EEPROM запись/чтение
- Войдите на сайт для отправки комментариев
Ср, 01/03/2017 - 22:25
проблемы с чтением EEEPROM, может и с записью
В общем :
Скетч использует 27126 байт (88%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 996 байт (48%) динамической памяти, оставляя 1052 байт для локальных переменных. Максимум: 2048 байт
мало места ...
Ужимался где мог, в итоге EEPROM стал лажать почему-то.
Вот что получается при чтении данных (при загрузке контроллера)
time off [0][-] 0
time on [1][-] 0
time dt [2][-] 0
H`% off [3][-] 0
H`% on [4][-] 44
H`% D [5][-] 5
t`C on [6][-] 28
t`C off [7][-] 22
Прикладываю исходник, проблема в void options_get(), void options_put().
#include <U8glib.h>
#include <IRremote.h>
#include <DHT.h>
#include <EEPROM.h>
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); // I2C / TWI
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST); // Fast I2C / TWI
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK); // Display which does not send AC
IRrecv irrecv(2);
decode_results ir_results;
DHT dht(5,DHT11);
byte xs_dialog=0;
#define xs_sTxt 8
char vs[xs_sTxt];
boolean xs_debug;
char xs_inputText[xs_sTxt]={};
char xs_inputCurrent;
byte xs_inputOperation;
byte xs_inputIndex;
byte xs_inputCarret;
boolean xs_inputChanged=false;
byte st_mode;//0[#]-default 1[*]-options 2[0]-debug 255-sleeping
#define xs_c 8
const char* xs_name[xs_c]={"time off","time on","time dt","H`% off","H`% on","H`% D","t`C on","t`C off"};
unsigned int xs_value[xs_c]={};
boolean xs_enable[xs_c]={};
boolean xs_control[5]={};
unsigned long xs_time[3]={};
int xs_selectedItem=0;
int xs_firstView=0;
int xs_count=xs_c-1;
const int xs_countView=4;
int i,ii,fh,iy;
byte ve=0;
#define xs_pinBuzz 4
boolean xs_buzz=false;
#define xs_pinRelay 3
boolean xs_relayOut=false;
boolean xs_relayCtr=true;
boolean xs_relayMan=false;
void draw(float t, float h) {
u8g.setColorIndex(1);
if(st_mode==0){ //default
if(xs_inputChanged){options_put();xs_inputChanged=false;}
u8g.setFont(u8g_font_fur49n);
u8g.setFontPosTop();
dtostrf(t,2,0,vs);
u8g.drawStr(4,6,vs);
u8g.drawFrame(90,0,38,64);
fh=map(h,0,100,0,62);
u8g.drawBox(92,62-fh,34,fh);
u8g.setFont(u8g_font_profont29r);
u8g.setFontPosTop();
dtostrf(h,2,0,vs);
if(h>52){
u8g.setColorIndex(0);
u8g.drawStr(94,36,vs);
}else{
u8g.drawStr(94,0,vs);
}
}else if(st_mode==1){ //options
if(xs_selectedItem>xs_count){xs_selectedItem=0;xs_firstView=0;}
if(xs_selectedItem<0){xs_selectedItem=xs_count;xs_firstView=xs_count-4;}
if(xs_selectedItem>=(xs_firstView+xs_countView)){xs_firstView++;}
if(xs_selectedItem<xs_firstView){xs_firstView--;}
fh=u8g.getHeight()/xs_countView;
ii=xs_firstView;
for(i=0;i<=xs_countView-1;i++){
if(ii>xs_count){ii=0;}
iy=i*(fh+1);
if(ii==xs_selectedItem){u8g.drawBox(0,iy,2,fh);}
u8g.setFont(u8g_font_profont15r);
u8g.setFontPosTop();
u8g.drawStr(3,iy,xs_name[ii]);
dtostrf(xs_value[ii],4,0,vs);
u8g.drawStr(70,iy,vs);
u8g.drawFrame(110,iy+1,fh-4,fh-4);
if(xs_enable[ii]){u8g.drawBox(114,iy+5,fh-12,fh-12);}
ii++;
}
}else if(st_mode==2){ //edit
u8g.setFont(u8g_font_profont15r);
u8g.setFontPosTop();
u8g.drawStr(12,4,xs_name[xs_inputIndex]);
u8g.drawHLine(4,22,80);
dtostrf(xs_value[xs_inputIndex],8,0,vs);
u8g.drawStr(1,28,"OLD:");
u8g.drawStr(18,28,vs);
u8g.drawStr(1,48,"NEW:");
u8g.drawStr(48,48,xs_inputText);
if((xs_inputOperation==0)&&(xs_inputCurrent!='\0')&&(xs_inputCarret<xs_sTxt)){
xs_inputText[xs_inputCarret]=xs_inputCurrent;
xs_inputCarret++;
xs_inputCurrent='\0';
xs_inputOperation=0;
}//input0..9
else if(xs_inputOperation==3){
xs_inputCarret--;
xs_inputText[xs_inputCarret]='\0';
xs_inputOperation=0;
}//backspace
else if(xs_inputOperation==2||xs_inputOperation==1){
if(xs_inputOperation==1){xs_value[xs_inputIndex]=atoi(xs_inputText);}
input_reset();
st_mode=1;
}//cancel/save
if(xs_inputCarret<0){xs_inputCarret=0;}
}else if(st_mode==255){ //sleeping on/off
}else{st_mode=0;} //reset
}
void input_reset(){
xs_inputOperation=0;
xs_inputIndex=0;
xs_inputCarret=0;
memset(&xs_inputCurrent,0,1);
memset(&xs_inputText,0,xs_sTxt);
}
void options_put(){
for(i=0;i<=xs_count;i++){EEPROM.put(i*2,xs_value[i]);}
ve=0;
for(ii=0;ii<=8;ii++){bitWrite(ve,ii,xs_enable[ii]);}
EEPROM.write((i+2)*2,ve);
}
void options_get(){
for(i=0;i<=xs_count;i++){EEPROM.get(i*2,xs_value[i]);}
ve=EEPROM.read((i+2)*2);
for(ii=0;ii<=8;ii++){xs_enable[ii]=bitRead(ve,ii);}
}
void menu_update(){
if(ir_results.value==0x511DBB || ir_results.value==0xFF629D ){xs_selectedItem--;xs_buzz=true;}//#up
if(ir_results.value==0xFFA857 || ir_results.value==0xA3C8EDDB){xs_selectedItem++;xs_buzz=true;}//#down
if(ir_results.value==0xFF02FD || ir_results.value==0xD7E84B1B){st_mode=2;xs_inputIndex=xs_selectedItem;xs_inputChanged=true;xs_buzz=true;}//#ok"edit"
if(ir_results.value==0xFFC23D || ir_results.value==0x20FE4DBB){xs_enable[xs_selectedItem]=!xs_enable[xs_selectedItem];xs_inputChanged=true;xs_buzz=true;}//#right "use it"
if(ir_results.value==0xFF52AD || ir_results.value==0x3EC3FC1B){st_mode=0;xs_buzz=true;}//##"default"
}
void input_update(){
if(ir_results.value==0xFF4AB5 || ir_results.value==0x1BC0157B){xs_inputCurrent='0';}//#0
else if(ir_results.value==0xFF6897 || ir_results.value==0xC101E57B){xs_inputCurrent='1';}//#1
else if(ir_results.value==0xFF9867 || ir_results.value==0x97483BFB){xs_inputCurrent='2';}//#2
else if(ir_results.value==0xFFB04F || ir_results.value==0xF0C41643){xs_inputCurrent='3';}//#3
else if(ir_results.value==0xFF30CF || ir_results.value==0x9716BE3F){xs_inputCurrent='4';}//#4
else if(ir_results.value==0xFF18E7 || ir_results.value==0x3D9AE3F7){xs_inputCurrent='5';}//#5
else if(ir_results.value==0xFF7A85 || ir_results.value==0x6182021B){xs_inputCurrent='6';}//#6
else if(ir_results.value==0xFF10EF || ir_results.value==0x8C22657B){xs_inputCurrent='7';}//#7
else if(ir_results.value==0xFF38C7 || ir_results.value==0x488F3CBB){xs_inputCurrent='8';}//#8
else if(ir_results.value==0xFF5AA5 || ir_results.value==0x449E79F){xs_inputCurrent='9';}//#9
else{xs_inputCurrent='\0';}
if(ir_results.value==0xFF02FD || ir_results.value==0xD7E84B1B){xs_inputOperation=1;xs_buzz=true;}//#ok
else if(ir_results.value==0xFF52AD || ir_results.value==0x3EC3FC1B){xs_inputOperation=2;xs_buzz=true;}//##"cancel"
else if(ir_results.value==0xFF22DD || ir_results.value==0x52A3D41F){xs_inputOperation=3;}//#left"backspace"
else{xs_inputOperation=0;}
}
void state_update(){
if(ir_results.value==0xFF42BD || ir_results.value==0x32C6FDF7){st_mode=1;}//*"options"
else if(ir_results.value==0xFF52AD || ir_results.value==0x3EC3FC1B){xs_debug=!xs_debug;}//##"debug"
else if(ir_results.value==0xFF4AB5 || ir_results.value==0x1BC0157B){xs_relayMan=!xs_relayMan;xs_relayCtr=true;}//#0"close relay"
}
void dialog_update(){
if(Serial.available()>0){
xs_dialog=Serial.read();
if(xs_dialog==49){
Serial.println("Dialog 1");
for(i=0;i<=xs_count;i++){
Serial.print(xs_name[i]);
Serial.print(" \t[");
Serial.print(i,DEC);
Serial.print(xs_enable[i]?"][+] ":"][-] ");
Serial.println(xs_value[i],DEC);
}
xs_dialog=0;
}
}
}
void relay_control(int h,int t){
if(xs_enable[0]&&xs_enable[1]){
if((((millis()-xs_time[0])/1000)>xs_value[0])&&(!xs_control[0])){
xs_relayCtr=true;
xs_control[0]=true;
xs_time[0]=millis();
if(xs_debug){
Serial.print("time on: ");
Serial.println(millis()-xs_time[0],DEC);
}
}else if((((millis()-xs_time[0])/1000)>xs_value[1])&&(xs_control[0])){
xs_relayCtr=true;
xs_control[0]=false;
xs_time[0]=millis();
if(xs_debug){
Serial.print("time off: ");
Serial.println(millis()-xs_time[0],DEC);
}
}
}else{xs_control[0]=false;}//time on/off
if(xs_enable[3]&&xs_enable[4]){
if(xs_control[1]&&(h<xs_value[3])){//H% off
xs_relayCtr=true;
xs_control[1]=false;
xs_control[2]=true;
Serial.println("control-4On");
xs_time[1]=millis();
}else if(!xs_control[1]&&(h>xs_value[4])){//H% on
xs_relayCtr=true;
xs_control[1]=true;
Serial.println("control-3On");
}
if(xs_control[2]&&xs_enable[2]){
if(((millis()-xs_time[1])/1000)>xs_value[2]){
xs_relayCtr=true;xs_control[2]=false;
Serial.println("control-4Off");}
}
}else{xs_control[1]=xs_control[2]=false;}//H`% on/off"
if(xs_enable[6]&&xs_enable[7]){
if(xs_control[3]&&(t>xs_value[6])){//t`C off
xs_relayCtr=true;
xs_control[3]=false;
xs_control[4]=true;
Serial.println("control-7On");
xs_time[2]=millis();
}else if(!xs_control[3]&&(t<xs_value[7])){//H% on
xs_relayCtr=true;
xs_control[3]=true;
Serial.println("control-6On");
}
if(xs_control[4]&&xs_enable[2]){
if(((millis()-xs_time[2])/1000)>xs_value[2]){
xs_relayCtr=true;xs_control[4]=false;
Serial.println("control-7Off");}
}
}else{xs_control[3]=xs_control[4]=false;}//"t`C on/off
xs_relayOut=xs_control[0]||xs_control[1]||xs_control[3]||xs_relayMan;
if(xs_relayCtr){
if(xs_relayOut){
digitalWrite(xs_pinRelay,HIGH);
Serial.println("relay open");
}else{
digitalWrite(xs_pinRelay,LOW);
Serial.println("relay close");
}
xs_relayCtr=false;
}
}
void time_update(){
for(i=0;i<xs_c;i++){xs_time[i]=0;xs_control[i]=false;}
}
void setup() {
pinMode(xs_pinBuzz,OUTPUT);
pinMode(xs_pinRelay,OUTPUT);
irrecv.enableIRIn();
Serial.begin(9600);
dht.begin();
xs_count=xs_c-1;
options_get();
input_reset();
time_update();
}
void loop() {
float dht11_h=dht.readHumidity();
float dht11_t=dht.readTemperature();
relay_control(dht11_h,dht11_t);//control relay output
dialog_update();
if(irrecv.decode(&ir_results)){//pult
if(st_mode==1){menu_update();}
else if(st_mode==2){input_update();}
else{state_update();}
irrecv.resume();
}
u8g.firstPage();do{draw(dht11_t,dht11_h);}while(u8g.nextPage());
if(xs_buzz){tone(xs_pinBuzz,900);}
delay(50);
if(xs_buzz){noTone(xs_pinBuzz);xs_buzz=false;}
}
можно как то ужать u8glib. Пробовал удалять неиспользуемые шрифты, не помогло ?
На всякий случай: по дэйташиту при записи данных в EEPROM на границе страниц необходимо выдержать паузу 5 мс.
может мне 5мс писать одно и то же в одно и то же место EEPROM , а вдруг запишется, либо писать 10 раз с задержкой в 50
На каком программаторе прошиваете arduino nano atm328 (AliExpress) и на каком лучше?
Пробовал на AVR (медленно), на Arduino побыстрей.
На каком программаторе прошиваете arduino nano atm328 (AliExpress) и на каком лучше?
Пробовал на AVR (медленно), на Arduino побыстрей.
))))))
на швейной машинке побыстрей
Вот что получается при чтении данных (при загрузке контроллера)
time off [0][-] 0
time on [1][-] 0
time dt [2][-] 0
H`% off [3][-] 0
H`% on [4][-] 44
H`% D [5][-] 5
t`C on [6][-] 28
t`C off [7][-] 22
Непонятно 1) где это получается (где Вы это выводите), а также непонятно, 2) что должно получаться.
проблема в void options_get(), void options_put().
Если Вы так считаете, то сделайте следующее (совет общий и пригодится всегда, а не только в этой ситуации):
1) поставьте печать в функции сохранения EEPROM
2) поставьте печать в функции чтения из EEPROM
Вы увидите что сохраняете и что что читаете. И сразу станет понятно где проблема - в сохранении/чтении или ещё где. Так Вы за несколько шагов локализуете проблему.
Сделайте это и, если сразу не поймёте в чём беда, то выкладывайте скетч с печатаями и результат печатей - будем смотреть.
Пробовал на AVR (медленно), на Arduino побыстрей.
Открою страшную тайну - Ардуино это и есть AVR. Самый распространённый недорогой программатор - USBasp, тоже на AVR.
Непонятно 1) где это получается (где Вы это выводите), а также непонятно, 2) что должно получаться.
то что вы видите это и есть после чтения из EEPROM.
1) поставьте печать в функции сохранения EEPROM
2) поставьте печать в функции чтения из EEPROM
делал и то и другое, отличие заключается в том что нулей не должно быть, а минусы в скобках это массив boolean, который тоже не должен быть пустым
Открою страшную тайну - Ардуино это и есть AVR. Самый распространённый недорогой программатор - USBasp, тоже на AVR.
Ну к сожалению при переполнении отметки 90% памяти дисплей страшно глючит визуально - полосы искажения (библиотека u8glib), я подумал это из-за программатора, тк 90% это не 99%
На каком программаторе прошиваете arduino nano atm328 (AliExpress) и на каком лучше?
Пробовал на AVR (медленно), на Arduino побыстрей.
я имел ввиду программтор в ide arduino редакторе , разница то есть наверно какя-то, незря их там столько ?!
я подумал это из-за программатора, тк 90% это не 99%
Неправильно подумал, это не из-за программатора. Программатор никаким боком не влияет на программу. Он всего лишь загружает эту программу в память микроконтроллера.
я имел ввиду программтор в ide arduino редакторе , разница то есть наверно какя-то, незря их там столько ?!
Нет никакой разницы, каким программатором загружать программу в микроконтроллер.
Более того, Вы точно прошиваете программатором? (что-то у меня есть сомнения...) Или просто подключаете Arduino NANO в USB-порт компьютера? Тогда выбирать программатор в Arduino IDE вообще бессмысленно, т.к. эта настройка работает только тогда, когда Ардуина прошивается с помощью настоящего "железного" программатора.
то что вы видите это и есть после чтения из EEPROM.
Я не вижу где это печатается.
делал и то и другое, отличие заключается в том что нулей не должно быть, а минусы в скобках это массив boolean, который тоже не должен быть пустым
Я не знаю о чём Вы говорите. Дайте пожалуйста код с операторами печати о которых я говорид и текст, который он печатает. Без этого Вам помочь крайне трудно.
Если по каким-то причинам не хотите - дело Ваше.
то что вы видите это и есть после чтения из EEPROM.
Я не вижу где это печатается.
делал и то и другое, отличие заключается в том что нулей не должно быть, а минусы в скобках это массив boolean, который тоже не должен быть пустым
Я не знаю о чём Вы говорите. Дайте пожалуйста код с операторами печати о которых я говорид и текст, который он печатает. Без этого Вам помочь крайне трудно.
Если по каким-то причинам не хотите - дело Ваше.
так обойдусь...
Удачи!
Del