#include <ESP8266WiFi.h>
#include <HttpPacket.h>
#include <ArduinoJson.h>
#include "DHT.h"
#define DHTPIN D8 //温湿度传感器接口
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
int led=D5; //LED
int buzzer = D10; //蜂鸣器信号
int relayPin = D2; //继电器信号
int FirePin = D1; //火焰接口
int Human_pin = D3; //人体红外
int CO_Pin = D4; //CO数字接口
int CO_Senor = A0; //CO模拟接口
const char ssid[] = ""; //修改为自己的路由器用户名
const char password[] = ""; //修改为自己的路由器密码
char device_id[] = ""; //设备ID
char API_KEY[] = ""; //API_KEY
char sensor_id1[] = "温度";
char sensor_id2[] = "煤气含量";
char sensor_id3[] = "火焰情况";
char sensor_id4[] = "是否有人";
char sensor_id5[] = "火警等级";
char* OneNetServer = "api.heclouds.com"; //服务器地址
void WIFI()
{
Serial.print("Connecting to " + *ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.println("Connected");
Serial.println("");
}
void postData(char* API_VALUE_temp, char* device_id_temp, char* sensor_id_temp, float thisData)
{
WiFiClient client;
StaticJsonBuffer<250> jsonBuffer;
JsonObject& myJson = jsonBuffer.createObject();
JsonArray& datastreams= myJson.createNestedArray("datastreams");
JsonObject& id_datapoints = datastreams.createNestedObject();
id_datapoints["id"] = sensor_id_temp;
JsonArray& datapoints = id_datapoints.createNestedArray("datapoints");
JsonObject& value = datapoints.createNestedObject();
value["value"] = thisData;
char p[180];
myJson.printTo(p, sizeof(p));
packet.setHostAddress(OneNetServer);
packet.setDevId(device_id_temp);
packet.setAccessKey(API_VALUE_temp);
packet.createCmdPacket(POST, TYPE_DATAPOINT, p);
if (strlen(packet.content)){
Serial.print(packet.content);
}
Serial.println(p);
char cmd[400];
memset(cmd, 0, 400);
strcpy(cmd, packet.content);
strcat(cmd, p);
if (client.connect(OneNetServer, 80)) {
Serial.println("WiFi connected ");
client.print(cmd);
delay(1000);
}
client.stop();
}
void postString(char* API_VALUE_temp, char* device_id_temp, char* sensor_id_temp, char* thisString)
{
WiFiClient client;
StaticJsonBuffer<250> jsonBuffer;
JsonObject& myJson = jsonBuffer.createObject();
JsonArray& datastreams= myJson.createNestedArray("datastreams");
JsonObject& id_datapoints = datastreams.createNestedObject();
id_datapoints["id"] = sensor_id_temp;
JsonArray& datapoints = id_datapoints.createNestedArray("datapoints");
JsonObject& value = datapoints.createNestedObject();
value["value"] = thisString;
char p[180];
myJson.printTo(p, sizeof(p));
packet.setHostAddress(OneNetServer);
packet.setDevId(device_id_temp);
packet.setAccessKey(API_VALUE_temp);
packet.createCmdPacket(POST, TYPE_DATAPOINT, p);
if (strlen(packet.content)){
Serial.print(packet.content);
}
Serial.println(p);
char cmd[400];
memset(cmd, 0, 400);
strcpy(cmd, packet.content);
strcat(cmd, p);
if (client.connect(OneNetServer, 80)) {
Serial.println("connected ");
client.print(cmd);
delay(1000);
}
client.stop();
}
void setup(){
pinMode(Human_pin, INPUT); //设置人体红外接口为输入状态
pinMode(CO_Senor, INPUT); //一氧化碳接口为输入状态
pinMode(FirePin,INPUT);
pinMode(led, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(relayPin, OUTPUT);
digitalWrite(relayPin,LOW);
Serial.begin(9600);
WIFI();
}
void loop() {
/*初始化*/
int F = digitalRead(FirePin);
int t = dht.readTemperature();
int CO = analogRead(CO_Senor); //读取CO传感器数值
int flag = digitalRead(Human_pin);
char* State = "";
char* Person = "";
char* alert = "";
Serial.print("CO:");
Serial.print(CO);
Serial.println("%");
Serial.print("Temp:");
Serial.print(t);
Serial.println("C");
/*数据处理*/
if(flag == 1){
Serial.print(1);
Person = "有人";
}else{
Serial.print(0);
Person = "无人";
}
if(t>30){
Serial.println("Temperature is High!");
digitalWrite(led,HIGH);
digitalWrite(buzzer,HIGH);
digitalWrite(relayPin,HIGH);
}
else{
digitalWrite(buzzer,LOW);
digitalWrite(led,LOW);
digitalWrite(relayPin,LOW);
}
Serial.println(digitalRead(FirePin));
if(F == 1){
digitalWrite(relayPin, HIGH);
digitalWrite(led,HIGH);
digitalWrite(buzzer,HIGH);
State = "有火";
Serial.println("Fire!");
}
else{
State = "无火";
digitalWrite(relayPin, LOW);
}
if(CO > 80){
Serial.print("CO is High!");
digitalWrite(led,HIGH);
digitalWrite(buzzer,HIGH);
digitalWrite(relayPin,HIGH);
}else{
digitalWrite(relayPin,LOW);
}
if((flag == 1)&&(CO>80)&&(t>30)){
alert = "红色警报!";
}
else if((flag == 0)&&(CO>80)&&(t>30)){
alert = "无人危险!";
}
else if((flag == 0)&&(CO>80)){
alert = "煤气泄漏!";
}else{
alert = "安全";
}
postData(API_KEY, device_id, sensor_id1, t);
delay(100);
postData(API_KEY, device_id, sensor_id2, CO);
delay(100);
postString(API_KEY, device_id, sensor_id3, State);
delay(100);
postString(API_KEY, device_id, sensor_id4, Person);
delay(100);
postString(API_KEY, device_id, sensor_id5, alert);
delay(5000); //5s一次循环
}