eeprom yazma ve okuma da problem
  • Arkadaşlar counter olarak saydırıyorum fakat total bölümüne sayılan degerin kalıcı olmasını istiyorum enerjiyi kesince siliniyor yardımcı olabilirmisiniz hatam nerde nasıl düzeltebilirim yardımcı olacak arkadaşlara teşekkürler.

    #include < LiquidCrystal.h>
    #include < EEPROM.h>
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
    //const int buttonPin = A0;
    //const int ledPin = 13;
    int a;
    int but = A0;
    int but1 = A1;
    int led = 13;
    int addr;
    int durum;
    int durum1;
    void setup() {
    lcd.begin(16, 2);
    pinMode(but,INPUT);
    pinMode(but1,INPUT);
    pinMode(led, OUTPUT);

    lcd.setCursor(0,0);
    lcd.print("SAYI :");
    lcd.setCursor(0,1);
    lcd.print("TOTAL:");
    }

    void loop() {
    durum=digitalRead(but);
    if ( durum == HIGH ){

    a = a + 1;
    EEPROM.write (addr ,'a');
    lcd.setCursor(6,0);
    lcd.print(a);
    delay (200);
    }

    durum1=digitalRead(but1);
    if ( durum1 == HIGH ){
    EEPROM.read (a);

    lcd.setCursor (6,1);
    lcd.print(a);
    digitalWrite(led,HIGH);
    delay (200);
    digitalWrite(led,LOW);
    }
    }
  • Setup kısmına
    a = EEPROM.read(adr);
    satırını ekleyin
    birde EEPROM.read (a); şeklinde kullanım hatalıdır
    birde write yaparken a değişkenini tırnak içinde yazmışsınız. başka bir sakıncalı durumda rom a sadece byte yazabilirsiniz. doğrudan int yazılmaz. int yazmak için kullanılan kütüphanelere bakın
  • direkt olarak , EEPROM.write(addr,a) olarak denedniz mi ?
  • direkt olarak , EEPROM.write(addr,a) olarak denedniz mi ?
    evet denedim
  • eeprom write yaparken degeri byte olarak kaydetmeniz lazim, byte 0-255 arasi toplam 256 tane deger alabilir,

    simdi char veri tipi 1 byte boyutunda oldugu icin

    EEPROM.write (addr ,byte('a'));

    seklinde kullanabilirsiniz

    ayrica EEPROM.read(addr); yapinca size bir byte degeri verir

    char(EEPROM.read(addr));

    seklinde degeri okuyabilirsiniz
  • kayıt işlemini yaptı ama 255 kadar kaydediyor sonra 1 den başlıyor .benim istedigim 7 haneli rakamlara kadar hafızasında tutsun. bunun için ne yapmalıyım.

    #include < LiquidCrystal.h>
    #include < EEPROM.h>
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
    //const int buttonPin = A0;
    //const int ledPin = 13;
    int a;
    int but = A0;
    int but1 = A1;
    int led = 13;
    int addr;
    int durum;
    int durum1;
    void setup() {
    a = EEPROM.read(addr);
    lcd.begin(16, 2);
    pinMode(but,INPUT);
    pinMode(but1,INPUT);
    pinMode(led, OUTPUT);

    lcd.setCursor(0,0);
    lcd.print("SAYI :");
    lcd.setCursor(0,1);
    lcd.print("TOTAL:");
    }

    void loop() {
    durum=digitalRead(but);
    if ( durum == HIGH ){

    a = a + 1;

    EEPROM.write(addr,a);
    lcd.setCursor(6,0);
    lcd.print(a);
    digitalWrite(led,HIGH);
    delay (200);
    }

    //durum1=digitalRead(but1);
    // if ( durum1 == HIGH ){
    char(EEPROM.read(a));

    lcd.setCursor (6,1);
    lcd.print(a);

    delay (200);
    digitalWrite(led,LOW);
    // }
    }
  • a degeri int bir deger oldugu icin int(EEPROM.read(addr) olmasi daha dogru olur,

    bakin burada iki hata var birincisi int() yerine char() kullanmaniz (ki hata denir mi emin degilim), ikincisi EEPROM.read(a) kullanmaniz, kaydettiginiz bir adresin degerini okumaniz lazim, EEPROM.read(addr) kullanmaniz lazim

    ...

    eepromu arttirdigin zaman eger address_1 deki deger 255 ise degeri 0 yap

    sonra ikinci adresi okuyup + 1 yap

    ...

    #define ADDRESS_1 0
    #define ADDRESS_2 1

    void setup(){}

    void loop()
    {

    if(EEPROM.read(ADDRESS_1) == byte(255))
    {
    EEPROM.write(ADDRESS_1, 0);
    EEPROM.write(ADDRESS_2, EEPROM.read(ADDRESS_2) + byte(1));
    }

    if(EEPROM.read(ADDRESS_2) == byte(255))
    {
    // eeprom veri kaydetmeyi durduracak kod
    }

    }

    ...

    simdi bu sekilde 256x256 toplam 65.536 deger tutacak counter yapabilirsin. adress_3 eklersen x256 daha deger okunabilir bu devam eder boyle

    kaydettigin degerin toplamini gormek icin

    int(EEPROM.read(ADDRESS_1)) + (int(EEPROM.read(ADDRESS_2))*256)

    seklinde okumak mumkun

    ...

    dikkat etmen gereken nokta adresin 255 olup olmadigini denetlerken loop icinde surekli calisacak kodlar yerine gerektigi zaman calisabilecegi yere koymak, eepromun yazma omru var cunku
  • illa kulağı tersten tutacaksınız. yukarıda koydum tum bu kontrolu yapan ve gerektiği kadar değişken uzunluğuna uygun guncelleme yapan eepromput eeprom get komutlarını kullanın işte
  • eeprom bir hucresi 1 byte uzunlukta bilgi alır 0-255 arasında deger alır siz adc den aldıgınız bir bilgiyi yazmaya çalışıyorsunuz sanırım adc çıktısı 2 bytelık bir veridir bunu dikkate alarak eproma yazarsanız ıyı olur.
  • aşağıdaki ornekde değişken uzunluğuna göre epromda o kadar alana yazan bır komut var eeprom.put eeprom.update ve eeprom.get komutlarını ınceleyın bir değişkenın hafızada kaç byte yer tutugunu ıse sizeof(xxxx) komutu ıle ogrenebılırsınız.
    https://www.arduino.cc/en/Tutorial/EEPROMPut
  • okoman'nın verdiği link ile bir dakika da çözülüyor sorunun neden ısrar ediyorsun anlamıyorum , kimse bir şey için kafa yormak istemiyor arkadaş memlekette
  • dilersen yapayım vereyim ücretli ama
  • Gece gece güldürdün be volkan:)
    Tam olarak emin değilim ama herhalde mantık kısmı havada kaldı, o yüzden ilerleme kaydedilmiyor.
  • Yolumuzu bulalım hocam bizde ne yapalım :D

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Login with Facebook
Açık kaynak kültürü gereği, çözdüğünüz problemlerin çözümlerini paylaşmayı lütfen unutmayın.