两块uno板使用软串口通信,读取dht11温湿度数据再发送给另一个uno,使用json解析提取温湿度数据。

自己的第一个小项目,发出来分享一下自己的感想。如果有误欢迎指正!·

大概的流程图

先上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数据就串口接收到什么就打印什么
    }
  }
  }
}

这次小项目的完成,也给了我很多成就感和满足感,同时也加强了我上网查找知识的能力 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
这里假设两个Arduino Uno之间通过串口通信,而两个电机分别使用PWM信号控制,以下为一种简单的实现方案: Arduino Uno1代码: ```c++ // 定义串口通信波特率 #define BAUDRATE 9600 // 定义两个电机控制引脚 #define MOTOR1_PIN 3 #define MOTOR2_PIN 5 void setup() { // 初始化串口通信 Serial.begin(BAUDRATE); // 设置电机控制引脚为输出模式 pinMode(MOTOR1_PIN, OUTPUT); pinMode(MOTOR2_PIN, OUTPUT); } void loop() { // 发送两个数据给Arduino Uno2 int data1 = 50; int data2 = 100; Serial.write(data1); Serial.write(data2); // 控制两个电机 analogWrite(MOTOR1_PIN, data1); analogWrite(MOTOR2_PIN, data2); delay(1000); } ``` Arduino Uno2代码: ```c++ // 定义串口通信波特率 #define BAUDRATE 9600 // 定义两个电机控制引脚 #define MOTOR1_PIN 3 #define MOTOR2_PIN 5 void setup() { // 初始化串口通信 Serial.begin(BAUDRATE); // 设置电机控制引脚为输出模式 pinMode(MOTOR1_PIN, OUTPUT); pinMode(MOTOR2_PIN, OUTPUT); } void loop() { if (Serial.available() >= 2) { // 从Arduino Uno1接收两个数据 int data1 = Serial.read(); int data2 = Serial.read(); // 控制两个电机 analogWrite(MOTOR1_PIN, data1); analogWrite(MOTOR2_PIN, data2); } } ``` 这样通过串口通信,Arduino Uno1发送两个数据给Arduino Uno2,Arduino Uno2接收到数据后控制两个电机。同时,Arduino Uno1也控制了两个电机,两个主的操作是同步的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值