Дружба Serial и EEPROM

Lui22
Offline
Зарегистрирован: 07.03.2016

Доброго времени суток, господа.

Сколько не пытался - не получилось подружить EEPROM и Serial. При отключении Serial порта !НЕ ОТКЛЮЧАЯ САМУ АРДУИНКУ ИЗ КОМПЬЮТЕРА! и подключении заново, все обнуляется и значения выводятся заново. Пробовал и свой скетч и скетч из библиотеки. Не получилось.

Как сделать, чтобы динамическая переменнаяя сохранялась в EEPROM, а после выводилась в Сом порт, и Соотвественно, при отключении питания эта переменная не обнулялась?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы знаете, напоминает бессвязный бред. Влияние отключения или включения сериала на епром находится в границах диапазона от "не колышет" до "пох". Давайте как Вы вложите скетч (желательно небольшой) в котором этот эффект проявляется и прокомментируете в чём именно Вы видете его проявления.

Lui22
Offline
Зарегистрирован: 07.03.2016
#include <EEPROM.h>

uint16_t startAddr = 0; // стартовый адрес в EEPROM 

int money = 0; //переменная кол-ва денег
int money_old = 0; //переменная старого кол-ва денег
const int buttonPin1 = 13; // порт 1 кнопки
const int buttonPin5 = 2; // порт 2 кнопки
const int buttonPin0 = 12; // порт защиты
int buttonState1 = 0; // статус 1 кнопки    
int buttonState5 = 0; // статус 2 кнопки 
int buttonState0 = 0; // статус защиты    
   
void setup() {
  pinMode(buttonPin1, INPUT); // инициализация 1 кнопки
  pinMode(buttonPin5, INPUT); // инициализация 2 кнопки
  pinMode(buttonPin0, INPUT); // инициализация защиты
  Serial.begin (9600);
}

void loop() {
  if (money_old != money) { //печать только при изменении
      Serial.println(money); // вывод перменной
      delay (100);
      /* Запись в EEPROM */
      EEPROM.put(startAddr, money_old);
      startAddr += sizeof(money_old);
      /*                 */
      money_old = money; 
  }
  delay (200);
  buttonState1 = digitalRead(buttonPin1); // читаем положение 1 кнопки
  buttonState5 = digitalRead(buttonPin5); // читаем положение 2 кнопки
  buttonState0 = digitalRead(buttonPin0); // читаем положение защиты

  if (buttonState1 == HIGH) { //если 1 кнопка нажата,
    money += 10; // то переменная + 10
  }
  if ( buttonState5 && !buttonState0 ) {
      money += 50; // то переменная + 50
 }
}

Вот дали мне такой код (переделанный из моего). Но если любым способом прерывать общение компьютера и ардуинки(откл. питания, disconnect в приложении), то отсчет начинается заново.

Смысл скетча: нажимаешь на одну кнопку, то добавляется 10 к переменной money, нажимаешь на другую - добавляется 50 к переменной.

Нужно так, чтобы эта переменная записывалась в EEPROM и выводилась в Serial. Соотвественно - при отключении питания возобновлялся счет переменной. Тоесть если переменная была равна 100 при отключении, то после включения она опять должна быть равна 100.

toc
Offline
Зарегистрирован: 09.02.2013

1.По-моему, тут не хватает чтения из еепром при включении.

》нужно чтобы эта переменная записывалась в EEPROM
2. сделано так, что при каждом изменении значение записывается по новому адресу.

3. хорошо бы учесть дребезг кнопок.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Lui22 пишет:

если любым способом прерывать общение компьютера и ардуинки(откл. питания, disconnect в приложении), то отсчет начинается заново.

Отключение питания и перезапус монитора порта в данном контексте одно и тоже. И то, и другое приводит к перезегрузке. Т.е. Ваша проблема в том, что при перезагрузке Вы не читаете из EEPROM записанное туда значение, а начинаете всё заново.

Вы понимаете? Значение Вы туда записываете, а читать его оттуда кто будет?

Lui22
Offline
Зарегистрирован: 07.03.2016

toc пишет:
3. хорошо бы учесть дребезг кнопок.

Он учтен, одна кнопка подключена к 13 контакту, а он не дребезжит, т.к. на 13 пине висит светодиод. А вторая кнопка 3-х контактная.

vvadim
Offline
Зарегистрирован: 23.05.2012

Lui22 пишет:

toc пишет:
3. хорошо бы учесть дребезг кнопок.

Он учтен, одна кнопка подключена к 13 контакту, а он не дребезжит, т.к. на 13 пине висит светодиод. А вторая кнопка 3-х контактная.

я не знал что светодиоды дребезг кнопки устраняют, блин...

а Клапауций от незнания воще титановый велик изобретал...

Lui22
Offline
Зарегистрирован: 07.03.2016

Кроме светодиода резистор стоит.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

vvadim пишет:

а Клапауций от незнания воще титановый велик изобретал...

[мерзко хихикая, посыпает титановый велик радиоактивным пеплом]

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Lui22 пишет:

Кроме светодиода резистор стоит.

"У ей в нутре думатель, анализатор и неонка. Думатель думает, анализатор анализирует, а неонка мигает" :)))

Lui22
Offline
Зарегистрирован: 07.03.2016

Я тут помучался, поизучал статейки. Получил такой говнокод:

#include <EEPROM.h>
int value0 = 0;
int value1 = 0;
int money = 0; //переменная кол-ва денег
int money_old = 0; //переменная старого кол-ва денег
const int buttonPin1 = 13; // порт 1 кнопки
const int buttonPin5 = 2; // порт 2 кнопки
const int buttonPin0 = 12; // порт защиты
int buttonState1 = 0; // статус 1 кнопки    
int buttonState5 = 0; // статус 2 кнопки 
int buttonState0 = 0; // статус защиты    
void setup() {
  pinMode(buttonPin1, INPUT); // инициализация 1 кнопки
  pinMode(buttonPin5, INPUT); // инициализация 2 кнопки
  pinMode(buttonPin0, INPUT); // инициализация защиты
  Serial.begin (9600);
}
void loop() {
  if (money_old != money) { //печать только при изменении
      byte hi = highByte(money); // старший байт
      byte low = lowByte(money); // младший байт
      EEPROM.write(1, hi);  // записываем в ячейку 1 старший байт
      EEPROM.write(2, low); // записываем в ячейку 2 младший байт
      value0 = EEPROM.read(1);
      value1 = EEPROM.read(2);
      int value = word(value0, value1);
      Serial.println(value); // вывод перменной
      delay (100);
      money_old = money; 
  }
  delay (200);
  buttonState1 = digitalRead(buttonPin1); // читаем положение 1 кнопки
  buttonState5 = digitalRead(buttonPin5); // читаем положение 2 кнопки
  buttonState0 = digitalRead(buttonPin0); // читаем положение защиты
  if (buttonState1 == HIGH) { //если 1 кнопка нажата,
    money += 10; // то переменная + 10
  }
  if ( buttonState5 && !buttonState0 ) {
      money += 50; // то переменная + 50
  }
}

Но проблема не изменилась. При ребуте счет начинается с "0". Я не понимаю что не так..

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

ЕвгенийП пишет:

Lui22 пишет:

Кроме светодиода резистор стоит.

"У ей в нутре думатель, анализатор и неонка. Думатель думает, анализатор анализирует, а неонка мигает" :)))

Эдак светодиод скоро эвристической машиной станет:D

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Lui22 пишет:

Я тут помучался, поизучал статейки. Получил такой говнокод:

Но проблема не изменилась. При ребуте счет начинается с "0". Я не понимаю что не так..

А чего Вы хотели? Вы ведь по прежнему не читаете из епрома! Формально Вы читаете, но как? Сначала записываете туда новые значения (строки 22-23) и затираете всё, что там было, а потом тут же (стр. 24-25) читаете свежезаписанные данные. И чего толку?

Ну, не думайте об операциях языка, думайте о логике программы, Началась програмаа - так и читайте сразу, прямо в сетапе, чего Вы сначала запишете туда (затрёте то, что там было), а потом читаете зачем-то.

Lui22
Offline
Зарегистрирован: 07.03.2016

ЕвгенийП пишет:

А чего Вы хотели? Вы ведь по прежнему не читаете из епрома! Формально Вы читаете, но как? Сначала записываете туда новые значения (строки 22-23) и затираете всё, что там было, а потом тут же (стр. 24-25) читаете свежезаписанные данные. И чего толку?

Поднял чтение из епрома на самый верх, но получилось вот такое.

(данные из монитора сом порта)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Простите. я не понимаю что и куда Вы подняли. Хотите нормальной работы, выкладывайте скетч. Вы место на сервере экономите?

Lui22
Offline
Зарегистрирован: 07.03.2016
#include <EEPROM.h>
int value0 = 0;
int value1 = 0;
int money = 0; //переменная кол-ва денег
int money_old = 0; //переменная старого кол-ва денег
const int buttonPin1 = 13; // порт 1 кнопки
const int buttonPin5 = 2; // порт 2 кнопки
const int buttonPin0 = 12; // порт защиты
int buttonState1 = 0; // статус 1 кнопки    
int buttonState5 = 0; // статус 2 кнопки 
int buttonState0 = 0; // статус защиты    
void setup() {
  pinMode(buttonPin1, INPUT); // инициализация 1 кнопки
  pinMode(buttonPin5, INPUT); // инициализация 2 кнопки
  pinMode(buttonPin0, INPUT); // инициализация защиты
  Serial.begin (9600);
}
void loop() {
  if (money_old != money) { //печать только при изменении
      value0 = EEPROM.read(1);
      value1 = EEPROM.read(2);
      int value = word(value0, value1);
      Serial.println(value); // вывод перменной
      byte hi = highByte(money); // старший байт
      byte low = lowByte(money); // младший байт
      EEPROM.write(1, hi);  // записываем в ячейку 1 старший байт
      EEPROM.write(2, low); // записываем в ячейку 2 младший байт
      delay (100);
      money_old = money; 
  }
  delay (200);
  buttonState1 = digitalRead(buttonPin1); // читаем положение 1 кнопки
  buttonState5 = digitalRead(buttonPin5); // читаем положение 2 кнопки
  buttonState0 = digitalRead(buttonPin0); // читаем положение защиты
  if (buttonState1 == HIGH) { //если 1 кнопка нажата,
    money += 10; // то переменная + 10
  }
  if ( buttonState5 && !buttonState0 ) {
      money += 50; // то переменная + 50
  }
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ничего не понимаю. Вы сами понимаете, что Вы делаете? Вот для чего Вы читаете? Что пишете?

Если я правильно понимаю, то Вы записываете туда значение переменной money? Так? И при это Вы хотите, чтобы при старте программы после перезагрузки у Вас переменные money money_old (обе) были равны тому. что в последний раз записалось, а не 0.

Всё правильно?

Ну так и делайте именно это, чего Вы мудрите-то?

1. Строки 2, 3, 20-27 выбрасываете нафиг.

После строки 16 вставляеете строку чтения money  и присваивания money_old 

EEPROM.get(1, money);
money_old = money;
Serial.print("In setup(): money=");
Serial.println(money);

Вместо строк 20-27 вставляете запись Вашей money в EEPROM

EEPROM.put(1, money);
Serial.print("WRITTEN: money=");
Serial.println(money);

Вот и всё, если я правильно понял чего Вы хотите.

Сейчас там у Вас (в епроме) может быть всё, что угодно, поэтому при первом запуске EEPROM.get(1, money); Дождитесь, чтобы что-нибудь записалось, а потом можете раскомментировать и перезапускать - увидите, что считалось ровно то, что записалось.

Lui22
Offline
Зарегистрирован: 07.03.2016

Спасибо. Разобрался.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не за что. Видите, всё проще, чем Вам казалось.