【R78/G15 开发板测评】串口打印 DHT11 温湿度传感器、DS18B20 温度传感器数据,LabVIEW 上位机绘制演化曲线

news2024/11/12 9:03:11

【R78/G15 开发板测评】串口打印 DHT11 温湿度传感器、DS18B20 温度传感器数据,LabVIEW 上位机绘制演化曲线

主要介绍了 R78/G15 开发板基于 Arduino IDE 环境串口打印温湿度传感器 DHT11 和温度传感器 DS18B20 传感器的数据,并通过LabVIEW上位机绘制演化曲线。

DHT11

DHT11 数字温湿度传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。

简介

DHT11 内置一个电阻式感湿元件和一个 NTC 测温元件,DHT11 为 4 针单排引脚封装,采用单线制串行接口,只需加适当的上拉电阻,信号传输距离可达20米以上。

dht11_pins

DHT11 工作参数:

  • 湿度测量范围:20~90%RH
  • 湿度测量精度:±5%RH
  • 温度测量范围:0~50℃
  • 温度测量精度:±2℃
  • 工作电压:DC 3.3V/5V

DHT11 采用单总线协议,也就是使用一根 DATA 线进行数据的收发。DHT11 的 DATA 线一次通讯时间 4ms 左右,数据分整数部分、小数部分和校验位,具体为: 8bit 湿度整数数据 + 8bit 湿度小数数据 + 8bit 温度整数数据 + 8bit 温度小数数据 + 8bit 校验位。

时序图

dht11_time

DHT11 的 DATA 传输一次完整的数据为 40bit,按照高位在前,低位在后的顺序传输。

数据格式为:8bit 湿度整数数据 + 8bit 湿度小数数据 + 8bit 温度整数数据 + 8bit 温度小数数据 + 8bit 校验位,一共 5 字节(40bit)数据。

代码

由于直接调用 DHT11.h 库函数出错,因此需要自己编写 DHT11 驱动函数

int dhPin = 4;  // 温湿度信号接脚连入 Pin 4
byte dat[5];   // 存放湿度2byte, 温度 2 byte, checksum 1 byte
byte readData() {  // 每次读取 8 bits  ( one byte)
  byte data = 0 ; // 初始化数据,不然可能出错
  for (int i = 0; i < 8; i++) {
    if (digitalRead(dhPin) == LOW) {  // 一开始要 LOW 才表示要传过来
      while (digitalRead(dhPin) == LOW); //等待 50us;
      // 现在已经变成 HIGH 了
      delayMicroseconds(30); //判断高电平持续时间,以判定资料是‘0’还是‘1’;
      if (digitalRead(dhPin) == HIGH) // 持续了 30 us 以上就是 1
        data |= (1 << (7 - i)); //高位在前,低位元在后;
      while (digitalRead(dhPin) == HIGH); // 等待下一bit的接收;
    }
  }
  return data;
}
void start_test() 
{  // 每次要与 DHT11 沟通
  digitalWrite(dhPin, LOW); //拉低到 LOW,发送表示要开始沟通的信号;
  delay(30); //延时要大于 18ms,以便 DHT11 能检测到开始信号;我们用30ms
  digitalWrite(dhPin, HIGH);  // 拉高HIGH, 让 DHT11 拉低到 LOW 告诉我们要传送
  delayMicroseconds(40);  // 给40us等待 DHT11 响应;
  pinMode(dhPin, INPUT); // 改为输入 mode 准备 digitalRead( )
  while (digitalRead(dhPin) == HIGH);  // 必须等到 LOW
  delayMicroseconds(80); //DHT11 发出响应,会拉低 80us;所以至少等80us
  while (digitalRead(dhPin) == LOW); // 继续等到变 HIGH
  delayMicroseconds(80); //DHT11 会拉高到HIGH 80us 后开始发送数据;
  for (int i = 0; i < 5; i++) dat[i] = readData(); //接收温湿度资料,校验位元;
  pinMode(dhPin, OUTPUT); // 改为 Output mode, 准备拉高HIGH
  digitalWrite(dhPin, HIGH); //发送完一次资料后释放bus,等待下一次开始信号;
}
void setup(  ) {
  Serial.begin(9600);
  Serial.println("begin!");
  pinMode(dhPin, OUTPUT);
}
void loop(  ) {
  start_test( );
  Serial.print("Current humdity = ");
  Serial.print(dat[0], DEC); //显示湿度的整数部分;
  Serial.print('.');
  Serial.print(dat[1], DEC); //显示湿度的小数位;
  Serial.println(" %");
  Serial.print("Current temperature = ");
  Serial.print(dat[2], DEC); //显示温度的整数部分;
  Serial.print('.');
  Serial.print(dat[3], DEC); //显示温度的小数位;
  Serial.println(" C");
  delay(1985);
}

参考:基于arduino的dht11温湿度传感器的使用 。

效果

硬件连接

电路

application

实物连线

wire

串口打印

UART

dht11_printf

DS18B20

DS18B20 数字温度计是 DALLAS 公司生产的 1-Wire 单总线器件,具有线路简单、体积小的特点。

简介

ds18b20

特点:

  • 独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
  • 测温范围 -55℃~+125℃,固有测温误差 1℃。
  • 支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,实现多点测温,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定。
  • 工作电源: 3.0~5.5V/DC (可以数据线寄生电源)
  • 在使用中不需要任何外围元件
  • 测量结果以9~12位数字量方式串行传送

电路

模块

ds18b20_mode

电路

ds18b20_mode

时序图

ds18b20_time_sequence

代码

这里同样是库函数无法正常加载,因此不使用库函数驱动 DS18B20

int DS18B20DQ = 4;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
}
void loop() {
  float t;
  t= Ds18b20GetTemp();
  Serial.print("The temperature is :");
  Serial.println(t);
  delay(2000);
}
void Ds18b20Rst(void)
{
     pinMode(DS18B20DQ,OUTPUT);
     digitalWrite(DS18B20DQ,LOW);
     delayMicroseconds(750);//主机发送复位脉冲480us-960us
     digitalWrite(DS18B20DQ,HIGH);
     delayMicroseconds(15);//18b20等待15-60us  
}
/*等待18b20响应
 * 返回1:未检测到18b20
 * 返回0:存在
 */
byte Ds18b20Check()
{ 
   byte retry=0;
   pinMode(DS18B20DQ,INPUT);
   while(digitalRead(DS18B20DQ)&&retry<200)
       {   retry++;
           delayMicroseconds(1);
         }
   if(retry>=200)return 1;
   else retry=0;
   while(!digitalRead(DS18B20DQ)&&retry<240)
   {
       retry++;
       delayMicroseconds(1);
    } 
    if(retry>240)return 1;
    return 0;   
  }
/*从18b20读取一个位
 * 返回值1/0
 */
byte Ds18b20ReadBit(void)
{
     byte data;
     pinMode(DS18B20DQ,OUTPUT);
     digitalWrite(DS18B20DQ,LOW);
     delayMicroseconds(2);
     digitalWrite(DS18B20DQ,HIGH);
     pinMode(DS18B20DQ,INPUT);
     delayMicroseconds(12);
     if(digitalRead(DS18B20DQ))data=1;
     else data=0;
     delayMicroseconds(50);
     return data;
  }
/*从18b20读取一个字节
 * 返回值:读到的数据
 */
byte Ds18b20ReadByte(void)
{
    byte i,j,dat;
    dat=0;
    for(i=1;i<=8;i++)
    {
        j=Ds18b20ReadBit();
        dat=(j<<7)|(dat>>1);//低位在前
      }
    return dat;
  }
/*写一个字节到Ds18b20
 * dat:要写入的字节
 */
void Ds18b20WriteByte(byte dat)
{ 
   byte i;
   byte temp;
   pinMode(DS18B20DQ,OUTPUT);
   for(i=1;i<=8;i++)
   {
      temp=dat&0x01;
      dat=dat>>1;
      if (temp)//write 1
      {
          digitalWrite(DS18B20DQ,LOW);
          delayMicroseconds(2); 
          digitalWrite(DS18B20DQ,HIGH);
          delayMicroseconds(60); 
        }
       else
       {
          digitalWrite(DS18B20DQ,LOW);
          delayMicroseconds(60); 
          digitalWrite(DS18B20DQ,HIGH);
          delayMicroseconds(2); 
        }
    }
  }
 
/*开始温度转换
 *
 */
void Ds18b20Start(void)
{
   Ds18b20Rst();
   Ds18b20Check();
   Ds18b20WriteByte(0XCC);
   Ds18b20WriteByte(0X44);
 }
/*从Ds18b20得到温度值
 * 精度0.1c
 * 返回值:温度值(-550-1250)
 */
float Ds18b20GetTemp()
{
   byte temp;
   byte TH=0,TL=0;
   short tem;
   float t;
   Ds18b20Start();
   Ds18b20Rst();
   Ds18b20Check();
   Ds18b20WriteByte(0XCC);//skip rom
   Ds18b20WriteByte(0XBE);//read,start form the 0 byte,LSB forst
   TL=Ds18b20ReadByte();//LSB
   TH=Ds18b20ReadByte();//MSB
   //Serial.println(TH);
   //Serial.println(TL);
   if(TH>7)
   {
       TH=~TH;
       TL=~TL;
       temp=0;//the temperature is negative
    }
    else temp=1;// the temperature is positive
    tem=TH;//高八位
    tem<<=8;
    tem+=TL;//低八位
    t=((float)tem*0.0625);
    if(temp)return t;
    else return -t;
  }

效果

硬件连接

hardware

串口打印效果

UART_println

LabVIEW

结合 LabVIEW 上位机可实现远程监控

流程图

flow

代码改进

int DS18B20DQ = 4;
byte comdata[3]={0};      //定义数组数据,存放串口命令数据
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
}
 
void loop() 
{
  while (Serial.available() > 0)   //不断检测串口是否有数据
   {
      receive_data();            //接受串口数据
      test_do_data();            //测试数据是否正确并更新数据
   }
}
  void receive_data(void)       
{
  int i ;
  for(i=0;i<3;i++)
  {
    comdata[i] = Serial.read();
    //延时一会,让串口缓存准备好下一个字节,不延时可能会导致数据丢失,
    delay(2);
  }
}
 
void test_do_data(void) // 测试并执行命令
{
  if(comdata[0] == 0x55) //0x55和0xAA均为判断是否为有效命令
  {
    if(comdata[1] == 0xAA)
    {
      if(comdata[2] == 0xFF)
      {
        // 读取温度值
        float t;
        t= Ds18b20GetTemp();
        Serial.println(t);
      }
    }
  }
}

DHT11

labview_dht11

DS18B20

labview_ds18b20

温度动态采集展示

ds18b20_labview

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2237272.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于MFC实现的赛车游戏

一、问题描述 游戏背景为一环形车道图&#xff0c;选择菜单选项“开始游戏”则可开始游戏。游戏的任务是使用键盘上的方向键操纵赛道上的蓝色赛车追赶红色赛车&#xff0c;红色赛车沿车道顺时针行驶&#xff0c;出发点和终点均位于车道左上方。任一赛车先达到终点则比赛结束。…

实验三 JDBC数据库操作编程(设计性)

实验三 JDBC数据库操作编程&#xff08;设计性&#xff09; 实验目的 掌握JDBC的数据库编程方法。掌握采用JDBC完成数据库链接、增删改查&#xff0c;以及操作封装的综合应用。实验要求 本实验要求每个同学单独完成&#xff1b;调试程序要记录调试过程中出现的问题及解决办法…

Java期末复习暨学校第二次上机课作业

Java期末复习暨学校第二次上机课作业&#xff1a;了解程序的控制结构&#xff0c;掌握顺序结构程序的设计方法&#xff0c;掌握分支程序设计方法。 第一题&#xff1a; 闰年有两种判断方式&#xff1a; &#xff08;1&#xff09;&#xff1a;能被4整除但不能被100整除 &…

Windows配置NTP时间同步

Windows下实现NTP时间同步 1、Windows时间服务(W32Time)2、Windows 时间同步的工作原理3、配置和管理 Windows 时间同步3.1 命令行工具&#xff1a;w32tm3.2 控制面板中的设置 4. 高级设置&#xff08;Windows Server 环境&#xff09;5.调整时间同步的间隔5.1 通过组策略调整时…

Go八股(Ⅳ)***slice,string,defer***

***slice&#xff0c;string&#xff0c;defer*** 1.slice和arry的区别 arry&#xff1a; Go语言中arry即为数据的一种集合&#xff0c;需要在声明时指定容量和初值&#xff0c;且一旦声明就长度固定&#xff0c;访问时按照索引访问。通过内置函数len可以获取数组中的元素个…

STM32H503开发(2)----STM32CubeProgrammer烧录

STM32H503开发----2.STM32CubeProgrammer烧录 概述硬件准备视频教学样品申请源码下载参考程序自举模式BOOT0设置UART烧录USB烧录 概述 STM32CubeProgrammer (STM32CubeProg) 是一款用于编程STM32产品的全功能多操作系统软件工具。 它提供了一个易用高效的环境&#xff0c;通过…

ubuntu下aarch64-linux-gnu(交叉编译) gdb/gdbserver(二)

ubuntu下aarch64-linux-gnu(交叉编译) gdb/gdbserver&#xff08;二&#xff09; 本教程作为gdb/gdbserver编译安装教程的一个补充&#xff0c;教会大家如何使用gdb/gdbserver进行远程调试。 如上图所示&#xff0c;我们需要将编译后的gdbserver上传至目标设备&#xff0c;其上…

架构零散知识点

1 数据库 1.1 数据库范式 有一个学生表&#xff0c;主键是学号&#xff0c;含有学生号、学生名、班级、班级名&#xff0c;违反了数据库第几范式&#xff1f; --非主属性不依赖于主键&#xff0c;不满足第二范式 有一个订单表&#xff0c;包含以下字段&#xff1a;订单ID&…

【时间之外】IT人求职和创业应知【31】

目录 新闻一&#xff1a;2024年“秦创原沣东杯”陕西省科技工作者创新创业大赛颁奖仪式暨沣东新城机器人产业发展大会盛大启幕 新闻二&#xff1a;声网CEO赵斌&#xff1a;RTE将成为生成式AI时代AI Infra的关键部分 新闻三&#xff1a;“5G工业互联网”融合应用试点城市名单…

移动开发(七):.NET MAUI使用RESTAPI实现查询天气笔记

目录 一、接口准备 二、实体部分 三、页面部分 四、后台代码逻辑 五、总结 在移动开发过程中,第三方对接是非常常见的。今天给大家分享.NET MAUI如何使用REST API实现输入城市名称查询天气的示例,希望对大家学习.NET MAUI可以提供一些帮助! 一、接口准备 首先我们需要…

Javascript中如何实现函数缓存?函数缓存有哪些应用场景?

#一、是什么 函数缓存&#xff0c;就是将函数运算过的结果进行缓存 本质上就是用空间&#xff08;缓存存储&#xff09;换时间&#xff08;计算过程&#xff09; 常用于缓存数据计算结果和缓存对象 解释 const add (a,b) > ab; const calc memoize(add); // 函数缓存…

【网络安全 | 并发问题】Nginx重试机制与幂等性问题分析

未经许可,不得转载。 文章目录 业务背景Nginx的错误重试机制proxy_next_upstream指令配置重试500状态码非幂等请求的重试问题幂等性和非幂等性请求non_idempotent选项的使用解决方案业务背景 在现代互联网应用中,高可用性(HA)是确保系统稳定性的关键要求之一。为了应对服务…

利用游戏引擎的优势

大家好&#xff0c;我是小蜗牛。 在当今快速发展的游戏产业中&#xff0c;选择合适的游戏引擎对开发者来说至关重要。Cocos Creator作为一款功能强大且灵活的游戏引擎&#xff0c;为开发者提供了丰富的工具和资源&#xff0c;使他们能够高效地开发出优秀的游戏。本文将探讨如何…

财务源码 财务软件 SaaS 云财务

&#x1f50d; 专业财务源码&#xff0c;助您快速开展财务管理&#xff01;&#x1f4c8; &#x1f3af; 我们提供一系列高质量、可定制、易于使用的财务源码&#xff0c;帮助您快速搭建强大的财务管理系统。无论是小型企业、中型企业&#xff0c;还是个人用户&#xff0c;我们…

数据流图,学习笔记

目录 一、数据流图的基本元素 外部实体&#xff08;External Entity&#xff09; 加工&#xff08;Process&#xff09; 数据存储&#xff08;Data Store&#xff09; 数据流&#xff08;Data Flow&#xff09; 二、数据流图的层次结构 顶层数据流图 中层数据流图 底层…

docker镜像文件导出导入

1. 导出容器&#xff08;包含内部服务&#xff09;为镜像文件&#xff08;docker commit方法&#xff09; 原理&#xff1a;docker commit命令允许你将一个容器的当前状态保存为一个新的镜像。这个新镜像将包含容器内所有的文件系统更改&#xff0c;包括安装的软件、配置文件等…

Android中桌面小部件framework层使用到的设计模式

在Android中&#xff0c;桌面小部件&#xff08;App Widget&#xff09;的Framework层采用了多种设计模式&#xff0c;以实现模块化、可维护性和高效的交互。 以下是Android桌面小部件Framework层中常用的设计模式及其具体应用&#xff1a; 1. 观察者模式&#xff08;Observe…

7.《双指针篇》---⑦三数之和(中等偏难)

题目传送门 方法一&#xff1a;双指针 1.新建一个顺序表用来返回结果。并排序数组。 2.for循环 i 从第一个数组元素遍历到倒数第三个数。 3.如果遍历过程中有值大于0的则break&#xff1b; 4.定义左右指针,以及target。int left i 1, right n - 1; int target -nums[i];…

DBeaver工具连接Hive

DBeaver工具连接Hive 首先解压安装包dbeaver-ce-latest-x86_64-setup.zip,并安装dbeaver-ce-latest-x86_64-setup.exe; 安装Kerberos客户端4.1-amd64.msi; 查看集群节点/etc/hosts文件内容,并追加到C:\Windows\System32\drivers\etc\hosts; 下载集群用户keytab文件,并解压…

从零开始 blender插件开发

blender 插件开发 文章目录 blender 插件开发环境配置1. 偏好设置中开启相关功能2. 命令行打开运行脚本 API学习专有名词1. bpy.data 从当前打开的blend file中&#xff0c;加载数据。2. bpy.context 可用于获取活动对象、场景、工具设置以及许多其他属性。3. bpy.ops 用户通常…