Arduino Kaldığı yerden devam etme

semih00055

Üye
Katılım
19 Kas 2020
Mesajlar
5
Puanları
1
Yaş
27
Arduinoda zaman rölesi kodunu elektrik kesilip geldiği zaman kaldığı yerden saymaya devam etmesini nasıl sağlayabilirim?
include <LiquidCrystal.h> #include "Countimer.h" Countimer timer; LiquidCrystal lcd(2, 3, 4, 5, 6, 7); #include <EEPROM.h> #define bt_set A0 #define bt_up A1 #define bt_down A2 #define bt_start A3 int time_s = 0; int time_m = 0; int time_h = 0; int set=0, mode=0; int flag1=0, flag2=0, flag3=0; int relay = 8; int buzzer = A5; void setup() { Serial.begin (9600); pinMode(bt_set, INPUT_PULLUP); pinMode(bt_up, INPUT_PULLUP); pinMode(bt_down, INPUT_PULLUP); pinMode(bt_start, INPUT_PULLUP); pinMode(relay, OUTPUT); digitalWrite(relay, HIGH); pinMode(buzzer, OUTPUT); lcd.begin(16, 2); lcd.clear(); lcd.setCursor(0,0); lcd.print(" Welcome To "); lcd.setCursor(0,1); lcd.print(" On/Off Timer "); timer.setInterval(print_time, 999); delay(1000); lcd.clear(); read_on_time(); } void print_time(){ time_s = time_s-1; if(time_s<0){time_s=59; time_m = time_m-1;} if(time_m<0){time_m=59; time_h = time_h-1;} } void loop(){ timer.run(); if(digitalRead (bt_set) == 0){ if(flag1==0 && flag2==0){flag1=1; mode = mode+1; if(mode>2){mode=0; set=0;} if(mode==1){read_on_time(); flag3=0;} if(mode==2){read_of_time(); flag3=1;} delay(100); } } if(digitalRead (bt_up) == 0){ if(set==0 && mode==0){timer.start(); flag2=1;} if(set==1){time_s++;} if(set==2){time_m++;} if(set==3){time_h++;} if(time_s>59){time_s=0;} if(time_m>59){time_m=0;} if(time_h>99){time_h=0;} if(set>0 && mode==1){write_on_time();} if(set>0 && mode==2){write_of_time();} delay(200); } if(digitalRead (bt_down) == 0){ if(set==0 && mode==0){timer.stop(); flag2=0;} if(set==1){time_s--;} if(set==2){time_m--;} if(set==3){time_h--;} if(time_s<0){time_s=59;} if(time_m<0){time_m=59;} if(time_h<0){time_h=99;} if(set>0 && mode==1){write_on_time();} if(set>0 && mode==2){write_of_time();} delay(200); } if(digitalRead (bt_start) == 0){ if(mode==0){ flag2=1; flag3=0; read_on_time(); timer.restart(); timer.start(); } if(mode>0 && flag1==0){ flag1=1; set = set+1; if(set>3){set=0;} delay(100); } } if(digitalRead (bt_set) == 1 && digitalRead (bt_start) == 1){flag1=0;} lcd.setCursor(0,0); if(flag3==0){lcd.print(" On ");} if(flag3==1){lcd.print("Off ");} lcd.print("Timer"); if(set==0 && mode>0){lcd.print(" Mode S ");} if(set==0 && mode==0 && flag2==0){lcd.print(" Stop ");} if(set==0 && mode==0 && flag2==1){lcd.print(" Start ");} if(set==1){lcd.print(" Set SS ");} if(set==2){lcd.print(" Set MM ");} if(set==3){lcd.print(" Set HH ");} lcd.setCursor(4,1); if(time_h<=9){lcd.print("0");} lcd.print(time_h); lcd.print(":"); if(time_m<=9){lcd.print("0");} lcd.print(time_m); lcd.print(":"); if(time_s<=9){lcd.print("0");} lcd.print(time_s); lcd.print(" "); if(time_s==0 && time_m==0 && time_h==0 && flag2==1){ flag3 = flag3+1; if(flag3>1){flag3=0;} if(flag3==0){read_on_time();} if(flag3==1){read_of_time();} timer.restart(); timer.start(); digitalWrite(relay, flag3); digitalWrite(buzzer, HIGH); delay(500); digitalWrite(buzzer, LOW); } if(flag2==1){digitalWrite(relay, flag3);} else{digitalWrite(relay, HIGH);} delay(1); } void write_on_time(){ EEPROM.write(1, time_s); EEPROM.write(2, time_m); EEPROM.write(3, time_h); } void write_of_time(){ EEPROM.write(11, time_s); EEPROM.write(12, time_m); EEPROM.write(13, time_h); } void read_on_time(){ time_s = EEPROM.read(1); time_m = EEPROM.read(2); time_h = EEPROM.read(3); } void read_of_time(){ time_s = EEPROM.read(11); time_m = EEPROM.read(12); time_h = EEPROM.read(13); }
 
Son düzenleme:
setup içine timer.setCounter(saat,dakika,saniye) olarak eepromdan daha önce kaydettiğin değerleri gireceksin
 
Screenshot_2021-02-14-11-48-40-666_com.android.chrome.jpg
 
@silvestir, anladığım kadarıyla kod içindeki saat, dakika ve saniye süreyi tutmak için kullanılmış. O sebeple RTC (gerçek zaman saati) modülüne ihtiyaç yok. Bu bilgiler eeprom'da saklanmakta ve her çalışmaya başladığında (void setup) okunmaktadır. Aynı şekilde void loop içindeki saklamak istediğiniz diğer değişenleri de bir sonraki eeprom hücresine (1,2,3'ten sonraki 4,5,6,7,8,9,10 nolu hücreleri) saklamanız ve ilk açışta geri okutarak onun üzerinden devam etmeniz mümkün. Kodu siz yazdıysanız bu kısmı ekleyebileceğinizi düşünüyorum.
 
Bu soruna @semih00055 kardeşle şöyle bir çözüm bulduk @rsimsek hocanın dediği gibi saniye saniye eeproma kaydedip güç geri geldiğinde bunu okuyup kaldığı yerden devam edebilirdik ama eepromun ömrü yüz bin kere yazılmaya müsait, her saniye yazarsak 6 saat gibi bi sürede çöp olurdu. Onun yerine @silvestir 'ın dediği ds1302 modülünü kullanmaya karar verdik ama saat özelliğini değil. DS1302 içerisinde 64 baytlık erişilebilir bir ram var, batarya bitmediği sürece bu verileri saklayabiliyor ve yazma ömrü tüm ramlerde olduğu gibi sınırsız. DS1302 için yazılmış kitaplıklardan faydalanarak. Cihazın mevcut durumunu rame kaydedip her yeni başlangıçta oradan çağırarak elektrik kesintisinden önceki durumuna geri döndürdük.
 
Bu soruna @semih00055 kardeşle şöyle bir çözüm bulduk @rsimsek hocanın dediği gibi saniye saniye eeproma kaydedip güç geri geldiğinde bunu okuyup kaldığı yerden devam edebilirdik ama eepromun ömrü yüz bin kere yazılmaya müsait, her saniye yazarsak 6 saat gibi bi sürede çöp olurdu. Onun yerine @silvestir 'ın dediği ds1302 modülünü kullanmaya karar verdik ama saat özelliğini değil. DS1302 içerisinde 64 baytlık erişilebilir bir ram var, batarya bitmediği sürece bu verileri saklayabiliyor ve yazma ömrü tüm ramlerde olduğu gibi sınırsız. DS1302 için yazılmış kitaplıklardan faydalanarak. Cihazın mevcut durumunu rame kaydedip her yeni başlangıçta oradan çağırarak elektrik kesintisinden önceki durumuna geri döndürdük.
Hocam kolay gelsin bir projede aynı bahsettiğiniz gibi bir durum yaşıyordum çözümünüzü okuduktan sonra ds1302 siparişi verdim daha elime ulaşmadı ancak kodda bu işlemi nasıl yaptığınızı soracaktım mümkünatı varsa paylaşırsanız çok sevinirim yani sadece mevcut durumu RAM e aktarma kısmını saygılar
 
Bu soruna @semih00055 kardeşle şöyle bir çözüm bulduk @rsimsek hocanın dediği gibi saniye saniye eeproma kaydedip güç geri geldiğinde bunu okuyup kaldığı yerden devam edebilirdik ama eepromun ömrü yüz bin kere yazılmaya müsait, her saniye yazarsak 6 saat gibi bi sürede çöp olurdu. Onun yerine @silvestir 'ın dediği ds1302 modülünü kullanmaya karar verdik ama saat özelliğini değil. DS1302 içerisinde 64 baytlık erişilebilir bir ram var, batarya bitmediği sürece bu verileri saklayabiliyor ve yazma ömrü tüm ramlerde olduğu gibi sınırsız. DS1302 için yazılmış kitaplıklardan faydalanarak. Cihazın mevcut durumunu rame kaydedip her yeni başlangıçta oradan çağırarak elektrik kesintisinden önceki durumuna geri döndürdük.
bilgiyi eepromun tek baytına değil sırayla mesela 100 baytına yazın. diğerlerini silin. silme işlemi 100. bayt dolduktan sonra 1 defa yapılacak.
cihaz açıldığında 100 baytı tarasın bilgiyi okusun.
masraf olmasın.
 
Son düzenleme:
Hocam kolay gelsin bir projede aynı bahsettiğiniz gibi bir durum yaşıyordum çözümünüzü okuduktan sonra ds1302 siparişi verdim daha elime ulaşmadı ancak kodda bu işlemi nasıl yaptığınızı soracaktım mümkünatı varsa paylaşırsanız çok sevinirim yani sadece mevcut durumu RAM e aktarma kısmını saygılar
Kodun tamamını paylaşamıyorum maalesef ama ram kısmına okuma ve yazma işlemi için küçük bir kod paylaşabilirim. DS1302 kitaplığını kurmayı unutma ve ram hücresine sadece 8 bitlik yani 0-255 arası sayılar kaydedilebileceğini aklında tut. Daha büyük veriler için bit işlemi yaparak ayırman gerekiyor. Aşağıdaki örnekte ssayının her saniye ramin sıfırıncı hücresine kaydedilip her açılışta oradan okunarak başladığını göreceksin. 0-63 arası hücreleri kullanabilirsin. İlk başlamada ramin o hücresi daha önce ayarlanmadığı için saçma bir sayıdan başlayabilir. Kolay gelsin.

C++:
#include <DS1302.h>
DS1302_RAM ramBuffer;
DS1302 rtc(10,11,12);    //RST->10,DA->11,CLK->12
uint8_t saniye = 0;

void setup(){
    Serial.begin(115200);
    if (!rtc.begin())
        Serial.println("Saat modülüne erişilemiyor");
    
    ramBuffer=rtc.readBuffer();
    saniye = ramBuffer.cell[0];
}

void loop(){
    Serial.println(saniye);
    ramBuffer.cell[0]= ++saniye;
    rtc.writeBuffer(ramBuffer);
    delay(1000);
}
 

Forum istatistikleri

Konular
127,950
Mesajlar
913,851
Kullanıcılar
449,598
Son üye
kadir12366

Yeni konular

Geri
Üst