Şimdi Ara

Cevap: FLOAT Değişkenini EEPROM a aktarma.

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir (1 Mobil) - 1 Masaüstü1 Mobil
5 sn
1
Cevap
0
Favori
441
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • 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);
    }








  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
    
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.