作为一名曾经的AVR使用者,对于arduino的名头早已听过。Arduino作为一个开放式的软硬件平台,消除了软硬件设计之间的神秘感,让软件人员也可以轻松的玩转硬件,也让硬件人员可以很好的利用封装好的软件库。本来自己已经拥有了基本的硬件设备和学习资料,只是一直忙于其他的事情而懒于动手,正好借这次机会,强迫自己来实地操作一下,体验一把arduino的魅力。
目前手上有书籍一本,arduion主板一块(mega2560),DHT11温湿度传感器一个,干簧管传感器一个,人体热释电传感器一个,pulsesensor心率传感器一个。
首先简单翻了一下书,发现其实从应用的角度来看,这个东西并不难。硬件上如果使用现成的模块,其实就更搭积木一样简单;而软件上使用的C语言,有很多封装好的函数和库,只要明白C语言的规则就可以很容易的写出程序。这种可以快速上手,快速成型的特点也是arduino的一大特色,也难怪老外们都喜欢用它来做原型机,因为这个是一个万金油式的工具,重要的是想法。这次为了体验一下arduino,先用DHT11做一个简单的实验。
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有枀高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC 测温元件,可与一个高性能8位单片机相连接。
湿度测量范围: 20%-95%(0 度-50度范围)湿度测量误差: +-5%
温度测量范围: 0度-50 度 温度测量误差: +-2度
DHT11的通信采用的单总线通信方式,做过DS18B20的应该都知道,其实就是靠线与的功能来做的双向通信。这种通信方式的好处是占用引脚少,缺点就是慢,单片机除了这事基本就干不了啥了。
该通信的数据格式为8bit湿度整数数据 + 8bit湿度小数数据+8bit温度整数数据 + 8bit温度小数数据+8bit校验位
按照通信时序写出arduino读取DHT11的程序,由于没有显示屏,读取的结果通过串口显示出来。下面给出两张效果对比图。
第一个图是室内的环境温度
第二个图是用嘴对着传感器吹气后的效果图,可以看到湿度值和温度值都上升了
最后把程序附上。
int DHpin = 22;
byte dat[5];
byte read_data()
{
byte data;
for(int i=0; i<8; i++)
{
if(digitalRead(DHpin) == LOW)
{
while(digitalRead(DHpin) == LOW); //等待50us;
delayMicroseconds(30); //判断高电平的持续时间,以判定数据是‘0’还是‘1’;
if(digitalRead(DHpin) == HIGH) data |= (1<<(7-i)); //高位在前,低位在后;
while(digitalRead(DHpin) == HIGH); //数据‘1’,等待下一位的接收;
}
}
return data;
}
void start_test()
{
digitalWrite(DHpin,LOW); //拉低总线,发开始信号;
delay(30); //延时要大于18ms,以便DHT11能检测到开始信号;
digitalWrite(DHpin,HIGH);
delayMicroseconds(40); //等待DHT11响应;
pinMode(DHpin,INPUT);
while(digitalRead(DHpin) == HIGH);
delayMicroseconds(80); //DHT11发出响应,拉低总线80us;
if(digitalRead(DHpin) == LOW);
delayMicroseconds(80); //DHT11拉高总线80us后开始发送数据;
for(int i=0;i<4;i++) //接收温湿度数据,校验位不考虑;
dat = read_data();
pinMode(DHpin,OUTPUT);
digitalWrite(DHpin,HIGH); //发送完一次数据后释放总线,等待主机的下一次开始信号;
}
void setup()
{
Serial.begin(9600);
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(700);
}
总体来讲,利用这个简单的实验来熟悉了一下arduino的操作流程,体验了其魅力。
下一次有空的时候,做一下arduino和心率传感器的实验,到时会把效果汇报过来的。
本文最早发表于zigbee小组:http://group.ednchina.com/GROUP_GRO_14595_673.HTM
用户377235 2014-7-5 20:45
小数点后的不会变,总是2.
用户403664 2014-1-17 10:29