Termostat z rf433 i przekaźnikiem

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
sono2020
Młodszy majsterkowicz
Posty: 1
Rejestracja: 23 paź 2016, 20:37

Termostat z rf433 i przekaźnikiem

Post autor: sono2020 » 14 lis 2017, 23:38

Witam buduję termostat z trzema czujnikami wyświetlaczem przekaźnikiem i wysyłem na inne arduino przez RF433
i mam problem z kilkoma rzeczami mianowicie.
Potrzebuję żeby po przekroczeniu temperatury przez sensor 1 aby przekaźnik wyłączyć na LOW i aby pozostał wyłączony przez określony czas np 10min przy okazji żeby nie blokowało całego arduino dealey 60000 tylko ciągle wyświetlało aktualną temperaturę.
Następnie aby wszystkie trzy temperatury były wysyłane przez RF433 do drugiego arduino na podgląd.
Potrzebuję jakiś wskazówek podpowiedzi bo zawiesiłem się na tym etapie.

Kod: Zaznacz cały

#include <OneWire.h>                              // dodaje bibliotekę OneWire
#include <DallasTemperature.h>                    // dodaje bibliotekę
#include <LiquidCrystal.h>                        // dodaje bibliotekę
#include <VirtualWire.h>                          // dodaje bibliotekę
#define ONEWIRE_PIN1 8                            // definiuje zmienną do pinu
#define ONEWIRE_PIN2 9                            // definiuje zmienną do pinu
#define ONEWIRE_PIN3 10                           // definiuje zmienną do pinu
#define ZAWOR 11                                  // definiuje zmienną do pinu
LiquidCrystal lcd(2,3,4,5,6,7);                   // definiuje piny do LCD
OneWire oneWire1(ONEWIRE_PIN1);                   // wywołujemy transmisję 1-Wire na pinie
OneWire oneWire2(ONEWIRE_PIN2);                   // wywołujemy transmisję 1-Wire na pinie
OneWire oneWire3(ONEWIRE_PIN3);                   // wywołujemy transmisję 1-Wire na pinie
DallasTemperature sensors1(&oneWire1);            // informujemy Arduino, ze przy pomocy 1-Wire
DallasTemperature sensors2(&oneWire2);            // informujemy Arduino, ze przy pomocy 1-Wire
DallasTemperature sensors3(&oneWire3);            // informujemy Arduino, ze przy pomocy 1-Wire
char temp[6];                                     // tworzy znakową tablicę

void wys(void)
{
  
}
void setup(void) 
{
  lcd.begin(16, 2);                               // ustawia rozdzielczość ekranu
  sensors1.begin();                               // rozpocznij odczyt z czujnika
  sensors2.begin();                               // rozpocznij odczyt z czujnika
  sensors3.begin();                               // rozpocznij odczyt z czujnika
  vw_set_tx_pin(12);                              // nadajnik RF podłączamy do pinu
  vw_setup(2000);                                 // ustawiamy prędkość transmisji
  Serial.begin(9600);                             // rozpoczna transmisję UART o prędkości 
  pinMode(ZAWOR, OUTPUT);                         // konfiguruje ZAWOR jako wyjście
  digitalWrite(ZAWOR, LOW);                       // ustawia na wyjściu ZAWOR stan niski
 }
void loop(void) {

// odczyt temperatury z czujników

sensors1.requestTemperatures();                   // odczytuje temperaturę z czujnika
sensors2.requestTemperatures();                   // odczytuje temperaturę z czujnika
sensors3.requestTemperatures();                   // odczytuje temperaturę z czujnika

// ustawienie wyświetlania na LCD

//      lcd.clear();                                // czyszczenie danych na wyświetlaczu
      lcd.setCursor(0, 0);                        // ustawia kursor na wyświetlaczu
      lcd.print("T1=");                           // wyświetla napis
      lcd.setCursor(3, 0);                        // ustawia kursor na wyświetlaczu
      lcd.print(sensors1.getTempCByIndex(0));     // wyświetla odczyt z czujnika
      lcd.setCursor(8, 0);                        // ustawia kursor na wyświetlaczu
      lcd.print("T2=");                           // wyświetla napis
      lcd.setCursor(11, 0);                        // ustawia kursor na wyświetlaczu
      lcd.print(sensors2.getTempCByIndex(0));     // wyświetla odczyt z czujnika
      lcd.setCursor(0, 1);                        // ustawia kursor na wyświetlaczu
      lcd.print("T3=");                           // wyświetla napis
      lcd.setCursor(3, 1);                       // ustawia kursor na wyświetlaczu
      lcd.print(sensors3.getTempCByIndex(0));     // wyświetla odczyt z czujnika

// sprawdzanie warunków

      if ((sensors1.getTempCByIndex(0) > 28.10))  // sprawdza czy spełniony jest warunek jeżeli TAK to wykonuje poniższy kod
 {
        lcd.setCursor(10, 1);                     // ustawia kursor na wyświetlaczu
        lcd.print("CLOSE ");                      // wyświetla napis
        digitalWrite(ZAWOR, LOW);         // ustawia na wyjściu ZAWOR stan niski
        delay(60000);
      }
      else                                        // sprawdza czy spełniony jest warunek jeżeli NIE to wykonuje poniższy kod
 {
        lcd.setCursor(10, 1);                     // ustawia kursor na wyświetlaczu
        lcd.print(" OPEN ");                      // wyświetla napis
        digitalWrite(ZAWOR, HIGH);                // ustawia na wyjściu ZAWOR stan wysoki
      }

// transmisja temperatur

      float temp1 = sensors1.getTempCByIndex(0);      // tworzy zmienną float do przechowywania wartości odczytanej temperatury
      float temp2 = sensors2.getTempCByIndex(0);      // tworzy zmienną float do przechowywania wartości odczytanej temperatury
      float temp3 = sensors3.getTempCByIndex(0);      // tworzy zmienną float do przechowywania wartości odczytanej temperatury

// Transmisja jednej temperatury
dtostrf(temp1, 6, 2, temp);
        
        delay(1000);                                     // przerwa ms
        vw_send((uint8_t*)temp, strlen(temp));      // wysyła zawartość zmiennej pomaiar
        vw_wait_tx();                                   // czeka aż całość zostanie wysłana
        delay(1000);                                     // przerwa ms

}

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


ElectronicRide
Majsterkowicz
Posty: 58
Rejestracja: 17 cze 2016, 14:50

Re: Termostat z rf433 i przekaźnikiem

Post autor: ElectronicRide » 24 lis 2017, 15:03

Musisz wykorzystać zamiast delay millis, masz w przykładach Arduino Basic-> blink without delay. Zasada działania jest bardzo prosta: millis odlicza czas od włączenia processora i jeżeli chcesz dokonać czegoś w jakimś odstępie np. 1 minuty to po prostu robisz 2 globalne i od jednej przypisujesz czas opóźnienia tzw. interwał a do drugiej aktualny czas millis.
I w warunku jeżeli temp przekroczona dajesz kolejny warunek opóźnienia w następujący sposób:

Kod: Zaznacz cały

 // jeżeli czas od początku startu programu - ostatni czas >= delay to
  if (poczMillis - ostatniMillis >= interval) {
    // przypisujemy ostatniemu czasowi czas obecny millis (zapis czasu) aby mógł dalej odliczać i odejmować
    ostatniMillis = poczMillis;

I później piszesz co ma się wykonywać w tym czasie czyli wyłączenie przekaźnika digital.Write(3,LOW);
i później w else oczywiście HIGH żeby cały czas nie był w stanie LOW.
ODPOWIEDZ

Strony partnerskie: