Помогите со скетчом
- Войдите на сайт для отправки комментариев
Пнд, 05/09/2022 - 15:06
Здравствуйте форумчане. Помогите пожалуйста разобраться со скетчом, никак не пойму что идет не так?! глаза уже болят!!!! Делаю 1 раз что то идет не так....
суть проблемы:
программа должна реагировать на нажатие Pin1, pin2 GHB, прибавлением +5 к счетчику и записать значение в память, при аварийном отключении возобновить работу с последнего значения, а она обнуляется после перезагрузки... помогите!!!
Помогите пожалуйста разобраться со скетчом, никак не пойму что идет не так?! глаза уже болят!!!!
чтобы и у тех, кто вам будет помогать, тоже глаза не заболели - первым делом вставьте код по правилам форума, оформив его соответвующим тегом
1. Вычитывать значение переменных нужно в блоке setup() один раз при включении, а дальше уже работать с полученными значениями
2. Зачем в бесконечном цикле (функции loop() - почитайте перевод этого слова) еще один бесконечный цикл? "Утка в яйце, кощей на игле!" ))))))
3. Если использовать такие большие делеи (аж в одну секунду) - ни к чему хорошему это не приведет. Зачем "оно"?
4. В строке № ХЗ (вставьте код по правилам форума) вместо значения переменной "ves" вы записываете в энергонезависимую память НОЛЬ
Пока это все, что "в глаза бросилось"...
Пока это все, что "в глаза бросилось"...
"на третий день глаз станет потихоньку открываться" )))
А чего тебе в глаза не бросилось, что под переменные типа int в eeprom выделено аж по цельному байту ?
Так на то оно и «первое что в глаза бросилось», я не вчитывался... ))))
У меня первое что бросилось "со скетчом"... И уже всё. Нах-нах.)
У меня первое что бросилось "со скетчом"... И уже всё. Нах-нах.)
Ну да, но я на это глаза закрыл )))) Безграмотных во времена егэ пруд пруди...(
Ну а о чём можно говорить, когда без грамматических ошибок написать название темы не могут, когда исходный текст вставить не могут... Ну это же полный ЕГЭ!( "И польный писюнь вода.")
#include <Wire.h> // библиотека для управления по I2C #include <LCD_1602_RUS.h> // подключаем трафик LCD_1602_RUS #include <EEPROM.h> // подключаем трафик памяти LCD_1602_RUS lcd_1(0x27,16,2); // усваиваем имя LCD для дисплея инт вес; // переменная вес время; // переменная цикл недействительная установка () { lcd_1.init(); // инициализация LCD дисплея lcd_1.backlight(); // включение подсветки дисплея lcd_1.setCursor(0, 0); // ставим курсор на 1 символ первой строки lcd_1.print("ООО МЕГА СЕРВИС"); // печатаем сообщение по итогам первой задержка(1000); // Ждем 1000 миллисекунд(ы) lcd_1.clear(); pinMode(1, ВВОД); // объявляем пин 1 как вход pinMode(2, ВВОД); // пин 2 как вход lcd_1.setCursor(0, 0); lcd_1.print("ВЕС"); lcd_1.setCursor(8, 0); lcd_1.print("ЦИКЛ"); EEPROM.get(0, вес); // прочитали значение из адреса 0 EEPROM.get(1, время); // прочитали значение из адреса 1 } пустой цикл () { если (digitalRead(1) == ВЫСОКИЙ) вес=(вес+5); задержка(500); lcd_1.setCursor(0, 1); lcd_1.print(вес); если (вес>=50) вес=10; EEPROM.put(0, вес); // записал значение в адрес 0 если (digitalRead(2) == ВЫСОКИЙ) время=(время+1); задержка(500); lcd_1.setCursor(8, 1); lcd_1.print(время); если (время>=50) время=10; EEPROM.put(1, время); // записал значение в адрес 1 задержка (10); // Небольшая задержка для улучшения производительности симуляции }Спасибо, что подсказываете, я не специалист в программировании. Все равно после 2-3 отключений на 0 скидывается, что я делаю не так?
Вроде получилось! спасибо! #include <Wire.h> // библиотека для управления устройствами по I2C #include <LCD_1602_RUS.h> // подключаем библиотеку LCD_1602_RUS #include <EEPROM.h> // подключаем библиотеку памяти LCD_1602_RUS lcd_1(0x27,16,2); // присваиваем имя LCD для дисплея int ves; // переменная вес int time; // переменная цикл void setup() { lcd_1.init(); // инициализация LCD дисплея lcd_1.backlight(); // включение подсветки дисплея lcd_1.setCursor(0, 0); // ставим курсор на 1 символ первой строки lcd_1.print("ООО МЕГА СЕРВИС"); // печатаем сообщение на первой строке delay(1000); // Wait for 1000 millisecond(s) lcd_1.clear(); pinMode(1, INPUT); // объявляем пин 1 как вход pinMode(2, INPUT); // пин 2 как вход lcd_1.setCursor(0, 0); lcd_1.print("ВЕС"); lcd_1.setCursor(8, 0); lcd_1.print("ЦИКЛ"); ves=EEPROM[0]; // прочитали значение из адреса 0 time=EEPROM[1]; // прочитали значение из адреса 1 } void loop() { if (digitalRead(1) == HIGH) ves=(ves+5); delay(500); lcd_1.setCursor(0, 1); lcd_1.print(ves); if (ves>=50) ves=10; EEPROM.put(0, ves); // записали значение в адрес 0 if (digitalRead(2) == HIGH) time=(time+1); delay(500); lcd_1.setCursor(8, 1); lcd_1.print(time); if (time>=50) time=10; EEPROM.put(1, time); // записали значение в адрес 1 delay(10); // Delay a little bit to improve simulation performance }А не должно было получиться... Второе записываемое в EEPROM число сейчас всегда портит первое. У Вас каждое записываемое значение имеет тип int (2 байта). Второе число надо не в адрес 1, а в адрес 2 писать.
Отчего то, все любят использовать EEPROM.h, тогда как для многих случаев есть "штатные" и более удобные средства в рамках avr-libc. Очевидно, по незнанию.( В eeprom libc не нужно следить за адресацией, EEMEM об этом заботится. Ну и типы данных явно указываются при обращении к функциям eeprom. А это уменьшает кол-во ошибок, подобных этой.
Считаю, что, коль Ардуино автоматом использует libc, то и разработчикам как то нужно было бы акцентировать на её (libc) функциях.
UPD. А то получается функционал libc то мы используем (автоматом), а вот откуда оно берётся - ХЗ. Непорядок.)
А не должно было получиться... Второе записываемое в EEPROM число сейчас всегда портит первое. У Вас каждое записываемое значение имеет тип int (2 байта). Второе число надо не в адрес 1, а в адрес 2 писать.
Спасибо, исправил