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;
// 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;
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();
} 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;