goktug59
Üye
- Katılım
- 17 Haz 2024
- Mesajlar
- 11
- Puanları
- 1
- Yaş
- 18
Şimdi bekliyorum bakalım 2 gündür nodemcu çalışıyor bugün röleyi açarsa sorun yok direkt montajı yapacağım.1000/1 saniye de sorun olmaz
Şimdi bekliyorum bakalım 2 gündür nodemcu çalışıyor bugün röleyi açarsa sorun yok direkt montajı yapacağım.1000/1 saniye de sorun olmaz
Ş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.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.
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?Ben aynı şeyi nodeMCU ile internetten remotexy uygulaması üzerinden damlama sistemini elle açıp kapatıyorum. Her ihtimal röle bağlantılarına birer kablo bağlayıp sistemde bir sorun olursa elle/manuel selenoid vanayı açıp kapatabiliyorum. Önceki mesajlarımda kodu paylaşmıştım.
Kolunuzda şöyle bir sorun var. Loop sonundaki 60 saniye beklemede 21:00'ı ve 21:10'u tutturamayabilirsiniz. O yüzden işi garantiye almak için ufak bir değişiklik yapın.
Kod:void loop() { myRTC.updateTime(); if(myRTC.dayofmonth % 2 == 0) { if(myRTC.hours == 21 && myRTC.minutes >= 0 && myRTC.minutes <=1) { digitalWrite(RELAY_PIN, LOW); lcd.setCursor(0,1); lcd.print("SULAMA YAPILIYOR"); } if(myRTC.hours == 21 && myRTC.minutes >= 10) { digitalWrite(RELAY_PIN, HIGH); lcd.setCursor(0,1); lcd.print(" SULAMA YAPILDI "); } } delay(60000); }
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 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?
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?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.
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.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
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();
}