原创 zigbee小组赠送模块-把手边的arduino用起来

2014-1-17 11:22 2824 15 17 分类: MCU/ 嵌入式

作为一名曾经的AVR使用者,对于arduino的名头早已听过。Arduino作为一个开放式的软硬件平台,消除了软硬件设计之间的神秘感,让软件人员也可以轻松的玩转硬件,也让硬件人员可以很好的利用封装好的软件库。本来自己已经拥有了基本的硬件设备和学习资料,只是一直忙于其他的事情而懒于动手,正好借这次机会,强迫自己来实地操作一下,体验一把arduino的魅力。 
目前手上有书籍一本,arduion主板一块(mega2560),DHT11温湿度传感器一个,干簧管传感器一个,人体热释电传感器一个,pulsesensor心率传感器一个。

x20131219132244520.jpg.pagespeed.ic.HFNq7X63uB.jpg

x20131219132300524.jpg.pagespeed.ic.remMFJnNEu.jpg

x20131219132314909.jpg.pagespeed.ic.C1NYfLz1PE.jpg

首先简单翻了一下书,发现其实从应用的角度来看,这个东西并不难。硬件上如果使用现成的模块,其实就更搭积木一样简单;而软件上使用的C语言,有很多封装好的函数和库,只要明白C语言的规则就可以很容易的写出程序。这种可以快速上手,快速成型的特点也是arduino的一大特色,也难怪老外们都喜欢用它来做原型机,因为这个是一个万金油式的工具,重要的是想法。这次为了体验一下arduino,先用DHT11做一个简单的实验。 
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有枀高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC 测温元件,可与一个高性能8位单片机相连接。 
湿度测量范围: 20%-95%(0 度-50度范围)湿度测量误差: +-5% 
温度测量范围: 0度-50 度 温度测量误差: +-2度 

20131219132606948.jpg 
DHT11的通信采用的单总线通信方式,做过DS18B20的应该都知道,其实就是靠线与的功能来做的双向通信。这种通信方式的好处是占用引脚少,缺点就是慢,单片机除了这事基本就干不了啥了。 
该通信的数据格式为8bit湿度整数数据 + 8bit湿度小数数据+8bit温度整数数据 + 8bit温度小数数据+8bit校验位 
按照通信时序写出arduino读取DHT11的程序,由于没有显示屏,读取的结果通过串口显示出来。下面给出两张效果对比图。 
第一个图是室内的环境温度

x20131219132349519.gif.pagespeed.ic.qIWKFbJJLO.png
第二个图是用嘴对着传感器吹气后的效果图,可以看到湿度值和温度值都上升了

x20131219132407823.gif.pagespeed.ic.14MXbfW-U0.png
最后把程序附上。 
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

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户377235 2014-7-5 20:45

小数点后的不会变,总是2.

用户403664 2014-1-17 10:29

赞啦,同时可以把小组的地址也贴上去
相关推荐阅读
用户1321768 2014-01-17 10:13
Pulse Sensor心率传感器实验
      “可穿戴设备”这个发端于2013年的核心词汇,在最近的CES大会上再一次的成为了焦点,这似乎说明了可穿戴设备将在2014年处于极速上升期。而心率作为最容易采集和分析人体生理信号必将是最...
用户1321768 2010-03-30 13:00
【转】arch/arm 是一个目录.停止.(空格引发的惨案)
感谢loops,我已经困惑N天了友情链接:http://www.cnblogs.com/goodloop/archive/2009/05/29/1491777.html编译内核。修改顶层makefil...
用户1321768 2010-03-05 14:51
输入sudo apt-get update无法更新的原因
在ubuntu系统中的终端敲入:sudo apt-get update,后发现后面的文字大部分都是fail和Ign(失败和忽略),也无法安装和更新其他的软件。但是可以打开firefox,还可以上网,说...
用户1321768 2010-03-05 14:14
如何在ubuntu系统下安装vmware-tools
Ubuntu安装VMware Tools说简单不简单,说难也不难,下面列出Ubuntu安装VMware Tools的相关方法和代码。VMware Tools位置:VMware的安装路径VMwareVM...
用户1321768 2010-03-03 20:29
ubuntu下解决鼠标滚轮不能使用的问题
抄一段解决办法: 用vmware安装ubuntu, 解决鼠标自由切换问题: 在 安装vmware-tools 后, 编辑配置文件 sudo gedit /etc/X11/xorg.conf 找到并修改...
EE直播间
更多
我要评论
2
15
关闭 站长推荐上一条 /3 下一条