Arama butonu
Bu konudaki kullanıcılar: 1 misafir
26
Cevap
3701
Tıklama
0
Öne Çıkarma
FLOAT Değişkenini EEPROM a aktarma.
P
9 yıl
Teğmen
Konu Sahibi

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

DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.

Üye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.

Üye Ol Şimdi Değil



L
9 yıl
Binbaşı

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 >
Bu mesaja 2 cevap geldi.
P
9 yıl
Teğmen
Konu Sahibi

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ı >

P
9 yıl
Teğmen
Konu Sahibi

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



K
9 yıl
Er

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 >

L
9 yıl
Teğmen

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ı >
Bu mesaja 3 cevap geldi.
P
9 yıl
Teğmen
Konu Sahibi

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ı >

P
9 yıl
Teğmen
Konu Sahibi

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



M
9 yıl
Binbaşı

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 >
Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @prax
P
9 yıl
Teğmen
Konu Sahibi

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 >

P
9 yıl
Teğmen
Konu Sahibi

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.



L
9 yıl
Teğmen

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ı >
Bu mesaja 2 cevap geldi.
P
9 yıl
Teğmen
Konu Sahibi

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ı >

P
9 yıl
Teğmen
Konu Sahibi

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);



L
9 yıl
Teğmen

İkinci kisimda & isaretinden sonra bosluk koymayin.



< Bu ileti mobil sürüm kullanılarak atıldı >
Bu mesaja 1 cevap geldi.
G
9 yıl
Binbaşı

 
#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 >
Bu mesaja 1 cevap geldi.
P
9 yıl
Teğmen
Konu Sahibi

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 >
Bu mesaja 2 cevap geldi.
G
9 yıl
Binbaşı

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.



L
9 yıl
Binbaşı

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.


Bu mesaja 1 cevap geldi.
P
9 yıl
Teğmen
Konu Sahibi

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.


Bu mesaja 1 cevap geldi.