Доброго времени суток.
Появилась необходимость собрать устройство (автоматический дозатор жидкости)
на просторах интернета нашел код. реализовал проект, но сразу столкнулся на две проблемы.
- при выборе литража если превысить цифру 9.9, то на экране снова появляется 1.0 вместо 10.0. причем есть предположение, что в самом коде считается как следует, а на экран выводится неправильно.
- при нажатии на кнопки (выбор литража) кнопки периодически не срабатывают (как бы подвисают, не срабатывают, глючат).
Не пинайте сильно, направьте где почитать, чтобы разобраться.
#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);
}
} ```