Что происходит с температурой, когда вы открываете дверцу холодильника? Очевидно, что холодный воздух выходит и температура повышается. Но насколько? А как часто включается система охлаждения?
Чтобы ответить на эти вопросы — можно собрать простую самодельную систему регистрации данных. Для этого понадобятся только: контроллер Arduino Uno, температурный сенсор (DHT22, TMP36), фоторезистор (для отслеживания открытия двери холодильника), экран и модуль для работы с картами памяти формата microSD (для хранения данных).
Скетч для Arduino (Arduino_SD_card_Datalogger_DHT22__PhotoSnsr_w2x16.ino)
/* micro SD card Datalogger for:
DHT22 Temp and Humidity
Photo Resistor
TMP36 Temp Sensor (physical)
Copy and pasted by Ryan, poorly.
*/
const int analogTemp1 = A0; // Analog input pin for TMP36 Temp sensor
const int analogTemp2 = A1; // Analog input pin for TMP36 Temp sensor
const int analogInPin2 = A2; // Analog input pin that the photoresistor is attached to
int sensorValueA = 0; // value read from the photoresistor
const int analogInPin3 = A3; // Analog input pin that the photoresistor is attached to
int sensorValueB = 0; // value read from the photoresistor
int led4 = 4;
int led5 = 5;
int led6 = 6;
// include the library code
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
//#include "Adafruit_seesaw.h"
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address for a 16 chars and 2 line display
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#define DHTPIN 2 // Digital pin connected to the DHT sensor
#include <SPI.h>
#include <SD.h>
uint32_t delayMS;
// Uncomment the type of sensor in use:
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
DHT_Unified dht(DHTPIN, DHTTYPE);
const int chipSelect = 10;
float Ftemp;
void setup() {
Serial.begin(9600);
pinMode(led4,OUTPUT); pinMode(led5,OUTPUT); pinMode(led6,OUTPUT);
digitalWrite(led6,HIGH); delay(250); //red
digitalWrite(led5,HIGH); delay(250); //yellow
digitalWrite(led4,HIGH); delay(250); //green
digitalWrite(led4,LOW);delay(250); digitalWrite(led5,LOW);delay(250); digitalWrite(led6,LOW);
//digitalWrite(leds[random(0,sizeof(leds)/sizeof(int))],LOW);
lcd.init(); //initialize the lcd
lcd.backlight(); //open the backlight
dht.begin();
sensor_t sensor;
dht.temperature().getSensor(&sensor);
dht.humidity().getSensor(&sensor);
delayMS = sensor.min_delay / 1000;
// Open serial communications and wait for port to open:
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.print("Initializing SD card...");
// see if the card is present and can be initialized:
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
// don't do anything more:
while (1);
}
Serial.println("card initialized.");
digitalWrite(led4,HIGH); //turn green led one
Serial.println("Data format is:");
Serial.println("Temp_F, %Humitidy, PhotoRes_A2, PhotoRes_A3, T1, T2, time(sec) elasped");
}
void loop() {
//---------------------TMP36 sensor---------------------------------
delay(50); int Temp1 = analogRead(analogTemp1);
delay(50); int Temp2 = analogRead(analogTemp2);
float voltage1 = Temp1 * 5.0;
voltage1 /= 1024.0;
float Temp1C = (voltage1 - 0.5) * 100 ;
float Temp1F = (Temp1C * 9.0 / 5.0) + 32.0;
float voltage2 = Temp2 * 5.0;
voltage2 /= 1024.0;
float Temp2C = (voltage2 - 0.5) * 100 ;
float Temp2F = (Temp2C * 9.0 / 5.0) + 32.0; //
int timeSec = millis()/1000;
//-------------Photo Resistor----------------------------------
sensorValueA = analogRead(analogInPin2); // read the analog in value:
//map the photo resistor analog value to something more comprehendable (0-100 range)
sensorValueA= map(sensorValueA,0,1023,0,100);
sensorValueB = analogRead(analogInPin3); // read the analog in value:
//map the photo resistor analog value to something more comprehendable (0-100 range)
sensorValueB= map(sensorValueB,0,1023,0,100);
//-------------DHT11 Temp & Humidity----------------------------
digitalWrite(led5,LOW);
delay(delayMS);
digitalWrite(led5,HIGH);
sensors_event_t event; // Get temperature event and print its value.
dht.temperature().getEvent(&event);
if (isnan(event.temperature)) {
Serial.println(F("Error reading temperature!"));
}
else {
//Serial.print(F("Temperature: "));
//Serial.print((1.8*event.temperature+32));
Ftemp = ((event.temperature)*1.8)+32;
//Serial.print(",");
}
// Get humidity event and print its value.
dht.humidity().getEvent(&event);
if (isnan(event.relative_humidity)) {
Serial.println(F("Error reading humidity!"));
}
else {
//Serial.print(F("Humidity: "));
//Serial.println(event.relative_humidity);
//Serial.println(F("%"));
}
//-------------Formatting for SD card writing----------------------------
//// make a single line string for assembling the data to log:
String dataString = ""; // this is a string now, its not numerical value....
dataString += String((Ftemp)); dataString += ",";
dataString += String(round(event.relative_humidity)); dataString += ",";
dataString += String(sensorValueA); dataString += ",";
dataString += String(sensorValueB); dataString += ",";
dataString += String(round(Temp1F)); dataString += ",";
dataString += String(round(Temp2F)); dataString += ",";
dataString += String(timeSec);
//---------------------------SD CARD Write function------------------
digitalWrite(led6,HIGH); delay(50);
// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
File dataFile = SD.open("datalog.txt", FILE_WRITE);
// if the file is available, write to it:
if (dataFile) {
dataFile.println(dataString);
dataFile.close();
Serial.println(dataString); // print to the serial port too:
}
// if the file isn't open, pop up an error:
else {
Serial.println("error opening datalog.txt");
}
digitalWrite(led6,LOW);
//-----------------------print to LCD-----------------------------
lcd.setCursor(0,0); lcd.print("PR2 "); lcd.print(sensorValueA);
lcd.setCursor(0,1); lcd.print("T1 "); lcd.print(round(Temp1F)); lcd.print("F");
lcd.setCursor(11,0);
lcd.print(round(Ftemp)); lcd.print("*F");
lcd.setCursor(10,1); lcd.print("RH "); lcd.print(round(event.relative_humidity)); lcd.print("%");
}
Ссылки
Refrigerator Data Logger
По теме
Практическое программирование Arduino — Аналоговый датчик температуры – LM335
Практическое программирование Arduino — температурный 1-Wire датчик DS18S20
Чёрный ящик для автомобиля на Arduino Mega
Arduino в ближнем космосе: 27 км над Землёй
Arduino
Ардуино что это и зачем?
Arduino, термины, начало работы
КМБ для начинающих ардуинщиков
Состав стартера (точка входа для начинающих ардуинщиков)
