Z kodów przedstawionych tu przez Jola skleciłem program, który pokazuje na wyświetlaczu temperaturę powietrza, wilgotność oraz temperaturę punktu rosy.
Wszystko działa. Zapakuję to w pudełko i będę używał jako mini stację pogodową ostrzegającą o możliwości wystąpienia rosy.
Na razie żadnej automatyki... grzałki jak dotąd będę włączał ręcznie.
Żeby ten układ należycie spełniał swoją funkcję alarmową chciałbym jeszcze dodać mrugającą czerwoną diodę LED w momencie kiedy wystąpi możliwość roszenia.
I tu mam problem jak taki warunek dopisać do istniejącego programu - nie potrafię sam tego zrobić.
Czy ktoś mógłby mi pomóc dopisać taką sekwencję?
Zastanawiam się też jak bardzo temperatura powietrza musi się zbliżyć do temperatury punktu rosy, żeby warunek włączenia alarmu został spełniony?
Dwa, jeden, a może ułamek stopnia Celsjusza?
Uwaga do foto: w momencie robienia zdjęcia w układzie brakowało DHT22
Poniżej program, który z pewnością zawiera błędy (przepraszam znawców tematu), ale działa.
Dołączyłem do niego linię w części setup():
digitalWrite(7, LOW); //LED czerwony - możliwość powstania rosy
więcej w temacie mrugającej diody nie potrafię...
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Timer.h>
#include <dht.h>
#include <EEPROM.h>
#include <LiquidCrystal.h>
#define DS8120_PIN 6
#define DHT22_PIN 9
OneWire oneWire(DS8120_PIN);
DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer;
dht DHT;
Timer timer;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
boolean DS1820connected = false;
boolean DHT22connected = false;
float currentTemp; // bieżąca temperatura z czujnika DHT
float currentHum; // bieżąca wilgotność z czujnika DHT
float currentDewpoint; // obliczony punkt rosy na podstawie danych z czujnika DHT
float currentDSTemp; // bieżąca temperatura z czujnika DS przymocowanego do lustra
void setup() {
int chk = DHT.read22(DHT22_PIN);
if(chk == DHTLIB_OK) DHT22connected = true; {
pinMode(9, OUTPUT); // dwa wiersze do regulacji kontrastu wyświetlacza
analogWrite(9, 100); // regulacja
}
digitalWrite(7, LOW); //LED czerwony - możliwość powstania rosy
sensors.begin();
DS1820connected = sensors.getAddress(insideThermometer, 0);
if(DS1820connected) sensors.setResolution(insideThermometer, 10);
lcd.begin(16, 2);
timer.every(1000, updateSensors);
}
void loop() {
timer.update();
}
void printData() {
Serial.println(currentTemp);
}
void updateSensors() {
if (DS1820connected) {
sensors.requestTemperaturesByAddress(insideThermometer); // przy 10 bitowej dokładności trwa 188ms
timer.after(188, readTemp);
currentDSTemp = sensors.getTempC(insideThermometer);
}
if (DHT22connected) {
DHT.read22(DHT22_PIN);
currentTemp = DHT.temperature;
currentHum = DHT.humidity;
currentDewpoint = dewPoint(currentTemp, currentHum);
}
}
void readTemp() {
currentTemp = sensors.getTempC(insideThermometer);
updateLCD();
}
// dewPoint function NOAA
// reference (1) : http://wahiduddin.net/calc/density_algorithms.htm
// reference (2) : http://www.colorado.edu/geography/weather_station/Geog_site/about.htm
//
double dewPoint(double celsius, double humidity)
{
// (1) Saturation Vapor Pressure = ESGG(T)
double RATIO = 373.15 / (273.15 + celsius);
double RHS = -7.90298 * (RATIO - 1);
RHS += 5.02808 * log10(RATIO);
RHS += -1.3816e-7 * (pow(10, (11.344 * (1 - 1/RATIO ))) - 1) ;
RHS += 8.1328e-3 * (pow(10, (-3.49149 * (RATIO - 1))) - 1) ;
RHS += log10(1013.246);
// factor -3 is to adjust units - Vapor Pressure SVP * humidity
double VP = pow(10, RHS - 3) * humidity;
// (2) DEWPOINT = F(Vapor Pressure)
double T = log(VP/0.61078); // temp var
return (241.88 * T) / (17.558 - T);
}
void updateLCD() {
lcd.clear();
lcd.print("Temp [C]= ");
lcd.print(currentTemp);
lcd.setCursor(0, 1);
lcd.print("RH=");
lcd.print(currentHum,0);
lcd.print("% DP=");
lcd.print(currentDewpoint,1);
lcd.print("C");
}