《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)
关于【《无限死亡函》txt下载在线阅读全文】,求百度网盘云资源,今天涌涌小编给您分享一下,如果对您有所帮助别忘了关注本站哦。
1、ESP32-cam自制远程控制浇水系统教程
自制ESP32-cam远程控制浇水系统
今年在疫情的影响下,有了些空余时间。南京的梅雨过后天气开始热了。一直想做一个远程控制浇水的系统。开始了解Arduino编程,买了不少ESP8266、ESP32-Cam、继电器、电机等等,过程中遇到不少问题都查资料逐一解决,但是动手能力还是弱了些,最后总算完成,达到预期目标。经过2个月的测试,现在把成功的写出来,分享给一样有兴趣的朋友。
(成品图)
(浇水中)
测试过程中为了能走出试验室,进入实际使用中,作了不少优化。最大点就是电源了。拖拉电线是件很麻烦的事情,拖拉电线既不美观也不安全,浇水都是在室外的多,要适应各种天气,暴晒、下雨、下雪。12V的点是没有任何危险的。而且可以随意放,只要靠近水龙头就可以。接上后,水龙头是长开着的,所以在断电,电池没电,网络中断等情况下,电磁阀要保持长闭合状态,防止水失控。这些方面都作了多次测试。10000毫安的充电宝只能提供最多4天的ESP32-Cam的电力。12v5a的蓄电池通过降压模块只能提供5V和12V最多3天的电力。这是不能满足需求的,我们正常出门一次,如果天数较多,1个月时需要的。浇水系统一天只会在早晨或晚上浇水,其余时间都是不需要的。好在ESP32有这方面的考虑,有deep-sleep功能,可以深度休眠,使用Timer隔一段时间后唤醒就好。如果一天只运行指定的一个小时段,这样1天就换回了24天,就能满足需求了。一个12v5a蓄电池可以满足30天左右。
材料
在淘宝、京东、拼多多都可以买。以下是我在淘宝购买的记录
总共花费:290.2,浇水实用到的物品费用:232.73
接线
ESP-Cam需要5V电压,所以用一个TTL USB接头,USB接头插入电脑USB口可以供电,烧入Arduino程序。
ESP32-Cam 说明:
· 烧入程序时接线:
TX接ESP-Cam RXD
RX接ESP-Cam TXD
5V连接ESP-Cam 5V
GND连接ESP-Cam GND
ESP-Cam IO0要和GND用冒连接
· 运行时接线:
本程序运行时只使用5V、GND、GPIO13三个角针。5V、GND是供电,GPIO13是输出继电器信号。
(运行时继电器的接线)
· 继电器接线:
用杜邦线连接ESP32-Cam GPIO13和图示中的口。
5V电压输入、GND和ESP32-Cam的电源共用。
12V电压输入和12输出串联在蓄电池和电磁阀之间。
5V的电源可以是12V蓄电池降压得到。这样12V电磁阀和5V 的ESP32-Cam、继电器可以共用一个电源。如果想用家里的充电宝提供5V电源,用USB Dip接头可以插入充电宝,为5V 的ESP32-Cam、继电器供电,12V的电磁阀单独由蓄电池供电。
ESP-Cam中的程序控制GPO13端口输入高电平,低电平来控制继电器开和关。这款继电器输入高电平时是关闭的,输入低电平是打开的。
· 降压器使用
· 水接线
水接线是个体力活,雾化喷头按购买的说明结合自家的花草情况进行部署。
电池阀的水接方法:
Arduino程序
· Arduino环境准备
1.Arduino可以官网下载,安装Arduino,我用的是1.8.12版本。
2.安装ESP32开发组建:
esp32_package_v1_0_2.exe 可以网上找,找不到可以QQ我发,直接运行
3.Arduino要打ESP32_AzureIoT_Arduino补丁
ESP32_AzureIoT_Arduino.zip 解压到
C:\Users\admin\Documents\Arduino\hardware\espressif\esp32\libraries\AzureIoT
4.安装ESP32开发库,需要安装的库如下:
ArduinoJson-5.11.2.zip --JSON操作包
time-master.zip --时间包
CH341SER.ZIP --寄存器操作,存储wifi和服务地址
加载库如下页面操作:
设置:
· 烧入程序:按上面的接线完毕后,TTL USB插入电脑USB,电脑打开Arduino,打开Waiter程序,点击写入就可以。
#include "esp_camera.h"
#include <TimeLib.h>
#include <WiFi.h>
#include <ArduinoJson.h>
#include <EEPROM.h>
#define CAMERA_MODEL_AI_THINKER //指定摄像头的模式,只能用这种
#include "camera_pins.h"
#define relay 13 //ESP32 指定继电器的控制针脚
boolean saveElc=true; //是否开启省点模式,只有在一个时间开启服务
String startTimeOfDay="6:30:00,18:30:00"; //每天开启时间,逗号分割可以多个,这个取决于服务端的逻辑控制。
String endTimeOfDay="7:00:00,19:00:00"; //每天关闭时间
int defaultStatus=HIGH; //默认继电器是高电平,关闭状态。
WiFiServer server(8080); //ap模式下的服务端口,用于刚开始时设置wifi的密码和应用程序地址
//----wifi connection and sync data to iot server
String objName="water"; //设备类型
String userName="Wong"; //用户名称
String loginAcct="WFIOT"; //服务端用户帐号
String seqNum="01"; //设备序列
String userId="1111000"; //用户编号
String macAds;
int iotPort;
String iotIp;
String netIp;
//web服务端需要有以下API接口用于和该设备通信和控制。Web服务部署在Wifi局域网内。
String iotCheckUrl="addIotUser"; //服务端需要有的API名称,创建用户并检查用户是否存在。
String iotSleepTime="getSleepSeconds"; //获取休眠的时长,单位秒。
String iotServiceUrl="getIotData"; //设备获取服务端的指令,如关闭继电器,开启继电器。
String iotUpdateServiceUrl="updateIotData"; //设备断电重启时更新WifiIP到服务端。
int processStatus=0;
int recovercount=0;
String ssid;
String pwd;
struct config_type
{
char iotIp[24];//定义配网得到的WIFI密码长度(最大64字节)
char iotPort[12];
char ssid[24];
char pwd[24];
};
config_type cfg;
//web服务端存储的设备记录信息。
String getDesc(){
return "{\"iot_object\":\""+objName+"\","
+"\"iot_object_mac\":\""+macAds+"\","
+"\"iot_data\":\""+getIotData()+"\","
+"\"user_name\":\""+userName+"\","
+"\"user_obj_seq\":\""+seqNum+"\","
+"\"user_id\":\""+userId+"\","
+"\"net_ip\":\""+netIp+"\","
+"\"app_ip\":\""+iotIp+"\","
+"\"is_sleep\":\""+saveElc+"\","
+"\"start_time\":\""+startTimeOfDay+"\","
+"\"end_time\":\""+endTimeOfDay+"\","
+"\"app_port\":\""+String(iotPort)+"\","
+"\"register_srv\":\""+iotCheckUrl+"\","
+"\"sync_data_srv\":\""+iotServiceUrl+"\","
+"\"login_code\":\""+loginAcct+"\","
+"}";
}
//请求web服务的路径
String getIotData(){
return "{imageUrl:['http://"+netIp+"/control?var=framesize&val=6','http://"+netIp+"/capture?_cb=1593852828143'],relay:'OFF'}";
}
void loadConfig()//读取函数
{
EEPROM.begin(1024);
uint8_t *p = (uint8_t*)(&cfg);
for (int i = 0; i < sizeof(cfg); i++)
{
*(p + i) = EEPROM.read(i);
}
EEPROM.commit();
}
void saveConfig()//保存函数
{
Serial.println("saveConfig...");
EEPROM.begin(1024);//向系统申请1024kb ROM
//开始写入
uint8_t *p = (uint8_t*)(&cfg);
for (int i = 0; i < sizeof(cfg); i++)
{
EEPROM.write(i, *(p + i)); //在闪存内模拟写入
}
EEPROM.commit();//执行写入ROM
}
int setup_connectWifi(String ssid,String pwd,String localhostName){
if(ssid!="" && pwd!=""){
WiFi.begin(ssid.c_str(),pwd.c_str());
}else{
WiFi.begin();
}
int n=0;
while (WiFi.status() != WL_CONNECTED){
delay(100);
n++;
if(n>100){
Serial.print("Connected "+ssid+", fail ");
return 0;
}
Serial.print(".");
}
netIp=String(WiFi.localIP()[0])+"."+String(WiFi.localIP()[1])+"."+String(WiFi.localIP()[2])+"."+String(WiFi.localIP()[3]);
Serial.println("connected work wifi "+netIp+" by "+ssid);
if(iotIp){
setMac();
String txt = sendHtmlPost(iotIp,iotPort,iotUpdateServiceUrl,"{\"user_id\":\""+userId+"\",\"iot_object_mac\":\""+macAds+"\",\"iot_data\":\""+getIotData()+"\"}");
Serial.println(txt);
}
return 1;
}
void setMac(){
byte mac[6];
WiFi.macAddress(mac);
macAds=String(mac[5])+":"+String(mac[4])+":"+String(mac[3])+":"+String(mac[2])+":"+String(mac[1])+":"+String(mac[0]);
}
void startReg(){
processStatus=1;
setup_wifiAP_STA();
setup_server();
}
void setup_wifiAP_STA(){
Serial.print("begin set ap ...");
IPAddress lxip(192,168,2,1);
IPAddress lxip1(192,168,2,1);
IPAddress lxip2(255,255,255,0);
setMac();
Serial.println("mac:"+macAds);
String ssid= String("TB_IOT-")+userName+" "+objName+seqNum;
String password = "";
WiFi.mode(WIFI_AP_STA);
WiFi.softAPConfig(lxip,lxip1,lxip2);
WiFi.softAP(ssid.c_str(),password.c_str(),1);
Serial.print("finished set ap ,please connect ");
Serial.print(WiFi.softAPIP());
Serial.println(":8080");
}
void setup_server(){
server.begin();
Serial.println("started http server");
}
boolean parseServerRequest(){
WiFiClient client = server.available();
if (client){
Serial.println("[Client connected]");
String firstLine;
String resposnehtml;
int ishead=1;
int n=0;
boolean flag=false;
while(!client.connected()||!client.available()){
delay(1);
n++;
if(n>100){
delay(100);
Serial.println("[server wait timeout]");
client.stop();
return false;
}
Serial.print(".");
}
while (client.connected()||client.available()){
if (client.available()){
String line = client.readStringUntil('\r');
Serial.println(line);
if(firstLine==NULL){
firstLine=line;
//getwifi info ...GET /queryServerList?ssid=wf&password=144565 HTTP/1.1
String pars[5] ;
parseHtmlQueryString(firstLine,pars);
String type=pars[0];
if(type=="home"){
resposnehtml=homePage("","","","","");
}else if(type=="queryServerList"){
//parseOut ssid password
if(pars[1]!=NULL && pars[2]!=NULL && pars[3]!=NULL){
int ret = setup_connectWifi(pars[1],pars[2],objName+seqNum);
if(ret==1){
String data = checkAndUpdateDesc(pars[3],pars[4].toInt(),iotCheckUrl,iotServiceUrl,getDesc());
String f = data.substring(0,1);
String msg = data.substring(1);
if(f=="Y"){
resposnehtml=successHtml(msg); //success close window
flag=true;
}else{
resposnehtml=homePage("connect iot server fail.<br/> "+msg,pars[1],pars[2],pars[3],pars[4]);
}
}else{
resposnehtml=homePage("SSID,Password fail ,can't connect wifi, please check",pars[1],pars[2],pars[3],pars[4]);
}
}else{
resposnehtml=homePage("SSID,Password,IotIP is null, please check",pars[1],pars[2],pars[3],pars[4]);
}
}
if(resposnehtml!=NULL){
//Serial.println(client.status());
if(client.connected()){
Serial.println("response:"+resposnehtml);
client.println(resposnehtml);
delay(100);
client.flush();
delay(1000);
}
}
client.stop();
Serial.println("[Client disonnected]");
if(flag){
WiFi.mode(WIFI_STA);
Serial.println("set wifi mode STA");
if(setup_connectWifi(pars[1],pars[2],objName+seqNum)==1){
Serial.println("connected "+pars[1]);
processStatus=0;
strcpy(cfg.iotIp,pars[3].c_str());
strcpy(cfg.iotPort,pars[4].c_str());
strcpy(cfg.ssid,pars[1].c_str());
strcpy(cfg.pwd,pars[2].c_str());
String t = cfg.iotIp;
saveConfig();
WiFi.setAutoConnect(true);
Serial.println("saved config data to cash");
}else{
Serial.println("can't connect wifi "+pars[1]);
}
}
return true;
}
break;
}else{
break;
}
}
Serial.println("[Client disonnected2]");
client.stop();
return true;
}else{
return false;
}
}
void parseHtmlQueryString(String qstring,String *ret){
String txt = GetRidOfurlCharacters(qstring);
Serial.println(txt);
String url = txt.substring(txt.indexOf("/")+1,txt.indexOf("\r"));
int n = url.indexOf("?");
if(n!=-1){
String a = url.substring(0,url.indexOf("?"));
ret[0]=a;
String q = url.substring(url.indexOf("?")+1,url.indexOf("HTTP"));
ret[1]=q.substring(q.indexOf("ssid=")+5,q.indexOf("&p"));
ret[2]=q.substring(q.indexOf("password=")+9,q.indexOf("&ioti"));
ret[3]=q.substring(q.indexOf("iotip=")+6,q.indexOf("&iotp"));
ret[4]=q.substring(q.indexOf("iotport=")+8,q.indexOf(" "));
iotIp=ret[3];
iotPort=ret[4].toInt();
}else{
ret[0]="home";
}
Serial.println("0:"+ret[0]);
Serial.println("1:"+ret[1]);
Serial.println("2:"+ret[2]);
Serial.println("3:"+ret[3]);
}
String GetRidOfurlCharacters(String urlChars)
{
urlChars.replace("%0D%0A", String('\n'));
urlChars.replace("+", " ");
urlChars.replace("%20", " ");
urlChars.replace("%21", "!");
urlChars.replace("%22", String(char('\"')));
urlChars.replace("%23", "#");
urlChars.replace("%24", "$");
urlChars.replace("%25", "%");
urlChars.replace("%26", "&");
urlChars.replace("%26%2365281%3B","!");
urlChars.replace("%27", String(char(39)));
urlChars.replace("%28", "(");
urlChars.replace("%29", ")");
urlChars.replace("%2A", "*");
urlChars.replace("%2B", "+");
urlChars.replace("%2C", ",");
urlChars.replace("%2D", "-");
urlChars.replace("%2E", ".");
urlChars.replace("%2F", "/");
urlChars.replace("%30", "0");
urlChars.replace("%31", "1");
urlChars.replace("%32", "2");
urlChars.replace("%33", "3");
urlChars.replace("%34", "4");
urlChars.replace("%35", "5");
urlChars.replace("%36", "6");
urlChars.replace("%37", "7");
urlChars.replace("%38", "8");
urlChars.replace("%39", "9");
urlChars.replace("%3A", ":");
urlChars.replace("%3B", ";");
urlChars.replace("%3C", "<");
urlChars.replace("%3D", "=");
urlChars.replace("%3E", ">");
urlChars.replace("%3F", "?");
urlChars.replace("%40", "@");
urlChars.replace("%41", "A");
urlChars.replace("%42", "B");
urlChars.replace("%43", "C");
urlChars.replace("%44", "D");
urlChars.replace("%45", "E");
urlChars.replace("%46", "F");
urlChars.replace("%47", "G");
urlChars.replace("%48", "H");
urlChars.replace("%49", "I");
urlChars.replace("%4A", "J");
urlChars.replace("%4B", "K");
urlChars.replace("%4C", "L");
urlChars.replace("%4D", "M");
urlChars.replace("%4E", "N");
urlChars.replace("%4F", "O");
urlChars.replace("%50", "P");
urlChars.replace("%51", "Q");
urlChars.replace("%52", "R");
urlChars.replace("%53", "S");
urlChars.replace("%54", "T");
urlChars.replace("%55", "U");
urlChars.replace("%56", "V");
urlChars.replace("%57", "W");
urlChars.replace("%58", "X");
urlChars.replace("%59", "Y");
urlChars.replace("%5A", "Z");
urlChars.replace("%5B", "[");
urlChars.replace("%5C", String(char(65)));
urlChars.replace("%5D", "]");
urlChars.replace("%5E", "^");
urlChars.replace("%5F", "_");
urlChars.replace("%60", "`");
urlChars.replace("%61", "a");
urlChars.replace("%62", "b");
urlChars.replace("%63", "c");
urlChars.replace("%64", "d");
urlChars.replace("%65", "e");
urlChars.replace("%66", "f");
urlChars.replace("%67", "g");
urlChars.replace("%68", "h");
urlChars.replace("%69", "i");
urlChars.replace("%6A", "j");
urlChars.replace("%6B", "k");
urlChars.replace("%6C", "l");
urlChars.replace("%6D", "m");
urlChars.replace("%6E", "n");
urlChars.replace("%6F", "o");
urlChars.replace("%70", "p");
urlChars.replace("%71", "q");
urlChars.replace("%72", "r");
urlChars.replace("%73", "s");
urlChars.replace("%74", "t");
urlChars.replace("%75", "u");
urlChars.replace("%76", "v");
urlChars.replace("%77", "w");
urlChars.replace("%78", "x");
urlChars.replace("%79", "y");
urlChars.replace("%7A", "z");
urlChars.replace("%7B", String(char(123)));
urlChars.replace("%7C", "|");
urlChars.replace("%7D", String(char(125)));
urlChars.replace("%7E", "~");
urlChars.replace("%7F", "Â");
urlChars.replace("%80", "`");
urlChars.replace("%81", "Â");
urlChars.replace("%82", "â");
urlChars.replace("%83", "Æ");
urlChars.replace("%84", "â");
urlChars.replace("%85", "â¦");
urlChars.replace("%86", "â");
urlChars.replace("%87", "â¡");
urlChars.replace("%88", "Ë");
urlChars.replace("%89", "â°");
urlChars.replace("%8A", "Å");
urlChars.replace("%8B", "â¹");
urlChars.replace("%8C", "Å");
urlChars.replace("%8D", "Â");
urlChars.replace("%8E", "Ž");
urlChars.replace("%8F", "Â");
urlChars.replace("%90", "Â");
urlChars.replace("%91", "â");
urlChars.replace("%92", "â");
urlChars.replace("%93", "â");
urlChars.replace("%94", "â");
urlChars.replace("%95", "â¢");
urlChars.replace("%96", "â");
urlChars.replace("%97", "â");
urlChars.replace("%98", "Ë");
urlChars.replace("%99", "â¢");
urlChars.replace("%9A", "Å¡");
urlChars.replace("%9B", "âº");
urlChars.replace("%9C", "Å");
urlChars.replace("%9D", "Â");
urlChars.replace("%9E", "ž");
urlChars.replace("%9F", "Ÿ");
urlChars.replace("%A0", "Â");
urlChars.replace("%A1", "¡");
urlChars.replace("%A2", "¢");
urlChars.replace("%A3", "£");
urlChars.replace("%A4", "¤");
urlChars.replace("%A5", "Â¥");
urlChars.replace("%A6", "¦");
urlChars.replace("%A7", "§");
urlChars.replace("%A8", "¨");
urlChars.replace("%A9", "©");
urlChars.replace("%AA", "ª");
urlChars.replace("%AB", "«");
urlChars.replace("%AC", "¬");
urlChars.replace("%AE", "®");
urlChars.replace("%AF", "¯");
urlChars.replace("%B0", "°");
urlChars.replace("%B1", "±");
urlChars.replace("%B2", "²");
urlChars.replace("%B3", "³");
urlChars.replace("%B4", "´");
urlChars.replace("%B5", "µ");
urlChars.replace("%B6", "¶");
urlChars.replace("%B7", "·");
urlChars.replace("%B8", "¸");
urlChars.replace("%B9", "¹");
urlChars.replace("%BA", "º");
urlChars.replace("%BB", "»");
urlChars.replace("%BC", "¼");
urlChars.replace("%BD", "½");
urlChars.replace("%BE", "¾");
urlChars.replace("%BF", "¿");
urlChars.replace("%C0", "Ã");
urlChars.replace("%C1", "Ã");
urlChars.replace("%C2", "Ã");
urlChars.replace("%C3", "Ã");
urlChars.replace("%C4", "Ã");
urlChars.replace("%C5", "Ã");
urlChars.replace("%C6", "Ã");
urlChars.replace("%C7", "Ã");
urlChars.replace("%C8", "Ã");
urlChars.replace("%C9", "Ã");
urlChars.replace("%CA", "Ã");
urlChars.replace("%CB", "Ã");
urlChars.replace("%CC", "Ã");
urlChars.replace("%CD", "Ã");
urlChars.replace("%CE", "Ã");
urlChars.replace("%CF", "Ã");
urlChars.replace("%D0", "Ã");
urlChars.replace("%D1", "Ã");
urlChars.replace("%D2", "Ã");
urlChars.replace("%D3", "Ã");
urlChars.replace("%D4", "Ã");
urlChars.replace("%D5", "Ã");
urlChars.replace("%D6", "Ã");
urlChars.replace("%D7", "Ã");
urlChars.replace("%D8", "Ã");
urlChars.replace("%D9", "Ã");
urlChars.replace("%DA", "Ã");
urlChars.replace("%DB", "Ã");
urlChars.replace("%DC", "Ã");
urlChars.replace("%DD", "Ã");
urlChars.replace("%DE", "Ã");
urlChars.replace("%DF", "Ã");
urlChars.replace("%E0", "Ã");
urlChars.replace("%E1", "á");
urlChars.replace("%E2", "â");
urlChars.replace("%E3", "ã");
urlChars.replace("%E4", "ä");
urlChars.replace("%E5", "Ã¥");
urlChars.replace("%E6", "æ");
urlChars.replace("%E7", "ç");
urlChars.replace("%E8", "è");
urlChars.replace("%E9", "é");
urlChars.replace("%EA", "ê");
urlChars.replace("%EB", "ë");
urlChars.replace("%EC", "ì");
urlChars.replace("%ED", "Ã");
urlChars.replace("%EE", "î");
urlChars.replace("%EF", "ï");
urlChars.replace("%F0", "ð");
urlChars.replace("%F1", "ñ");
urlChars.replace("%F2", "ò");
urlChars.replace("%F3", "ó");
urlChars.replace("%F4", "ô");
urlChars.replace("%F5", "õ");
urlChars.replace("%F6", "ö");
urlChars.replace("%F7", "÷");
urlChars.replace("%F8", "ø");
urlChars.replace("%F9", "ù");
urlChars.replace("%FA", "ú");
urlChars.replace("%FB", "û");
urlChars.replace("%FC", "ü");
urlChars.replace("%FD", "ý");
urlChars.replace("%FE", "þ");
urlChars.replace("%FF", "ÿ");
return urlChars;
}
void setDefaultStatus(){
if(digitalRead(relay)!=defaultStatus){
digitalWrite(relay,defaultStatus);
}
}
String checkAndUpdateDesc(String ip,int iotPort,String iotCheckUrl,String iotServiceUrl,String this_desc){
String txt = sendHtmlPost(ip,iotPort,iotCheckUrl,this_desc);
if(txt==NULL || txt==""){
return "";
}
Serial.println("iot response:"+txt);
int size = txt.length() + 200;
DynamicJsonDocument jsonBuffer(size);
deserializeJson(jsonBuffer,txt);
JsonObject ret = jsonBuffer.as<JsonObject>();
if(ret!=NULL){
String nn = ret["now"];
if(nn!=NULL){
String y = nn.substring(0,nn.indexOf("-"));
String e = nn.substring(nn.indexOf("-")+1);
String n = e.substring(0,e.indexOf("-"));
e = e.substring(e.indexOf("-")+1);
String d = e.substring(0,e.indexOf(" "));
e = e.substring(e.indexOf(" ")+1);
String h = e.substring(0,e.indexOf(":"));
e = e.substring(e.indexOf(":")+1);
String m = e.substring(0,e.indexOf(":"));
String s = e.substring(e.indexOf(":")+1);
Serial.println("now date is :"+y+"-"+n+":"+d+" "+h+":"+m+":"+s);
setTime(h.toInt(),m.toInt(),s.toInt(),d.toInt(),n.toInt(),y.toInt());
}
Serial.print("iot server response fail:");
String iserror=ret["is_error"];
Serial.println(iserror);
String m=ret["msg"];
if(iserror=="true"){
return "F"+m;
}else{
return "Y"+m;
}
}else{
return "Fparse response json null.";
}
}
String sendHtmlPost(String host,int httpPort,String md,String queryStringData){
WiFiClient http;
if (!http.connect(host.c_str(), httpPort)) {
Serial.println("iot server connection failed "+host+":"+httpPort);
http.stop();
return "connection failed";
}
String request = "/api?actions="+md;
String encRequest = request; // need to write your own method for this...
String post = "POST " + encRequest + " HTTP/1.1\r\n"+
"Host: " + host + "\r\n" +
"Content-Type: application/json"+"\r\n" +
"Connection: close\r\n"+
"Content-Length: "+queryStringData.length()+"\r\n\r\n"+
queryStringData;
http.println( post);
Serial.println("send request:"+post);
//delay(100);
String result;
String p="header";
int c=0;
while(!http.available()){
delay(1);
c++;
if(c>60000){
Serial.println("network wait response timeout 60s");
break;
}
}
while(http.available()){
String line = http.readStringUntil('\r');
Serial.println(line);
if (p=="header") {
if (line=="\n") {
p="json";
}
}else if (p=="json") {
p="ignore";
result += line.substring(1);
}
}
Serial.println("get result:"+result);
http.stop();
return result;
}
String errorHtml(){
String htmlPage =
String("HTTP/1.1 200 OK\r\n") +
"Content-Type: text/html\r\n" +
"Connection: close\r\n" + // the connection will be closed after completion of the response
// "Refresh: 5\r\n" + // refresh the page automatically every 5 sec
"\r\n" +
"<!DOCTYPE HTML>" +
"<html>" +
//"<link rel=\"icon\" href=\"data:image/ico;base64,aWNv\">"+
"<body>request invalid, please refresh page</body>" +
"</html>" +
"\r\n";
return htmlPage;
}
String successHtml(String msg){
String htmlPage =
String("HTTP/1.1 200 OK\r\n") +
"Content-Type: text/html\r\n" +
"Connection: close\r\n" + // the connection will be closed after completion of the response
// "Refresh: 5\r\n" + // refresh the page automatically every 5 sec
"\r\n" +
"<!DOCTYPE HTML>" +
"<html>" +
"<body>Configuration Success!<br><br>"+msg+"<br><br><input type=\"button\" onclick=\"window.close();\" value=\"Close\"></body>" +
"</html>" +
"\r\n";
return htmlPage;
}
String homePage(String msg,String v_ssid,String v_password,String v_iotip,String v_iotport){
String htmlPage =
String("HTTP/1.1 200 OK\r\n") +
"Content-Type: text/html\r\n" +
"Connection: close\r\n" + // the connection will be closed after completion of the response
// "Refresh: 5\r\n" + // refresh the page automatically every 5 sec
"\r\n" +
"<!DOCTYPE HTML>" +
"<html>" +
//"<link rel=\"icon\" href=\"data:;base64,=\">"+
"<body><br /><br />"+
msg+"<br /><br />"+
"<form action=\"/queryServerList\" method=\"get\">"+
"SSID :<input type=\"text\" name=\"ssid\" value=\""+v_ssid+"\" size=\"20\"><br /><br />"+
"Password:<input type=\"text\" name=\"password\" value=\""+v_password+"\" size=\"20\"><br /><br />"+
"IotIP :<input type=\"text\" name=\"iotip\" value=\""+v_iotip+"\" size=\"20\"><br /><br />"+
"IotPort :<input type=\"text\" name=\"iotport\" value=\""+v_iotport+"\" size=\"20\"><br /><br />"+
"<input type=\"submit\" onclick=\"formSubmit()\" value=\"Submit\"></form>" +
"</body></html>" +
"\r\n";
return htmlPage;
}
String syncIotServerStatus(){
String txt = sendHtmlPost(iotIp,iotPort,iotServiceUrl,"{\"user_id\":\""+userId+"\",\"iot_object_mac\":\""+macAds+"\"}");
Serial.println("iot response:"+txt);
int size = txt.length() + 200;
DynamicJsonDocument jsonBuffer(size);
deserializeJson(jsonBuffer,txt);
JsonObject ret = jsonBuffer.as<JsonObject>();
if(ret["relay"]=="ON"){
if(defaultStatus==digitalRead(relay)){
if(defaultStatus==LOW){
digitalWrite(relay,HIGH);
}else{
digitalWrite(relay,LOW);
}
Serial.println("opened relay");
}
}else if(ret["relay"]=="OFF"){
if(defaultStatus!=digitalRead(relay)){
digitalWrite(relay,defaultStatus);
Serial.println("closed relay");
}
}else if(defaultStatus!=digitalRead(relay)){
digitalWrite(relay,defaultStatus);
Serial.println("closed relay");
}
if(ret["is_error"]=="true"){
return "";
}else{
return txt;
}
}
boolean checkIotServer(){
String data = checkAndUpdateDesc(iotIp,iotPort,iotCheckUrl,iotServiceUrl,getDesc());
String f = data.substring(0,1);
if(data=="" || f!="Y"){
Serial.println("auto connect iot server fail");
return false;
}else{
return true;
}
}
//===end
void startCameraServer();
void setup() {
Serial.begin(115200);
Serial.setDebugOutput(false);
//servo.attach(servopin,2,0,servoAngle);
pinMode(relay,OUTPUT);
setDefaultStatus();
Serial.println("begin setup...");
loadConfig();
iotIp=cfg.iotIp;
iotPort=String(cfg.iotPort).toInt();
ssid=cfg.ssid;
pwd=cfg.pwd;
if(WiFi.status() != WL_CONNECTED){//auto connect wifi
WiFi.mode(WIFI_STA);//设置模式为STA
if(ssid!=NULL && pwd!=NULL){
Serial.println("connect... with "+ssid+" "+pwd);
setup_connectWifi(ssid,pwd,objName+seqNum);
}else{
setup_connectWifi("","",objName+seqNum);
}
int n=0;
while (WiFi.status() != WL_CONNECTED){
delay(1);
n++;
if(n>5000){
break;
}
}
if(n>5000){
//if connect fail to setting
Serial.println("can't auto default conncect,will setting");
startReg();
}else{
setMac();
Serial.println("auto default conncected , iotIp from flush is "+iotIp);
boolean b = checkIotServer();
if(!b){
startReg();
}
}
}else{
Serial.println("auto connected wifi");
boolean b= checkIotServer();
if(!b){
startReg();
}
}
}
boolean isInit=true;
void loop() {
if(processStatus==1){
Serial.println("set connect...");
boolean b= parseServerRequest();
}else if(WiFi.status() == WL_CONNECTED){
if(isInit){
//init camera
cameraInit();
isInit=false;
}
Serial.println("...");
String res = syncIotServerStatus();
if(iotIp==NULL || iotIp==""){
startReg();
}else if(res=="connection failed"){
setDefaultStatus();
}else if(res=="" || res==NULL){
recovercount++;
if(recovercount>10){
startReg();
}
}else{
recovercount=0;
}
//sycn to iot server
//省电模式,指定某个时间唤醒服务
if(saveElc){
String txt = sendHtmlPost(iotIp,iotPort,iotSleepTime,"{\"user_id\":\""+userId+"\",\"iot_object_mac\":\""+macAds+"\"}");
Serial.println("iot response:"+txt);
int size = txt.length() + 200;
DynamicJsonDocument jsonBuffer(size);
deserializeJson(jsonBuffer,txt);
JsonObject ret = jsonBuffer.as<JsonObject>();
String ss = ret["sleepSeconds"];
String isb = ret["isBetween"];
if(isb == "false"){
int sleepSeconds = ss.toInt();
if(sleepSeconds>2100){
sleepSeconds=2100;
}
Serial.print("-----begin to sleep ,will wake after ");
Serial.print(sleepSeconds);
Serial.println(" seconds");
esp_sleep_enable_timer_wakeup(sleepSeconds * 1000000);
//关闭Camera服务
//关闭蓝牙
//esp_bt_controller_disable();
//esp_bluedroid_disable();
//关闭wifi
//esp_wifi_stop();
esp_deep_sleep_start();
}
}
}else{
Serial.println("rely set default...");
setDefaultStatus();
}
// put your main code here, to run repeatedly:
delay(2000);
}
//判断当前时间是否不是激活时间
boolean isNotWakeTime(){
int sh = startTimeOfDay.substring(0,startTimeOfDay.indexOf(":")).toInt();
int sm = startTimeOfDay.substring(startTimeOfDay.indexOf(":")+1).toInt();
int eh = endTimeOfDay.substring(0,endTimeOfDay.indexOf(":")).toInt();
int em = endTimeOfDay.substring(endTimeOfDay.indexOf(":")+1).toInt();
Serial.print("now is ");
Serial.print(hour());
Serial.print(":");
Serial.print(minute());
if(hour()>=sh && hour()<=eh && minute()>=sm && minute()<=em){
return false;
}else{
return true;
}
}
//计算当前时间到下一个激活时间的秒数
int calculateSleepSeconds(){
}
void cameraInit(){
camera_config_t config;
config.ledc_channel = LEDC_CHANNEL_0;
config.ledc_timer = LEDC_TIMER_0;
config.pin_d0 = Y2_GPIO_NUM;
config.pin_d1 = Y3_GPIO_NUM;
config.pin_d2 = Y4_GPIO_NUM;
config.pin_d3 = Y5_GPIO_NUM;
config.pin_d4 = Y6_GPIO_NUM;
config.pin_d5 = Y7_GPIO_NUM;
config.pin_d6 = Y8_GPIO_NUM;
config.pin_d7 = Y9_GPIO_NUM;
config.pin_xclk = XCLK_GPIO_NUM;
config.pin_pclk = PCLK_GPIO_NUM;
config.pin_vsync = VSYNC_GPIO_NUM;
config.pin_href = HREF_GPIO_NUM;
config.pin_sscb_sda = SIOD_GPIO_NUM;
config.pin_sscb_scl = SIOC_GPIO_NUM;
config.pin_pwdn = PWDN_GPIO_NUM;
config.pin_reset = RESET_GPIO_NUM;
config.xclk_freq_hz = 20000000;
config.pixel_format = PIXFORMAT_JPEG;
//init with high specs to pre-allocate larger buffers
if(psramFound()){
config.frame_size = FRAMESIZE_UXGA;
config.jpeg_quality = 10;
config.fb_count = 2;
Serial.println("frame_size is FRAMESIZE_UXGA");
} else {
config.frame_size = FRAMESIZE_SVGA;
config.jpeg_quality = 12;
config.fb_count = 1;
Serial.println("frame_size is FRAMESIZE_SVGA");
}
#if defined(CAMERA_MODEL_ESP_EYE)
pinMode(13, INPUT_PULLUP);
pinMode(14, INPUT_PULLUP);
#endif
// camera init
esp_err_t err = esp_camera_init(&config);
Serial.println(err);
if (err != ESP_OK) {
Serial.printf("Camera init failed with error 0x%x", err);
return;
}else{
Serial.println("init camera ok");
}
sensor_t * s = esp_camera_sensor_get();
//initial sensors are flipped vertically and colors are a bit saturated
if (s->id.PID == OV3660_PID) {
s->set_vflip(s, 1);//flip it back
s->set_brightness(s, 1);//up the blightness just a bit
s->set_saturation(s, -2);//lower the saturation
}
Serial.println("init sensors ok");
//drop down frame size for higher initial frame rate
s->set_framesize(s, FRAMESIZE_QVGA);
#if defined(CAMERA_MODEL_M5STACK_WIDE)
s->set_vflip(s, 1);
s->set_hmirror(s, 1);
#endif
Serial.println("connect wifi...");
// WiFi.begin(v_ssid, v_password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
startCameraServer();
Serial.print("Camera Ready! Use 'http://");
Serial.print(WiFi.localIP());
Serial.println("' to connect");
}
· 说明
配置操作:
1.通电后,打开手机Wifi,可以找到带有程序中用户名字样的Wifi 接入,选择接入。提示不能上网,选择保持连接。
2.打开手机浏览器,输入192.168.2.1:8080,显示一下画面
输入家里的Wifi名称和密码,在输入web服务的ip和服务端口。提交后,设备会尝试和Wifi连接和Web服务连接,把信息注册到Web服务后,返回注册的信息。注册后就可以登录Web服务访问、控制设备了。
应用程序
本地可以部署一个应用,用于控制设备。也可以网络穿透,公网访问你家的路由器访问设备。
· 网络结构
有两种网络结构,如果考虑安全,所有的控制、数据都在私域(家里),就用第一种方案,所有控制和数据都有本地服务控制,本地和远程云进行命令交互,注册的信息都在本地,云和本地只是服务调用的专递。如果嫌麻烦,可以用第二种方案。家里的ESP32可以通过本地的路由器连接到云,本地路由器配置DDNS,云服务就可以连接到家里内网设备。
· 数据表
就一张注册表:IOT_USER
· API
Web服务需要自行搭建,下面最接口做一下说明。
1) getCameraLastImage:Web服务通过ESP32-Cam的http地址获取图片。
入参:{
iot_object_mac://设备mac地址
}
出参:base64的图片流
2) addIotUser:设备启动时注册信息到Web服务。
入参:Arduino代码中getDesc的数据。
出参:{is_error:true/false}
3) updateIotData:设备重启时更新自己的Wifi IP到Web服务。
入参:{
user_id://type:'string',desc:'用户编号'
iot_object_mac: //type:'string',desc:'设备的mac地址'
iot_data: //设备信息
}
出参:{
is_error:true/false
}
4) queryIotUser:根据Web登录账号,查找匹配的设备信息。
5) getIotData:设备启动loop中请求Web服务获取变更的继电器命令。
入参:{
user_id://type:'string',desc:'用户编号'
iot_object_mac: //type:'string',desc:'设备的mac地址'
}
出参{
"imageUrl":[
,"http://xxxxx/capture?_cb=1593852828143"]
,"relay":"OFF"
}
6) getSleepSeconds:根据注册的数据表信息计算休眠的时长。
入参:{
user_id://type:'string',desc:'用户编号'
iot_object_mac: //type:'string',desc:'设备的mac地址'
}
出参:{
sleepSeconds: //type:'int',desc:'本次休眠的时长,单位秒'
isBetween: //type:'boolean',desc:'当前时间是否在激活的时间段内'
}
2、《无限死亡函》txt下载在线阅读全文,求百度网盘云资源
《无限死亡函》txt下载在线阅读全文,求百度网盘云资源
《无限死亡函》百度网盘txt最新全集下载:链接:https://pan.baidu.com/s/1cxfN3ufNN08jE4VxGnszFg?pwd=989n 提取码:989n简介:那个地方。就没有压力了。
只有对死亡的恐惧。对现在还活着的快感!。活着,你要作到的,仅仅只是活着。
《无限死亡函》最新txt全集下载
无限死亡函 txt全集小说附件已上传到百度网盘,点击免费下载:内容预览:第十章 兰尼博士 你想拯救世界吗穿着USR公司研究员服装的仇嵊,此刻正大摇大摆的走在路边的人行道上,轻轻的上下抛动着手中装着清洗剂的试管,转头看了眼灯火通明的USR大厦,两个指头一并,伸到眉毛处敬个联合**队的军礼。伸手招过一辆出租,仇嵊打算继续利用警探的身份做一趟霸王车。
‘小站’旅馆里,此时房间里的气氛显的有点诡异。
林欣自顾的坐在镜子前补着自己的妆,由于长时间的结界开放,让她有点吃不消,汗水冲掉了大部份早上画好的妆,回来便坐在镜子前没有移动过。李浩面色冷漠的坐在中间的沙发上,燃起一支香烟,抽了一口,然后想着自己的心事,直到香烟自行烧掉一节,又举起来抽一口。陈成一个人在客厅中央来回走动着,边走边不断的望向大门的方向。嘴里一个人不知道在嘟囔着什么。
芳菲坐在墙角的椅子上,低着头不断拨弄自己的手指,脸上透出异常焦急的神色。沙发背后的地上躺着一个昏迷的人,不用说,这就是仇嵊等人‘偷’来的兰尼博士。
无限死亡函小说txt全集免费下载
无限死亡函 txt全集小说附件已上传到百度网盘,点击免费下载:内容预览:无限死亡函 第六章 悲惨的耶苏 仇嵊的改变“乞呵呵呵呵,您真的不记得了?朴老师。我跑接力赛最后一棒,结果摔了一跤,您就打我耳光,怪我摔跤。
输了比赛,呵呵,想来是为了我好吧,因为要当一个运动员挺不容易的。
”“不是达峰,你听我说”“就是那天我穿的鞋,呵呵,没有牌子的廉价鞋,曾经是崭新的,没有任何破损,是妈妈专门给我买的您知道,我们家穷,再买不起鞋托您的福让我做了一整天的下蹲,把鞋彻底穿坏了在回家的时候,我的腿开始抽筋,然后摔了一跤您知道,我的梦想是成为一个棒球运动员”仇嵊闭着眼睛,仿佛又回到了自己的小学时代,那天,仇嵊和同学被老师叫去帮忙搬东西,同学分到一个很大的花瓶,他艰难的搬着花瓶往回走,这时匆匆的走过来一个女老师,同学想躲开,可已经来不及了。花瓶当然是打碎了,女老师揪着同学一阵臭骂,原来那个花瓶就是女老师的,同学被惹急了也在大声的为自己辩护着。
本文关键词:无限死亡领域,无限死亡好看吗,无限死亡小说,无限死亡电影小说,无限死亡函全文阅读。这就是关于《《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)》的所有内容,希望对您能有所帮助!更多的知识请继续关注《犇涌向乾》百科知识网站:http://www.029ztxx.com!
版权声明: 本站仅提供信息存储空间服务,旨在传递更多信息,不拥有所有权,不承担相关法律责任,不代表本网赞同其观点和对其真实性负责。如因作品内容、版权和其它问题需要同本网联系的,请发送邮件至 举报,一经查实,本站将立刻删除。