Помогите со скетчом

Wagaz
Offline
Зарегистрирован: 02.09.2022

Здравствуйте форумчане. Помогите пожалуйста разобраться со скетчом, никак не пойму что идет не так?! глаза уже болят!!!! Делаю 1 раз что то идет не так....

суть проблемы:

программа должна реагировать на нажатие Pin1, pin2 GHB,  прибавлением +5 к счетчику и записать значение в память, при аварийном отключении возобновить работу с последнего значения, а она обнуляется после перезагрузки... помогите!!!

 
 
 
 
            
 
 
 
b707
Offline
Зарегистрирован: 26.05.2017

Wagaz пишет:

Помогите пожалуйста разобраться со скетчом, никак не пойму что идет не так?! глаза уже болят!!!!

чтобы и у тех, кто вам будет помогать, тоже глаза не заболели - первым делом вставьте код по правилам форума, оформив его соответвующим тегом

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

1. Вычитывать значение переменных нужно в блоке setup() один раз при включении, а дальше уже работать с полученными значениями

2. Зачем в бесконечном цикле (функции loop() - почитайте перевод этого слова) еще один бесконечный цикл? "Утка в яйце, кощей на игле!" ))))))

3. Если использовать такие большие делеи (аж в одну секунду) - ни к чему хорошему это не приведет. Зачем "оно"?

4. В строке № ХЗ (вставьте код по правилам форума) вместо значения переменной "ves" вы записываете в энергонезависимую память НОЛЬ

Пока это все, что "в глаза бросилось"...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

BOOM пишет:

Пока это все, что "в глаза бросилось"...

"на третий день глаз станет потихоньку открываться" )))

Kakmyc
Offline
Зарегистрирован: 15.01.2018

А чего тебе в глаза не бросилось, что под переменные типа int в eeprom выделено аж по цельному байту ?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Kakmyc пишет:
А чего тебе в глаза не бросилось, что под переменные типа int в eeprom выделено аж по цельному байту ?

Так на то оно и «первое что в глаза бросилось», я не вчитывался... ))))

Green
Offline
Зарегистрирован: 01.10.2015

У меня первое что бросилось "со скетчом"... И уже всё. Нах-нах.)

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Green пишет:

У меня первое что бросилось "со скетчом"... И уже всё. Нах-нах.)

Ну да, но я на это глаза закрыл )))) Безграмотных во времена егэ пруд пруди...(

Green
Offline
Зарегистрирован: 01.10.2015

Ну а о чём можно говорить, когда без грамматических ошибок написать название темы не могут, когда исходный текст вставить не могут... Ну это же полный ЕГЭ!( "И польный писюнь вода.")

Wagaz
Offline
Зарегистрирован: 02.09.2022
#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 скидывается, что я делаю не так?

Wagaz
Offline
Зарегистрирован: 02.09.2022
Вроде получилось! спасибо!

#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
}

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

А не должно было получиться... Второе записываемое в EEPROM число сейчас всегда портит первое. У Вас каждое записываемое значение имеет тип int (2 байта). Второе число надо не в адрес 1, а в адрес 2 писать. 

Green
Offline
Зарегистрирован: 01.10.2015

Отчего то, все любят использовать EEPROM.h, тогда как для многих случаев есть "штатные" и более удобные средства в рамках avr-libc. Очевидно, по незнанию.( В eeprom libc не нужно следить за адресацией, EEMEM об этом заботится. Ну и типы данных явно указываются при обращении к функциям eeprom. А это уменьшает кол-во ошибок, подобных этой.
Считаю, что, коль Ардуино автоматом использует libc, то и разработчикам как то нужно было бы акцентировать на её (libc) функциях.
UPD. А то получается функционал libc то мы используем (автоматом), а вот откуда оно берётся - ХЗ. Непорядок.)

Wagaz
Offline
Зарегистрирован: 02.09.2022

kalapanga пишет:

А не должно было получиться... Второе записываемое в EEPROM число сейчас всегда портит первое. У Вас каждое записываемое значение имеет тип int (2 байта). Второе число надо не в адрес 1, а в адрес 2 писать. 

Спасибо, исправил