Arduino Kaldığı yerden devam etme

semih00055

Üye
Katılım
19 Kas 2020
Mesajlar
5
Puanları
1
Yaş
25
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:

FakirMaker

Paylaşımcı üye
Katılım
5 May 2009
Mesajlar
679
Puanları
106
setup içine timer.setCounter(saat,dakika,saniye) olarak eepromdan daha önce kaydettiğin değerleri gireceksin
 

silvestir

Profesyonel Üye
Katılım
10 Ağu 2011
Mesajlar
2,769
Puanları
656
Screenshot_2021-02-14-11-48-40-666_com.android.chrome.jpg
 

rsimsek

Profesyonel Üye
Katılım
3 Haz 2010
Mesajlar
1,524
Puanları
281
Konum
Anadolu yakası
@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.
 

FakirMaker

Paylaşımcı üye
Katılım
5 May 2009
Mesajlar
679
Puanları
106
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.
 

Grkn5434

Üye
Katılım
25 Kas 2017
Mesajlar
26
Puanları
1
Yaş
35
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
 

kesmez

Profesyonel Üye
Katılım
14 Ara 2006
Mesajlar
4,615
Puanları
1,306
Konum
ankara
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:

FakirMaker

Paylaşımcı üye
Katılım
5 May 2009
Mesajlar
679
Puanları
106
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
118,541
Mesajlar
834,573
Kullanıcılar
430,610
Son üye
Grapio

Yeni konular

Üst