Arduino EEprom değişken problemi

Mçınar

Hectopat
Katılım
5 Ağustos 2019
Mesajlar
461
Selamunaleyküm, EEprom üzerinde uğraşıyorum, EEprom değişkenleri hücreye alıyor ama 2022 değerini almıyor 230 olarak alıyor neden 22 yazdığımda bir sorun olmuyor?
 
Senin öncelikle kullanmaya çalıştığın programlama dilini öğrenmeye ihtiyacın var, boş yere vakit kaybediyorsun.

Açtığın diğer konular için şu örnek kod üzerinden gitmeyi dene, daha da yardımcı olamayacağım.

C++:
#include <EEPROM.h>

struct Tarih{
    //...
    uint8_t hours;
    uint8_t dayofweek;
    uint8_t month;
    int year;
};

void setup() {
  Serial.begin(9600);
  EEPROM.begin(256);
}

void loop() {

  Tarih yazilanTarih = {24, 30, 12, 2022};

  if (button_state) {
    //tarihi kaydet
    EEPROM.put(0, yazilanTarih);
  }


  Tarih okunanTarih;
  //tarihi oku
  EEPROM.get(0, okunanTarih);
  Serial.println( okunanTarih.year);

}
 
Senin öncelikle kullanmaya çalıştığın programlama dilini öğrenmeye ihtiyacın var, boş yere vakit kaybediyorsun.

Açtığın diğer konular için şu örnek kod üzerinden gitmeyi dene, daha da yardımcı olamayacağım.

C++:
#include <EEPROM.h>

struct Tarih{
 //...
 uint8_t hours;
 uint8_t dayofweek;
 uint8_t month;
 int year;
};

void setup() {
 Serial.begin(9600);
 EEPROM.begin(256);
}

void loop() {

 Tarih yazilanTarih = {24, 30, 12, 2022};

 if (button_state) {
 //tarihi kaydet.
 EEPROM.put(0, yazilanTarih);
 }

 Tarih okunanTarih;
 //tarihi oku.
 EEPROM.get(0, okunanTarih);
 Serial.println( okunanTarih.year);

}

Hocam öneriniz için sağ olun zamanım kısıtlı old. İçin projeyi yetiştirmem lazım dediğiniz gibi projeden sonra zaman ayırıcam.

Senin öncelikle kullanmaya çalıştığın programlama dilini öğrenmeye ihtiyacın var, boş yere vakit kaybediyorsun.

Açtığın diğer konular için şu örnek kod üzerinden gitmeyi dene, daha da yardımcı olamayacağım.

C++:
#include <EEPROM.h>

struct Tarih{
 //...
 uint8_t hours;
 uint8_t dayofweek;
 uint8_t month;
 int year;
};

void setup() {
 Serial.begin(9600);
 EEPROM.begin(256);
}

void loop() {

 Tarih yazilanTarih = {24, 30, 12, 2022};

 if (button_state) {
 //tarihi kaydet.
 EEPROM.put(0, yazilanTarih);
 }

 Tarih okunanTarih;
 //tarihi oku.
 EEPROM.get(0, okunanTarih);
 Serial.println( okunanTarih.year);

}

Hocam son attığınız kodlarda biraz da olsa aydınlanma sağladım sağ olun.
Lakin "tarih yazilantarih = {24, 30, 12, 2022};" kısmından -->
Serial. Println( okunantarih. Year); diyerek tarih struct kısmından 2022
değeri çekmemiz 1 özellik mi yani RTC kütüphanesi kullanmadan çektiğimiz için biraz tuhaf geldi ama çok işime yaradı.
 
Son düzenleme:
Neden garip geldi anlamadım, herhangi bir özellik değil bu kendi yazdığımız tarih struct'undan bir nesne oluşturduk 24, 30, 12, 2022 verisi ile ilklendirdik ve bunu eeprom'a yazdık, ardından eeprom'dan okuyup başka bir tarih nesnesine yazdık.
 
Neden garip geldi anlamadım, herhangi bir özellik değil bu kendi yazdığımız tarih struct'undan bir nesne oluşturduk 24, 30, 12, 2022 verisi ile ilklendirdik ve bunu eeprom'a yazdık, ardından eeprom'dan okuyup başka bir tarih nesnesine yazdık.
Sa, hocam ksb yine rahatsız ediyourum ama yine takıldığın bir kısım oldu bakabilir misin sizim ilk kodu üzerinde biraz oynayarak düzenleme yaptım ilkin yılı elektrik gittiğinde de ekrana yazıyordu şimdi tekrar 1104412672 yazıyor ne alaka anlamadım beynim yandı gerçekten. Nereyi neyi unutuyorum hocam şu kısma yardım eder misiniz ??(eeprom kısmına hücre 1 e şunu al demiştim 12 yi almıştı sonra sildim bu durumlar karşılaştım eepromu mu EEPROM.clear() mı yapmam lazım?)

[CODE title="Eeprom"]#include <EEPROM.h>


#define buton_pin D3
#define led_pin D4
uint8_t buton_durum = 0;


struct Tarih{
//...
uint8_t hours;
uint8_t dayofweek;
uint8_t month;
int year;
};

void setup() {
Serial.begin(9600);
EEPROM.begin(256);

}

void loop() {

Tarih yazilanTarih = {24, 30, 12, 2022};
Serial.println("****************buton koşulu buranın içerisinde gerçekleşiyor******");
int buton_durum = digitalRead(buton_pin);

if(buton_durum == 1)
{
Serial.println("Butona basıldı");
digitalWrite(led_pin, HIGH);



//tarihi kaydet
EEPROM.put(0, yazilanTarih);

}
else{
Serial.println("Butona basılmadı");
digitalWrite(led_pin, LOW);
}
delay(1000);
Serial.println("****************buton koşulu buranın yukarısında gerçekleşiyor***********if koşulun bitimi");


Tarih okunanTarih;
//tarihi oku
EEPROM.get(0, okunanTarih);
Serial.println( okunanTarih.year);
}
[/CODE]

77.PNG
 
Son düzenleme:
İlk birkaç adrese zaten Tarih verisini yazdık, o adreslere tekrar başka bir şey yazdırırsan veriler bozulur. Her adres 8bit veri tutabiliyor, illa tek byte veri ekleyeceksen int adres =sizeof(Tarih); kaç dönerse o adresten itibaren yazdır, o donanımda struct kaç byte hizalanıyor bilmediğimden direk şu adresten itibaren yazdır diyemem . Ekstra veri eklemek istiyorsan tarih struct'una ekle, aynı şekilde ilklendirilirken de sıralamayı bozma.
örn;

C++:
struct Tarih{
    //...
    uint8_t hours;
    uint8_t dayofweek;
    uint8_t month;
    int year;
};

struct Tarih{
    //...
    uint8_t minutes; //yeni
    uint8_t hours;
    uint8_t dayofweek;
    uint8_t month;
    int year;
};

Tarih yazilanTarih = { 12 ,24, 30, 12, 2022};
 
İlk birkaç adrese zaten Tarih verisini yazdık, o adreslere tekrar başka bir şey yazdırırsan veriler bozulur. Her adres 8bit veri tutabiliyor, illa tek byte veri ekleyeceksen int adres =sizeof(Tarih); kaç dönerse o adresten itibaren yazdır, o donanımda struct kaç byte hizalanıyor bilmediğimden direk şu adresten itibaren yazdır diyemem . Ekstra veri eklemek istiyorsan tarih struct'una ekle, aynı şekilde ilklendirilirken de sıralamayı bozma.
örn;

C++:
struct Tarih{
    //...
    uint8_t hours;
    uint8_t dayofweek;
    uint8_t month;
    int year;
};

struct Tarih{
    //...
    uint8_t minutes; //yeni
    uint8_t hours;
    uint8_t dayofweek;
    uint8_t month;
    int year;
};

Tarih yazilanTarih = { 12 ,24, 30, 12, 2022};
peki hocam asıl projeme nasıl ekliyeceğiz bunu ilişkilendirmeye gerek kalmıyor sanırsam zamanı rtc den değişkene aktardım. 2 tane değişkenimin hafızaya almasını istiyorum
sabitay ,yeniyıl3 değişkenlerini hafızaya alsa yeter. Nasıl yapabiliriz ??


[CODE title="RTC kodlarım;"] #include <EEPROM.h>
//---------------------------
#define buton_pin D3
#define led_pin D4
int buton_durum = 0;
//---------------------------

#include <virtuabotixRTC.h>
virtuabotixRTC Saat(D6, D7, D8); // CLK -> 6, ,//Data -> 7 RST -> 8
String gunler[] = {"PAZARTESI", "SALI", "CARSAMBA", "PERSEMBE", "CUMA", "CUMARTESI", "PAZAR"};

int sabitay ;
int yeniyıl3;

void setup() {
Serial.begin(9600);

pinMode(D13, OUTPUT);
pinMode(buton_pin, INPUT);
pinMode(led_pin, OUTPUT);

//pinMode(buzzerPin,OUTPUT); // Buzzer'in bağlı olduğu pini çıkış olarak ayarladık.
// saniye, dakika, saat, haftanın günü, ayın günü, ay, yıl
Saat.setDS1302Time(24, 59, 23,4, 31, 05, 2022);
}

void loop() {
Saat.updateTime(); //Bu kod ile RTC deki anlık zamanı alıyoruz.
Serial.println(" ");
Serial.print(Saat.hours); //Saat
Serial.print(":");
Serial.print(Saat.minutes); //Dakika
Serial.print(":");
Serial.print(Saat.seconds); //Saniye
Serial.print(" ");
Serial.print(Saat.dayofmonth); //Gün
Serial.print("/");
Serial.print(Saat.month); //Ay
Serial.print("/");
Serial.print(Saat.year); //Yıl
Serial.print(" ");
Serial.println(gunler[Saat.dayofweek - 1]); //Hangi güne denk geldiğini bularak yazdırıyoruz.
Serial.print(" ");
// Serial.println(aylar[Saat.month - 1]); //Hangi güne denk geldiğini bularak yazdırıyoruz.
delay(1000); // 1 saniye bekletiyoruz.


int saat,dakika,saniye,gün,ay,yıl;

int saat2=Saat.hours;
int dakika2=Saat.minutes;
int saniye2=Saat.seconds;
int gün2=Saat.dayofmonth;
int ay2=Saat.month;
int yıl2=Saat.year;

int yeniyıl2=Saat.year;

Serial.println("***************buton koşulu buranın içerisinde gerçekleşiyor******");
//Eğer değer "1" ise( yani 1 rakamına bastığımızda,)
int buton_durum = digitalRead(buton_pin);
if(buton_durum == 1){
Serial.println("Butona basıldı");
digitalWrite(led_pin, HIGH);
Serial.println("");

yeniyıl2+=1;
yeniyıl3=yeniyıl2;
sabitay = ay2 ;
}
else{
Serial.println("Butona basılmadı");
digitalWrite(led_pin, LOW);
}
delay(100);
Serial.println(" ***************buton koşulu buranın yukarısında gerçekleşiyor***********if koşulun bitimi");

Serial.print("yeniyıl2 = ");
Serial.println( yeniyıl2);
Serial.print("yeniyıl3 = ");
Serial.println( yeniyıl3);
Serial.print("sabitay = ");
Serial.println(sabitay);


Serial.println("");
Serial.print(Saat.month);
Serial.print("==");
Serial.print(sabitay);
Serial.print("&&");
Serial.print(yıl2);
Serial.print("==");
Serial.println(yeniyıl3);

Serial.print("▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲");//yeni bir dizinin başlangıcı
}[/CODE]

son.PNG
 
Açıkladım ya kaç defa açıklayacağım? Teker teker uğraşmamak için struct tanımlayıp onunla işlem yapıyoruz, verileri blok halinde eeprom'a yazıyoruz. Bu son örnek olsun, artık gerisini bir şekilde hallet.

C++:
#include <EEPROM.h>
#include <virtuabotixRTC.h>

#define buton_pin D3
#define led_pin D4

virtuabotixRTC Saat(D6, D7, D8);  // CLK -> 6, ,//Data -> 7   RST -> 8
String gunler[] = {"PAZARTESI", "SALI", "CARSAMBA", "PERSEMBE", "CUMA", "CUMARTESI", "PAZAR"};

struct Tarih{

    uint8_t month;
    int year;
};

void setup() {
  Serial.begin(9600);
  EEPROM.begin(256);

  pinMode(D13, OUTPUT);
  pinMode(buton_pin, INPUT);
  pinMode(led_pin, OUTPUT);

  Saat.setDS1302Time(24, 59, 23,4, 31, 05, 2022);

}

void loop() {

  Saat.updateTime();
 
  if ( digitalRead(buton_pin) ) {

    Tarih alarmTarihi = { 7, 2022};
    EEPROM.put(0, alarmTarihi);

    digitalWrite(led_pin, HIGH);
    Serial.println("Alarm kuruldu!");

  } else {

    digitalWrite(led_pin, LOW);

  }

  Tarih kayitliAlarmTarihi;
  EEPROM.get(0, kayitliAlarmTarihi);

  if (Saat.year >=  kayitliAlarmTarihi.year && Saat.month >= kayitliAlarmTarihi.month ) {

    Serial.println("Alarm cal!");
  }


  delay(1000);
}
 

Technopat Haberler

Geri
Yukarı