Skocz do zawartości

Sterowanie oświetleniem za pomocą przekaźników, arduino i modułu czasu rzeczywistego DS1302


Pomocna odpowiedź

Napisano (edytowany)

Witam całą społeczność. Tak jak w tytule chciałbym wykonać sterowanie oświetleniem za pomocą modułu 6 przekaźników (każdy przekaźnik oddzielny komplet lampek), arduino oraz modułu czasu rzeczywistego DS1302. Wcześniej wykonałem takie sterowanie, ale opierało się ono na funkcji delay, która nie zbyt dobrze działała. O ile posiadam już zakupione wszystko, co potrzebne, ale za bardzo nie wiem jak się do tego zabrać. Cały projekt ma działać na zasadzie włącz 6 przekaźników o godzinie 20, a o godzinie 1 w nocy wyłącz wszystkie przekaźniki. Chciałbym poprosić społeczność o pomoc w edycji kodu. Przedstawiony kod jest przystosowany pod moduł DS3231

 

#include <DS3231.h>

int Relay = 4;

DS3231  rtc(SDA, SCL);
Time t;

const int OnHour = 18;
const int OnMin = 49;
const int OffHour = 18;
const int OffMin = 55;

void setup() {
  Serial.begin(115200);
  rtc.begin();
  pinMode(Relay, OUTPUT);
  digitalWrite(Relay, HIGH);
}

void loop() {
  t = rtc.getTime();
  Serial.print(t.hour);
  Serial.print(" hour(s), ");
  Serial.print(t.min);
  Serial.print(" minute(s)");
  Serial.println(" ");
  delay (1000);
  
  if(t.hour == OnHour && t.min == OnMin){
    digitalWrite(Relay,LOW);
    Serial.println("LIGHT ON");
    }
    
    else if(t.hour == OffHour && t.min == OffMin){
      digitalWrite(Relay,HIGH);
      Serial.println("LIGHT OFF");
    }
}

 

Edytowano przez kacpermateusz7
(edytowany)
  1. Zaprojektuj strukturę relay_control, która opisuje przekaźnik (ewentualnie jego pin) oraz zawiera informacje o godzinach włączenia i wyłączenia
  2. W pętli loop pobierz godzinę i minutę, którą aktualnie zwraca zegar RTC
  3. Dla każdego przekaźnika:
    1. Wybierz najbliższą aktualnej godzinę włączenia i najbliższą godzinę wyłączenia ze struktury relay_control
    2. Sprawdź, czy aktualna godzina jest późniejsza niż godzina włączenia
      1. Sprawdź czy aktualna godzina jest wcześniejsza niż godzina wyłączenia
        1. Włącz przekaźnik, jeżeli nie jest ON
      2. W innym przypadku wyłącz przekaźnik jeżeli nie jest OFF
    3. W innym przypadku wyłącz przekaźnik jeżeli nie jest OFF

Jakoś tak, ale mogłem gdzieś walnąć błąd w warunkach, pisane na kolanie

Edytowano przez H1M4W4R1
  • Lubię! 1

Doszedłem do tego momentu i dalej nie wiem czego jeszcze brakuje. Może społeczność zerknąć.

#include <Ds1302.h>

int Przekaznik_1 = 1;

const int OnHour = 20;
const int OnMin = 00;
const int OffHour = 01;
const int OffMin = 00;

void setup() {
  
  Serial.begin(115200);
  rtc.begin();
  pinMode(Przekaznik_1, OUTPUT);
  digitalWrite(Przekaznik_1, HIGH);
}

void loop() {
  t = rtc.getTime();
  Serial.print(t.hour);
  Serial.print(" hour(s), ");
  Serial.print(t.min);
  Serial.print(" minute(s)");
  Serial.println(" ");
  delay (1000);
  
  if(t.hour == OnHour && t.min == OnMin){
    digitalWrite(Przekaznik_1,LOW);
    Serial.println("LIGHT ON");
    }
    
    else if(t.hour == OffHour && t.min == OffMin){
      digitalWrite(Przekaznik_1,HIGH);
      Serial.println("LIGHT OFF");
    }
}

 

14 minut temu, kacpermateusz7 napisał:

Doszedłem do tego momentu i dalej nie wiem czego jeszcze brakuje. Może społeczność zerknąć.

Fakt, moje rozwiązanie uwzględnia większość tego, co byś ewentualnie chciał zmienić w przyszłości (nawyk zawodowy). W przypadku Twoich wymagań wystarczy kilka razy zrobić kopiuj i wklej dla każdego z przekaźników. Musisz mieć przypisane 6 przekaźników, zainicjowane 6 pinów w metodzie setup oraz aktywowane / dezaktywowane 6 pinów w metodzie loop po osiągnięciu odpowiednich godzin.

Jeżeli liczysz na gotowca, to nie jest takie forum. My tylko dajemy wędkę (sposób na rozwiązanie problemu), żyłkę musisz kupić sam (zdobyć odpowiednią wiedzę). Potem możesz łowić ryby (mieć gotowe rozwiązanie).

(edytowany)
46 minut temu, H1M4W4R1 napisał:

My tylko dajemy wędkę

To Ja chociaz haczyk dorzuce od siebie i ze dwa kretliki...😉

byte tab[] = {1,2,3,4,5,6}; //nr pinow przekanikow (do zmiany)..
byte i = 0;
byte ii 
  


for (int i = 0; i < 6; i++) { //wlaczasz wszystkie przekazniki
  digitalWrite(tab[i], HIGH);
  }

for (int i = 0; i < 6; i++) { // gasiez wszystkie przekazniki
  digitalWrite(tab[i], LOW);
  }

(Byte do wywalenia...mam chory psychicznie tel i nie nadaje sie do uzywania tego forum..)

Edytowano przez farmaceuta
  • Lubię! 1
(edytowany)
1 godzinę temu, kacpermateusz7 napisał:

Kurczę w drodze wyjątku nie dał byś rady ujednolicić tego kodu aby to działało tylko na jednym przekaźniku. Z resztą bym sobie poradził. 

Pomysł, aby ktoś za Ciebie to ujednolicił, jest słaby. Za to pomysł, aby uruchomić tylko jeden przekaźnik, a potem pomyśleć co dalej, jest bardo dobry. 

Co więcej. Ja bym sugerował ogarnąć najpierw RTC. DS3231 działa na I2C a RTC1302 na coś w rodzaju SPI w którym jeden pin współdzieli MISO i MOSI. 

Czyli metodą baby steps: pierwszy kroczek wybrać bibliotekę do DS1302. Drugi kroczek połączyć się z DS1302 odczytać coś i wypisać po serialu. A dopiero potem ogarnąć całą komunikację z RTC. Uruchomić jeden przekaźnik. I wtedy pomyśleć jak te puzzle zgrać w jedną całość... czyli to co opisał @H1M4W4R1 😋

Edytowano przez pmochocki

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...