蓝牙虚拟测量仪下位机软件设计
费了半天劲,写完了Lavbiew上位机程序,接下来,下位机Arduino的程序如何设计?Arduino程序的任务有两点:一、把DHT11传感器的温湿度值采样出来,处理成字节数据;二、把湿度和温度字节数据通过串口上传给上位机。
由于DHT11传感器是采用单线制串行通讯的方法进行采样数据的,要配合时序,一位位从单条通讯线传过来,再合成8位字节,然后还要进行校验和,所以厂家自带程序,比较复杂冗长,看起来头疼! 实际上有的时候,我们琢磨一个东西,可以大刀阔斧,没必要转牛角尖,所以从下面Arduino程序中,您找到所需的温度值和湿度值,就行了,dht11_dat[2]为温度值整数部分,dht11_dat[0]为湿度值整数部分,然后把湿度和温度字节数据通过RS232通讯协议,上传给PC机串口COM。
下位机蓝牙温湿度采样器Arduino程序:
#define DHT11_PIN 0 //DHT11连接在Arduino UNO 模拟端口PIN 0
byte read_dht11_dat() //“读取DHT11的温湿度值”子函数
{
byte i = 0;
byte result=0;
for(i=0; i< 8; i++)
{
while(!(PINC & _BV(DHT11_PIN))); // wait for 50us
delayMicroseconds(30);
if(PINC & _BV(DHT11_PIN))
result |=(1<<(7-i));
while((PINC & _BV(DHT11_PIN))); // wait '1' finish
}
return result;
}
//初始化
void setup()
{
DDRC |= _BV(DHT11_PIN);
PORTC |= _BV(DHT11_PIN);
Serial.begin(9600); //串口通讯启动
}
//主程序
void loop()
{
byte dht11_dat[5];//存储从DHT11传感器采样的温湿度值的数组
byte dht11_in;
byte i;
// start condition
// 1. pull-down i/o pin from 18ms
//启动采样
PORTC &= ~_BV(DHT11_PIN);
delay(18);
PORTC |= _BV(DHT11_PIN);
delayMicroseconds(40);
DDRC &= ~_BV(DHT11_PIN);
delayMicroseconds(40);
dht11_in = PINC & _BV(DHT11_PIN);
delayMicroseconds(80);
dht11_in = PINC & _BV(DHT11_PIN);
delayMicroseconds(80);
// 读取来自DHT11传感器的5个字节温湿度值
//第一个字节是湿度值整数部分,dht11_dat[0]
//第二个字节是湿度值小数部分
//第三个字节是温度值整数部分,dht11_dat[2]
//第四个字节是温度值小数部分
//第五个字节是校验值,可以判断数据传送是否正确
for (i=0; i<5; i++)
dht11_dat = read_dht11_dat();
DDRC |= _BV(DHT11_PIN);
PORTC |= _BV(DHT11_PIN);
byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];
//检测校验值,判断是否采样出错
/*if(dht11_dat[4]!= dht11_check_sum)
{
Serial.println("DHT11 checksum error");
}*/
//把湿度值整数部分上传上位机
Serial.print(dht11_dat[0], BYTE);
//把温度值整数部分上传上位机
Serial.print(dht11_dat[2], BYTE);
delay(500);//延时0.5s
}
Arduino程序下载:
```