اندازه گیری دمای محیط کاربرد فراوانی در تجهیزات مبتنی بر IoT دارد . می توانید بر اساس فیدبک از دمای محیط لوازم سرمایشی یا گرمایشی را کنترل کنید . یا می توانید بر اساس دمای محیط یک خانه ، تقریبی از مصرف انرژی سیستم های گرمایشی را به دست بیاورید . سنسور های زیادی وجود دارند که به طور گسترده در گره های IoT مورد استفاده قرار میگیرند . سنسور هایی با خروجی I2C ، 1Wire و سنسور های آنالوگ . برخی از این سنسور های قیمت های بالایی دارند و بر اساس ادعای سازندگان دارای کالیبراسیونی دقیق هستند . انتخاب سنسور مناسب در پروژه ها گاها می تواند چالش بر انگیز باشد چرا که قیمت تمام شده محصول باید کم و همچنین کیفیت و دقت آن بالا باشد . در این مقاله به برسی و مقایسه چند مدل سنسور دما خواهیم پرداخت و خروجی آن ها را مانیتور میکنیم تا اختلاف هر کدا مشخص شود . سنسور هایی که در این پروژه قصد داریم مقایسه کنیم شامل :

1- سنسور دمای DS18B20 که کالیبره شده و دارای رابط 1Wire است که به راحتی می توانید چندین سنسور DS18B20 را تنها از طریق یک پین کنترل کنید .

2- DHT11 و DHT22 که از دقت بالایی برخوردارند و نیز قیمت آن ها از دیگر سنسور ها بالتر می باشد . در این سنسور ها از یک میکروکنترلر و یک NTC استفاده شده است که میکروکنترلر موجود بر روی سنسور وظیفه تبدیل مقادیر آنالوگ ولتاژ رت به I2C و 1Wire دارد . این سنسور ها در مدل های مختلف کابلی و بدون کابل در بازار موجود هستن .

3- سنسور LM35 یک سنسور دمای آنالوگ می باشد که عملکرد آن در دمای محیط خطی است . به دلیل قیمت پایین و راه اندازی ساده این سنسور کاربرد فراوانی در بین طراحان دارد .

4- سنسور های BMP180 و BMP280 در واقع سنسور های اندازه گیری فشار هوا می باشند که قیمت پایینی دارند و از آن ها برای اندازه گیری ارتفاع نیز استفاده می شود . BMP180 و BME280 دارای سنسور دمای داخلی هستند که به دلیل یک پارچه بودن سنسور به صورت گسترده ای از آن ها در گره های IoT استفاده می شود .

 

در جدول زیر مشخصات هر کدام از این سنسور ها درج شده است :

 

 

به دلیل تعداد سنسور ها در این پروژه از برد آردوینو Mega2560 استفاده می کنیم . در هر کدام از سنسور های پین های تغذیه را به 5 یا 3 ولت برد آردوینو می توانید متصل کنید . همچنین پین های دیتا را به صورت زیر به آردوینو متصل کنید :

پین دیتای DHT11 —-> به پین 11 آردوینو

پین دیتای DHT22—-> به پین 12 آردوینو

پین دیتای DS18B20—> به پین A0 آردوینو

پین های SCL و SDA ماژول BMP180 را به ترتیب به پین های 21 و 20 برد آردوینو متصل کنید .

برای اتصال ماژول BME280 نیز پین های SPI برد را به ماژول متصل کنید (MOSI پین 7 ، MISO پین 4 ، CS پین 5 و SCK پین 6 برد آردوینو می باشد )

 

در این پروژه از یک میکرو SD برای ذخیره دیتای سنسور های استفاده می شود لذا به یک میکرو SD و یک ماژول SD کارت نیاز دارید . ماژول SD را مانند تصویر زیر به آردوینو متصل کنید :

 

کد های پروژه :

/*
 * Rui Santos
 * Complete Project Details https://RandomNerdTutorials.com
 */

#include "DHT.h"

#include <OneWire.h>
#include <DallasTemperature.h>

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

#include <Wire.h>
#include <Adafruit_BMP085.h>

#include <SD.h> // for the SD card

const int DHT11sensorPin = 11;  
const int DHT22sensorPin = 12;  

DHT dht11(DHT11sensorPin, DHT11);
DHT dht22(DHT22sensorPin, DHT22);

float DHT11temperature;
float DHT22temperature;

const int DS18B20sensorPin = 14;

OneWire oneWire(DS18B20sensorPin);
DallasTemperature ds18b20(&oneWire);

float DS18B20temperature1;
float DS18B20temperature2;

const int BME_SCK = 6;
const int BME_MISO = 4;
const int BME_MOSI = 7;
const int BME_CS = 5;

Adafruit_BME280 bme280(BME_CS, BME_MOSI, BME_MISO, BME_SCK);

Adafruit_BMP085 bmp180;
 
const int LM35sensorPin = A0; 
float LM35sensorValue;
float LM35voltageOut;
float LM35temperature;

const int chipSelectSDCard = 53; 
File myFile;

void setup() {
  Serial.begin(9600);

  dht11.begin();
  delay(2000);
  dht22.begin();

  ds18b20.begin();

  bme280.begin();

  bmp180.begin();
 
  pinMode(LM35sensorPin, INPUT);

  if(!SD.begin(chipSelectSDCard)) {
    Serial.println("SD card initialization failed!");
    return;
  }
  Serial.println("SD card initialization done.");
  
  myFile=SD.open("DATA.txt", FILE_WRITE);
  if (myFile) {
    Serial.println("File opened ok");
    // print the headings for our data
    myFile.println("DHT11,DHT22,DS18B20-1,DS18B20-2,BME280,BMP180,LM35");
  }
  myFile.close();  
}

void loop() {

  /*-------------------------------------------------------*/
  //DHT11
  DHT11temperature = dht11.readTemperature();
  if (isnan(DHT11temperature)) {
    Serial.println("Failed to read from DHT11 sensor!");
    return;
  }
  Serial.print("Temperature DHT11(ºC): ");
  Serial.println(DHT11temperature);
  
  /*-------------------------------------------------------*/
  //DHT22  
  DHT22temperature = dht22.readTemperature();
  if (isnan(DHT22temperature)) {
    Serial.println("Failed to read from DHT22 sensor!");
    return;
  }
  Serial.print("Temperature DHT22(ºC): ");
  Serial.println(DHT22temperature);

/*-------------------------------------------------*/  
  //DS18B20
  ds18b20.requestTemperatures();  
  DS18B20temperature1 = ds18b20.getTempCByIndex(0);
  DS18B20temperature2 = ds18b20.getTempCByIndex(1);

  Serial.print("Temperature DS18B20-1(ºC): ");
  Serial.println(DS18B20temperature1);
  
  Serial.print("Temperature DS18B20-2(ºC): ");
  Serial.println(DS18B20temperature2);

/*-------------------------------------------------*/
//BME280

  Serial.print("Temperature BME280(ºC): ");
  Serial.println(bme280.readTemperature());

/*-------------------------------------------------*/
//BMP180
  Serial.print("Temperature BMP180(ºC): ");
  Serial.println(bmp180.readTemperature());

/*-------------------------------------------------*/ 
  //LM35 SENSOR
  LM35sensorValue = analogRead(LM35sensorPin);
  LM35voltageOut = (LM35sensorValue * 5000) / 1024;
  
  // calculate temperature for LM35 (LM35DZ)
  LM35temperature = LM35voltageOut / 10;

  Serial.print("Temperature LM35(ºC): ");
  Serial.println(LM35temperature);

  Serial.println("");

  myFile = SD.open("DATA.txt", FILE_WRITE);
  if (myFile) {
    Serial.println("File open with success");
    myFile.print(DHT11temperature);
    myFile.print(",");
    myFile.print(DHT22temperature);
    myFile.print(",");
    myFile.print(DS18B20temperature1);
    myFile.print(",");
    myFile.print(DS18B20temperature2);
    myFile.print(",");
    myFile.print(bme280.readTemperature());
    myFile.print(",");
    myFile.print(bmp180.readTemperature());
    myFile.print(",");
    myFile.print(LM35temperature);
    myFile.println(",");
  }
  myFile.close();
  
  delay(6000);
}

 

مقدار دمای هر سنسور در یک فایل txt ذخیره می شود که می توانید نمودار داده ها را با اکسل نشان دهید .تصویر زیر مربوط به داده های سنسور های به کار رفته در 36 ساعت است :

منبع : https://randomnerdtutorials.com/dht11-vs-dht22-vs-lm35-vs-ds18b20-vs-bme280-vs-bmp180/

Tags:
About Author: USER_4