Arduino温湿度烟雾监测上传ThingSpeak_Esp8266
一、项目介绍
本项目使用Arduino作为主控板,使用ESP-01(ESP8266)模块进行联网通信,并将数据上传到Thing Speak网站进行实时监测查看,Thing Speak将以折线图(可视化界面)展示。
Thing Speak展示部分
最终实现三部分数据同时上传并展示
二、准备工作
1.硬件部分
Arduino UNO(崭新出厂)
esp8266-01
MQ烟雾传感器
DHT11温湿度传感器
1.2 ESP8266-01配置(重点)
Esp-01原理图
(PS不同的板子里CH_PD = EN)
在此之前,我们需要将ESP-01刷入AT固件,后续的代码我们需要调用AT固件
对于Esp8266-01刷入AT固件的教程可以参考我的另一篇的博客有详细的教程
1.3 接线
3.软件部分
首先我们需要在Thing Speak官网注册
注册后进入个人频道
在Channels- My Channels
然后在上面NEW一个Channels
注:选择field时一定要选择三个,因为我们要上传三个传感器的数据
创建好之后进入API keys
Write API Keys(我们需要将传感器的数据上传需要的是Write)
之后还有还得把public View的权限设置为公开
方便外界对我们的访问
然后在Add Visualizations里添加可视化组件和(Add Widgets是添加小组件,若有需要,可以在添加组件时候在进行可视化操作)添加组件我们选择折线图
这边可以Title里设置标题名称,右边的Date Min/Max可以设置监测的数值上下限
剩下设置的可以自行个性化发挥
三、代码
代码分析
esp8266-01AT 固件部分
连接Wi-Fi部分:
String AP = "Wi-Fi名称"; // Wi-Fi名称
String PASS = "Wi-Fi密码"; // Wi-Fi密码
String API = "Write-API——KEY"; // 频道的API KEY
String HOST = "api.thingspeak.com"; //连接到Thing Speak官网
String PORT = "80"; //端口80
int countTrueCommand;
int countTimeCommand;
boolean found = false;
int valSensor = 1;
使用AT固件进行连接Wi-Fi指令
以下指令使用AT固件指令,具体可以参考乐鑫官网的AT固件文档
sendCommand("AT",5,"OK"); //发送AT返回OK确定AT固件正常
sendCommand("AT+CWMODE=1",5,"OK");//发送设置模式1
sendCommand("AT+CWJAP=\""+ AP +"\",\""+ PASS +"\"",20,"OK");
完整代码
#include <SoftwareSerial.h> //调用
#include <dht11.h> //调用温湿度库
#include <Arduino.h> //调用
#define RX 2 //定义Arduino的RX引脚为2
#define TX 3 //定义Arduino的TX引脚为3
#define Sensor_A0 A0 //定义烟雾传感器的AO引脚
#define Sensor_D0 7 //定义烟雾传感器的DO引脚
unsigned int sensorValue = 0;
#define dht_apin 11 // 温湿度传感器连接模拟引脚
dht11 dhtObject;
String AP = "Wi-Fi名称"; // Wi-Fi名称
String PASS = "Wi-Fi密码"; // Wi-Fi密码
String API = "Write-API——KEY"; // 频道的API KEY
String HOST = "api.thingspeak.com";
String PORT = "80";
int countTrueCommand;
int countTimeCommand;
boolean found = false;
int valSensor = 1;
SoftwareSerial esp8266(RX,TX);
void setup() {
pinMode(Sensor_D0, INPUT);
Serial.begin(9600);
esp8266.begin(115200);
sendCommand("AT",5,"OK");
sendCommand("AT+CWMODE=1",5,"OK");
sendCommand("AT+CWJAP=\""+ AP +"\",\""+ PASS +"\"",20,"OK");
}
void loop() {
String getData = "GET /update?api_key="+ API +"&field1="+getTemperatureValue()+"&field2="+getHumidityValue()+"&field3="+SmokeValue();
sendCommand("AT+CIPMUX=1",5,"OK");
sendCommand("AT+CIPSTART=0,\"TCP\",\""+ HOST +"\","+ PORT,15,"OK");
sendCommand("AT+CIPSEND=0," +String(getData.length()+4),4,">");
esp8266.println(getData);delay(1500);countTrueCommand++;
sendCommand("AT+CIPCLOSE=0",5,"OK");
}
String getTemperatureValue(){
dhtObject.read(dht_apin);
Serial.print(" Temperature(C)= ");
int temp = dhtObject.temperature;
Serial.println(temp);
delay(50);
return String(temp);
}
String getHumidityValue(){
dhtObject.read(dht_apin);
Serial.print(" Humidity in %= ");
int humidity = dhtObject.humidity;
Serial.println(humidity);
delay(50);
return String(humidity);
}
String SmokeValue(){
sensorValue = analogRead(Sensor_A0);
Serial.print(" Somke : ");
Serial.print(sensorValue);
int smoke = sensorValue;
Serial.println(smoke);
delay(50);
return String(smoke);
}
void sendCommand(String command, int maxTime, char readReplay[]) {
Serial.print(countTrueCommand);
Serial.print(". at command => ");
Serial.print(command);
Serial.print(" ");
while(countTimeCommand < (maxTime*1))
{
esp8266.println(command);//at+cipsend
if(esp8266.find(readReplay))//ok
{
found = true;
break;
}
countTimeCommand++;
}
if(found == true)
{
Serial.println("OYI");
countTrueCommand++;
countTimeCommand = 0;
}
if(found == false)
{
Serial.println("Fail");
countTrueCommand = 0;
countTimeCommand = 0;
}
found = false;
}