|
本帖最后由 无垠的广袤 于 2024-11-14 20:30 编辑
【R78/G15 开发板测评】串口打印 DHT11 温湿度传感器、DS18B20 温度传感器数据,LabVIEW 上位机绘制演化曲线
主要介绍了 R78/G15 开发板基于 Arduino IDE 环境串口打印温湿度传感器 DHT11 和温度传感器 DS18B20 传感器的数据,并通过LabVIEW上位机绘制演化曲线。
DHT11
DHT11 数字温湿度传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。
简介
DHT11 内置一个电阻式感湿元件和一个 NTC 测温元件,DHT11 为 4 针单排引脚封装,采用单线制串行接口,只需加适当的上拉电阻,信号传输距离可达20米以上。
DHT11 工作参数:
- 湿度测量范围:20~90%RH
- 湿度测量精度:±5%RH
- 温度测量范围:0~50℃
- 温度测量精度:±2℃
- 工作电压:DC 3.3V/5V
DHT11 采用**单总线**协议,也就是使用一根 DATA 线进行数据的收发。DHT11 的 DATA 线一次通讯时间 4ms 左右,数据分整数部分、小数部分和校验位,具体为: 8bit 湿度整数数据 + 8bit 湿度小数数据 + 8bit 温度整数数据 + 8bit 温度小数数据 + 8bit 校验位。
时序图
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);
- }
复制代码
参考:https://www.cnblogs.com/54programer/p/15829233.html
效果
硬件连接
电路
实物连线
串口打印
DS18B20
DS18B20 数字温度计是 DALLAS 公司生产的 1-Wire 单总线器件,具有线路简单、体积小的特点。
简介
特点:
- 独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
- 测温范围 -55℃~+125℃,固有测温误差 1℃。
- 支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,实现多点测温,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定。
- 工作电源: 3.0~5.5V/DC (可以数据线寄生电源)
- 在使用中不需要任何外围元件
- 测量结果以9~12位数字量方式串行传送
电路
模块
电路
时序图
代码
这里同样是库函数无法正常加载,因此不使用库函数驱动 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;
- }
复制代码
效果
硬件连接
串口打印效果
LabVIEW
结合 LabVIEW 上位机可实现远程监控
流程图
代码改进
- 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
DS18B20
温度动态采集展示
详见:https://blog.csdn.net/qq_36654593/article/details/143654532
|
|