自己的第一个小项目,发出来分享一下自己的感想。如果有误欢迎指正!·
大概的流程图
先上uno1代码
#include <DFRobot_DHT11.h>
#include <SoftwareSerial.h>
SoftwareSerial dht11_Serial(2,3); //定义一个软串口
DFRobot_DHT11 DHT;
#define DHT11_PIN 6//dht11信号线插到6
void setup() {
Serial.begin(115200);
dht11_Serial.begin(115200);
}
void loop() {
DHT.read(DHT11_PIN);
delay(1); //给延迟让dht11读取完整的数据
char dht_Char[100]; // 增加合适的缓冲区大小
sprintf(dht_Char, "{\"temperature\": %d, \"humidity\": %d}", DHT.temperature, DHT.humidity); // 将温度和湿度的值赋值给dht
dht11_Serial.println(dht_Char);
delay(5000);
}
库文件部分需引用两个库
第一个用来读取dht11的数值,第二个用来定义软串口,进行软串口通信。
软串口通信部分:
首先定义一个软串口
打开软串口通信
读取dht11数据部分:
在引用库文件后
使用库文件里的函数初始化传感器,把dht11的信号线插在uno板的D6
主机向dht11发送开始信号
定义一个char类型数组并把温湿度数据放进去,并打印到软串口
在最后结束时添加5秒的读取延迟。
接着uno2的代码
#include <SoftwareSerial.h>
#include <ArduinoJson.h>
SoftwareSerial dht11_Serial(2, 3); //定义软串口
void setup() {
Serial.begin(115200);
dht11_Serial.begin(115200);
}
void loop() {
if (dht11_Serial.available()) {
String date = dht11_Serial.readString() ; 接收软串口收到的数据
delay(1);//等待接收全部的json数据
// StaticJsonDocument<1024> true_off;
if(dht11_Serial.available()==0){ //判断缓冲区是否还有数据
StaticJsonDocument<200> doc; // 声明一个JsonDocument对象
//Serial.println(date);
DeserializationError error = deserializeJson(doc, date); // 反序列化JSON数据
delay(1);//等待全部json数据反序列化完成
if(doc.is<JsonObject>()){ //判断接收的数据是否为json数据,是就提取数据中的温湿度,否就直接打印接收到的消息
if(!error){ //error的值为1,所以需要一个非门,实现序列化成功才提取数值
int temp_start = date.indexOf(":")+2;
int temp_end = date.indexOf(",");
String temperature = date.substring(temp_start,temp_end);
int humi_start = date.indexOf(":",temp_end)+2;
int humi_end = date.length()-3;
String humidity = date.substring(humi_start,humi_end);
//提取出来的温湿度发送到电脑(硬串口)
Serial.print("温度:");
Serial.print(temperature);
Serial.print("℃ , ");
Serial.print("湿度: ");
Serial.print(humidity);
Serial.println("%");
}
else{
Serial.println("反序列化失败");
}
}
else{
Serial.println(date);//不是json数据就串口接收到什么就打印什么
}
}
}
}
引用两个库文件,分别用来使用软串口通信和进行json数据解析
#include <SoftwareSerial.h>
#include <ArduinoJson.h>
定义一个软串口
SoftwareSerial dht11_Serial(2, 3); //定义软串口
打开串口通信
void setup() {
Serial.begin(115200);
dht11_Serial.begin(115200);
}
剩下的看注释就可
void loop() {
if (dht11_Serial.available()) {
String date = dht11_Serial.readString() ; 接收软串口收到的数据
delay(1);//等待接收全部的json数据
// StaticJsonDocument<1024> true_off;
if(dht11_Serial.available()==0){ //判断缓冲区是否还有数据
StaticJsonDocument<200> doc; // 声明一个JsonDocument对象
//Serial.println(date);
DeserializationError error = deserializeJson(doc, date); // 反序列化JSON数据
delay(1);//等待全部json数据反序列化完成
if(doc.is<JsonObject>()){ //判断接收的数据是否为json数据,是就提取数据中的温湿度,否就直接打印接收到的消息
if(!error){ //error的值为1,所以需要一个非门,实现序列化成功才提取数值
int temp_start = date.indexOf(":")+2;
int temp_end = date.indexOf(",");
String temperature = date.substring(temp_start,temp_end);
int humi_start = date.indexOf(":",temp_end)+2;
int humi_end = date.length()-3;
String humidity = date.substring(humi_start,humi_end);
//提取出来的温湿度发送到电脑(硬串口)
Serial.print("温度:");
Serial.print(temperature);
Serial.print("℃ , ");
Serial.print("湿度: ");
Serial.print(humidity);
Serial.println("%");
}
else{
Serial.println("反序列化失败");
}
}
else{
Serial.println(date);//不是json数据就串口接收到什么就打印什么
}
}
}
}
这次小项目的完成,也给了我很多成就感和满足感,同时也加强了我上网查找知识的能力