目录
1.前期准备
2.ESP8266代码
3.Arduino代码
4.易联智能
由于自己是物联网工程专业的学生,所以对于一些单片机等硬件都必须要有一些了解,接着这次做课设的机会,我打算将自己的这次做课设的经验记录下来,以便于以后自己的CV。万一以后需要用到这些,而自己又忘记了,因为我并不打算走硬件这条路。做好记录,以备不时之需。
首先是使用Arduino连接各种所需要的传感器,例如:温湿度、光照、等等。这些感觉还是比较简单的,只需要搞清楚所用传感器的引脚该如何去连接,一般情况如下:
VCC——正极
GND——负极
DO——(连接一个数字引脚,Arduino为2~13)
AO——(连接一个模拟引脚,Arduino为A0~A5)
其他的大部分能够在网上找到相关教程,这里就不多讲了。
首先我们需要准备一个8266模块和一个下载器。
下载器
ESP8266
需要注意的是,当需要将代码通过下载器下载到ESP8266使,需要进行一些操作,否则会导致下载失败。
将两个短孔短接 ,不然会导致下载失败
随后进行一系列准备工作,
第一步:
附加网址:https://arduino.esp8266.com/stable/package_esp8266com_index.json
第二步:相关库下载
进入工具->开发板->开发板管理器添加esp8266库
进入工具->管理库添加 pubsubclient 库和 ArduinoJson 库
将库安装好以后就可以进行下一步了。
如果你需要使用此代码,只需要修改WIFI账号跟密码以及sub和pub。
建议:
特别注意:我使用的是易联智能云平台,这里所说的sub和pub也都是基于此平台而来的。
下面附上相关网址:易联智能物联网平台
该平台相较于其他云平台,使用起来更为简单、比较适合初学者。
上传至ESP8266的代码:
#include
#include
#include
#include
#define BUILTIN_LED 2
#define MSG_BUFFER_SIZE (50)
#define STASSID "good"//wifi名称
#define STAPSK "12345678"//wifi密码
StaticJsonDocument<400> sendJson;
StaticJsonDocument<400> readJson;
unsigned long lastUpdateTime = 0;
const char* ssid = STASSID;
const char* password = STAPSK;
char msg[MSG_BUFFER_SIZE];
WiFiClient espClient;
PubSubClient client(espClient);
const char* ID = "100113";
const char* Secret = "6ImLfL1d";
const unsigned long updateInterval = 5000;
char sub[] = "Sub/100113";
char pub[] = "Pub/100113";
const char* mqtt_server = "1.116.67.152";
void setup() {
Serial.begin(9600);
pinMode(BUILTIN_LED, OUTPUT);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
digitalWrite(BUILTIN_LED, HIGH);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
if (millis() - lastUpdateTime > updateInterval) {// 数据定时上报
sendJsonData();
lastUpdateTime = millis();
}
}
void callback(char *topic, byte *payload, unsigned int length) {
String inputString;
for (int i = 0; i < length; i++) {
inputString += (char)payload[i];
}
Serial.println(inputString);
int jsonBeginAt = inputString.indexOf("{");
int jsonEndAt = inputString.lastIndexOf("}");
if (jsonBeginAt != -1 && jsonEndAt != -1) {
inputString = inputString.substring(jsonBeginAt, jsonEndAt + 1);
deserializeJson(readJson, inputString);
sendJsonData();
}
}
void setup_wifi() {
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
while (!client.connected()) {
String clientId = "Esp8266";
clientId += "100113";
if (client.connect(clientId.c_str(), ID, Secret)) {
client.subscribe(sub);
}
else {
Serial.print(client.state());
delay(5000);
}
}
}
void sendJsonData() {
sendJson["ID"] = ID;
String pubres;
serializeJson(sendJson, pubres);
int str_len = pubres.length() + 1;
char char_array[str_len];
pubres.toCharArray(char_array, str_len);
client.publish(pub, char_array);
}
这个就没啥好讲的了,但有些连线需要提一下
ESP8266连接Arduino:
3V3——3.3V
EN——3.3V
GND——负极
RX——连Arduino上的TX
TX——连Arduino上的RX
如果没有将RX与TX接反,那么云平台接收不到上传的数据。
在将Arduino代码上传至Arduino板的时候,一定要将RX和TX拔掉,不然会导致代码无法上传。当年就是这个坑,搞了我一下午,人都搞麻了。。。
上传时Arduino的代码 :
#include
#include
#include
#include
#include "Adafruit_SGP30.h"
#define FAN 3 // 风扇
#define SUN A2 //定义模拟口A5
#define CO A0 //定义模拟口A0 气体
#define DHTPIN 7 //温湿度
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
StaticJsonDocument<400> sendJson; // 创建JSON对象,用来向树莓派发送数据
StaticJsonDocument<400> readJson; // 创建JSON对象,用来存放接收到的数据
unsigned long lastUpdateTime = 0; //记录上次上传数据时间
const unsigned long updateInterval = 2000; // 数据上传间隔时间4秒
//********************全局变量**********************************
long ID = 100113; // 定义设备ID号
float temp, humi;
int tempFlag = 24;//定义温度阈值
int sun = 0;//光照强度
int eCO2 = 0;
//*******************setup*********************
void setup() {
Serial.begin(9600); //设置波特率参数
Wire.begin();
pinMode(CO, INPUT);
pinMode(SUN, INPUT); //火焰传感器
pinMode(FAN, OUTPUT); //风扇
Serial.println(F("数据接收开始!"));
dht.begin();
}
//*************************loop**********************************
void loop() {
sendJsonData();
while (Serial.available() > 0) { // 判断串口缓冲区是否有消息
String inputString = Serial.readStringUntil('\n'); //从串口缓冲区读入数据,并赋值给inputString变量(String变量为Arduino独有变量类型,可以简化字符串操作)
//检测json数据是否完整,若通过则进行下一步的处理
/*
云平台向硬件下发JSON的格式为 {"Light":"1"} 类型的字符串,通常叫键值对,C语言中叫做哈希表。
左边的"Air"为我们在云平台中定义的标识符,右边为具体的指令
*/
int jsonBeginAt = inputString.indexOf("{");
int jsonEndAt = inputString.lastIndexOf("}");
if (jsonBeginAt != -1 && jsonEndAt != -1)
{
inputString = inputString.substring(jsonBeginAt, jsonEndAt + 1); //净化json数据
deserializeJson(readJson, inputString); //通过ArduinoJSON库将JSON字符串转换为方便操作的对象
// 判断接收的指令
// 风扇温度设定
if (readJson.containsKey("tempFlag")) {
tempFlag = (int)readJson["tempFlag"]; // 让Arduino中的空调设定值更新为云平台下放的值
}
delay(500);
sendJsonData(); //向云平台发送最新的信息
}
}
//气体传感器
eCO2 = analogRead(CO);
eCO2 = map(sun, 0, 4950, 0, eCO2); //把0-4095值转化为0-100
Serial.println(eCO2, DEC);
//*****************光照强度**********
sun = analogRead(SUN); //读取模拟口AD5的值,存入sun变量
sun = map(sun, 0, 1000, 1000, 0); //把0-4095值转化为0-100
Serial.println(sun); //串口输出sun变量的值,并换行
//*************温湿度*******************
temp = dht.readTemperature();
humi = dht.readHumidity();
Serial.println("温");
Serial.println(temp);
Serial.println("湿");
Serial.println(humi);
if (temp > tempFlag) {
digitalWrite(FAN, HIGH); //温度高,风扇启动
} else {
digitalWrite(FAN, LOW); //低温,风扇关闭
}
delay(1500);
}
//************************相关函数***************************
void sendJsonData()
{
sendJson["ID"] = 100113;
sendJson["Temp"] = temp;//温度
sendJson["Humi"] = humi;//湿度
sendJson["Sun"] = sun;//光照强度
sendJson["tempFlag"] = tempFlag;//温度阈值
sendJson["eCO2"] = eCO2;
String pubres;
serializeJson(sendJson, pubres);
Serial.println(pubres);
}
易联智能是由安徽工程大学物联网开放创新实验室开发的智能化教学应用物联网平台。其具有零代码开发、MCU 低代码开发等特性,使用户可以快速搭建出属于自己的物联网应用。同时具备开发板等配套设施,供用户进行进一步的学习。