Arduino判断,DH11温湿度传感器采集的数据。ESP8266模块连接WiFi,将数据按post协议上传至OneNET服务器,用户可在平台实时查看温湿度数据。设定温湿度值上限与下限,若温湿度数据超过设定范围,则开启风扇,同时触发蜂鸣器报警,使用SIM900A模块发送短信到指定的手机号。
硬件结构:
Arduino管脚图如图所示:
Arduino Uno可通过USB连接或者外部电源供电。外部(非USB)电源可以是AC-DC适配器,也可以是电池。电路板可由6-20V外部电源供电。然而,如果电源电压低于7V,那么5V引脚可能会提供低于5V的电压,电路板也许会不稳定。如果电源电压超过12V,稳压器可能会过热,从而损坏电路板。电压范围建议为7~12V。
Arduino单片机和DHT11传感器之间只要连一个数字口,DATA接11口就可以了(随便你定义)。DHT11传感器的引脚VCC可以接Arduino 的5V供电,GND脚接Arduino的地,空脚悬空不接。
#include "dht11.h"
DHT11 myDHT11(11);
int temp=1;
int humi=1;
myDHT11.DHT11_Read(); //读取温湿度值
这是部分代码,dht11的库是网上找的一个,调用就可以了。
将WiFi模块的VCC和CH_PD端共接电源5V,将WiFi模块的GND接GND。模块URXD接Arduino开发板的TXD,UTXD接Arduino开发板的RXD。自带有一个信号指示灯和一个电源指示灯。在接上正确的电源后,红灯长亮,表示模块已经开始工作。在串口发送AT指令或者数据时,WiFi模块的蓝色指示灯会轻微的闪烁后熄灭。
串口初始化需要对相应的寄存器进行初始化,在这里我设置其串口波特率为115200
Serial.begin(115200);
向OneNET云平台发送HTTP数据包时,要包含设备ID和APIKEY,这里我在程序开始就设置,而不是在post请求中就是为了方便修改。用如下函数即可:
#define DevicesID 516128482
char APIkey[] = "wsZg=kanSndl6XnjadWqwbgDi=E=";
编辑函数set_ESP8266(),由AT命令使WiFi连接路由器和OneNET云平台
void set_ESP8266(void)
{
Serial.println("AT"); //判断模块是否正常
Serial.println("AT+CWMODE=3"); //设置WIFI应用模式
Serial.println("AT+RST"); //重置WIFI模块
Serial.print("AT+CWJAP=\""); //连接无线路由器
Serial.print(ssid);
Serial.print("\",\"");
Serial.print(password);
Serial.println("\"");
Serial.println("AT+CIPSTART=\"TCP\",\"183.230.40.33\",80"); //和服务器建立TCP连接
Serial.println("AT+CIPMODE=1"); //进入透明传输模式
Serial.println("AT+CIPSEND"); //开始传输
}
合成POST请求。固定的POST头部加之前设定的设备ID和APIKEY,然后调用温度函数,把温度加进请求。最后要注意的是预先设定整个POST包的长度,长度错误是传不上去数据的。
void ESP8266_SendMessage(void){
Serial.print("POST /devices/");
Serial.print(DevicesID);
Serial.println("/datapoints HTTP/1.1");
Serial.print("api-key:");
Serial.println(APIkey);
Serial.println("Host:api.heclouds.com");
Serial.println("Content-Length: 59");
Serial.println("");
Serial.print("{\"datastreams\":[{\"id\":\"Temp\",\"datapoints\":[{\"value\":");
Serial.print(myDHT11.TEM_Buffer_Int);
Serial.println("}]}]}");
}
我的代码中的POST包的长度是写死的59位,传的是两位的温度和湿度,如果传一位数会传不上。可以自己改改加个计算长度的
int chang;
String fa;
fa = "{\"X_Acceleration\": " + APIkey + ",\"Y_Acceleration\": " +String(AngleY)+",\"Z_Acceleration\": "+String(AngleZ)+"}";//定义发送数据格式
chang = fa.length();//获取发送数据长度
模块使用的SIM卡是标准大小,也就是俗称的大卡其它的型号可以使用SIM卡卡套。
模块需要5V供电,本设计USB提供5V电源和接地。接线引脚:
Arduino SIM900A
5V -> 5V 供电
GND -> GND 电源地
TXD -> 5VRXD 模块接收
RXD -> 5VTXD 模块发送
主循环中使用if函数判断温湿度值是否超限,超限就调用SIM900A_SendMessage()函数发送短信报警。因网络延迟和处理速度,每次命令发送后应该延时几秒等待响应。
mySerial.begin(9600); //设置sim900a波特率为9600
if(myDHT11.TEM_Buffer_Int>30 || myDHT11.HUMI_Buffer_Int>50)
{
SIM900A_SendMessage();
}
void SIM900A_SendMessage()
{
mySerial.print("AT+CSCS=\"GSM\"\r\n"); //设置GSM字符集
mySerial.print("AT+CMGF=1\r\n"); //设置为文本模式
mySerial.print("AT+CMGS=\"18888888888\"\r\n"); //设置手机号
mySerial.print("HUMI = ");
mySerial.print(myDHT11.HUMI_Buffer_Int);
mySerial.println(" %RH");
mySerial.print("TMEP = ");
mySerial.print(myDHT11.TEM_Buffer_Int);
mySerial.println(" ℃");
mySerial.write(0x1A); //“CTRL+Z”的键值,执行发送操作 (HEX)格式单独发送
}
使用5v小风扇控制温湿度,使用汇科4100F-DC5V-SHG继电器组成控制电路,做控制开关。
继电器引脚1 3是常开点,2 5是线圈,6 4是常闭点。风扇负极接地,正极接继电器1脚,2、3脚接5V供电,5脚接Arduino控制口9。
通过驱动电路控制蜂鸣器,使用的材料有1K欧姆电阻、PNP型三极管(型号8550)和有源蜂鸣器。三极管的B脚,就是基极通过一个1K欧姆电阻接到Arduino开发板的输出端口10,A脚是集电极要接地,C脚发射极接有源蜂鸣器的负极,而蜂鸣器的正极接5V供电。
噢噢最后还有个云平台的设置,完整的代码就放到下一篇里面了。