Дружба Serial и EEPROM
- Войдите на сайт для отправки комментариев
Сб, 11/03/2017 - 21:04
Доброго времени суток, господа.
Сколько не пытался - не получилось подружить EEPROM и Serial. При отключении Serial порта !НЕ ОТКЛЮЧАЯ САМУ АРДУИНКУ ИЗ КОМПЬЮТЕРА! и подключении заново, все обнуляется и значения выводятся заново. Пробовал и свой скетч и скетч из библиотеки. Не получилось.
Как сделать, чтобы динамическая переменнаяя сохранялась в EEPROM, а после выводилась в Сом порт, и Соотвественно, при отключении питания эта переменная не обнулялась?
Вы знаете, напоминает бессвязный бред. Влияние отключения или включения сериала на епром находится в границах диапазона от "не колышет" до "пох". Давайте как Вы вложите скетч (желательно небольшой) в котором этот эффект проявляется и прокомментируете в чём именно Вы видете его проявления.
#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.
1.По-моему, тут не хватает чтения из еепром при включении.
》нужно чтобы эта переменная записывалась в EEPROM
2. сделано так, что при каждом изменении значение записывается по новому адресу.
3. хорошо бы учесть дребезг кнопок.
если любым способом прерывать общение компьютера и ардуинки(откл. питания, disconnect в приложении), то отсчет начинается заново.
Отключение питания и перезапус монитора порта в данном контексте одно и тоже. И то, и другое приводит к перезегрузке. Т.е. Ваша проблема в том, что при перезагрузке Вы не читаете из EEPROM записанное туда значение, а начинаете всё заново.
Вы понимаете? Значение Вы туда записываете, а читать его оттуда кто будет?
Он учтен, одна кнопка подключена к 13 контакту, а он не дребезжит, т.к. на 13 пине висит светодиод. А вторая кнопка 3-х контактная.
Он учтен, одна кнопка подключена к 13 контакту, а он не дребезжит, т.к. на 13 пине висит светодиод. А вторая кнопка 3-х контактная.
я не знал что светодиоды дребезг кнопки устраняют, блин...
а Клапауций от незнания воще титановый велик изобретал...
Кроме светодиода резистор стоит.
а Клапауций от незнания воще титановый велик изобретал...
[мерзко хихикая, посыпает титановый велик радиоактивным пеплом]
Кроме светодиода резистор стоит.
"У ей в нутре думатель, анализатор и неонка. Думатель думает, анализатор анализирует, а неонка мигает" :)))
Я тут помучался, поизучал статейки. Получил такой говнокод:
#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". Я не понимаю что не так..
Кроме светодиода резистор стоит.
"У ей в нутре думатель, анализатор и неонка. Думатель думает, анализатор анализирует, а неонка мигает" :)))
Эдак светодиод скоро эвристической машиной станет:D
Я тут помучался, поизучал статейки. Получил такой говнокод:
Но проблема не изменилась. При ребуте счет начинается с "0". Я не понимаю что не так..
А чего Вы хотели? Вы ведь по прежнему не читаете из епрома! Формально Вы читаете, но как? Сначала записываете туда новые значения (строки 22-23) и затираете всё, что там было, а потом тут же (стр. 24-25) читаете свежезаписанные данные. И чего толку?
Ну, не думайте об операциях языка, думайте о логике программы, Началась програмаа - так и читайте сразу, прямо в сетапе, чего Вы сначала запишете туда (затрёте то, что там было), а потом читаете зачем-то.
А чего Вы хотели? Вы ведь по прежнему не читаете из епрома! Формально Вы читаете, но как? Сначала записываете туда новые значения (строки 22-23) и затираете всё, что там было, а потом тут же (стр. 24-25) читаете свежезаписанные данные. И чего толку?
Поднял чтение из епрома на самый верх, но получилось вот такое.
Простите. я не понимаю что и куда Вы подняли. Хотите нормальной работы, выкладывайте скетч. Вы место на сервере экономите?
#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 } }Ничего не понимаю. Вы сами понимаете, что Вы делаете? Вот для чего Вы читаете? Что пишете?
Если я правильно понимаю, то Вы записываете туда значение переменной 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); Дождитесь, чтобы что-нибудь записалось, а потом можете раскомментировать и перезапускать - увидите, что считалось ровно то, что записалось.
Спасибо. Разобрался.
Не за что. Видите, всё проще, чем Вам казалось.