Skocz do zawartości

Czujnik temperatury z buzerem z możliwością wył. dźwięku


Mixon

Pomocna odpowiedź

Cześć, drodzy koledzy, programuję Arduino. Robię sobie czujnik temperatury do kotła centralnego ogrzewania, aby mieć kontrole nad temperaturą. Wyświetlanie temperatury działa, jest wyświetlana temperatura na wyświetlaczu 16x2, buzer się włącza po przekroczeniu zadanej temperatury. Ale, ale ... Chciałbym zrobić dodatkowo przycisk, który będzie wyłączał tylko buzer, a temperatura będzie nadal mierzona i wyświetlana- bo kiedy np. alarm włączy się o 1 w nocy to chciałbym buzer wyłączyć guzikiem by nie budzić wszystkich domowników. I własnie mój problem polega na tym, że nie mogę sobie z tym poradzić. Wklejam kod, który mam napisany. Byłbym bardzo wdzięczny za pomoc. Pozdrawiam.

  // TERMOMETR DO PIECA CO Z ALARMEM // 
#include <OneWire.h>
#include <DS18B20.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(10,11,8,9,12,13);

#define CZUJNIK 2 // pin czujnika

byte address[8] = {0x28,0xFF,0x27,0xC1,0x86,0x16,0x5,0x9D}; // czujnik

OneWire onewire(CZUJNIK);
DS18B20 sensors(&onewire);

 void setup() {
  lcd.begin(16,2); // KURSOR
  lcd.setCursor(0, 0); // KURSOR
  lcd.print(" TEMPERATURA NA");
  lcd.setCursor(0,1); //Ustawienie kursora
  lcd.print("KOTLE TO");
  lcd.setCursor(15,1); //Ustawienie kursora
  lcd.print("C");

  pinMode(7, OUTPUT); //Wyjście BUZERA

  sensors.begin();
  sensors.request(address);
  }

 void loop() {
   if (sensors.available())
   {
   double temperatura = sensors.readTemperature(address);

   lcd.setCursor(9, 1); // WYŚWIETLACZ
   lcd.print(temperatura);
   delay(250);

   if (temperatura > 25.00) { //JESLI TEMPERATURA PRZEKROCZY 70 STOPNI 
     digitalWrite(7, HIGH); // TO WŁĄCZ BUZER Z KRÓTKIMI PRZERWAMI
     delay(500);
     digitalWrite(7, LOW);
     delay(1000);
   }

    if (temperatura < 25.00 ){
     digitalWrite(7, LOW); // W PRECIWNYM RAZIE NIE WLACZAJ BUZERA
    }
   sensors.request(address);
   } 
}

Link do komentarza
Share on other sites

Cześć drogi Kolego 🙂

W sytuacjach takich jak ta musisz zerwać narzucającą się i bezpośrednią więź między temperaturą a piszczeniem, prawda?

No to teraz postaw się w roli buzzera i odpowiedz sobie na kilka pytań:

1. Co mnie włącza?

2. Co mnie wyłącza?

3. Ile mam stanów?

4. W których stanach muszę piszczeć?

Żeby było szybciej, podpowiem Ci:

1. Włącza przekroczenie temperatury, ale nie prosty stan "gorąco" - tak jak masz teraz, tylko zmiana stanu pieca z zimno na gorąco - to podstawowa różnica.

2. Wyłączać mogą dwie rzeczy: przycisk - to jasne, i zmiana stanu z "gorąco" na "zimno". To drugie nie jest takie oczywiste bo może chcesz podtrzymać alarm który wystąpił gdy np. nikogo w pobliżu nie było, piec się ochłodził ale chciałbyś po powrocie być ostrzeżony o zdarzeniu.

3. Teraz nie wystarczą dwa stany związane z bezpośrednim stanem pieca. Buzzer może być:

- odblokowany (w oczekiwaniu na "gorąco"),
- załączony (po wykryciu zdarzenia "gorąco"),
- zablokowany przyciskiem aż do spadku temperatury do poziom "zimno".

Tak więc masz 3 stany. Zrób więc zmienną "stan_buzzera", w zależności od jej stanu analizuj sytuację a w wyniku analizy zmieniaj stan zmiennej. Dopiero bazując na jej stanie odpalaj bipczaka.

Robi się to za pomocą tzw. maszyny stanów:

enum   // Najpierw definiujesz stany jako kolejne liczby całkowite, równie dobrze możesz tu użyć #define...
{
  STAN_ODBLOKOWANY,
  STAN_ZALACZONY,
  STAN_ZABLOKOWANY
};

#define TEMP_ALARM   25.0

int stan_buzzera = STAN_ODBLOKOWANY;

void fsm(void)
{
  switch (stan_buzzera)    // A ta funkcja bazując na aktualnym stanie sprawdza co się dzieje i zmienia ten stan.
  {
  case STAN_ODBLOKOWANY:
     if (temperatura >= TEMP_ALARM)
        stan_buzzera = STAN_ZALACZONY;
     break;
  case STAN_ZALACZONY:
     if (przycisk_wcisniety())
        stan_buzzera = STAN_ZABLOKOWANY;
     if (temperatura < TEMP_ALARM-2.0)                    // Tę linię i następną musisz wyciąć gdy raz wywołany alarm ma trwać aż do wciśnięcia przycisku.
        stan_buzzera = STAN_ODBLOKOWANY;
     break;
  case STAN_ZABLOKOWANY:
     if (temperatura < TEMP_ALARM-2.0)
        stan_buzzera = STAN_ODBLOKOWANY;
     break;
  }
}

Teraz wystarczy napisać prostą zależność:

if (stan_buzzera == STAN_ZALACZONY)
{
  digitalWrite(7, HIGH); // TO WŁĄCZ BUZER Z KRÓTKIMI PRZERWAMI 
  delay(500); 
  digitalWrite(7, LOW); 
  delay(1000);    
}

To ostatnie jest strasznie prymitywne i wyłącza Ci fajny procesor na całe 1.5s. W tym czasie nie może reagować na przyciski i w zasadzie nic nie robi zużywając tylko prąd jak jakiś głupi opornik. To też powinieneś zrobić inaczej, ale to na później 🙂 Spróbuj zrozumieć to co napisałem. Funkcję fsm() musisz wołać z głównej pętli a wcześniej przerobić ją tak by używała odpowiednich zmiennych itd.

Acha, dodałem histerezę szerokości 2°C, by błędy pomiarów nie powodowały "migotania" alarmu w okolicy temperatury progowej. To też przemyśl.

EDIT: Nie kompilowałem tego kodu (pisany z sufitu), ale poprawiłem kilka oczywistych literówek.

  • Lubię! 1
Link do komentarza
Share on other sites

Do wylaczenia buzzera zrobylbym zwykly przelacznik mechaniczny rozwierajacy jego obwod. Po co do takiej czynnosci uzywac mikroprocesora.

Chyba ze dodasz zegar czasu rzeczywistego i zaprogramujesz czasy ciszy.

Link do komentarza
Share on other sites

Do wylaczenia buzzera zrobylbym zwykly przelacznik mechaniczny rozwierajacy jego obwod. Po co do takiej czynnosci uzywac mikroprocesora.

Chyba ze dodasz zegar czasu rzeczywistego i zaprogramujesz czasy ciszy.

Po to, żeby nie trzeba było go ręcznie włączać -- tylko żeby się włączyło samo jak tylko stan wróci do normy, żeby przy kolejnym przekroczeniu limitu znowu był alarm.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Do wylaczenia buzzera zrobylbym zwykly przelacznik mechaniczny rozwierajacy jego obwod. Po co do takiej czynnosci uzywac mikroprocesora.

Chyba ze dodasz zegar czasu rzeczywistego i zaprogramujesz czasy ciszy.

Po to, żeby nie trzeba było go ręcznie włączać -- tylko żeby się włączyło samo jak tylko stan wróci do normy, żeby przy kolejnym przekroczeniu limitu znowu był alarm.

To jesli alarm wlaczy sie w nocy drugi raz to i tak bedzie glosno.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.