设为首页收藏本站

LM35、DS18B20、三合一传感器

川山甲的壳 发表于 2017-8-10 14:09:14 | 显示全部楼层 [复制链接]
9 1257
LM35、DS18B20、三合一传感器

前几天的成都,就像蒸桑拿一样,出门都感觉自己像雪糕一样快化了。正巧身边有三种传感器,于是在空闲之余就分别用Air Quality Monitor(文中简称三合一传感器)、LM35、DS18B20传感器做了室内温度的测试。测试所需物品如下图
图中所需物品的链接将会附于文末,可点击进入了解详情

                              
LM35温度传感器

LM35是一种得到广泛使用的半导体温度传感器。其应用简单,有较好的线性度和较高的灵敏度。它可以随不同的温度变化产生不同的电压。
LM35温度传感器电路连接图
  
室内环境温度为27℃(空调上的读数)。其测得的环境温度为27.34℃。(这是取了一个较平均的值,其温度范围基本是在27℃~28.2之间浮动)。因为室内空间较大,所以测得温度与实际温度有所差距。可能是随着空气的流动导致温度有所变化。
LM35.jpg
在咱们DF创客社区里的Arduino程序上是没有LCD显示的功能,在这里我加上LCD显示功能,虽然可以打开串口监视器,将波特率调整到9600,可以接收到传感器周围的具体温度,但不具备灵活性。让温度的读数显示在LCD上,可以更加直观的看见温度的读数。
LM35程序代码
[C++] 纯文本查看 复制代码
#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(); 
    
}

DS18B20温度传感器
DS18B20传感器市面上最常见的温度传感器,它具有体积小,精度高。其连线也非常方便,经过封装后可以运用于多种场合,主要根据应用场合的不同而改变其外观,比如大棚测温,高炉水循环测温,锅炉测温,机房测温,洁净室测温,弹药库测温等各种非极限温度场合。
DS18B20温度传感器电路连接图

室内环境温度为27℃(空调上的读数)。其测得的环境温度为27.56℃。(这是取了一个较平均的值,其温度范围基本是在27.4℃~28.9之间浮动)。可能是随着空气的流动导致温度有所变化。

读取温度程序代码段
[C++] 纯文本查看 复制代码
#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;
  
}

此段代码也是配合在LCD屏上显示温度。

大家看了上面这两款温度传感器的介绍,是不是觉得这个夏天还是有点看头呢。想必有很多朋友会觉得只能测温度玩玩不过瘾,那下面我们就再来一个较过瘾的传感器,它是一个可以同时监测空气PM2.5、PM10、甲醛浓度及温湿度的三合一传感器。正巧前两天朋友发了一份木板屋的设计文件,于是在淘宝上打了个样,做了一个环境检测房,如果大家对这个感兴趣,也是可以做一做的。
做好环境屋后,可以检测一下自己居住的环境,当然想要检测数据和网上公布的数据一致的话,还需要到检测节点去,毕竟不在同一个地方,测试所得的数据,会有差距的。
三合一传感器电路连接图
shy-lx.png

装配图
木板屋和其它配件图

装配
图一

图二

图三

图四

图五

在检测屋中,加了两块WS2812RGB LED灯,这样小房子看起来就比较温馨了。
连接
电路连接1

电路连接2

效果
完成装配后,就准备上电进行检测了,下面是手机和检测的数据做的一个对比。



看完这些,有想做的朋友吗?想做就动起来吧
顺便检测检测自己所居住的环境怎么样,是否超过了相关范围呢
在热爆的天气里,我们可以用三合一的传感器测测周围环境的温湿度,如果您家刚装修不久,还可以用它测测是否甲醛超标等功能。用它来检测咱们周围的居住环境也是不错的选择呢。其

测试程序。
[C++] 纯文本查看 复制代码
#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[/align][align=left]unsigned long last_lcd_time = 0, last_light_time = 0;[/align][align=left]#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);  
}

以上三种传感器采用的主控板都是完全兼容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

环境检测房子设计文件.rar

970.86 KB, 下载次数: 29, 下载积分: 创造力 -1

发表于 2017-8-11 11:06:22 | 显示全部楼层
很用心 还做了个房子
回复 支持 反对

使用道具 举报

发表于 2017-8-11 17:59:06 | 显示全部楼层
图片上传的好清楚!是什么工具压缩的?
回复 支持 反对

使用道具 举报

发表于 2017-8-12 15:33:27 | 显示全部楼层
好厉害
回复 支持 反对

使用道具 举报

发表于 2017-8-14 09:10:22 | 显示全部楼层
luna 发表于 2017-8-11 17:59
图片上传的好清楚!是什么工具压缩的?

先上传到我的相册,然后再我的相册里选择需要的图片。
回复 支持 反对

使用道具 举报

发表于 2017-8-15 13:06:31 | 显示全部楼层
我去 正在找甲醛三合一 的相关资料 这就来了  谢谢 楼主分享
回复 支持 反对

使用道具 举报

发表于 2017-8-15 15:37:13 | 显示全部楼层
本帖最后由 川山甲的壳 于 2017-8-21 09:33 编辑
昶平 发表于 2017-8-15 13:06
我去 正在找甲醛三合一 的相关资料 这就来了  谢谢 楼主分享

不谢,随便用
回复 支持 反对

使用道具 举报

发表于 2017-8-29 10:08:45 | 显示全部楼层
厉害了 顶一个
回复 支持 反对

使用道具 举报

发表于 2017-8-29 10:08:49 | 显示全部楼层
厉害了 顶一个
回复 支持 反对

使用道具 举报

发表于 2017-9-29 15:21:00 | 显示全部楼层
厉害了,66666666666666
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册  

本版积分规则 允许回帖同步到新浪微博  

推荐阅读

精华导读




公司简介| 联系我们| 小黑屋| 加入我们| 微博| 优酷| 英文网站| DF创客社区 ( 沪ICP备09038501号-4  
友情链接| 硬创邦| 花生壳社区| 模友之吧| 电子发烧友社区| 创客星球| 云汉电子社区| 电子工程网| 与非网| Arduino中文社区| 南极熊3D打印网| OneNET|

上海智位机器人有限公司  沪ICP备09038501号-4   

Powered by Discuz! X3.1

Licensed Comsenz Inc.

返回顶部 返回列表