当前位置: > 投稿>正文

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)

03-01 互联网 未知 投稿

关于【《无限死亡函》txt下载在线阅读全文】,求百度网盘云资源,今天涌涌小编给您分享一下,如果对您有所帮助别忘了关注本站哦。

1、ESP32-cam自制远程控制浇水系统教程

自制ESP32-cam远程控制浇水系统

今年在疫情的影响下,有了些空余时间。南京的梅雨过后天气开始热了。一直想做一个远程控制浇水的系统。开始了解Arduino编程,买了不少ESP8266、ESP32-Cam、继电器、电机等等,过程中遇到不少问题都查资料逐一解决,但是动手能力还是弱了些,最后总算完成,达到预期目标。经过2个月的测试,现在把成功的写出来,分享给一样有兴趣的朋友。

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)

(成品图)

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)

(浇水中)

测试过程中为了能走出试验室,进入实际使用中,作了不少优化。最大点就是电源了。拖拉电线是件很麻烦的事情,拖拉电线既不美观也不安全,浇水都是在室外的多,要适应各种天气,暴晒、下雨、下雪。12V的点是没有任何危险的。而且可以随意放,只要靠近水龙头就可以。接上后,水龙头是长开着的,所以在断电,电池没电,网络中断等情况下,电磁阀要保持长闭合状态,防止水失控。这些方面都作了多次测试。10000毫安的充电宝只能提供最多4天的ESP32-Cam的电力。12v5a的蓄电池通过降压模块只能提供5V和12V最多3天的电力。这是不能满足需求的,我们正常出门一次,如果天数较多,1个月时需要的。浇水系统一天只会在早晨或晚上浇水,其余时间都是不需要的。好在ESP32有这方面的考虑,有deep-sleep功能,可以深度休眠,使用Timer隔一段时间后唤醒就好。如果一天只运行指定的一个小时段,这样1天就换回了24天,就能满足需求了。一个12v5a蓄电池可以满足30天左右。

材料

在淘宝、京东、拼多多都可以买。以下是我在淘宝购买的记录

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)

总共花费:290.2,浇水用到的物品费用:232.73

接线

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)

ESP-Cam需要5V电压,所以用一个TTL USB接头,USB接头插入电脑USB口可以供电,烧入Arduino程序。

ESP32-Cam 说明:

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(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是输出继电器信号。

(运行时继电器的接线)

· 继电器接线:

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)

用杜邦线连接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端口输入高电平,低电平来控制继电器开和关。这款继电器输入高电平时是关闭的,输入低电平是打开的。

· 降压器使用

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)

· 水接线

水接线是个体力活,雾化喷头按购买的说明结合自家的花草情况进行部署。

电池阀的水接方法:

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)

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

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)

4.安装ESP32开发库,需要安装的库如下:

ArduinoJson-5.11.2.zip --JSON操作包

time-master.zip --时间包

CH341SER.ZIP --寄存器操作,存储wifi和服务地址

加载库如下页面操作:

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)

设置:

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)

· 烧入程序:按上面的接线完毕后,TTL USB插入电脑USB,电脑打开Arduino,打开Waiter程序,点击写入就可以。

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)

#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,显示一下画面

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)

输入家里的Wifi名称和密码,在输入web服务的ip和服务端口。提交后,设备会尝试和Wifi连接和Web服务连接,把信息注册到Web服务后,返回注册的信息。注册后就可以登录Web服务访问、控制设备了。

应用程序

本地可以部署一个应用,用于控制设备。也可以网络穿透,公网访问你家的路由器访问设备。

· 网络结构

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)

《无限死亡函》txt下载在线阅读全文,求百度网盘云资源(ESP32-cam自制远程控制浇水系统教程)

有两种网络结构,如果考虑安全,所有的控制、数据都在私域(家里),就用第一种方案,所有控制和数据都有本地服务控制,本地和远程云进行命令交互,注册的信息都在本地,云和本地只是服务调用的专递。如果嫌麻烦,可以用第二种方案。家里的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!

版权声明: 本站仅提供信息存储空间服务,旨在传递更多信息,不拥有所有权,不承担相关法律责任,不代表本网赞同其观点和对其真实性负责。如因作品内容、版权和其它问题需要同本网联系的,请发送邮件至 举报,一经查实,本站将立刻删除。

猜你喜欢