NodeMCU her 2 günde bir röleyi açıp kapatacak kod

Bendeki bahçe sulaması için 3 çeyrek selenoid valf ile 40'lık kolon boruya su veriyorum. 15-20 kol damlama borusunu besliyor. Uzaktan kamera ile görünecek şekilde amber renkli modul LED'i valfe paralel bağladım. Açık olduğunda LED yanıyor. Dolaysıyla LCD'ye gerek yok. Zaten uygulama üzerinden elle/manuel açıp kapatıyorum. LCD şöyle kullanılabilir, en son şu tarih-saatte sulama yapıldı, bir sonraki sulamaya şu kadar zaman var diye daha ayrıntılı hale getirilebilir. Valf yanında sularken selenoid'e bir LED modul paralel bağlanabilir.
 

Ekli dosyalar

  • IMG_20240618_124448.jpg
    1 MB · Görüntüleme: 9
DS1302 RTC modülünü kullanmak daha doğru olur.
ESP8266'nın gücü kesildiğinde bile zamanı doğru bir şekilde takip etmenizi sağlar.
NodeMCU'nun dahili RTC'si, güç kesildiğinde zaman bilgisini kaybeder,
DS1302 gibi harici RTC modülleri pil ile çalışar, zaman doğru şekide kullanılır.

Kodunuzun bazı küçük düzeltmelere ve kullanım kolaylığına ihtiyacı var.

Mesela:
1. Sistemi ilk açtığınıda suyu akıtmamak için, başlangıçta Röleyi devre dışı bırakma:
setup fonksiyonunda digitalWrite(RELAY_PIN, HIGH) komutu eklenerek rölenin başlangıçta (off) olması..

2. LCD Başlangıç Mesajı faydalı olur:
setup fonksiyonunda LCD'ye başlangıç mesajı yazsın ve 2 saniye beklesin.

3. LCD Satır Göstergesi: LCD mesajlarının doğru satırda göstersin.

4. Zaman Güncelleme: myRTC.updateTime() fonksiyonu kullanılarak RTC'den zaman bilgisi
güncellensin.


Setup ve (Ana) Loop fonksiyonları, kodun tamamı şöyle olabilir:

******************************************************************

#include <DS1302.h>
#include <LiquidCrystal.h>

// DS1302 RTC pinleri
const int DS1302_SCLK_PIN = 5; // SCLK pin
const int DS1302_IO_PIN = 6; // I/O pin
const int DS1302_CE_PIN = 7; // CE pin

// Röle pini
const int RELAY_PIN = 8; // Röle pinini uygun bir GPIO pinine bağlayın

// LCD ekran pini
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// RTC modülü
DS1302 myRTC(DS1302_SCLK_PIN, DS1302_IO_PIN, DS1302_CE_PIN);

void setup() {
// Röle pinini çıkış olarak ayarlayın
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, HIGH); // Röleyi başlangıçta "off" yapın

// LCD ekranı başlatın
lcd.begin(16, 2);

// RTC'yi başlatın
myRTC.halt(false);
myRTC.writeProtect(false);

// Başlangıç mesajı
lcd.setCursor(0, 0);
lcd.print("Saat Ayarlaniyor");
lcd.setCursor(0, 1);
lcd.print("Lutfen Bekleyin");
delay(2000); // 2 saniye bekleyin
lcd.clear();
}

void loop() {
myRTC.updateTime();

if(myRTC.dayofmonth % 2 == 0) { // Ayın çift günlerinde sulama yap
if(myRTC.hours == 21 && myRTC.minutes == 0) {
digitalWrite(RELAY_PIN, LOW); // Röleyi aç
lcd.setCursor(0, 1);
lcd.print("SULAMA YAPILIYOR");
}

if(myRTC.hours == 21 && myRTC.minutes == 10) {
digitalWrite(RELAY_PIN, HIGH); // Röleyi kapat
lcd.setCursor(0, 1);
lcd.print(" SULAMA YAPILDI ");
}
}

delay(60000); // 1 dakika bekleyin
}


******************************************************************

DS1302 RTC Kütüphanesi gerekli:
LiquidCrystal Kütüphanesi gerekli:

Bağlantıları unutmayın:
DS1302'nin SCLK, I/O ve CE pinlerini uygun GPIO pinlerine bağlayın.
Röleyi uygun bir GPIO pinine bağlayın.
LCD ekranını uygun pinlere bağlayın.
 
Şuanda kodum sizinki attığınızın benzeri. Her şey tamam. Nodemcu test için 2 gündür açık ve bu akşam ayarlanan saatte açması gerekiyor röleyi.
 
Bu akşam röle sıkıntısız açıldı. Ama nodemcunun fişini çekip taktığında tekrar açmıyor. İf döngüsüne sizin yazdığınız gibi büyüktür küçüktür işareti koysam düzelir mi?
 
Kodda ikinci günde açacaksa beklemesi normal değil mi? Yani gün ve saat geldiği halde açmıyorsa ya kodu önerdiğim gibi değiştirin ya da bekleme süresi 30 saniyeden küçük olursa aynı kod çalışır.
 
Bu sisteme 12v 30 amper trafo var elimde şuan onu kullanacağım. Sürekli 7/24 çalışıp eskime yapmasın diye elimde bir adet daha röle var. Bunu da sisteme dahil etsem direkt 220voltu açıp kapatabilir miyim?
 
Rölelerin ömrü oldukça uzundur, kullandığınız röle ve kontakları arasından geçen akımı söyleyebilirseniz, elinizdeki rölenin tahmini ömrü söylenebilir.
Ancak elektrik kesinti problemi ile ilgili bir kaç şey yapılabilir.
Örnek:
1. Elektrik kesintisi sırasında rölenin durumunu ve son işlem tarihini EEPROM'a kaydederek, güç tekrar geldiğinde bu bilgileri geri yükleyebilirsiniz.
2. Elektrik kesintisi sonrası sistemin doğru çalışması için, sistemin son durumu ve RTC'deki zamanı kontrol edebilirsiniz.
3. Elektrik kesintisi sonrası durum kontrolü için bir başlangıç durumu belirleyebilir ve sistemin her açılışında bu durumu kontrol edebilirsiniz.
 
EEPROM'a nasıl kaydedebilirim? Bir kaç kod yazdım, Nodemcunun fişini çekip taktığımda Kaldığı yerden devam etmiyor. Sulama yapılıyor yazıp röleyi açması gerekiyor ama yapmıyor.(Gerçi sulama yapılıyor yazmaz, çünkü setup'ta eepromun başlangıcına sadece röleyi başlat kodunu yazmışım ama röle açılmıyor) Rölenin kapanması gereken saatte sadece ekrana Sulama yapıldı yazıyor o kadar.

EEPROM.begin() kodunu setupa yazmam gerekiyormuş sanırım.

C:
//EEPROM
const int eepromAddress = 0;

void setup() {

  Wire.begin();
  lcd.init();
  lcd.backlight();
  Serial.begin(9600);
  digitalWrite(RELAY_PIN, HIGH);
  pinMode(RELAY_PIN, OUTPUT);

  int lastActivationTime = EEPROM.read(eepromAddress);
  if (lastActivationTime == 1) {

    digitalWrite(RELAY_PIN, LOW);

  }
  // Saat ayarı - saniye, dakika, saat, gün, ay, yıl
  //myRTC.setDS1302Time(00, 15, 18, 14, 6, 2024, 3);
}

void loop() {
 
  myRTC.updateTime();

  if (myRTC.hours == 12 && myRTC.minutes == 19 && myRTC.seconds == 0) {
    digitalWrite(RELAY_PIN, LOW); // Röleyi aç ''LOW''
    lcd.setCursor(0, 0);
    lcd.print("SULAMA YAPILIYOR");
    EEPROM.write(eepromAddress, 1);
    EEPROM.commit();


  } else if (myRTC.hours == 12 && myRTC.minutes == 22 && myRTC.seconds == 0) {
    digitalWrite(RELAY_PIN, HIGH); // Röleyi kapat ''HIGH''
    lcd.setCursor(0, 0);
    lcd.print(" SULAMA YAPILDI ");
    EEPROM.write(eepromAddress, 0);
    EEPROM.commit();
  }
 
Son düzenleme:
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için onları kabul etmelisiniz. Daha fazla bilgi edin…