Forum AstroCD
http://www.astrocd.pl/forum/

Arduino w Astronomii - Sterownik grzałek
http://www.astrocd.pl/forum/viewtopic.php?f=105&t=5866
Strona 1 z 2

Autor:  Radosław Deska [ niedziela, 12 maja 2019, 15:28 ]
Tytuł:  Arduino w Astronomii - Sterownik grzałek

Założenia dla sterownika i potrzebne elementy

Założenia na początek bardzo proste i podstawowe.

  • Pomiar temperatury
  • Pomiar wilgotności
  • Obliczenie temperatury punktu rosy
  • Sterowanie pracą grzałki w zależności jaki mamy punkt rosy
  • Sposób sterowania grzałką - włącz/wyłącz (bez regulacji mocy grzałki)

Potrzebne elementy dla układu modelowego (wyjściowego)

  • Arduino UNO lub NANO - 1 szt.
  • Czujnik DHT22 (AM2302) - 1 szt.
  • Rezystor 220 Ohm - 2 szt.
  • Rezystor 10k Ohm - 1szt.
  • Dioda LED - czerwona
  • Dioda LED - zielona
  • Płytka stykowa - 1 szt.
  • Kilka przewodów do połączenia wszystkiego

Schemat układu

Załącznik:
Komentarz: Schemat układu
ASTRO_DHT22.png
ASTRO_DHT22.png [ 349.4 KiB | Przeglądane 1845 razy ]


Opis działania

Układ ma za zadanie dokonywać pomiaru temperatury i wilgotności za pomocą czujnika DHT22. Na podstawie zmierzonych wartości program dokonuje obliczeń temperatury punktu rosy. Mając te dane i na ich podstawie program steruje grzałką. Czerwona dioda LED sygnalizuje (symuluje) włączenie grzałki. Zielona dioda LED sygnalizuje brak roszenia. Program nie ma zdefiniowanego pinu / pinów do sterowania grzałką / grzałkami (układ pełni na chwilę obecną zadanie modelowe, eksperymentalne). Komunikacja szeregowa (COM) służy jako "monitor" działania programu - docelowo może być wyłączona w celu oszczędności pamięci programu.

Funkcje:
  • Pomiar temperatury
  • Pomiar wilgotności
  • Obliczenie punktu rosy
  • Sterowanie grzałką teleskopu - włącz / wyłącz (symulacja diodami LED)
  • Sygnalizacja błędu odczytu z czujnika DHT - (wizualna, diodą LED)

Wykorzystane biblioteki:
  • Adafruit Unified Sensor (Adafruit)
  • DHT Sensor Library (Adafruit)

Kod programu

Kod:
//  Automatyczny sterownik grzałek
//
//  Funkcje:
//    - Pomiar temperatury
//    - Pomiar wilgotności
//    - Obliczenie punktu rosy
//    - Sterowanie grzałką teleskopu - włącz / wyłącz
//    - Sygnalizacja błędu odczytu z czujnika DHT
//
//  Biblioteki:
//    - Adafruit Unified Sensor (Adafruit)
//    - DHT Sensor Library (Adafruit)
//
//  Uwagi:
//    - Program demonstruje działanie automatycznego sterownika grzałek.
//    - Czerwona dioda LED sygnalizuje (symuluje) włączenie grzałki
//    - Zielona dioda LED sygnalizuje brak roszenia
//    - Program nie ma zdefiniowanego pinu / pinów do sterowania grzałką / grzałkami
//    - Komunikacja szeregowa (COM) służy jako "monitor" działania programu - docelowo może być wyłączona w celu oszczędności pamięci programu
//    - Rozwiązanie programowe absolutnie nie jedynie słuszne
//    - Za uszkodzenia wynikające z działania programu nie odpowiadam, program stworzony został jako przykład dla urządzenia modelowego (bez grzałki)
//
//  Autor:
//    Radosław Deska
// 
//  Wersja:
//    - 1.0 (12.05.2019)
//
// -------------------------------------------------------------------------------------------------------------------------------------------------

#include "DHT.h"                                                      //  Biblioteka DHT

#define LED_R_PIN 3                                                   //  Czerwona dioda LED do pinu cyfrowego nr 3 (sygnalizacja pracy grzałki)
#define LED_G_PIN 4                                                   //  Zielona dioda LED do pinu cyfrowego nr 4 (sygnalizacja braku rosy)

#define DHTPIN 5                                                      //  Czujnik DHT podłaczony do pinu cyfrowego nr 5
#define DHTTYPE DHT22                                                 //  Rodzaj czujnika DHT22

DHT dht(DHTPIN, DHTTYPE);


// Funkcja obliczająca temperature punktu rosy na podstawie pomiarów temperatury i wilgotności - wynik typu float

float pktRosy(float humi, float temp) {
  float k;
  k = log(humi/100) + (17.62 * temp) / (243.12 + temp);
  return 243.12 * k / (17.62 - k);
}


void setup() {

  Serial.begin(9600);                                                 //  Włączenie komunikacji szeregowej - ustawienie prędkości transmisji
  Serial.println("Automatyczny sterownik grzałek \n");                //  Tekst na powitanie

  pinMode(LED_R_PIN, OUTPUT);                                         //  Konfiguracja pinu cyfrowego nr 3 jako wyjście
  pinMode(LED_G_PIN, OUTPUT);                                         //  Konfiguracja pinu cyfrowego nr 4 jako wyjście

  dht.begin();                                                        //  Włączenie i inicjalizacja komunikacji z czujnikiem DHT

}

void loop() {

  delay(500);                                                        //  Odczekaj 0,5 sekundy

  float h = dht.readHumidity();                                       //  Odczyt wilgotności h - typ zmiennej float
  float t = dht.readTemperature();                                    //  Odczyt temperatury t - typ zmiennej float


  // Kontrola odczytu danych z czujnika DHT, sygnalizacja błędu czerwoną diodą LED

  if (isnan(h) || isnan(t)) {
    Serial.println("Błąd odczytu z czujnika DHT!");                   //  Wyślij komunikat o błedzie
   
    digitalWrite(LED_R_PIN, HIGH);                                    //  Włącz czerwoną diode LED
    delay(150);                                                       //  Odczekaj 150ms
    digitalWrite(LED_R_PIN, LOW);                                     //  Wyłącz czerwoną diode LED
   
    return;
  }


  float td = pktRosy(h, t);                                           //  Wywołanie funkcji pktRosy z wartościami h i t, przypisanie wyniku do zmiennej td

 
  // Wysłanie na port COM danych o temperaturze (t), wilgotności (h) i temeraturze punktu rosy (td)
 
  Serial.print("Wilgotność: ");
  Serial.print(h);
  Serial.print("%  Temperatura: ");
  Serial.print(t);
  Serial.print("°C ");
  Serial.print(" Punkt rosy: ");
  Serial.print(td);
  Serial.print("°C \n");

  // Sprawdzamy na podstawie wyliczonego punktu rosy (td) i mierzonej temperatury z czujnika DHT czy należy włączyć grzałkę
  // Jeżeli td > t = uruchamiamy grzałkę, w przeciwnym razie td < t = wyłączamy grzałkę
  // W układzie modelowym czerwona dioda LED sygnalizuje pracę grzałki, zielona dioda LED brak rosy.
  // Jeżeli spełniony jest warunek td > t wówczas zaświeci się czerwona dioda LED (grzałka pracuje), zielona dioda LED zgaśnie (rosa)

  if (td > t) {
    digitalWrite(LED_R_PIN, HIGH);                                    //  Włącz czerwoną diodę LED - grzałka pracuje
    digitalWrite(LED_G_PIN, LOW);                                     //  Wyłącz zieloną diodę LED - rosa
  }
  else{
    digitalWrite(LED_R_PIN, LOW);                                     //  Wyłącz czerwoną diodę LED - grzałka nie pracuje
    digitalWrite(LED_G_PIN, HIGH);                                    //  Włącz zieloną diodę LED - brak rosy
  }
}


Starałem się maksymalnie opisać komentarzami program. Sama idea wcale nie jest jedyna i słuszna.
Jest to wersja 1.0, modelowa i ma służyć jako punkt wyjścia do w pełni działającego urządzenia.
Dlatego sygnalizację działania oparłem na dwóch diodach LED.

Miejcie litość nigdy nigdzie nie publikowałem swoich programów więc nie biorę odpowiedzialności za wszelkie uszkodzenia czy to programowe czy też sprzętowe :mrgreen:

Autor:  Marek Substyk [ niedziela, 12 maja 2019, 18:36 ]
Tytuł:  Re: Arduino w Astronomii - Sterownik grzałek

Radku. Super robota.
Jutro zabieram się za konstrukcję.

Autor:  Radosław Deska [ niedziela, 12 maja 2019, 18:45 ]
Tytuł:  Re: Arduino w Astronomii - Sterownik grzałek

To tylko pierwsza wersja programu. Jak się uda zmieścić w 8kB programu spokojnie finalnie można wrzucić to do tego maleństwa :)

Obrazek

ATTINY85 + PCB + czujnik + kilka elementów i małe sprytne urządzenie gotowe :)

Wersja 1.0 programu bez wysyłania komunikatów na port COM zajmuje 3,8kB

Autor:  Radosław Deska [ niedziela, 12 maja 2019, 21:58 ]
Tytuł:  Re: Arduino w Astronomii - Sterownik grzałek

Jeszcze dobrze nie ostygła wersja 1.0 a już jest aktualizacja do wersji 1.1 programu.

Robiąc test pracy wrzuciłem układ do zamrażarki na kilka minut. Następnie wyjąłem układ i podłączyłem do zasilania.
Wim, wiem, ryzykowne ale czego to się nie robi. Całość ładnie się "zmoczyła" i efekt jaki uzyskałem to brak sygnalizacji, że grzałka działa (czerwona dioda LED).

Wynik z tego co pokazywał serial monitor:
Kod:
Wilgotność: 99.00%  Temperatura: 06.70°C  Punkt rosy: 06.69°C
Wilgotność: 99.00%  Temperatura: 06.70°C  Punkt rosy: 06.69°C
Wilgotność: 99.00%  Temperatura: 06.71°C  Punkt rosy: 06.70°C
Wilgotność: 99.00%  Temperatura: 06.72°C  Punkt rosy: 06.71°C

Przy warunku td > t po prostu nie miało prawa zadziałać.
Zmieniłem warunek na td+1 > t, mała prosta modyfikacja sprawiająca, że układ modelowy zadziałał.

Teraz ważne pytanie do mądrych głów. Na ile przed "zbliżającym się" punktem rosy powinien układ włączyć grzałkę i w którym momencie ją wyłączyć ?

Poniżej kod dla wersji 1.1 wraz z komentarzami.
Kod:
//  Automatyczny sterownik grzałek
//
//  Funkcje:
//    - Pomiar temperatury
//    - Pomiar wilgotności
//    - Obliczenie punktu rosy
//    - Sterowanie grzałką teleskopu - włącz / wyłącz
//    - Sygnalizacja błędu odczytu z czujnika DHT
//
//  Biblioteki:
//    - Adafruit Unified Sensor (Adafruit)
//    - DHT Sensor Library (Adafruit)
//
//  Uwagi:
//    - Program demonstruje działanie automatycznego sterownika grzałek.
//    - Czerwona dioda LED sygnalizuje (symuluje) włączenie grzałki
//    - Zielona dioda LED sygnalizuje brak roszenia
//    - Program nie ma zdefiniowanego pinu / pinów do sterowania grzałką / grzałkami
//    - Komunikacja szeregowa (COM) służy jako "monitor" działania programu - docelowo może być wyłączona w celu oszczędności pamięci programu
//    - Rozwiązanie programowe absolutnie nie jedynie słuszne
//    - Za uszkodzenia wynikające z działania programu nie odpowiadam, program stworzony został jako przykład dla urządzenia modelowego (bez grzałki)
//
//  Autor:
//    Radosław Deska
// 
//  Wersja:
//    - 1.1 (12.05.2019)
//
//  Poprawki do wersji:
//    - zmieniono warunek kiedy ma zostać włączona grzałka
//    - dodano komunikat wysyłany na port COM o włączonej / wyłączonej grzałce (ON/OFF)
//
// -------------------------------------------------------------------------------------------------------------------------------------------------

#include "DHT.h"                                                      //  Biblioteka DHT

#define LED_R_PIN 3                                                   //  Czerwona dioda LED do pinu cyfrowego nr 3 (sygnalizacja pracy grzałki)
#define LED_G_PIN 4                                                   //  Zielona dioda LED do pinu cyfrowego nr 4 (sygnalizacja braku rosy)

#define DHTPIN 5                                                      //  Czujnik DHT podłaczony do pinu cyfrowego nr 5
#define DHTTYPE DHT22                                                 //  Rodzaj czujnika DHT22

DHT dht(DHTPIN, DHTTYPE);


// Funkcja obliczająca temperature punktu rosy na podstawie pomiarów temperatury i wilgotności - wynik typu float

float pktRosy(float humi, float temp) {
  float k;
  k = log(humi/100) + (17.62 * temp) / (243.12 + temp);
  return 243.12 * k / (17.62 - k);
}


void setup() {

  Serial.begin(9600);                                                 //  Włączenie komunikacji szeregowej - ustawienie prędkości transmisji
  Serial.println("Automatyczny sterownik grzałek \n");                //  Tekst na powitanie

  pinMode(LED_R_PIN, OUTPUT);                                         //  Konfiguracja pinu cyfrowego nr 3 jako wyjście
  pinMode(LED_G_PIN, OUTPUT);                                         //  Konfiguracja pinu cyfrowego nr 4 jako wyjście

  dht.begin();                                                        //  Włączenie i inicjalizacja komunikacji z czujnikiem DHT

}

void loop() {

  delay(500);                                                        //  Odczekaj 2 sekundy

  float h = dht.readHumidity();                                       //  Odczyt wilgotności h - typ zmiennej float
  float t = dht.readTemperature();                                    //  Odczyt temperatury t - typ zmiennej float


  // Kontrola odczytu danych z czujnika DHT, sygnalizacja błędu czerwoną diodą LED

  if (isnan(h) || isnan(t)) {
//    Serial.println("Błąd odczytu z czujnika DHT!");                   //  Wyślij komunikat o błedzie
   
    digitalWrite(LED_R_PIN, HIGH);                                    //  Włącz czerwoną diode LED
    delay(150);                                                       //  Odczekaj 150ms
    digitalWrite(LED_R_PIN, LOW);                                     //  Wyłącz czerwoną diode LED
   
    return;
  }


  float td = pktRosy(h, t);                                           //  Wywołanie funkcji pktRosy z wartościami h i t, przypisanie wyniku do zmiennej td

 
  // Wysłanie na port COM danych o temperaturze (t), wilgotności (h) i temeraturze punktu rosy (td)
 
  Serial.print("Wilgotność: ");
  Serial.print(h);
  Serial.print("%  Temperatura: ");
  Serial.print(t);
  Serial.print("°C ");
  Serial.print(" Punkt rosy: ");
  Serial.print(td);
  Serial.print("°C ");

  // Sprawdzamy na podstawie wyliczonego punktu rosy (td) i mierzonej temperatury z czujnika DHT czy należy włączyć grzałkę
  // Jeżeli td > t = uruchamiamy grzałkę, w przeciwnym razie td < t = wyłączamy grzałkę
  // W układzie modelowym czerwona dioda LED sygnalizuje pracę grzałki, zielona dioda LED brak rosy.
  // Jeżeli spełniony jest warunek td > t wówczas zaświeci się czerwona dioda LED (grzałka pracuje), zielona dioda LED zgaśnie (rosa)

  if (td+1 > t) {                                                     //  Zmodyfikowany warunek. Do punktu rosy (td) dodałem jeden (testy zamrażarka)
    digitalWrite(LED_R_PIN, HIGH);                                    //  Włącz czerwoną diodę LED - grzałka pracuje
    digitalWrite(LED_G_PIN, LOW);                                     //  Wyłącz zieloną diodę LED - rosa
    Serial.print("   ON ");                                           //  Znacznik grzałki - ON (kiedy dt+1 > t)
  }
  else{
    digitalWrite(LED_R_PIN, LOW);                                     //  Wyłącz czerwoną diodę LED - grzałka nie pracuje
    digitalWrite(LED_G_PIN, HIGH);                                    //  Włącz zieloną diodę LED - brak rosy
    Serial.print("   OFF ");                                          //  Znacznik grzałki - OFF (kiedy dt+1 < t)
  }

  Serial.print("\n");
}

Autor:  Grzegorz Czernecki [ poniedziałek, 13 maja 2019, 15:17 ]
Tytuł:  Re: Arduino w Astronomii - Sterownik grzałek

A kiedy wersja z PWM i sterowaniem mocą grzałki zależnie od temperatury i punktu rosy ? :)

Autor:  Radosław Deska [ poniedziałek, 13 maja 2019, 16:02 ]
Tytuł:  Re: Arduino w Astronomii - Sterownik grzałek

PWM dorzucimy :) Powiedz mi jaka zależność miała by być? W sensie kiedy grzałka powinna grzać najmocniej a kiedy słabo?

Autor:  Grzegorz Czernecki [ poniedziałek, 13 maja 2019, 17:59 ]
Tytuł:  Re: Arduino w Astronomii - Sterownik grzałek

Przykładowo jak temperatura zbliżała by się do punktu rosy dajmy na to na 2 stopnie to grzałka załączałą by się na 30% , 1 stopień 50% punkt rosy 60% itd

Autor:  Radosław Deska [ poniedziałek, 13 maja 2019, 18:53 ]
Tytuł:  Re: Arduino w Astronomii - Sterownik grzałek

To tak napisze program żeby w taki sposób działał.
Podejrzewam, że opcja ustawiania progów działania grzałki bylaby ciekawym pomysłem.

Autor:  Marek Substyk [ środa, 15 maja 2019, 19:17 ]
Tytuł:  Re: Arduino w Astronomii - Sterownik grzałek

Informuje, że doszedłem już do tego punktu

Załączniki:
grzalka0.jpg
grzalka0.jpg [ 192.64 KiB | Przeglądane 1788 razy ]

Autor:  Marek Substyk [ środa, 15 maja 2019, 19:31 ]
Tytuł:  Re: Arduino w Astronomii - Sterownik grzałek

Wersja na ATTINY85 powinna być rewelacyjna!

Autor:  Radosław Deska [ środa, 15 maja 2019, 20:53 ]
Tytuł:  Re: Arduino w Astronomii - Sterownik grzałek

Marek Substyk napisał(a):
Informuje, że doszedłem już do tego punktu
Super, że się udało!

Marek Substyk napisał(a):
Wersja na ATTINY85 powinna być rewelacyjna!
Tez mam takie zdanie. Jest szansa na małe urządzenie. Limit 8kB programu jest jak najbardziej możliwy.

Za nim dojdziemy do tego etapu trzeba dopracować program i jego działanie tak by wszystko działało zgodnie z planem.

Grzegorz Czernecki napisał(a):
Przykładowo jak temperatura zbliżała by się do punktu rosy dajmy na to na 2 stopnie to grzałka załączałą by się na 30% , 1 stopień 50% punkt rosy 60% itd
Trzeba teraz napisać wrunek tak by grzałka działała z zalożeniami jakie podsunąl Grzegorz. Oczywiście sterowanie PWM.

Autor:  Radosław Deska [ sobota, 18 maja 2019, 22:51 ]
Tytuł:  Re: Arduino w Astronomii - Sterownik grzałek

Dzisiaj powstała wersja 1.2 z obsługą PWM.

Poprawki do wersji 1.2
  • poprawiono komentarze
  • zmieniony został blok związany z obsługą grzałki, inna budowa warunku
  • dodanie pinu obsługującego grzałkę (pin cyfrowy nr 6)
  • dodanie funkcji PWM dla pinu nr 6
  • zmienione zostały typy zmiennych t, h, td z float na int
  • zmieniono warunek braku komunikacji/danych z czujnika DHT

Całkowicie został przebudowany blok warunku sprawdzającego jak "przesuwa się" punkt rosy
Kod:
  if ((t - td <= 7) && (t - td >= 5)) {                               //  Jeżeli różnica t-td jest mniejsza lub równa 7 i większa lub równa 5
    digitalWrite(LED_R_PIN, HIGH);                                    //  Włącz czerwoną diodę LED - sygnalizacja pracy grzałki
    digitalWrite(LED_G_PIN, LOW);                                     //  Wyłącz zieloną diodę LED - rosa
    Serial.print("ON\t");                                             //  Wyślij tekst - ON i dodaj tabulator

    analogWrite(HEATER, 2);                                           //  PWM  - wypełnienie 2 (grzałkę symuluje dioda LED)
    Serial.print("PWM 2, 7 - 5");                                     //  Wyślij tekst o wypełnieniu PWM i zakresie

  }
  else if ((t - td < 5) && (t - td >= 3)) {                           //  Jeżeli różnica t-td jest mniejsza 5 i większa lub równa 3
    digitalWrite(LED_R_PIN, HIGH);                                    //  Włącz czerwoną diodę LED - grzałka pracuje
    digitalWrite(LED_G_PIN, LOW);                                     //  Wyłącz zieloną diodę LED - rosa
    Serial.print("ON\t");                                             //  Wyślij tekst - ON i dodaj tabulator

    analogWrite(HEATER, 32);                                          //  PWM  - wypełnienie 2 (grzałkę symuluje dioda LED)
    Serial.print("PWM 32, 5 - 3");                                    //  Wyślij tekst o wypełnieniu PWM i zakresie
  }
  else if ((t - td < 3) && (t - td > 1)) {                            //  Jeżeli różnica t-td jest mniejsza 3 i większa 1
    digitalWrite(LED_R_PIN, HIGH);                                    //  Włącz czerwoną diodę LED - grzałka pracuje
    digitalWrite(LED_G_PIN, LOW);                                     //  Wyłącz zieloną diodę LED - rosa
    Serial.print("ON\t");                                             //  Wyślij tekst - ON i dodaj tabulator

    analogWrite(HEATER, 64);                                          //  PWM  - wypełnienie 64 (grzałkę symuluje dioda LED)
    Serial.print("PWM 64, 3 - 1");                                    //  Wyślij tekst o wypełnieniu PWM i zakresie
  }
  else if (t - td == 1) {                                             //  Jeżeli różnica t-td jest równa 1
    digitalWrite(LED_R_PIN, HIGH);                                    //  Włącz czerwoną diodę LED - grzałka pracuje
    digitalWrite(LED_G_PIN, LOW);                                     //  Wyłącz zieloną diodę LED - rosa
    Serial.print("ON\t");                                             //  Wyślij tekst - ON i dodaj tabulator

    analogWrite(HEATER, 255);                                         //  PWM  - wypełnienie 255 (grzałkę symuluje dioda LED) - grzałka pracuje pełną mocą
    Serial.print("PWM 255, 1");                                       //  Wyślij tekst o wypełnieniu PWM i zakresie
  }
  else {
    digitalWrite(LED_R_PIN, LOW);                                     //  Wyłącz czerwoną diodę LED - grzałka nie pracuje
    digitalWrite(LED_G_PIN, HIGH);                                    //  Włącz zieloną diodę LED - brak rosy
    Serial.print("OFF\t");                                            //  Znacznik grzałki - OFF (kiedy td+1 < t)

    analogWrite(HEATER, 0);                                           //  PWM  - wypełnienie 0 (grzałkę symuluje dioda LED)
    Serial.print("PWM 0");                                            //  Wyślij tekst o wypełnieniu PWM
  }


Warunek oparty został na różnicy między temperaturą (t) i temperaturą punktu rosy (td). W zależności jaki wynik otrzymujemy odpowiednio sterujemy PWM na pinie nr 6.
Stopień wypełnienia jest "na oko" z tego względu, że zamiast grzałki do pinu nr 6 podłączyłem diodę LED symulującą już samą grzałkę. Podłączenie identyczne jak pozostałe diody LED (przez rezystor).

Oczywiście absolutnie nie podłączajcie grzałki bezpośrednio do pinu nr 6! To nadal układ modelowy bez końcówki wykonawczej dla samej grzałki!

Czekam na uwagi, propozycje zmian :)

Cały kod wersji 1.2 poniżej

Kod:
//  Automatyczny sterownik grzałek
//
//  Funkcje:
//    - Pomiar temperatury
//    - Pomiar wilgotności
//    - Obliczenie punktu rosy
//    - Sterowanie grzałką teleskopu - włącz / wyłącz
//    - Sygnalizacja błędu odczytu z czujnika DHT
//
//  Biblioteki:
//    - Adafruit Unified Sensor (Adafruit)
//    - DHT Sensor Library (Adafruit)
//
//  Uwagi:
//    - Program demonstruje działanie automatycznego sterownika grzałek.
//    - Czerwona dioda LED sygnalizuje (symuluje) włączenie grzałki
//    - Zielona dioda LED sygnalizuje brak roszenia
//    - Program nie ma zdefiniowanego pinu / pinów do sterowania grzałką / grzałkami
//    - Komunikacja szeregowa (COM) służy jako "monitor" działania programu - docelowo może być wyłączona w celu oszczędności pamięci programu
//    - Rozwiązanie programowe absolutnie nie jedynie słuszne
//    - Za uszkodzenia wynikające z działania programu nie odpowiadam, program stworzony został jako przykład dla urządzenia modelowego (bez grzałki)
//
//  Autor:
//    Radosław Deska
//
//  Wersja:
//    - 1.2 (18.05.2019)
//
//  Poprawki do wersji 1.2
//    - poprawiono komentarze
//    - zmieniony został blok związany z obsługą grzałki, inna budowa warunku
//    - dodanie pinu obsługującego grzałkę (pin cyfrowy nr 6)
//    - dodanie funkcji PWM dla pinu nr 6
//    - zmienione zostały typy zmiennych t, h, td z float na int
//    - zmieniono warunek braku komunikacji/danych z czujnika DHT
//
//  Poprawki do wersji 1.1
//    - zmieniono warunek kiedy ma zostać włączona grzałka
//    - dodano komunikat wysyłany na port COM o włączonej / wyłączonej grzałce (ON/OFF)
//
// -------------------------------------------------------------------------------------------------------------------------------------------------

#include "DHT.h"                                                      //  Biblioteka DHT

#define LED_R_PIN 3                                                   //  Czerwona dioda LED do pinu cyfrowego nr 3 (sygnalizacja pracy grzałki)
#define LED_G_PIN 4                                                   //  Zielona dioda LED do pinu cyfrowego nr 4 (sygnalizacja braku rosy)

#define HEATER 6                                                      // Pin sterujący pracą grzałki (pin cyfrowy nr 6, PWM)

#define DHTPIN 5                                                      //  Czujnik DHT podłaczony do pinu cyfrowego nr 5
#define DHTTYPE DHT22                                                 //  Rodzaj czujnika DHT22

DHT dht(DHTPIN, DHTTYPE);


// Funkcja obliczająca temperature punktu rosy na podstawie pomiarów temperatury i wilgotności - wynik typu float

float pktRosy(float humi, float temp) {
  float k;
  k = log(humi / 100) + (17.62 * temp) / (243.12 + temp);
  return 243.12 * k / (17.62 - k);
}


void setup() {

  Serial.begin(9600);                                                 //  Włączenie komunikacji szeregowej - ustawienie prędkości transmisji
  Serial.println("Automatyczny sterownik grzałek \t Wersja 1.2 \n");  //  Tekst na powitanie

  pinMode(LED_R_PIN, OUTPUT);                                         //  Konfiguracja pinu cyfrowego nr 3 jako wyjście
  pinMode(LED_G_PIN, OUTPUT);                                         //  Konfiguracja pinu cyfrowego nr 4 jako wyjście

  pinMode(HEATER, OUTPUT);                                            //  Konfiguracja pinu cyfrowego nr 6 jako wyjście

  dht.begin();                                                        //  Włączenie i inicjalizacja komunikacji z czujnikiem DHT

}

void loop() {

  delay(500);                                                         //  Odczekaj 500 ms

  int h = dht.readHumidity();                                         //  Odczyt wilgotności h - typ zmiennej int
  int t = dht.readTemperature();                                      //  Odczyt temperatury t - typ zmiennej int

  if (h == 0 || t == 0) {
    Serial.println("Błąd odczytu z czujnika DHT!");                   //  Wyślij komunikat o błedzie
    digitalWrite(LED_R_PIN, HIGH);                                    //  Włącz czerwoną diode LED
    delay(150);                                                       //  Odczekaj 150ms
    digitalWrite(LED_R_PIN, LOW);                                     //  Wyłącz czerwoną diode LED
    return;
  }

  //  Wywołanie funkcji pktRosy z wartościami h i t, przypisanie wyniku do zmiennej td (int)
 
  int td = pktRosy(h, t);

  // Wysłanie na port COM danych o temperaturze (t), wilgotności (h) i temeraturze punktu rosy (td)

  Serial.print("Wilgotność: ");                                       //  Wyślij tekst
  Serial.print(h);                                                    //  Wartość wilgotności - zmienna h
  Serial.print("°%");                                                 //  Wyślij tekst
  Serial.print("\t");                                                 //  Znak tabulatora
  Serial.print("Temperatura: ");                                      //  Wyślij tekst
  Serial.print(t);                                                    //  Wartość temperatury - zmienna t
  Serial.print("°C");                                                 //  Wyślij tekst
  Serial.print("\t");                                                 //  Znak tabulatora
  Serial.print(" Punkt rosy: ");                                      //  Wyślij tekst
  Serial.print(td);                                                   //  Wartość punktu rosy - zmienna td
  Serial.print("°C");                                                 //  Wyślij tekst
  Serial.print("\t");                                                 //  Znak tabulatora
  Serial.print("t-td = ");                                            //  Wyślij tekst
  Serial.print(t - td);                                               //  Oblicz różnicę między zmienną t i zmienną td i wyświetl
  Serial.print("\t");                                                 //  Znak tabulatora

  // Sprawdzamy na podstawie wyliczonego punktu rosy (td) i mierzonej temperatury z czujnika DHT czy należy włączyć grzałkę
  // Jeżeli td > t = uruchamiamy grzałkę, w przeciwnym razie td < t = wyłączamy grzałkę
  // W układzie modelowym czerwona dioda LED sygnalizuje pracę grzałki, zielona dioda LED brak rosy.
  // Jeżeli spełniony jest warunek td > t wówczas zaświeci się czerwona dioda LED (grzałka pracuje), zielona dioda LED zgaśnie (rosa)

  // !!! UWAGA !!! Do pinu nr 6 podłączona jest dioda LED wraz z rezystorem 220Ohm jako symulator grzałki

  if ((t - td <= 7) && (t - td >= 5)) {                               //  Jeżeli różnica t-td jest mniejsza lub równa 7 i większa lub równa 5
    digitalWrite(LED_R_PIN, HIGH);                                    //  Włącz czerwoną diodę LED - sygnalizacja pracy grzałki
    digitalWrite(LED_G_PIN, LOW);                                     //  Wyłącz zieloną diodę LED - rosa
    Serial.print("ON\t");                                             //  Wyślij tekst - ON i dodaj tabulator

    analogWrite(HEATER, 2);                                           //  PWM  - wypełnienie 2 (grzałkę symuluje dioda LED)
    Serial.print("PWM 2, 7 - 5");                                     //  Wyślij tekst o wypełnieniu PWM i zakresie

  }
  else if ((t - td < 5) && (t - td >= 3)) {                           //  Jeżeli różnica t-td jest mniejsza 5 i większa lub równa 3
    digitalWrite(LED_R_PIN, HIGH);                                    //  Włącz czerwoną diodę LED - grzałka pracuje
    digitalWrite(LED_G_PIN, LOW);                                     //  Wyłącz zieloną diodę LED - rosa
    Serial.print("ON\t");                                             //  Wyślij tekst - ON i dodaj tabulator

    analogWrite(HEATER, 32);                                          //  PWM  - wypełnienie 2 (grzałkę symuluje dioda LED)
    Serial.print("PWM 32, 5 - 3");                                    //  Wyślij tekst o wypełnieniu PWM i zakresie
  }
  else if ((t - td < 3) && (t - td > 1)) {                            //  Jeżeli różnica t-td jest mniejsza 3 i większa 1
    digitalWrite(LED_R_PIN, HIGH);                                    //  Włącz czerwoną diodę LED - grzałka pracuje
    digitalWrite(LED_G_PIN, LOW);                                     //  Wyłącz zieloną diodę LED - rosa
    Serial.print("ON\t");                                             //  Wyślij tekst - ON i dodaj tabulator

    analogWrite(HEATER, 64);                                          //  PWM  - wypełnienie 64 (grzałkę symuluje dioda LED)
    Serial.print("PWM 64, 3 - 1");                                    //  Wyślij tekst o wypełnieniu PWM i zakresie
  }
  else if (t - td == 1) {                                             //  Jeżeli różnica t-td jest równa 1
    digitalWrite(LED_R_PIN, HIGH);                                    //  Włącz czerwoną diodę LED - grzałka pracuje
    digitalWrite(LED_G_PIN, LOW);                                     //  Wyłącz zieloną diodę LED - rosa
    Serial.print("ON\t");                                             //  Wyślij tekst - ON i dodaj tabulator

    analogWrite(HEATER, 255);                                         //  PWM  - wypełnienie 255 (grzałkę symuluje dioda LED) - grzałka pracuje pełną mocą
    Serial.print("PWM 255, 1");                                       //  Wyślij tekst o wypełnieniu PWM i zakresie
  }
  else {
    digitalWrite(LED_R_PIN, LOW);                                     //  Wyłącz czerwoną diodę LED - grzałka nie pracuje
    digitalWrite(LED_G_PIN, HIGH);                                    //  Włącz zieloną diodę LED - brak rosy
    Serial.print("OFF\t");                                            //  Znacznik grzałki - OFF (kiedy td+1 < t)

    analogWrite(HEATER, 0);                                           //  PWM  - wypełnienie 0 (grzałkę symuluje dioda LED)
    Serial.print("PWM 0");                                            //  Wyślij tekst o wypełnieniu PWM
  }

Serial.println(" ");                                                  //  Przejdz do następnego wiersza (Serial Monitor)

}


Niestety forum nie zgadza się na przyjęcie pliku z rozszerzeniem *.ino dlatego muszę prezentować kod w pełnej okazałości zamiast gotowego piku do pobrania.

Autor:  Jarosław Grzegorzek [ niedziela, 9 czerwca 2019, 10:14 ]
Tytuł:  Re: Arduino w Astronomii - Sterownik grzałek

Mam pytanie związane DHT22. Stosuję go już od kilku lat i zauważyłem związane z nim ciekawe (a właściwie nieciekawe :) zjawisko). Uruchamiam układ i wszystko pracuje jak należy. Po kilku miesiącach stwierdzam, że mierzona przez niego wilgotność jest zawyżana. Z biegiem czasu proces się pogłębia. Po 1.5 roku czujnik pokazuje już niemal wyłącznie 100% (przy wyjątkowo małej wilgotności - 80%). Wymieniam DHT22 na nowy i na początku wszystko jest OK, ale z czasem sytuacja znów się powtarza jak z poprzednikiem. Temperaturę natomiast cały czas mierzy bezbłędnie. Czy ktoś z Was spotkał się z takim zjawiskiem ?

Autor:  Radosław Deska [ niedziela, 9 czerwca 2019, 20:09 ]
Tytuł:  Re: Arduino w Astronomii - Sterownik grzałek

Radosław Deska napisał(a):
Mam pytanie związane DHT22. Stosuję go już od kilku lat i zauważyłem związane z nim ciekawe (a właściwie nieciekawe :) zjawisko). Uruchamiam układ i wszystko pracuje jak należy. Po kilku miesiącach stwierdzam, że mierzona przez niego wilgotność jest zawyżana. Z biegiem czasu proces się pogłębia. Po 1.5 roku czujnik pokazuje już niemal wyłącznie 100% (przy wyjątkowo małej wilgotności - 80%). Wymieniam DHT22 na nowy i na początku wszystko jest OK, ale z czasem sytuacja znów się powtarza jak z poprzednikiem. Temperaturę natomiast cały czas mierzy bezbłędnie. Czy ktoś z Was spotkał się z takim zjawiskiem ?

Osobiście nie spotkałem się z takim objawem w przypadku mojego czujnika ponieważ stosunkowo krótko go posiadam i nie pracuje on non stop.
Z tego co udało mi się natknąć w czeluściach internetu powód takiego działania to po prostu sama konstrukcja czujnika i to z czego jest wykonany ma zasadniczy wpływ na jego żywotność i wiarygodność. Osobiście zauważyłem, że mój egzemplarz zawyża temperaturę o około 2 stopnie i to trochę nieliniowo.

Przy okazji kto znajdzie dwa błędy w kodzie (sposobie działania) dostanie za każdy znaleziony błąd piwo :)

Autor:  Grzegorz Czernecki [ niedziela, 16 czerwca 2019, 22:09 ]
Tytuł:  Re: Arduino w Astronomii - Sterownik grzałek

Jarosław Grzegorzek napisał(a):
Mam pytanie związane DHT22. Stosuję go już od kilku lat i zauważyłem związane z nim ciekawe (a właściwie nieciekawe :) zjawisko). Uruchamiam układ i wszystko pracuje jak należy. Po kilku miesiącach stwierdzam, że mierzona przez niego wilgotność jest zawyżana. Z biegiem czasu proces się pogłębia. Po 1.5 roku czujnik pokazuje już niemal wyłącznie 100% (przy wyjątkowo małej wilgotności - 80%). Wymieniam DHT22 na nowy i na początku wszystko jest OK, ale z czasem sytuacja znów się powtarza jak z poprzednikiem. Temperaturę natomiast cały czas mierzy bezbłędnie. Czy ktoś z Was spotkał się z takim zjawiskiem ?
U mnie jest podobnie mam go w astropudełku i raz wogóle nie chciał działać a innym razem pokazywał dziwne wartości wilgotności i punktu rosy

Autor:  Radosław Deska [ niedziela, 23 czerwca 2019, 10:39 ]
Tytuł:  Re: Arduino w Astronomii - Sterownik grzałek

Zamówiłem czujnik DHT21 więc będzie możliwość porównania jak się sprawuje na tle DHT22.

Autor:  Jarosław Grzegorzek [ niedziela, 4 sierpnia 2019, 02:37 ]
Tytuł:  Re: Arduino w Astronomii - Sterownik grzałek

Poczytałem sobie trochę na temat czujników (higrometrów). Okazuje się, że faktycznie DHT22 mają problem z długoterminową stabilnością. Po pewnym czasie najzwyczajniej "padają". Z różnych źródeł dowiedziałem się, że bardzo dobrze oceniany jest natomiast BME280. W Botlandzie go mają, ale bardzo drogo (prawie 100 zł), więc sprowadzę kilka sztuk z "dalekich krajów". Aż tak mi się nie spieszy i mogę poczekać. Przetestuję i dam znać czy jest lepiej.
Obrazek

Autor:  Radosław Deska [ niedziela, 4 sierpnia 2019, 20:12 ]
Tytuł:  Re: Arduino w Astronomii - Sterownik grzałek

Jarek to koniecznie daj znać jak przyjdą czujniki jak się spisują. Na marginesie w jakich układach i do czego wykorzystujesz, bo domyślam się, że w podobnym charakterze jak w temacie wątku. Do mnie dotarł już HTU21D wiec będzie można porównać "żywotność" w warunkach bojowych.

Autor:  Jarosław Grzegorzek [ niedziela, 4 sierpnia 2019, 23:37 ]
Tytuł:  Re: Arduino w Astronomii - Sterownik grzałek

Radek. Oczywiście, będę informował o tym jak się sprawują. Do czego je stosuję ? W moim obserwatorium używam ich w dwóch systemach:
Pierwszy to kamera AllSky, którą skonstruowałem kilka lat temu. Czujnik monitoruje wilgotność pod jej kopułką i dzięki temu wiem kiedy powinienem zregenerować/wymienić silica gel, który również umieszczony jest wewnątrz obudowy kamery.
Drugi to system podgrzewania 3 punktów mojego newtona - lusterka wtórnego, głównego oraz reduktora ogniskowej do poziomu temperatury powyżej punktu rosy, czyli coś zbliżonego do tematu tego wątku.

Autor:  Radosław Deska [ poniedziałek, 5 sierpnia 2019, 18:00 ]
Tytuł:  Re: Arduino w Astronomii - Sterownik grzałek

Jarosław Grzegorzek napisał(a):
Drugi to system podgrzewania 3 punktów mojego newtona - lusterka wtórnego, głównego oraz reduktora ogniskowej do poziomu temperatury powyżej punktu rosy, czyli coś zbliżonego do tematu tego wątku.


Oczywiście już mnie ciekawi rozwiązanie sterownika, a zwłaszcza wzoru, z którego korzystasz do obliczania punktu rosy, samej końcówki "mocy" do sterowania grzałkami.

Jarosław Grzegorzek napisał(a):
Poczytałem sobie trochę na temat czujników (higrometrów). Okazuje się, że faktycznie DHT22 mają problem z długoterminową stabilnością. Po pewnym czasie najzwyczajniej "padają". Z różnych źródeł dowiedziałem się, że bardzo dobrze oceniany jest natomiast BME280. W Botlandzie go mają, ale bardzo drogo (prawie 100 zł), więc sprowadzę kilka sztuk z "dalekich krajów". Aż tak mi się nie spieszy i mogę poczekać. Przetestuję i dam znać czy jest lepiej.


Zauważ, że cały moduł BME280 to odsłonięta elektronika, warto byłoby zabezpieczyć ją przed czynnikami atmosferycznymi. Oczywiście dbając by samego sensora nie "upaćkać".
Połączenie elektryczne muszą być zabezpieczone, jak sam dobrze o tym wiesz. Jakiś sprawdzony sposób zawsze mile widziany.

Strona 1 z 2 Strefa czasowa: UTC + 2
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/