Глюки кнопок и неправильный вывод информации на экран

Доброго времени суток.

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

  1. при выборе литража если превысить цифру 9.9, то на экране снова появляется 1.0 вместо 10.0. причем есть предположение, что в самом коде считается как следует, а на экран выводится неправильно.
  2. при нажатии на кнопки (выбор литража) кнопки периодически не срабатывают (как бы подвисают, не срабатывают, глючат).
    Не пинайте сильно, направьте где почитать, чтобы разобраться.
#include "LCD_1602_RUS.h"
#include "GyverButton.h"
LCD_1602_RUS lcd(0x27, 16, 2);

boolean Pusk = 0;
boolean Meny = 0;
float obyem;               //переменная прошедшего ОБЪЕМА
float zad_obyem = 0;
float rashod;             //расход воды в минуту
volatile unsigned long lastflash, flash;
volatile unsigned long impuls = 0; //число импульсов расходомера
unsigned long Taimer1;
unsigned long Taimer2;
float ves_impulsa = 2.40;  //вес одного импульса

//Настройка кнопок
#define BTN1 4  //Кнопка БОЛЬШЕ
#define BTN2 5  //Кнопка МЕНЬШЕ
#define BTN3 6  //Кнопка СТАРТ
#define BTN4 7  //Кнопка СТОП 
GButton bol(BTN1);
GButton men(BTN2);
GButton Start(BTN3);
GButton Stop(BTN4);

#define ADDR 10  //ячейка с ключем первого запуска
#define KEY 15  //ключь первого запуска
void setup() {
  Serial.begin(9600);
  if (EEPROM.read(ADDR) != KEY) { //если во время первого запуска в ячейке 10 ключь не совподает то записывает в 10 ячейку ключь
    EEPROM.write(ADDR, KEY);
    EEPROM.put(0, ves_impulsa);
  }   //также записываем стандартный весс импульса. 2,40
  EEPROM.get(0, ves_impulsa);

  pinMode (3, OUTPUT);    // Настраиваем 3 цифровой порт на выход
  digitalWrite (3, LOW);  // подать на 3 порт 0 Вольт.
  attachInterrupt(0, sens, RISING);    // подключить прерывание на 2 пин при повышении сигнала
  lcd.init();                 // инициализация дисплея
  lcd.backlight();            // включить подсветку
  bol.setTickMode(AUTO);    //Функция опроса кнопки БОЛЬШЕ
  men.setTickMode(AUTO);    //Функция опроса кнопки МЕНЬШЕ
  Start.setTickMode(AUTO);    //Функция опроса кнопки СТАРТ
  Stop.setTickMode(AUTO);    //Функция опроса кнопки СТОП
}
void sens() {
  flash = micros() - lastflash;   // вычислить время между двумя импульсами
  lastflash = micros();           // запомнить время последнего импульса
  impuls++;
}

void loop() {
  if (micros() - lastflash > 1000000) {                   // если сигнала нет больше секунды
    rashod = 0;                                           // считаем, что всё стоит и не крутится
  } else {
    obyem = impuls * ves_impulsa / 1000.0;
    rashod = 60.0 / (flash / 1000000.0 * 450.0);  // время одного оборота в секундах, с учётом числа лопастей
  }

  if (Pusk == 1 && obyem < zad_obyem - 0.01) {       //Если прошло 30 секунд и объем меньше заданного то подаем на 3 пин 5 вольт.
    digitalWrite (3, HIGH);
  }                               // Подаем на 3 пин 5 вольт
  else if (Pusk == 1 && obyem >= zad_obyem - 0.01) {
    digitalWrite (3, LOW);                                //если условие не выполняется по подаем на 3 пин 0 вольт.
    Pusk = 0;
  }
  else if (Pusk == 0) {
    digitalWrite (3, LOW);                                //если условие не выполняется по подаем на 3 пин 0 вольт.
  }
  if (millis() - Taimer1 > 300) {  // кадждые 300 миллисекунд
    if (Meny == 0) {
      lcd.setCursor(0, 0);        // курсор слева 1 строчка
      lcd.print(L"Задано");
      lcd.setCursor(0, 1);        // курсор слева 2 строчка
      lcd.print(L"Подано");
      lcd.setCursor(7, 0);  // курсор 9 слева 1 строчка
      lcd.print(zad_obyem, 1);       // выводим RPM
      lcd.setCursor(7, 1); // курсор 10 слева 2 строчка
      lcd.print(obyem, 1);  // выводим скорость
      lcd.setCursor(12, 0);  // курсор 9 слева 1 строчка
      lcd.print(rashod, 1);      // выводим RPM
    }
    else  {
        lcd.setCursor(2, 0);  // курсор 9 слева 1 строчка
        lcd.print(L"Вес импульса");      // выводим RPM
        lcd.setCursor(6, 1);  // курсор 9 слева 1 строчка
        lcd.print(ves_impulsa);      // выводим RPM
      }
      Taimer1 = millis();  // сброс таймера
    }

    //Работа с кнопками
    if (bol.isClick() && Meny == 0) {
      zad_obyem = zad_obyem + 0.1;
    }

    if (men.isClick() && Meny == 0) {
      zad_obyem = zad_obyem - 0.1;
    }

    if (bol.isStep() && Meny == 0) {
      zad_obyem = zad_obyem + 0.5;
    }

    if (men.isStep() && Meny == 0) {
      zad_obyem = zad_obyem - 0.5;
    }

    if (Start.isClick() && Meny == 0) {
      Pusk = 1;
    }

    if (Start.isStep()) {
      Meny = !Meny;
      lcd.setCursor(0, 0);
      lcd.print("                ");       // Очищаем дисплей
      lcd.setCursor(0, 1); //
      lcd.print("                ");  // Очищаем дисплей
    }

    if (Stop.isClick() && Meny == 0) {
      Pusk = 0;
    }

    if (Stop.isHold() && Meny == 0) {
      impuls = 0;
      obyem = 0;
    }
    if (bol.isClick() && Meny == 1) {
      ves_impulsa = ves_impulsa + 0.01;
      EEPROM.put(0, ves_impulsa);
    }

    if (men.isClick() && Meny == 1) {
      ves_impulsa = ves_impulsa - 0.01;
      EEPROM.put(0, ves_impulsa);
    }

    if (bol.isStep() && Meny == 1) {
      ves_impulsa = ves_impulsa + 0.1;
      EEPROM.put(0, ves_impulsa);
    }

    if (men.isStep() && Meny == 1) {
      ves_impulsa = ves_impulsa - 0.1;
      EEPROM.put(0, ves_impulsa);
    }
  }  ```

А сейчас скажут, что нужно идти в раздел платных услуг и всё такое…

На старом форуме (ссылка есть вверху) была очень активная тема про “Наливатор”. Там все эти проблемы решались. Посмотрите.

1 лайк

Вам не кажется, что для исправления глючного кода нужно обращаться к его автору?

Не кидайтксь в меня помидорами, это просто, чисто для себя понимать:
а в 73, 75 и 85 строках что за буква L?

Про расширенные символы почитайте

A string-literal that begins with L, such as L"asdf" , is a wide string literal. A wide string literal has type
“array of n const wchar_t”, where n is the size of the string as defined below; it is initialized with the given characters.

А ещё бывает R, u8, u8R, u, uR, U, UR, и LR.

1 лайк

век живи век учись… :grinning:

Этот вопрос еще на старом форуме ЗАДОЛБАЛ! Реально Гугль еще Роскомпозор не запретил, кмк?
https://en.cppreference.com/w/cpp/language/string_literal