Что происходит с температурой, когда вы открываете дверцу холодильника? Очевидно, что холодный воздух выходит и температура повышается. Но насколько? А как часто включается система охлаждения?
Чтобы ответить на эти вопросы — можно собрать простую самодельную систему регистрации данных. Для этого понадобятся только: контроллер 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, термины, начало работы
КМБ для начинающих ардуинщиков
Состав стартера (точка входа для начинающих ардуинщиков)