自制ESP32cam远程控制浇水系统Word文档下载推荐.docx
《自制ESP32cam远程控制浇水系统Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《自制ESP32cam远程控制浇水系统Word文档下载推荐.docx(49页珍藏版)》请在冰点文库上搜索。
![自制ESP32cam远程控制浇水系统Word文档下载推荐.docx](https://file1.bingdoc.com/fileroot1/2023-5/11/335e911b-06b1-41b1-a5bb-3fe84ffd8f36/335e911b-06b1-41b1-a5bb-3fe84ffd8f361.gif)
用杜邦线连接ESP32-CamGPIO13和图示中的口。
5V电压输入、GND和ESP32-Cam的电源共用。
12V电压输入和12输出串联在蓄电池和电磁阀之间。
5V的电源可以是12V蓄电池降压得到。
这样12V电磁阀和5V的ESP32-Cam、继电器可以共用一个电源。
如果想用家里的充电宝提供5V电源,用USBDip接头可以插入充电宝,为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和服务地址
加载库如下页面操作:
设置:
烧入程序:
按上面的接线完毕后,TTLUSB插入电脑USB,电脑打开Arduino,打开Waiter程序,点击写入就可以。
#include"
esp_camera.h"
#include<
TimeLib.h>
WiFi.h>
ArduinoJson.h>
EEPROM.h>
#defineCAMERA_MODEL_AI_THINKER//指定摄像头的模式,只能用这种
camera_pins.h"
#definerelay13//ESP32指定继电器的控制针脚
booleansaveElc=true;
//是否开启省点模式,只有在一个时间开启服务
StringstartTimeOfDay="
6:
30:
00,18:
00"
;
//每天开启时间,逗号分割可以多个,这个取决于服务端的逻辑控制。
StringendTimeOfDay="
7:
00:
00,19:
//每天关闭时间
intdefaultStatus=HIGH;
//默认继电器是高电平,关闭状态。
WiFiServerserver(8080);
//ap模式下的服务端口,用于刚开始时设置wifi的密码和应用程序地址
//----wificonnectionandsyncdatatoiotserver
StringobjName="
water"
//设备类型
StringuserName="
Wong"
//用户名称
StringloginAcct="
WFIOT"
//服务端用户帐号
StringseqNum="
01"
//设备序列
StringuserId="
1111000"
//用户编号
StringmacAds;
intiotPort;
StringiotIp;
StringnetIp;
//web服务端需要有以下API接口用于和该设备通信和控制。
Web服务部署在Wifi局域网内。
StringiotCheckUrl="
addIotUser"
//服务端需要有的API名称,创建用户并检查用户是否存在。
StringiotSleepTime="
getSleepSeconds"
//获取休眠的时长,单位秒。
StringiotServiceUrl="
getIotData"
//设备获取服务端的指令,如关闭继电器,开启继电器。
StringiotUpdateServiceUrl="
updateIotData"
//设备断电重启时更新WifiIP到服务端。
intprocessStatus=0;
intrecovercount=0;
Stringssid;
Stringpwd;
structconfig_type
{
chariotIp[24];
//定义配网得到的WIFI密码长度(最大64字节)
chariotPort[12];
charssid[24];
charpwd[24];
};
config_typecfg;
//web服务端存储的设备记录信息。
StringgetDesc(){
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服务的路径
StringgetIotData(){
return"
{imageUrl:
['
http:
//"
/control?
var=framesize&
val=6'
'
/capture?
_cb=1593852828143'
],relay:
'
OFF'
voidloadConfig()//读取函数
EEPROM.begin(1024);
uint8_t*p=(uint8_t*)(&
cfg);
for(inti=0;
i<
sizeof(cfg);
i++)
{
*(p+i)=EEPROM.read(i);
}
EEPROM.commit();
voidsaveConfig()//保存函数
Serial.println("
saveConfig..."
);
//向系统申请1024kbROM
//开始写入
EEPROM.write(i,*(p+i));
//在闪存内模拟写入
//执行写入ROM
intsetup_connectWifi(Stringssid,Stringpwd,StringlocalhostName){
if(ssid!
="
&
&
pwd!
){
WiFi.begin(ssid.c_str(),pwd.c_str());
}else{
WiFi.begin();
intn=0;
while(WiFi.status()!
=WL_CONNECTED){
delay(100);
n++;
if(n>
100){
Serial.print("
Connected"
+ssid+"
fail"
return0;
."
netIp=String(WiFi.localIP()[0])+"
+String(WiFi.localIP()[1])+"
+String(WiFi.localIP()[2])+"
+String(WiFi.localIP()[3]);
connectedworkwifi"
by"
+ssid);
if(iotIp){
setMac();
Stringtxt=sendHtmlPost(iotIp,iotPort,iotUpdateServiceUrl,"
\"
Serial.println(txt);
return1;
voidsetMac(){
bytemac[6];
WiFi.macAddress(mac);
macAds=String(mac[5])+"
+String(mac[4])+"
+String(mac[3])+"
+String(mac[2])+"
+String(mac[1])+"
+String(mac[0]);
voidstartReg(){
processStatus=1;
setup_wifiAP_STA();
setup_server();
}
voidsetup_wifiAP_STA(){
beginsetap..."
IPAddresslxip(192,168,2,1);
IPAddresslxip1(192,168,2,1);
IPAddresslxip2(255,255,255,0);
mac:
+macAds);
Stringssid=String("
TB_IOT-"
)+userName+"
"
+objName+seqNum;
Stringpassword="
WiFi.mode(WIFI_AP_STA);
WiFi.softAPConfig(lxip,lxip1,lxip2);
WiFi.softAP(ssid.c_str(),password.c_str(),1);
finishedsetap,pleaseconnect"
Serial.print(WiFi.softAPIP());
8080"
voidsetup_server(){
server.begin();
startedhttpserver"
booleanparseServerRequest(){
WiFiClientclient=server.available();
if(client){
[Clientconnected]"
StringfirstLine;
Stringresposnehtml;
intishead=1;
booleanflag=false;
while(!
client.connected()||!
client.available()){
delay
(1);
100){
[serverwaittimeout]"
client.stop();
returnfalse;
while(client.connected()||client.available()){
if(client.available()){
Stringline=client.readStringUntil('
\r'
Serial.println(line);
if(firstLine==NULL){
firstLine=line;
//getwifiinfo...GET/queryServerList?
ssid=wf&
password=144565HTTP/1.1
Stringpars[5];
parseHtmlQueryString(firstLine,pars);
Stringtype=pars[0];
if(type=="
home"
resposnehtml=homePage("
}elseif(type=="
queryServerList"
//parseOutssidpassword
if(pars[1]!
=NULL&
pars[2]!
pars[3]!
=NULL){
intret=setup_connectWifi(pars[1],pars[2],objName+seqNum);
if(ret==1){
Stringdata=checkAndUpdateDesc(pars[3],pars[4].toInt(),iotCheckUrl,iotServiceUrl,getDesc());
Stringf=data.substring(0,1);
Stringmsg=data.substring
(1);
if(f=="
Y"
resposnehtml=successHtml(msg);
//successclosewindow
flag=true;
connectiotserverfail.<
br/>
+msg,pars[1],pars[2],pars[3],pars[4]);
SSID,Passwordfail,can'
tconnectwifi,pleasecheck"
pars[1],pars[2],pars[3],pars[4]);
SSID,Password,IotIPisnull,pleasecheck"
if(resposnehtml!
=NULL){
//Serial.println(client.status());
if(client.connected()){
response:
+resposnehtml);
client.println(resposnehtml);
client.flush();
delay(1000);
[Clientdisonnected]"
if(flag){
WiFi.mode(WIFI_STA);
setwifimodeSTA"
if(setup_connectWifi(pars[1],pars[2],objName+seqNum)==1){
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());
Stringt=cfg.iotIp;
saveConfig();
WiFi.setAutoConnect(true);
savedconfigdatatocash"
can'
tconnectwifi"
returntrue;
break;
[Clientdisonnected2]"
voidparseHtmlQueryString(Stringqstring,String*ret){
Stringtxt=GetRidOfurlCharacters(qstring);
Stringurl=txt.substring(txt.indexOf("
/"
)+1,txt.indexOf("
\r"
));
intn=url.indexOf("
?
if(n!
=-1){
Stringa=url.substring(0,url.indexOf("
ret[0]=a;
Stringq=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();
ret[0]="
0:
+ret[0]);
1:
+ret[1]);
2:
+ret[2]);
3:
+ret[3]);
StringGetRidOfurlCharacters(StringurlChars)
urlChars.replace("
%0D%0A"
String('
\n'
+"
"
%20"
%21"
!
%22"
String(char('
)));
%23"
#"
%24"
$"
%25"
%"
%26"
%26%2365281%3B"
%27"
String(char(39)));
%28"
("
%29"
)"
%2A"
*"
urlChars.rep