12224| 9
|
LM35、DS18B20、三合一传感器 |
LM35、DS18B20、三合一传感器 前几天的成都,就像蒸桑拿一样,出门都感觉自己像雪糕一样快化了。正巧身边有三种传感器,于是在空闲之余就分别用Air Quality Monitor(文中简称三合一传感器)、LM35、DS18B20传感器做了室内温度的测试。测试所需物品如下图 图中所需物品的链接将会附于文末,可点击进入了解详情 LM35温度传感器 LM35是一种得到广泛使用的半导体温度传感器。其应用简单,有较好的线性度和较高的灵敏度。它可以随不同的温度变化产生不同的电压。 LM35温度传感器电路连接图 室内环境温度为27℃(空调上的读数)。其测得的环境温度为27.34℃。(这是取了一个较平均的值,其温度范围基本是在27℃~28.2之间浮动)。因为室内空间较大,所以测得温度与实际温度有所差距。可能是随着空气的流动导致温度有所变化。 在咱们DF创客社区里的Arduino程序上是没有LCD显示的功能,在这里我加上LCD显示功能,虽然可以打开串口监视器,将波特率调整到9600,可以接收到传感器周围的具体温度,但不具备灵活性。让温度的读数显示在LCD上,可以更加直观的看见温度的读数。 LM35程序代码。 [mw_shl_code=cpp,true] #include <Wire.h> #include "DFRobot_RGBLCD.h" DFRobot_RGBLCD lcd(16,2); //16 characters and 2 lines of show void setup() { Serial.begin(9600);//Set Baud Rate to 9600 bps lcd.init(); lcd.setRGB(0, 0, 255); } void loop() { uint16_t val; double dat; val=analogRead(A0);//Connect LM35 on Analog 0 dat = (double) val * (5/10.24); Serial.print("Tep:"); //Display the temperature on Serial monitor Serial.print(dat); Serial.println("C"); delay(500); //lcd.print("hello!"); //delay(1000); //lcd.clear(); lcd.setCursor(0,0); lcd.print("Tep: "); lcd.print(dat); delay(1000); // lcd.clear(); }[/mw_shl_code] DS18B20温度传感器 DS18B20传感器市面上最常见的温度传感器,它具有体积小,精度高。其连线也非常方便,经过封装后可以运用于多种场合,主要根据应用场合的不同而改变其外观,比如大棚测温,高炉水循环测温,锅炉测温,机房测温,洁净室测温,弹药库测温等各种非极限温度场合。 DS18B20温度传感器电路连接图 室内环境温度为27℃(空调上的读数)。其测得的环境温度为27.56℃。(这是取了一个较平均的值,其温度范围基本是在27.4℃~28.9之间浮动)。可能是随着空气的流动导致温度有所变化。 读取温度程序代码段 [mw_shl_code=cpp,true]#include <OneWire.h> #include <Wire.h> #include "DFRobot_RGBLCD.h" int DS18S20_Pin = 2; //DS18S20 Signal pin on digital 2 DFRobot_RGBLCD lcd(16,2); //16 characters and 2 lines of show //Temperature chip i/o OneWire ds(DS18S20_Pin); // on digital pin 2 void setup(void) { Serial.begin(9600); lcd.init(); lcd.setRGB(0, 0, 255); } void loop(void) { float temperature = getTemp(); Serial.println(temperature); delay(1000); lcd.setCursor(0,0); lcd.print("Tep: "); lcd.print(temperature); delay(1000); delay(100); //just here to slow down the output so it is easier to read } float getTemp(){ //returns the temperature from one DS18S20 in DEG Celsius byte data[12]; byte addr[8]; if ( !ds.search(addr)) { //no more sensors on chain, reset search ds.reset_search(); return -1000; } if ( OneWire::crc8( addr, 7) != addr[7]) { Serial.println("CRC is not valid!"); return -1000; } if ( addr[0] != 0x10 && addr[0] != 0x28) { Serial.print("Device is not recognized"); return -1000; } ds.reset(); ds.select(addr); ds.write(0x44,1); // start conversion, with parasite power on at the end byte present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad for (int i = 0; i < 9; i++) { // we need 9 bytes data = ds.read(); } ds.reset_search(); byte MSB = data[1]; byte LSB = data[0]; float tempRead = ((MSB << 8) | LSB); //using two's compliment float TemperatureSum = tempRead / 16; return TemperatureSum; }[/mw_shl_code] 此段代码也是配合在LCD屏上显示温度。 大家看了上面这两款温度传感器的介绍,是不是觉得这个夏天还是有点看头呢。想必有很多朋友会觉得只能测温度玩玩不过瘾,那下面我们就再来一个较过瘾的传感器,它是一个可以同时监测空气PM2.5、PM10、甲醛浓度及温湿度的三合一传感器。正巧前两天朋友发了一份木板屋的设计文件,于是在淘宝上打了个样,做了一个环境检测房,如果大家对这个感兴趣,也是可以做一做的。 做好环境屋后,可以检测一下自己居住的环境,当然想要检测数据和网上公布的数据一致的话,还需要到检测节点去,毕竟不在同一个地方,测试所得的数据,会有差距的。 三合一传感器电路连接图 装配图 木板屋和其它配件图 装配 图一 图二 图三 图四 图五 在检测屋中,加了两块WS2812RGB LED灯,这样小房子看起来就比较温馨了。 连接 电路连接1 电路连接2 效果 完成装配后,就准备上电进行检测了,下面是手机和检测的数据做的一个对比。 看完这些,有想做的朋友吗?想做就动起来吧:lol 顺便检测检测自己所居住的环境怎么样,是否超过了相关范围呢:O。 在热爆的天气里,我们可以用三合一的传感器测测周围环境的温湿度,如果您家刚装修不久,还可以用它测测是否甲醛超标等功能。用它来检测咱们周围的居住环境也是不错的选择呢。其 测试程序。 [mw_shl_code=cpp,true]#include <Wire.h> #include "DFRobot_RGBLCD.h" #include <Adafruit_NeoPixel.h> char col; char tempStr[15]; unsigned int PMSa = 0, FMHDSa = 0, TPSa = 0, HDSa = 0, PMSb = 0, FMHDSb = 0, TPSb = 0, HDSb = 0, PMS = 0, FMHDS = 0, TPS = 0, HDS = 0, CR1 = 0, CR2 = 0; unsigned int lcd_a = 0, lcd_b = 0, lcd_c = 0; unsigned char buffer_RTT[40] = {}; //The serial port receives the data unsigned long last_lcd_time = 0, last_light_time = 0; #define PIN 8 #define NUMBER 2 DFRobot_RGBLCD lcd(16, 2); //RGB address; 16 characters and 2 lines of show Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMBER, PIN, NEO_GRB + NEO_KHZ800); //Lamp parameters void setup() { Serial.begin(9600); lcd.init();//Initialize LCD1602 RGB screen strip.begin(); //Start the RGB light lcd.setRGB(0, 255, 0); //Sets the initial backlight color of the screen lcd.setCursor(0, 0 ); //Set the display from (0,0) lcd.print("T:");//display "T:" lcd.setCursor(9, 0 ); lcd.print("H:"); lcd.setCursor(0, 1 ); lcd.print("F:"); lcd.setCursor(9, 1 ); lcd.print("P:"); } void loop() { lcd_a = random(256);//Read random values delayMicroseconds(10); lcd_b = random(256); delayMicroseconds(10); lcd_c = random(256); if (millis() - last_lcd_time > 30000) //Change the display backlight every 3 seconds { lcd.setRGB(lcd_a, lcd_b, lcd_c); //Set the backlight color last_lcd_time = millis();//Take system time } if (millis() - last_light_time > 500) //RGB lights bright colors { strip.setPixelColor(0, strip.Color( 255, 227, 132) ); //0, for the first RGB light; 255 for the R, 227 for the G, 132 for the B, can be adjusted strip.setPixelColor(1, strip.Color( 255, 227, 132) ); strip.show();//RGB enable control, no such function, RGB light does not change state last_light_time = millis();//Take system time } while (Serial.available() > 0) //Check whether there is serial data { for (int i = 0; i < 40; i++) //Read serial data { col = Serial.read(); buffer_RTT = (char)col; delay(2); } Serial.flush(); //lcd.clear(); CR1 = (buffer_RTT[38] << 8) + buffer_RTT[39]; CR2 = 0; for (int i = 0; i < 38; i++) CR2 += buffer_RTT; if (CR1 == CR2) //check { PMSa = buffer_RTT[12]; //Read PM2.5 high octet data PMSb = buffer_RTT[13]; //Read PM2.5 low octet data PMS = (PMSa << 8) + PMSb; //PM2.5 data FMHDSa = buffer_RTT[28]; //Read the high octet data FMHDSb = buffer_RTT[29]; //Read the low octet data FMHDS = (FMHDSa << 8) + FMHDSb; //Formaldehyde data TPSa = buffer_RTT[30]; //Read the high octet data TPSb = buffer_RTT[31]; //Read the low temperature 8-bit data TPS = (TPSa << 8) + TPSb; //Temperature data HDSa = buffer_RTT[32]; //Read the humidity high octet data HDSb = buffer_RTT[33]; //Read low humidity eight bits of data HDS = (HDSa << 8) + HDSb; //Humidity data } else { PMS = 0; FMHDS = 0; TPS = 0; HDS = 0; } } lcd.setCursor(2, 0 ); sprintf(tempStr,"%d%d.%d",TPS/100,(TPS/10)%10,TPS%10); //display temperature lcd.print(tempStr); lcd.write(0xdf); //display"°" lcd.print('C'); //display"C" lcd.setCursor(11, 0 ); sprintf(tempStr,"%d%d.%d",HDS/100,(HDS/10)%10,HDS%10); //display Humidity lcd.print(tempStr); lcd.print('%'); //display"%" lcd.setCursor(2, 1 ); lcd.print((float)FMHDS/1000); //display formaldehyde in mg / m³ mg per cubic meter lcd.print((int)FMHDS%10); lcd.setCursor(11, 1 ); sprintf(tempStr,"%d%d%d",PMS/100,(PMS/10)%10,PMS%10); //displayDisplay PM2.5, ten, hundred units ug / m³ micrograms per cubic meter lcd.print(tempStr); }[/mw_shl_code] 以上三种传感器采用的主控板都是完全兼容Arduino UNO R3版本的DFRduino UNO R3,并使用更强大的ATmega16U2替代了8U2,以此获得了更快的转换速度和更大内存,让UNO R3版本在Linux或者Mac下不需要安装任何驱动程序。 如果您对以上的温度传感器感兴趣,可以点击下面的链接进一步了解。 注意:1、在使用DFRduino UNO R3主控板时,需要Arduino 1.0的驱动文件夹。我们已经测试过R3能够在老版本的IDE上编程。然而,在一台电脑上第一次运行R3,你将需要Arduino 1.0的驱动文件。如果你对新版本IDE变化感兴趣,请查看Arduino官网 Arduino 1.0的版本记录。 2、温湿度、甲醛、PM三合一传感器串口与DFRduinoUNO R3主板连接,这样就需要先把程序下载在UNO主控板中,再进行装配。如果想方便自己再加一些传感器进行调试,也可以使用虚拟串口,但这样需要自己接线,不能直接通过配件插在DFRduino UNO R3板上。如果想直插的话,就需要有DFRobot Leonardo& Xbee R3这种下载串口与D0、D1不是同一个的主控板。 传感器 电源 主控板UNO R3 DFRduino UNO R3(完全兼容Arduino UNO R3版本) 扩展板 显示屏 RGB灯 WS2812 RGB LED Module |
970.86 KB, 下载次数: 2709
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed