Şimdi Ara

FLOAT Değişkenini EEPROM a aktarma.

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
27
Cevap
1
Favori
3.526
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 12
Sayfaya Git
Git
sonraki
Giriş
Mesaj
  • Float değişkenini EEPROM dan yazdırıyorum. Ve lcd ye gösteriyorum fakat 255 yazısı çıkıyor. ilk kullanımda sanırım öyle oluyor muş. Eeprom read komutunu setupda ilk açılışta kullanmak istiyorum. nasıl yapabilirim.Yani degiskeni butonla değiştireceğim. değiştirdikten sonra eeproma kaydedecek ve de elektrik kesintisinde en son ki float değerine ulaşacak
    Örneği gelişi güzel yaptım. Şu anda Kod yanımda olmadığı için.

    örnek olarak

    float degisken=23,2;

    void setup (){
    degisken=EEPROM.read(3);
    }
    void loop(){
    while(menubuton==1){
    EEPROM.write(3,degisken);
    }
    }



  • Bu yazdırdığın 8 bitlik değerler. Float'lar 32 bittir. (https://en.wikipedia.org/wiki/Single-precision_floating-point_format )

    Doğrudan bellekten okuyup kopyala:

     
    for(x=0;x<4;x++) eeprom.write(A+x, ((char*) & degisken)[x] );


    & degisken diyerek adresini belirttim, sonra (char*) ile burayı bir 8 bitlik bir veri olarak görmesini sağladım. Bundan sonra 32 bitlik verinin başlangıcı olarak sıradan bir array gibi (örnekteki gibi) [] kullanabilirsin veya + - ile pointer aritmetiği uygulayabilirsin.



    < Bu mesaj bu kişi tarafından değiştirildi Liu Kang -- 27 Ağustos 2016; 23:23:12 >
  • quote:

    Orijinalden alıntı: Liu Kang

    Bu yazdırdığın 8 bitlik değerler. Float'lar 32 bittir. (https://en.wikipedia.org/wiki/Single-precision_floating-point_format )

    Doğrudan bellekten okuyup kopyala:

     
    for(x=0;x<4;x++) eeprom.write(A+x, ((char*) & degisken)[x] );


    & degisken diyerek adresini belirttim, sonra (char*) ile burayı bir 8 bitlik bir veri olarak görmesini sağladım. Bundan sonra 32 bitlik verinin başlangıcı olarak sıradan bir array gibi (örnekteki gibi) [] kullanabilirsin veya + - ile pointer aritmetiği uygulayabilirsin.


    teşekkür ederim ilginiz için. A+x neyi ifade ediyor . amacım birazda nedenleri ve mantıklarıda öğrenmek. birde neden 3 defa tekrarlattık?



    < Bu mesaj bu kişi tarafından değiştirildi prax -- 29 Ağustos 2016; 8:51:51 >
    < Bu ileti mobil sürüm kullanılarak atıldı >




  • quote:

    Orijinalden alıntı: Liu Kang

    Bu yazdırdığın 8 bitlik değerler. Float'lar 32 bittir. (https://en.wikipedia.org/wiki/Single-precision_floating-point_format )

    Doğrudan bellekten okuyup kopyala:

     
    for(x=0;x<4;x++) eeprom.write(A+x, ((char*) & degisken)[x] );


    & degisken diyerek adresini belirttim, sonra (char*) ile burayı bir 8 bitlik bir veri olarak görmesini sağladım. Bundan sonra 32 bitlik verinin başlangıcı olarak sıradan bir array gibi (örnekteki gibi) [] kullanabilirsin veya + - ile pointer aritmetiği uygulayabilirsin.


    A+x olarak kabul etmiyor..
    bende
    for(int x=0;x<4;x++){
    EEPROM.write(x,((char*) & degisken
    }

    yaptım fakat kabul olmuyor alakasız sayılar çıkıyor .

    Setup Bölümüne de
    for(int x=0;x<4;x++){
    degisken=EEPROM.read(x);
    }

    yaptım. Ama olmuyor. 29.1 gelmiyor. float olarakda yazmıyor kendi yaptığımda . Bi çare derdime bi çare :D




  • quote:

    Orijinalden alıntı: prax

    Float değişkenini EEPROM dan yazdırıyorum. Ve lcd ye gösteriyorum fakat 255 yazısı çıkıyor. ilk kullanımda sanırım öyle oluyor muş. Eeprom read komutunu setupda ilk açılışta kullanmak istiyorum. nasıl yapabilirim.Yani degiskeni butonla değiştireceğim. değiştirdikten sonra eeproma kaydedecek ve de elektrik kesintisinde en son ki float değerine ulaşacak
    Örneği gelişi güzel yaptım. Şu anda Kod yanımda olmadığı için.

    örnek olarak

    float degisken=23,2;

    void setup (){
    degisken=EEPROM.read(3);
    }
    void loop(){
    while(menubuton==1){
    EEPROM.write(3,degisken);
    }
    }


    Değişkenin 0-99.9 arası ise sayi=değişken*10 yap. tam=sayi/10; sonra onda=sayi%10; yani tam=23 ve onda=2 olacaktır.

    lcd ekranında şöyle yap ("%d,%d",tam,onda) yaparsan ekranında gözükür.



    < Bu mesaj bu kişi tarafından değiştirildi karacan450 -- 29 Ağustos 2016; 14:08:08 >




  • Arduino ile ilgili Türkçe kaynaklarda EEPROM ile ilgili kısımları okuyun. EEPROM.put() ve EEPROM.get() fonksiyonları ile istediginiz veri turunu EEPROM'a aktarabilirsiniz.
    Ben kullanmaniz gereken yontemlerden en kolay olani yazayim.

    float var = 3.14f;
    EEPROM.put(adres, var);
    Yukaridaki kisim gerekli veriyi yaziyor.

    float okunan;
    EEPROM.get(adres, okunan);
    Bu da okumak icin gerekli.
    Eger float degerini daha once o adrese yazmadan okuma yaparsaniz, hatali veya gecersiz float degeri okuyabilir ve bu haliyle programda kullanmaya calisirsaniz kritik hatalara meydan verebilirsiniz.

    https://www.arduino.cc/en/Reference/EEPROMGet
    Suna da goz atin bence

    < Bu ileti mobil sürüm kullanılarak atıldı >




  • quote:

    Orijinalden alıntı: lucky16

    Arduino ile ilgili Türkçe kaynaklarda EEPROM ile ilgili kısımları okuyun. EEPROM.put() ve EEPROM.get() fonksiyonları ile istediginiz veri turunu EEPROM'a aktarabilirsiniz.
    Ben kullanmaniz gereken yontemlerden en kolay olani yazayim.

    float var = 3.14f;
    EEPROM.put(adres, var);
    Yukaridaki kisim gerekli veriyi yaziyor.

    float okunan;
    EEPROM.get(adres, okunan);
    Bu da okumak icin gerekli.
    Eger float degerini daha once o adrese yazmadan okuma yaparsaniz, hatali veya gecersiz float degeri okuyabilir ve bu haliyle programda kullanmaya calisirsaniz kritik hatalara meydan verebilirsiniz.

    https://www.arduino.cc/en/Reference/EEPROMGet
    Suna da goz atin bence

    teşekkür ederim az sonra deneyecem fakat bu float değerinin sonuna ^f^ eklememiz gerekiyor dimi . bende degisken =29.1f;gibi sonuçta ben bu değeri buton ile değiştireceğim

    < Bu ileti mobil sürüm kullanılarak atıldı >




  • quote:

    Orijinalden alıntı: lucky16

    Arduino ile ilgili Türkçe kaynaklarda EEPROM ile ilgili kısımları okuyun. EEPROM.put() ve EEPROM.get() fonksiyonları ile istediginiz veri turunu EEPROM'a aktarabilirsiniz.
    Ben kullanmaniz gereken yontemlerden en kolay olani yazayim.

    float var = 3.14f;
    EEPROM.put(adres, var);
    Yukaridaki kisim gerekli veriyi yaziyor.

    float okunan;
    EEPROM.get(adres, okunan);
    Bu da okumak icin gerekli.
    Eger float degerini daha once o adrese yazmadan okuma yaparsaniz, hatali veya gecersiz float degeri okuyabilir ve bu haliyle programda kullanmaya calisirsaniz kritik hatalara meydan verebilirsiniz.

    https://www.arduino.cc/en/Reference/EEPROMGet
    Suna da goz atin bence

    nan değeri yazıyor




  • Aslında 2. mesajda arkadaş oldukça güzel anlatmış ama bende göstereyim. Çalışacak olan kod bu;
    #include <EEPROM.h> 

    float sayi = 123.334;
    char *temp;

    void setup() {
    // put your setup code here, to run once:
    Serial.begin(9600);

    temp = (char*)&sayi;

    for(uint8_t cnt = 0; cnt < 4; cnt++){
    EEPROM.write(0 + cnt, temp[cnt]);
    Serial.println((uint8_t)temp[cnt]);
    temp[cnt] = 0;
    }

    Serial.println(sayi);

    for(uint8_t cnt = 0; cnt < 4; cnt++){
    temp[cnt] = EEPROM.read(0 + cnt);
    Serial.println((uint8_t)temp[cnt]);
    }

    Serial.println(sayi);
    }

    void loop() {
    // put your main code here, to run repeatedly:

    }


    "sayi" değişkeni bizim eeproma yazacağımız float değer. Unutmayalım float değer 32bittir yani 4byte yer kaplar.
    EEPROM'lar ise haliyle dijital cihazlar ve virgüllü sayıyı doğrudan yazmaya müsait değillerdir. O yüzden ondalık sayıları parçalamamız gerekir.
    Bu kodda tam olarak yaptığımız şey ise float olan 4bytelık veriyi char türünde array olarak ifade ettmek. Bir nevi eeproma yazılabilecek 1 bytelık(8 bitlik) parçalara ayırmak. İstersen bu char* yerine uint8_t* filanda olabilirdi.
    Gerisi kodu anlayıp anlamamana kalmış. Arkadaşın paylaştığı kodda sormuşsun "A+x" kabul etmiyor diye. Aslında orada "A" eeproma hangi adresten yazılmaya başlanacağı x ise yazılacak 4 byte'ı ifade eden değişken.(1.byte, 2.byte, 3.byte, 4.byte gibi)

    Kod şunu yapıyor:
    sayının adresini temp'in adresine eşitliyor. Böylelikle temp içinde float olan sayıyı 4 byte olarak görebileceğiz.
    İlk for döngüsünde 0. eeprom adresinden başlamak üzere 4 hamlede 4 byte veriyi eeproma yazıyor, seri porttan dışarıya hangi datayı yazdığını gösteriyor ve 4 byte'ı da sıfıra eşitliyor yazdıktan sonra.
    Temp ile sayi artık aynı adresi paylaşıyor demiştik. Temp'in tüm byteları sıfırlanınca sayı'nında değerinin sıfır olduğunu görmek için seri porttan bakıyor.
    2. for döngüsünde eeproma yazdığı 4 byte'ı aynı adreslerden okuyup seri porttan her okuduğu byte'ı gösteriyor.
    En sonda sayi'nin sahip olduğu değeri seri porttan gösteriyor ve görüyoruz ki ilk değeri ile aynı. Yani eeproma yazıp geri okuyabildik.



    < Bu mesaj bu kişi tarafından değiştirildi mylord92 -- 31 Ağustos 2016; 9:17:31 >




  • quote:

    Orijinalden alıntı: mylord92

    Aslında 2. mesajda arkadaş oldukça güzel anlatmış ama bende göstereyim. Çalışacak olan kod bu;
    #include <EEPROM.h> 

    float sayi = 123.334;
    char *temp;

    void setup() {
    // put your setup code here, to run once:
    Serial.begin(9600);

    temp = (char*)&sayi;

    for(uint8_t cnt = 0; cnt < 4; cnt++){
    EEPROM.write(0 + cnt, temp[cnt]);
    Serial.println((uint8_t)temp[cnt]);
    temp[cnt] = 0;
    }

    Serial.println(sayi);

    for(uint8_t cnt = 0; cnt < 4; cnt++){
    temp[cnt] = EEPROM.read(0 + cnt);
    Serial.println((uint8_t)temp[cnt]);
    }

    Serial.println(sayi);
    }

    void loop() {
    // put your main code here, to run repeatedly:

    }


    "sayi" değişkeni bizim eeproma yazacağımız float değer. Unutmayalım float değer 32bittir yani 4byte yer kaplar.
    EEPROM'lar ise haliyle dijital cihazlar ve virgüllü sayıyı doğrudan yazmaya müsait değillerdir. O yüzden ondalık sayıları parçalamamız gerekir.
    Bu kodda tam olarak yaptığımız şey ise float olan 4bytelık veriyi char türünde array olarak ifade ettmek. Bir nevi eeproma yazılabilecek 1 bytelık(8 bitlik) parçalara ayırmak. İstersen bu char* yerine uint8_t* filanda olabilirdi.
    Gerisi kodu anlayıp anlamamana kalmış. Arkadaşın paylaştığı kodda sormuşsun "A+x" kabul etmiyor diye. Aslında orada "A" eeproma hangi adresten yazılmaya başlanacağı x ise yazılacak 4 byte'ı ifade eden değişken.(1.byte, 2.byte, 3.byte, 4.byte gibi)

    Kod şunu yapıyor:
    sayının adresini temp'in adresine eşitliyor. Böylelikle temp içinde float olan sayıyı 4 byte olarak görebileceğiz.
    İlk for döngüsünde 0. eeprom adresinden başlamak üzere 4 hamlede 4 byte veriyi eeproma yazıyor, seri porttan dışarıya hangi datayı yazdığını gösteriyor ve 4 byte'ı da sıfıra eşitliyor yazdıktan sonra.
    Temp ile sayi artık aynı adresi paylaşıyor demiştik. Temp'in tüm byteları sıfırlanınca sayı'nında değerinin sıfır olduğunu görmek için seri porttan bakıyor.
    2. for döngüsünde eeproma yazdığı 4 byte'ı aynı adreslerden okuyup seri porttan her okuduğu byte'ı gösteriyor.
    En sonda sayi'nin sahip olduğu değeri seri porttan gösteriyor ve görüyoruz ki ilk değeri ile aynı. Yani eeproma yazıp geri okuyabildik.


    Anlatımlarınız çok güzel. sizin verdiğiniz kodun aynısını da yaptım fakat olmuyor . bu sefer menüler arası hızla geçiş oluyor.vede kaydedileni okumuyor. sizin aynısnı da yaptup setup daki ni değiştirerek de yaptım ne yaptıysam LCD ye yazmıyor ve kaydetmiyor. ya 0.0 gösteriyor ya da nan Hemen Kodların hepsini veriyorum. Belki benimkilerle çakışıyordur. bilmiyorum..

     

    #include <EEPROM.h>

    #include <LiquidCrystal.h>
    #include <Servo.h>
    Servo myservo;
    int pos=0;
    const int sogutucuPin = 7;
    const int isiticiPin = 13;
    unsigned long oncekizaman = 0;
    unsigned long oncekizamaniki = 0;
    //*************DEGISTIREBILIRLER/////////////
    //Saat Ayari, Kac saatte bir çalışması gerekiyorsa o yazilacak
    int saatdegisken=4;
    //Dakika Ayari, Kac dakikada bir çalışması gerekiyorsa o yazilacak
    int dakikadegisken=4;
    //Saniye Ayari, Kac Saniyede bir çalışması gerekiyorsa o yazilacak
    int saniyedegisken=10;

    //********************************************
    //*************DEGISTIREBILIRLER 2/////////////
    //Saat Ayari, Kac saatte bir çalışması gerekiyorsa o yazilacak
    int saatdegiskeniki=4;
    //Dakika Ayari, Kac dakikada bir çalışması gerekiyorsa o yazilacak
    int dakikadegiskeniki=4;
    //Saniye Ayari, Kac Saniyede bir çalışması gerekiyorsa o yazilacak
    int saniyedegiskeniki=10;

    //********************************************

    // pin tanımlamaları
    #define yukari 9
    #define asagi 10
    #define _menu 8

    //LiquidCrystal(rs, enable, d4, d5, d6, d7)
    //LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)
    LiquidCrystal lcd(12,11,5,4,3,2);


    // menü seviyeleri tanımlamaları
    #define menu_adet 4
    #define menu_sicaklik 1
    #define menu_nem 2
    #define menu_Maxsicaklik 3
    #define menu_Maxnem 4
    #define menu_kalangun 0
    int kuluckagun=22;
    int lastkulucka=0;
    unsigned long oncekikalangunzaman=0;
    int saatdegiskenkalangun=24;
    //buton tepki bekleme süresi
    long beklemeSuresi = 200;

    //buton süre sayaçları
    long sureYukari;
    long sureAsagi;
    long sureMenu;

    //buton tetikleme değişkenleri
    bool yukariTetik;
    bool asagiTetik;
    bool menuTetik;

    // menü konum değişkeni, hangi konumda ise onunla ilgili işlem yapacak
    int menu = menu_kalangun; // varsayılan açık menü sıcaklık yani 1

    //sıcaklık ve nem değişkenleri
    float sicaklik = 29.1;
    float sicaklikmax = 40.5;
    float nem = 65.7;
    float nemmax=80.1;

    //sıcaklik ve nem okuma değişkenleri
    float sicaklikderece; //Analog değeri dönüştüreceğimiz sıcaklık
    float analoggerilim; //Ölçeceğimiz analog değer
    int sicaklikpin=0; //Analog değer girişi

    // EEPROM DEĞİŞKENLERİ
    char *temp;


    void setup() {
    // put your setup code here, to run once:
    pinMode(isiticiPin, OUTPUT);
    pinMode(sogutucuPin,OUTPUT);
    myservo.attach(6);
    pinMode(yukari, INPUT);
    pinMode(asagi, INPUT);
    pinMode(_menu, INPUT);
    //lcd başlat
    lcd.begin(16,2);
    lcd.clear();
    kuluckagun=EEPROM.read(0);
    lastkulucka=kuluckagun;



    temp = (char*)&sicaklik;
    for(uint8_t cnt = 2; cnt < 6; cnt++){
    EEPROM.write(0 + cnt, temp[cnt]);
    temp[cnt] = 0;
    }
    for(uint8_t cnt = 2; cnt < 6; cnt++){
    sicaklik = EEPROM.read(0 + cnt);
    }


    }

    void loop() {
    servo();
    servoiki();
    kalangun();
    if(digitalRead(yukari) == HIGH){
    if((millis() - sureYukari) > beklemeSuresi){
    artir();//hangi seçimde ise o seçimin değerini artıracak fonksiyon
    sureYukari = millis();//ikinci değişim için süreyi başa al
    }
    }else{
    sureYukari = millis();//yukarı tuş süresi başlangıç değeri
    }

    if(digitalRead(asagi) == HIGH){
    if((millis() - sureAsagi) > beklemeSuresi){
    azalt();//hangi seçimde ise o değeri azaltacak fonksiyon
    sureAsagi = millis();//ikinci değişim için süreyi başa al
    }
    }else{
    sureAsagi = millis();//aşağı tuş süresi başlangıç değeri
    }

    if(digitalRead(_menu) == HIGH){
    if((millis() - sureMenu)> beklemeSuresi){
    menu++;// menüyü artır
    if(menu > menu_adet){ menu = 0; }// limit menü sayısına ulaşınca başa dön
    sureMenu = millis();//ikinci değişim için süreyi başa al

    }
    }else{
    sureMenu = millis();//menü tuşu süresi başlangıç değeri
    }
    lcd_nem();
    lcd_sicaklik();
    if (sicaklikderece>sicaklik && sicaklikderece<sicaklikmax){
    digitalWrite(sogutucuPin,LOW);
    digitalWrite(isiticiPin,LOW);
    }
    if (sicaklikderece<sicaklik){
    digitalWrite(isiticiPin,HIGH);
    digitalWrite(sogutucuPin,LOW);
    }
    if (sicaklikderece>sicaklikmax){
    digitalWrite(isiticiPin,LOW);
    digitalWrite(sogutucuPin,HIGH);
    }
    //MENÜ TUŞU KAÇTA İSE EKRANDA ONU GÖSTERmesi için
    if(menu==0){
    lcd_kalangun_ayar();
    }
    if(menu==1){
    lcd_sicaklik_ayar();
    }
    if(menu==2){
    lcd_sicaklikmax_ayar();

    }
    if(menu==3){
    lcd_nem_ayar();
    }
    if(menu==4){
    lcd_nemmax_ayar();
    }
    //*************
    if(lastkulucka!=kuluckagun){
    EEPROM.write(0,kuluckagun);
    lastkulucka=kuluckagun;
    }

    }
    void kalangun(){
    unsigned long kalangunzaman=millis();
    long saat=saatdegiskenkalangun*10;

    //*************DEGISTIREBILIRLER/////////////
    //"1 günde 1 düşecek"
    if (kalangunzaman - oncekikalangunzaman >= saat) {
    //********************************************

    oncekikalangunzaman = kalangunzaman;

    //Saniye veya ile calisacak kodlar buraya
    kuluckagun=kuluckagun-1;
    //Saniye ile calisacak kodlar buraya

    }
    if (kuluckagun<0){
    kuluckagun=22;
    }
    if(kuluckagun>22) {
    kuluckagun=22;
    }


    }

    void servo(){
    unsigned long suankizaman = millis();
    long saat=saatdegisken*3600000;
    long dakika=dakikadegisken*60000;
    long saniye=saniyedegisken*1000;

    //*************DEGISTIREBILIRLER/////////////
    //"dakika" bazında ise dakika saniye bazında ise "saniye",saat ise"saat"
    if (suankizaman - oncekizaman >= saat) {
    //********************************************

    oncekizaman = suankizaman;

    //Saniye veya ile calisacak kodlar buraya

    myservo.write(130); // tell servo to go to position in variable 'pos'
    // waits 15ms for the servo to reach the position


    //Saniye ile calisacak kodlar buraya

    }

    }
    void servoiki(){
    unsigned long suankizamaniki = millis();
    //Saat degisken ile saat degiskeni 2 aynı dk saniye olacağı için hangi degisken ise ona ekleme yapılacak
    long saatiki=(saatdegiskeniki*3600000)+7200000;
    long dakikaiki=(dakikadegiskeniki*60000)+120000;
    long saniyeiki=(saniyedegiskeniki*1000)+7200000;

    //*************DEGISTIREBILIRLER/////////////
    //"dakika" bazında ise dakikaiki saniye bazında ise "saniyeiki",saat ise"saatiki"
    if (suankizamaniki - oncekizamaniki >= saatiki) {
    //********************************************
    // -60000 nin nedeni saatdegisken 1 ile saat değişkeni 2 örnek 2 saat te bir dönmesi lazımsa birinci yöne 2 4 6 gibi ikinciyide 1 3 5 gibi yapılcaksa dakika saniye saat bazında yazılıp sıfırlanacağı için
    oncekizamaniki = suankizamaniki-7200000;

    //Saniye veya ile calisacak kodlar buraya
    // goes from 180 degrees to 0 degrees
    myservo.write(45); // tell servo to go to position in variable 'pos'
    // waits 15ms for the servo to reach the position


    //Saniye ile calisacak kodlar buraya

    }

    }

    void artir(){
    switch(menu){
    case menu_sicaklik:
    sicaklik = sicaklik + 0.1;
    break;
    case menu_nem:
    nem = nem + 0.1;

    break;
    case menu_Maxsicaklik:
    sicaklikmax = sicaklikmax + 0.1;

    break;
    case menu_Maxnem:
    nemmax = nemmax + 0.1;

    break;
    }

    }

    void azalt(){
    switch(menu){
    case menu_sicaklik:
    sicaklik = sicaklik - 0.1;

    break;
    case menu_nem:
    nem = nem - 0.1;

    break;
    case menu_Maxsicaklik:
    sicaklikmax = sicaklikmax - 0.1;

    break;
    case menu_Maxnem:
    nemmax = nemmax - 0.1;

    break;
    }
    }


    void lcd_sicaklikmax_ayar(){
    lcd.setCursor(0, 0);
    lcd.print("Max C: ");
    lcd.setCursor(11, 0);
    lcd.print(sicaklikmax, 1);

    }

    void lcd_nemmax_ayar(){
    lcd.setCursor(0,0);
    lcd.print("Max Nem %");
    lcd.setCursor(11,0);
    lcd.print(nemmax, 1);
    }
    void lcd_sicaklik_ayar(){
    lcd.setCursor(0, 0);
    lcd.print("Min C: ");
    lcd.setCursor(11, 0);
    lcd.print(sicaklik, 1);
    }

    void lcd_nem_ayar(){
    lcd.setCursor(0,0);
    lcd.print("Min Nem %");
    lcd.setCursor(11,0);
    lcd.print(nem, 1);
    }
    void lcd_kalangun_ayar(){
    lcd.setCursor(0,0);
    lcd.print("Kalan Gun: ");
    lcd.setCursor(11,0);
    lcd.print(kuluckagun);
    lcd.setCursor(13,0);
    lcd.print(" ");
    if(kuluckagun<10){
    lcd.setCursor(12,0);
    lcd.print(" ");
    }
    }

    void lcd_sicaklik(){
    analoggerilim = analogRead(sicaklikpin); //A1'den değeri ölç
    analoggerilim = (analoggerilim/1023)*5000;//değeri mV'a dönüştr
    sicaklikderece = analoggerilim /10,0; // mV'u sicakliğa dönüştür
    lcd.setCursor(0,1);
    lcd.print("C:");
    lcd.setCursor(2, 1);
    lcd.print(sicaklikderece, 1);
    }

    void lcd_nem(){
    analoggerilim = analogRead(sicaklikpin); //A1'den değeri ölç
    analoggerilim = (analoggerilim/1023)*5000;//değeri mV'a dönüştr
    sicaklikderece = analoggerilim /10,0; // mV'u sicakliğa dönüştür
    lcd.setCursor(10,1);
    lcd.print("%");
    lcd.setCursor(11,1);
    lcd.print(sicaklikderece, 1);
    }




    < Bu mesaj bu kişi tarafından değiştirildi prax -- 31 Ağustos 2016; 13:17:26 >




  • quote:

    Orijinalden alıntı: lucky16

    Arduino ile ilgili Türkçe kaynaklarda EEPROM ile ilgili kısımları okuyun. EEPROM.put() ve EEPROM.get() fonksiyonları ile istediginiz veri turunu EEPROM'a aktarabilirsiniz.
    Ben kullanmaniz gereken yontemlerden en kolay olani yazayim.

    float var = 3.14f;
    EEPROM.put(adres, var);
    Yukaridaki kisim gerekli veriyi yaziyor.

    float okunan;
    EEPROM.get(adres, okunan);
    Bu da okumak icin gerekli.
    Eger float degerini daha once o adrese yazmadan okuma yaparsaniz, hatali veya gecersiz float degeri okuyabilir ve bu haliyle programda kullanmaya calisirsaniz kritik hatalara meydan verebilirsiniz.

    https://www.arduino.cc/en/Reference/EEPROMGet
    Suna da goz atin bence

    loop kısmına

    for(int x=4;x<8;x++)
    EEPROM.write(0+x, ((char*) & sicaklik)[x] );


    setup kısmına ise

    for(unsigned int x=4;x<8;x++)
    *((char*)&sicaklik+x)=EEPROM.read(0+x);

    yaptım fakat ilk çalıştırdığımda oluyor fakat sonra menüler arası geçiş yapmıyor. acaba LCD ye yazdırırken mi hata yapıyorum.

    lcd.print(sicaklik,1)

    denedim

    lcd.print(sicaklik,DEC) denedim. Ne yapmalıyım üstteki mesajda bütün kodlar var.




  • Liu Kang'ın yazdigi gibi yapin. x=4ten <8e kadar ifadesi yanlis. Float zaten 32 bit. Siz baska bellek bolgelerine erisiyorsunuz.EEPROMda baska adrese yazmak icin 0+x yerine de mesela 11+x yazin.

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • quote:

    Orijinalden alıntı: lucky16

    Liu Kang'ın yazdigi gibi yapin. x=4ten <8e kadar ifadesi yanlis. Float zaten 32 bit. Siz baska bellek bolgelerine erisiyorsunuz.EEPROMda baska adrese yazmak icin 0+x yerine de mesela 11+x yazin.

    olayı şimdi anladım 0+x deki 0 adres

    for döngüsü içindeki x=0 x <4 ün amacı ise 0 adresine float yazması.


    benim baştan beri anladığım ise float 4 hane x adres 4 den küçük 4 bit e göre kaydetmesi olarak anlamıştım . inşallah bu sefer olur . sabah ilk işim denemek :-)

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • quote:

    Orijinalden alıntı: lucky16

    Liu Kang'ın yazdigi gibi yapin. x=4ten <8e kadar ifadesi yanlis. Float zaten 32 bit. Siz baska bellek bolgelerine erisiyorsunuz.EEPROMda baska adrese yazmak icin 0+x yerine de mesela 11+x yazin.

    o şekilde denedim "nan" değeri çıkıyor.

    setup kısmına

    for(unsigned int x=0;x<4;x++)
    *((char*)&sicaklik+x)=EEPROM.read(0+x);

    loop kısmına

    for(int x=0;x<4;x++)
    EEPROM.write(0+x, ((char*) & sicaklik)[x] );

    lcd.print(sicaklik,1);
  • İkinci kisimda & isaretinden sonra bosluk koymayin.

    < Bu ileti mobil sürüm kullanılarak atıldı >
  •  
    #include <EEPROM.h>
    template <class T> int EpromYaz(int e, const T& veri)
    {
    const byte* p = (const byte*)(const void*)&veri;
    unsigned int i;
    for (i = 0; i < sizeof(veri); i++)
    EEPROM.write(e++, *p++);
    return i;
    }

    template <class T> int EpromOku(int e, T& veri)
    {
    byte* p = (byte*)(void*)&veri;
    unsigned int i;
    for (i = 0; i < sizeof(veri); i++)
    *p++ = EEPROM.read(e++);
    return i;
    }


    Şu iki fonksiyonu koduna ekle. Her türde veriyi okur yazarsın.

    bir değişkenin başına & işareti geldiğinde bu değişkenin hafıza adresine gider, adresteki veri ile işlem yapar.
    * olanlar ise pointer işaretidir. pointer bir değişken türüdür. pointer türü değişkenler hafıza adresi saklayan değişkenlerdir.
    template ile özel değişken sınıfı tanımlaması yaparak her türde değişkeni alabilirsin diyebilirsin.
    8 bit yerine 32 bitlik bir veriyi okuyup yazmak için 4 hafıza adresi kullanırsın. *p değişkeninin değerini artırarak hedef hafıza konumundaki değeri aynen kullanabilirsin. her adres 8 bit taşırken her farklı 8 bitlik değere direkt ulaşmak bu durumda daha elverişlidir.
    c++ kaynaklarına biraz göz atın derim. bazı kullanımlar kodu epey kolaylaştırır.

    Uyarı: veri tipinin genişliğini bilerek veri yazdırın. eğer 4 byte uzunluğunda veriyi 10 adresine yazdırıyorsanız bir sonraki veriyi 14 adresinden başlayarak yazdırın. 10-13 arası veri doldurulmuş olur. Bu adresleri değiştirirseniz eski veriniz bozulur.



    < Bu mesaj bu kişi tarafından değiştirildi goçhisar -- 4 Eylül 2016; 22:22:56 >




  • quote:

    Orijinalden alıntı: goçhisar

     
    #include <EEPROM.h>
    template <class T> int EpromYaz(int e, const T& veri)
    {
    const byte* p = (const byte*)(const void*)&veri;
    unsigned int i;
    for (i = 0; i < sizeof(veri); i++)
    EEPROM.write(e++, *p++);
    return i;
    }

    template <class T> int EpromOku(int e, T& veri)
    {
    byte* p = (byte*)(void*)&veri;
    unsigned int i;
    for (i = 0; i < sizeof(veri); i++)
    *p++ = EEPROM.read(e++);
    return i;
    }


    Şu iki fonksiyonu koduna ekle. Her türde veriyi okur yazarsın.

    bir değişkenin başına & işareti geldiğinde bu değişkenin hafıza adresine gider, adresteki veri ile işlem yapar.
    * olanlar ise pointer işaretidir. pointer bir değişken türüdür. pointer türü değişkenler hafıza adresi saklayan değişkenlerdir.
    template ile özel değişken sınıfı tanımlaması yaparak her türde değişkeni alabilirsin diyebilirsin.
    8 bit yerine 32 bitlik bir veriyi okuyup yazmak için 4 hafıza adresi kullanırsın. *p değişkeninin değerini artırarak hedef hafıza konumundaki değeri aynen kullanabilirsin. her adres 8 bit taşırken her farklı 8 bitlik değere direkt ulaşmak bu durumda daha elverişlidir.
    c++ kaynaklarına biraz göz atın derim. bazı kullanımlar kodu epey kolaylaştırır.

    Uyarı: veri tipinin genişliğini bilerek veri yazdırın. eğer 4 byte uzunluğunda veriyi 10 adresine yazdırıyorsanız bir sonraki veriyi 14 adresinden başlayarak yazdırın. 10-13 arası veri doldurulmuş olur. Bu adresleri değiştirirseniz eski veriniz bozulur.
    quote:

    Orijinalden alinti: goçhisar

     
    #include <EEPROM.h>
    template <class T> int EpromYaz(int e, const T& veri)
    {
    const byte* p = (const byte*)(const void*)&veri;
    unsigned int i;
    for (i = 0; i < sizeof(veri); i++)
    EEPROM.write(e++, *p++);
    return i;
    }

    template <class T> int EpromOku(int e, T& veri)
    {
    byte* p = (byte*)(void*)&veri;
    unsigned int i;
    for (i = 0; i < sizeof(veri); i++)
    *p++ = EEPROM.read(e++);
    return i;
    }


    Su iki fonksiyonu koduna ekle. Her türde veriyi okur yazarsin.

    bir degiskenin basina & isareti geldiginde bu degiskenin hafiza adresine gider, adresteki veri ile islem yapar.
    * olanlar ise pointer isaretidir. pointer bir degisken türüdür. pointer türü degiskenler hafiza adresi saklayan degiskenlerdir.
    template ile özel degisken sinifi tanimlamasi yaparak her türde degiskeni alabilirsin diyebilirsin.
    8 bit yerine 32 bitlik bir veriyi okuyup yazmak için 4 hafiza adresi kullanirsin. *p degiskeninin degerini artirarak hedef hafiza konumundaki degeri aynen kullanabilirsin. her adres 8 bit tasirken her farkli 8 bitlik degere direkt ulasmak bu durumda daha elverislidir.
    c++ kaynaklarina biraz göz atin derim. bazi kullanimlar kodu epey kolaylastirir.

    Uyari: veri tipinin genisligini bilerek veri yazdirin. eger 4 byte uzunlugunda veriyi 10 adresine yazdiriyorsaniz bir sonraki veriyi 14 adresinden baslayarak yazdirin. 10-13 arasi veri doldurulmus olur. Bu adresleri degistirirseniz eski veriniz bozulur.

    teşekkür ederim yardımınız için

    yazarken

    setup a

    EpromOku(adres,veri);

    loop a

    EpromYaz(adres,veri);

    şeklinde yaptım ilk başta oldu yazdı eeprom a fakat 2.de yine nan hatası verdi ?



    bir de şu şeilde yaptım bundada aynı

    void EEPROM_Write(float *num, int MemPos)
    {
    //float 4byte'lık yer kapsadığı için
    //float değerini 4 byte'a ayır
    //ve başlangıç adresinden itibaren
    // 4 ardışık adrese kaydet
    byte ByteArray[4];
    memcpy(ByteArray, num, 4);
    for(int x = 0; x < 4; x++)
    {
    EEPROM.write((MemPos * 4) + x, ByteArray[x]);
    }
    }

    void EEPROM_Read(float *num, int MemPos)
    {
    //float 4 byte'lık yer kapsadığı için
    //başlangıç adresinden itibaren 4 ardışık adresi oku
    //ve hedef gösterilen değişkene kaydet
    byte ByteArray[4];
    for(int x = 0; x < 4; x++)
    {
    ByteArray[x] = EEPROM.read((MemPos * 4) + x);
    }
    memcpy(num, ByteArray, 4);
    }



    < Bu mesaj bu kişi tarafından değiştirildi prax -- 5 Eylül 2016; 17:05:39 >




  • eprom yazma süreci işlemci içinde biraz uzun sürer. bir byte uno da yaklaşık 4ms civarında yaılır. yazma ve okuma arasında biraz bekleme yapman şart. kodu dağınık hale getirip sadece yazma gereken yerde eprom yazmayı kullanırsan hata kalkacaktır. ayrıca eproma sürekli yazma işlemi yapmamalısın. eprom ömrü kısıtlıdır. bir bellek adresi bozulduysa, yazma işlemi gerçekleşemiyorsa farklı bir adresi kullanmaya başlamalısın.
  • Bu kullandığınız hangi kütüphane, ne ortamında çalışıyorsunuz, hepsi muğlak bunlardan hiç bahsetmemişsiniz. Öyle zannediyorum ki siz henüz başlangıç aşamasındasınız (ve belli ki yalnış gidiyorsunuz*). Daha önce lucky16'nın bahsettiği fonksiyonlar kütüphanede varsa onları kullanın, bu for döngüleriyle anlamadan uğraşmayın.

    Yaşadığınız problem lcd.print fonksiyonundadır, bunun hakkındaki açıklamaları incelediniz mi? Girdi parametrelerinin türleri nedir?

    * Yalnış gidiyorsunuz dedim ya, bana kırılmayın, basitçe izah edeyim. Arduino sendromu dediğim bir durum var. Arduino modası rüzgar gibi eserken kendinizi buna bırakıp savrulmak zorunda değilsiniz. Bu esasen bir kod paylaşım sistemidir ve buna gerçekten hakim olmak isterseniz, dışarda esaslarını bağımsız bir şekilde öğrenmeniz gerekir. Önce C öğrenin. Bunu bilgisayarda bilgisayar için yazılım üreterek öğrenin. Çok iyi Türkçe kaynaklar vardır. Kolayca bulup kurabileceğiniz ve hiç baş ağırtan görsel pencerelerle uğraşmadan basitçe komut satırından kullanabileceğiniz açık kaynak kodlu özgür yazılımlarla, mesela GCC ile derlemeyi öğrenin, GDB ile hata gidermeyi öğrenin, çalıştırılabilir dosyanın içeriğini gösterecek araçlar vardır açın bakın sembolleri anlayın. Bunlarla uğraşırken ayrıca donanımı da anlama fırsatı bulacaksınız ki çok şey öğrenirsiniz. Geçer-orta seviye İngilizce varsa daha iyidir, yoksa bir paralel işlem olarak da İngilizce öğrenmeyi başlatın Standart kütüphanelerin kılavuz sayfaları vs için gereklidir.




  • quote:

    Orijinalden alıntı: Liu Kang

    Bu kullandığınız hangi kütüphane, ne ortamında çalışıyorsunuz, hepsi muğlak bunlardan hiç bahsetmemişsiniz. Öyle zannediyorum ki siz henüz başlangıç aşamasındasınız (ve belli ki yalnış gidiyorsunuz*). Daha önce lucky16'nın bahsettiği fonksiyonlar kütüphanede varsa onları kullanın, bu for döngüleriyle anlamadan uğraşmayın.

    Yaşadığınız problem lcd.print fonksiyonundadır, bunun hakkındaki açıklamaları incelediniz mi? Girdi parametrelerinin türleri nedir?

    * Yalnış gidiyorsunuz dedim ya, bana kırılmayın, basitçe izah edeyim. Arduino sendromu dediğim bir durum var. Arduino modası rüzgar gibi eserken kendinizi buna bırakıp savrulmak zorunda değilsiniz. Bu esasen bir kod paylaşım sistemidir ve buna gerçekten hakim olmak isterseniz, dışarda esaslarını bağımsız bir şekilde öğrenmeniz gerekir. Önce C öğrenin. Bunu bilgisayarda bilgisayar için yazılım üreterek öğrenin. Çok iyi Türkçe kaynaklar vardır. Kolayca bulup kurabileceğiniz ve hiç baş ağırtan görsel pencerelerle uğraşmadan basitçe komut satırından kullanabileceğiniz açık kaynak kodlu özgür yazılımlarla, mesela GCC ile derlemeyi öğrenin, GDB ile hata gidermeyi öğrenin, çalıştırılabilir dosyanın içeriğini gösterecek araçlar vardır açın bakın sembolleri anlayın. Bunlarla uğraşırken ayrıca donanımı da anlama fırsatı bulacaksınız ki çok şey öğrenirsiniz. Geçer-orta seviye İngilizce varsa daha iyidir, yoksa bir paralel işlem olarak da İngilizce öğrenmeyi başlatın Standart kütüphanelerin kılavuz sayfaları vs için gereklidir.

    Teşekkür ederim. yardımınız için. Dediğiniz gibi Bu şekilde örnekleme sistemi bana da yanlış gelmeye başladı artık. C yazılım dünyasına baştan başlamak lazım dediğiniz gibi. Ondan sonra C++ diye sürüp gider. ingilizcde bilgim orta düzeyde bu da yeterli gelir muhtemelen . çok fazla terim olduğunu zannetmiyorum . . . Doğru adımdamıyım acaba , C yazılımına başlamak mu yoksa farklı Farklı kodlar mı Gelecek hitap ediyor. Sizce.




  • 
Sayfa: 12
Sayfaya Git
Git
sonraki
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.