1. 前言
隨著社會的不斷發展和人們生活水平的逐漸提高,人們逐漸追求高質量的生活,很多人都會選擇在家里或辦公室種植一些花卉以凈化家庭空氣,陶冶情操,但是很多人忙于工作、學習、出差、旅游或者一些其他的原因,不能及時地對花卉進行照料,短時間內導致很多花卉因缺水分而影響正常生長,長時間不照料有些名貴的花卉直接死亡。基于上述狀況,提出了此基于物聯網的智慧澆花系統。該系統采用工業級高精度土壤溫濕度傳感器采集花盆中的突然溫濕度,環境的溫度濕度,通過ESP8266 WIFI實時上傳當前的土壤溫濕度、環境光照度等數據到華為云物聯網云平臺,可以通過 app實時查看花卉的土壤濕度、環境溫度等信息,并且本地通過OLED顯示屏實時顯示這些信息,可以設定某種花適宜的生長的土壤濕度條件,實現自動控制給花澆水,即能讓花卉生長在適宜的濕度下,與目前市場上的自動澆花系統相比,該系統的特點具有遠程控制,低成本、極高的資源利用率、操作簡單和反應靈敏等。
2. 整體系統設計
主控MCU選擇STM32F103芯片,通過土壤濕度傳感器、環境溫濕度傳感器,檢測整個周邊環境信息,再通過ESP8266 WIFI傳遞到物聯網平臺。程序里可以預設濕度閥值,當檢測到土壤濕度低于閥值就自動澆花。在手機APP上可以實現遠程控制水泵澆花,本地在搭載一個TFT小尺寸顯示屏,可以實時顯示測量檢測的數據,在辦公室里也可以通過TFT彩屏顯示屏解周圍環境的信息。
3. 應用側軟件運行效果
4. 硬件運行效果
5. 創建產品、設備
6.硬件核心代碼–ESP8266
#include "esp8266.h"
u8 ESP8266_IP_ADDR[16]; //255.255.255.255
u8 ESP8266_MAC_ADDR[18]; //硬件地址
/*
函數功能: ESP8266命令發送函數
函數返回值:0表示成功 1表示失敗
*/
u8 ESP8266_SendCmd(char *cmd)
{
u8 i,j;
for(i=0;i<10;i++) //檢測的次數--發送指令的次數
{
USARTx_StringSend(USART2,cmd);
for(j=0;j<100;j++) //等待的時間
{
delay_ms(50);
if(USART2_RX_FLAG)
{
USART2_RX_BUFFER[USART2_RX_CNT]='\0';
USART2_RX_FLAG=0;
USART2_RX_CNT=0;
if(strstr((char*)USART2_RX_BUFFER,"OK"))
{
return 0;
}
}
}
}
return 1;
}
/*
函數功能: ESP8266硬件初始化檢測函數
函數返回值:0表示成功 1表示失敗
*/
u8 ESP8266_Init(void)
{
//退出透傳模式
USARTx_StringSend(USART2,"+++");
delay_ms(100);
//退出透傳模式
USARTx_StringSend(USART2,"+++");
delay_ms(100);
return ESP8266_SendCmd("AT\r\n");
}
/*
函數功能: 一鍵配置WIFI為AP+TCP服務器模式
函數參數:
char *ssid 創建的熱點名稱
char *pass 創建的熱點密碼 (最少8位)
u16 port 創建的服務器端口號
函數返回值: 0表示成功 其他值表示對應錯誤值
*/
u8 ESP8266_AP_TCP_Server_Mode(char *ssid,char *pass,u16 port)
{
char *p;
u8 i;
char ESP8266_SendCMD[100]; //組合發送過程中的命令
/*1. 測試硬件*/
if(ESP8266_SendCmd("AT\r\n"))return 1;
/*2. 關閉回顯*/
if(ESP8266_SendCmd("ATE0\r\n"))return 2;
/*3. 設置WIFI模式*/
if(ESP8266_SendCmd("AT+CWMODE=2\r\n"))return 3;
/*4. 復位*/
ESP8266_SendCmd("AT+RST\r\n");
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
/*5. 關閉回顯*/
if(ESP8266_SendCmd("ATE0\r\n"))return 5;
/*6. 設置WIFI的AP模式參數*/
sprintf(ESP8266_SendCMD,"AT+CWSAP=\"%s\",\"%s\",1,4\r\n",ssid,pass);
if(ESP8266_SendCmd(ESP8266_SendCMD))return 6;
/*7. 開啟多連接*/
if(ESP8266_SendCmd("AT+CIPMUX=1\r\n"))return 7;
/*8. 設置服務器端口號*/
sprintf(ESP8266_SendCMD,"AT+CIPSERVER=1,%d\r\n",port);
if(ESP8266_SendCmd(ESP8266_SendCMD))return 8;
/*9. 查詢本地IP地址*/
if(ESP8266_SendCmd("AT+CIFSR\r\n"))return 9;
//提取IP地址
p=strstr((char*)USART2_RX_BUFFER,"APIP");
if(p)
{
p+=6;
for(i=0;*p!='"';i++)
{
ESP8266_IP_ADDR[i]=*p++;
}
ESP8266_IP_ADDR[i]='\0';
}
//提取MAC地址
p=strstr((char*)USART2_RX_BUFFER,"APMAC");
if(p)
{
p+=7;
for(i=0;*p!='"';i++)
{
ESP8266_MAC_ADDR[i]=*p++;
}
ESP8266_MAC_ADDR[i]='\0';
}
//打印總體信息
printf("當前WIFI模式:AP+TCP服務器\n");
printf("當前WIFI熱點名稱:%s\n",ssid);
printf("當前WIFI熱點密碼:%s\n",pass);
printf("當前TCP服務器端口號:%d\n",port);
printf("當前TCP服務器IP地址:%s\n",ESP8266_IP_ADDR);
printf("當前TCP服務器MAC地址:%s\n",ESP8266_MAC_ADDR);
return 0;
}
/*
函數功能: TCP服務器模式下的發送函數
發送指令:
*/
u8 ESP8266_ServerSendData(u8 id,u8 *data,u16 len)
{
u8 i,j,n;
char ESP8266_SendCMD[100]; //組合發送過程中的命令
for(i=0;i<10;i++)
{
sprintf(ESP8266_SendCMD,"AT+CIPSEND=%d,%d\r\n",id,len);
USARTx_StringSend(USART2,ESP8266_SendCMD);
for(j=0;j<10;j++)
{
delay_ms(50);
if(USART2_RX_FLAG)
{
USART2_RX_BUFFER[USART2_RX_CNT]='\0';
USART2_RX_FLAG=0;
USART2_RX_CNT=0;
if(strstr((char*)USART2_RX_BUFFER,">"))
{
//繼續發送數據
USARTx_DataSend(USART2,data,len);
//等待數據發送成功
for(n=0;n<200;n++)
{
delay_ms(50);
if(USART2_RX_FLAG)
{
USART2_RX_BUFFER[USART2_RX_CNT]='\0';
USART2_RX_FLAG=0;
USART2_RX_CNT=0;
if(strstr((char*)USART2_RX_BUFFER,"SEND OK"))
{
return 0;
}
}
}
}
}
}
}
return 1;
}
/*
函數功能: 配置WIFI為STA模式+TCP客戶端模式
函數參數:
char *ssid 創建的熱點名稱
char *pass 創建的熱點密碼 (最少8位)
char *p 將要連接的服務器IP地址
u16 port 將要連接的服務器端口號
u8 flag 1表示開啟透傳模式 0表示關閉透傳模式
函數返回值:0表示成功 其他值表示對應的錯誤
*/
u8 ESP8266_STA_TCP_Client_Mode(char *ssid,char *pass,char *ip,u16 port,u8 flag)
{
char ESP8266_SendCMD[100]; //組合發送過程中的命令
//退出透傳模式
//USARTx_StringSend(USART2,"+++");
//delay_ms(50);
/*1. 測試硬件*/
if(ESP8266_SendCmd("AT\r\n"))return 1;
/*2. 關閉回顯*/
if(ESP8266_SendCmd("ATE0\r\n"))return 2;
/*3. 設置WIFI模式*/
if(ESP8266_SendCmd("AT+CWMODE=1\r\n"))return 3;
/*4. 復位*/
ESP8266_SendCmd("AT+RST\r\n");
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
/*5. 關閉回顯*/
if(ESP8266_SendCmd("ATE0\r\n"))return 5;
/*6. 配置將要連接的WIFI熱點信息*/
sprintf(ESP8266_SendCMD,"AT+CWJAP=\"%s\",\"%s\"\r\n",ssid,pass);
if(ESP8266_SendCmd(ESP8266_SendCMD))return 6;
/*7. 設置單連接*/
if(ESP8266_SendCmd("AT+CIPMUX=0\r\n"))return 7;
/*8. 配置要連接的TCP服務器信息*/
sprintf(ESP8266_SendCMD,"AT+CIPSTART=\"TCP\",\"%s\",%d\r\n",ip,port);
if(ESP8266_SendCmd(ESP8266_SendCMD))return 8;
/*9. 開啟透傳模式*/
if(flag)
{
if(ESP8266_SendCmd("AT+CIPMODE=1\r\n"))return 9; //開啟
if(ESP8266_SendCmd("AT+CIPSEND\r\n"))return 10; //開始透傳
if(!(strstr((char*)USART2_RX_BUFFER,">")))
{
return 11;
}
//如果想要退出發送: "+++"
}
printf("WIFI模式:STA+TCP客戶端\r\n");
printf("Connect_WIFI熱點名稱:%s\r\n",ssid);
printf("Connect_WIFI熱點密碼:%s\r\n",pass);
printf("TCP服務器端口號:%d\r\n",port);
printf("TCP服務器IP地址:%s\r\n",ip);
return 0;
}
/*
函數功能: TCP客戶端模式下的發送函數
發送指令:
*/
u8 ESP8266_ClientSendData(u8 *data,u16 len)
{
u8 i,j,n;
char ESP8266_SendCMD[100]; //組合發送過程中的命令
for(i=0;i<10;i++)
{
sprintf(ESP8266_SendCMD,"AT+CIPSEND=%d\r\n",len);
USARTx_StringSend(USART2,ESP8266_SendCMD);
for(j=0;j<10;j++)
{
delay_ms(50);
if(USART2_RX_FLAG)
{
USART2_RX_BUFFER[USART2_RX_CNT]='\0';
USART2_RX_FLAG=0;
USART2_RX_CNT=0;
if(strstr((char*)USART2_RX_BUFFER,">"))
{
//繼續發送數據
USARTx_DataSend(USART2,data,len);
//等待數據發送成功
for(n=0;n<200;n++)
{
delay_ms(50);
if(USART2_RX_FLAG)
{
USART2_RX_BUFFER[USART2_RX_CNT]='\0';
USART2_RX_FLAG=0;
USART2_RX_CNT=0;
if(strstr((char*)USART2_RX_BUFFER,"SEND OK"))
{
return 0;
}
}
}
}
}
}
}
return 1;
}
審核編輯:湯梓紅
-
物聯網
+關注
關注
2910文章
44778瀏覽量
374694 -
STM32F103
+關注
關注
33文章
477瀏覽量
63707 -
ESP8266
+關注
關注
50文章
962瀏覽量
45137 -
華為云
+關注
關注
3文章
2607瀏覽量
17483
發布評論請先 登錄
相關推薦
評論