sd karta sayac değeri kaydetme ve okuma
  • merhaba arkadaşlar
    bir projem var, buton ile bir röleyi aktive ediyorum ve tekrar butona bastığımda röleyi kapatıyorum. Paylaştığım programla ilgili iki sorunum var, örneğin, röleyi 10 kez açıp kapatırsam, sayaç değerini 21 vermem gerekiyor. Sayacın düğmeyi açık ve kapalı olarak saydığını düşünüyorum.bunu nasıl düzeltebilirim?

    İkinci problem, gücü 100 defa açmak ve kapatmak istediğimde, ama elektrik 20. turda kesilirse, tekrar açtığım zaman baştan başlıyor. Mikro sd kart modülünü satın aldım ancak programa bir türlü adapte edemedim,
    Amaç ; sayaç değerinin güç kapatılıp açıldığında kaldığı yerden devam etmesini sağlamak
    yardımcı olabilecek arkadaşlara şimdiden teşekkür ederim.
    Programda sd çalışmalarını dahil etmedim,çünkü başarılı olmadı.


  • Programda belirsizliğe yer yoktur, her şeyi netleştirmelisin.

    Butona basılmadığında durum nedir?
    Sadece butona basılınca mı işlem olacak?
    Butona basınca (filtre yoksa) parazit olacağı için örneğin 100 ms içinde 2 defa basma algılanırsa ne olacak? Röle ardarda açılıp kapanacak mı?
    10 kez açıp kapatınca sayaç 21 olacaksa formül şöyle mi olacak: butona basma sayısı + 1
    1 kere basıldıktan sonra elektrikler kesilirse sayac artacak mı yoksa görmezden mi gelinecek? Artacaksa yukarıdaki formüle göre sayac 2 olur, yani çift sayı.
    Devrenin elektrikler kesilmeden resetlenme ihtimali var mı? Yoksa çalışması garanti mi?

    for (int i = 11; i > tur_sayisi ; i++)
    Buradaki 11 nedir?
  • arduıno nun eeprom modulunu kullan. sayaco her arttırdıgında eproma a yaz arduıno resetlendıgınde ıse acılırken ılk epromda başlangıç değerlerinial kaldıgın yerden devam et
  • merhaba amenofis öncelikle ilgin için tşk ederim.
    butona basılmadığı durumda son durum neyse o hali koruyacak yani açıksa açık kapalıysa kapalı olacak.yani butona her basışta işlem yapmış olacak.
    parazit olayı sanırım delay vererek giderilebilir ama parazit olsa dahi amaç cihazın çalıştırılması olacağından 100 ms içinde 2 baskıyı algılayıp röleyi aç kapa yapsa dahi üçüncü kez basılıp çalışmaya devam edilebilir.(tabiki parazitlenmeyi aşmak en iyisi olacaktır)

    "10 kez açıp kapatınca sayaç 21 olacaksa formül şöyle mi olacak:butona basma sayısı + 1
    1 kere basıldıktan sonra elektrikler kesilirse sayac artacak mı yoksa görmezden mi gelinecek? Artacaksa yukarıdaki formüle göre sayac 2 olur, yani çift sayı."

    aslında böyle bir formül yok.ilk yazdığım yazılımda röle yoktu bir ledi 10 kez yak dur dediğimde 10 kez yanıp duruyordu ama açık ve kapalı kalma zamanlamalarını delay ile belirliyebiliyordum.buton ve röleye ihtiyacım vardı bunlarıda yazılıma ekleyince 10 kez yan dediğimde sayaç içindeki numarayı 21 vermem gerekiyor 20 olursa mesela en son led açık olarak kalıyor.yukarıda sorduğun 11 de bu anlattığım olayın aynısı yani burada da 5 kez yakıp söndürebiliyorum.

    1 kez basıldığında elektrik bağlantısının gitme ihtimali pek yok ama olursada sayaç için görmezden gelinebilir.
    Amaç sadece sayaç değerinin güç kapatılıp açıldığında kaldığı yerden devam etmesini sağlamak (+-1)çok önemli değil yani günlük bir sınırlama yok fakat işin sonunda (şu an led ile denemeleri yapıyor olsamda)bu devrenin çalıştıracağı mekanik aksamın yıpranmasını ve gerekli parça değişimlerini takip edebiliyor olmam gerekiyor,bir nevi araçların periyodik yağ bakımı gibi düşünebilirsin.

  • Sd card'a gerek yok. Her açıp kapamayı 1 olarak düşün. Sayacı sadece makine kapandığı zaman arttır. Yani sayac 5 ise anla ki 5 kere açılmış, 5 kere de kapanmış. Hesabını ona göre yaparsın.

    Röle her kapandığında (bağlantı kesildiğinde) sayacı arttır ve eeprom'a yaz. Bir kereye mahsus eepromu sıfırlarsın, böylece ilk çalışmada sayac 0 olur. setup fonksiyonunda eepromdan sayacı yükle, loop içinde arttır ve yaz.
  • Anladım ama olay sadece sayması değil, program da gördüğün 21 yazan yere atıyorum 30,000 açma verdim dolayısıyla eeprom 100,000 yazma yapabiliyor ömrü çok kısa olur
  • 2 tane değişkenin olsun

    unsigned long sayac;
    boolean butonaktif = false;

    setupta sd karttakı son kaydedilen değeri alıp sayac değişkenine yaz

    sayac = karttangelenveri;


    ve lop içinde aşağıdaki kodu kullanın zira sizin kodlara bakınca ve yapmak istediğinizi okuyunca gereksiz birçok işlem görüyorum o kadar kasmaya gerek yok
    ayrıca aşağıdaki kodlarda sayac sadece role , HIGH olduğunda artacaktır


    if (digitalRead(role) == LOW && digitalRead(buton1) == LOW && butonaktif) {

    digitalWrite(role , HIGH);
    butonaktif = false;
    sayac++;

    // burada cd karta sayac değişkenindeki değeri yazdır

    } else if (digitalRead(role) == HIGH && digitalRead(buton1) == LOW && butonaktif) {

    digitalWrite(role , LOW);
    butonaktif = false;

    } else if (digitalRead(buton1) == HIGH) {

    butonaktif = true;

    }


    Edit: SD karta yazma için önce sabit bir değişkeni ayrı bir yükleme kodu ile deneyip mantığını kavrayın sonra bu kodlara adapte edersiniz nerde okuma nerde kaydetme yapacağınızı kodlar içinde belirttim
  • Eeprom ömrü sıkıntı değil. Yazılım optimizasyonu ile onu en az 20 yıla çıkarabiliriz.

    Sayaç belirlediğiniz sayıya ulaşınca ne yapılacak?
  • Yardımların için çok teşekkür ederim gumulcine, yarın deneyip sonuçları yazarım, aslına bakarsan cooooook yeniyim yazdığın bilgileri nereye ekleyeceğimi dahi bilmiyorum yada benim yazdığım fazlalıklar nedir... Neleri silmem gerek vb,
  • Amenofis belirtilmiş sayıya geldiğinde cihaz hiç çalışmayacak, bakım ve Kontrol için inceleme yapılıp tekrar program yüklenip aktif edilecek
  • En bastan yeni bir kod için ilk değişkenler tanımlanır

    const int buton1 = 1;
    const int role = 5;
    unsigned long sayac;
    boolean butonaktif = false;

    //setup fonksiyonu dediğimiz yer burası ve ilk enerji verildiğinde sadece 1 defa çalışır
    void setup()
    {
    // setupta sd karttakı son kaydedilen değeri alıp sayac değişkenine yaz dediğim yer

    pinMode(buton1 , INPUT_PULLUP);
    pinMode(role , OUTPUT);
    digitalWrite(role, HIGH);
    Serial.begin(9600);
    }

    //daha sonra da sürekli tekrarlanan loop fonksiyonu enerji sağlanmaya devam ettiği sürece kendini tekrarlar

    void loop()
    {
    // loop içinde kullan dediğim kod burada olacak
    }


    sd kard veya eeprom da kullansan setupta okuduğun yerde okuma kaydet denilen yerde de kaydeme yapacaksın

    eeproma sürekli yazmak yerine sadece sayacı arttırıp belirli aralıklarla atıyorum 10 dakikada bir de yazdırabilirsin eeprom ömrünü uzatmak için harici eepromlar da var daha fazla yazma yapabileceğin için onlardan alabilirsin

    Ayrıca eeprom ömrü 100000 evet ama bu arduinonun hemen duracağı anlamına gelmiyor belki 130000 yapar 100bin deyince tasarımcıların verdiği en az 100 bin gibi algılayın bunu
  • Ben eepromla ilgili gerekli kısımları yazdım. Bir hata yapmadıysam eğer bu kod ile eeprom'a yaklaşık 34 milyon kere yazabilirsin. Pratikte sınırsız gibi bişey.

    Sayacı arttırmak için sayac_arttir() fonksiyonunu kullanacaksın. Bakım zamanı gelmişse sayac artmayacak ve fonksiyon false dönecek. Yani sadece true dönerse cihazı çalıştır.

    Bakım yapıldığı zaman bakim_yapildi() fonksiyonunu çağırmalısın. Bu, bir sonraki bakım için gerekli ayarları yapacak.

    Başlangıç için eeprom'u sıfırlayıp SAYAC_LIMIT adresine (eeprom uzunluğunun 4 eksiği) bakım zamanını gösteren (ör. 30.000 demiştin ya) bir sayı atacaksın. Sayaç limitini istediğin zaman değiştirebilirsin ama o anki sayaç değerinden düşük bir değere ayarlamak hataya yol açar.


    #include <avr/io.h>

    #define SAYAC_UST (E2END - 9)
    #define ONCEKI_BAKIM (E2END - 7)
    #define SAYAC_LIMIT (E2END - 3)

    union {
    struct {
    uint16_t alt;
    uint16_t ust;
    };
    uint32_t butun;
    } volatile sayac;

    uint32_t sonraki_bakim;

    void setup()
    {
    EEPROM.get(SAYAC_UST, sayac.ust);
    EEPROM.get(sayac.ust * 2, sayac.alt);

    uint32_t onceki, limit;
    EEPROM.get(ONCEKI_BAKIM, onceki);
    EEPROM.get(SAYAC_LIMIT, limit);
    sonraki_bakim = onceki + limit;
    // ...
    }

    bool sayac_arttir()
    {
    if(++sayac.butun == sonraki_bakim) {
    --sayac.butun;
    return false;
    }
    else if(sayac.alt == 0)
    EEPROM.put(SAYAC_UST, sayac.ust);

    EEPROM.put(sayac.ust * 2, sayac.alt);
    return true;
    }

    void bakim_yapildi()
    {
    uint32_t limit;
    EEPROM.get(SAYAC_LIMIT, limit);
    EEPROM.put(ONCEKI_BAKIM, sonraki_bakim);
    sonraki_bakim += limit;
    }
  • Güncelledim, yukarıda.
  • @amenofis 100 bin yazma ömrü dediğimiz eeprom hücre başına mı? ben tamamı bilirdim
    Her bir adrese 100.000 ayrı ayrı mı? uygulanır. Örneğin, birçok kez 0 adresine yazıyorsak, yalnızca bu adres için mi 100000 sınırı var. Adres 1, 2, 3 her biri yüzer bin mi?
    Aslında aynı soruyu birkaç farklı cümle ile sordum galiba ama doğru ise artık bu bir dert olmaktan çıkar.
    Bu hesaba göre günde 1000 yazma ile 93 yıl sürer o zamana kadar kim öle kim kala zaten 93 yıla kadar Atmega geliştiricileri bunu 500 bine de çıkarır :)
  • sanırım tamamı ,bunu ilk araştırdığımda atıyorum bakım döngüsü 30.000 olacaksa her bir sayıyı bir kayıt olarak algılayıp toplamda üç kez bakım döngüsüne girdiğinde dördüncü kez kartın komple değişimi gerekecek.dolayısıyla sd kart kullanmak mantıklı geldi,
  • Hücre başına 100.000. Yazdığım örnekte 2 byte overflow olduğunda bir sonraki hücreye geçiyor.
  • Teşekkürler bu iyimiş ben toplamı için biliyordum.
    Acaba diyorum yarın senin bu kodu döngüye alsam proteusta dükkandaki bilgisayar ile ne olur diye merak ettim ama sabahı beklemem gerek bunun için :) kaça kadar sayabilecek merak ettim ;)
  • amenofis eline sağlık arkadaşım uğraş vermişsin ama yükleyemedim bir türlü sürekli hata veriyor.kartım uno ondan olabilirmi
  • amenofis'in yazdığı kodları denemen için senin kodlara uyarlaman gerek ayrıca
    EEPROM.h kütüphanesini kodlara include (dahil) etmelisin bir de loop yok o kodlarda doğrudan çalışmaz hata alırsın loop ve EEPROM ekle sonra loop içinde
    sayac_arttir(); fonksiyonunu butona basılan kodlar arasında çağır

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.