#include <LiquidCrystal_I2C.h> // подключаем библиотеку дисплея
#include <GyverEncoder.h> // подключаем библиотеку энкодера
#include <EEPROM.h> //подключаем библиотеку EEPROM памяти
LiquidCrystal_I2C lcd(0x27, 16, 2); // адрес, столбцов, строк
Encoder enc(2, 3, 4); // инициализация энкодера
uint32_t tmr1; //Таймер температуры
int8_t flag1 = 1;
int8_t flag2 = 0;
int16_t up = 1024; //верняя граница поступающих показаний
int16_t down = 0; //нижняя граница поступающих показаний
int16_t up_value = 57; //верхняя граница передаваемых показанй
int16_t down_value = 0; //нижняя граница передаваемых показанй
int16_t frequency = 500; //частота обновления
int8_t InputPin = A2; // пин поступающий сигнал с лямбда-зонда
int8_t OutputPin = 9; //пин сигнал на модуль управления
float voltageOutput = 0; //выходной сигнал на модуль управления
float voltageInput = 0;
//------------------------------------------------------------------------------
void setup() {
Serial.begin(9600); //подключае порт
enc.setType(TYPE2); //устанавливаем тип энкодера
lcd.init(); // инициализация дисплея
lcd.backlight(); // включить подсветку дисплея
analogReference(INTERNAL); //устанавливаем опорное напряжение измерения 1,1В
pinMode(InputPin, INPUT); //включаем пин на прием
pinMode(OutputPin, OUTPUT); //включаем пин на передачу
if (EEPROM.read(0) !=0) data_set_start(); //проверяем начальную запись в память
data_set_read(); //читаем начальные данные
displey(up_value, down_value, frequency); //обновляем данные дисплея
analogWrite(9, 23); //подаем начальное напряжение 0,45В
delay(30000); //пауза 30 сек.
}
//------------------------------------------------------------------------------
void loop() {
enc.tick(); //опрашиваем энкодер
if (!flag2) { //если флаг2 = 0 то переходим в навигацию по меню
novigating_menu(); //навигация по меню
if (enc.isClick()) flag2 = 1; //усли нажата кнопка то флаг2 = 1
}
if (flag2) press_button(flag1); //усли флаг2 = 1 то перходим в настройки показаний
if (millis() - tmr1 >= frequency) { //таймер отправки данных в модуль управления(частота)
ver1(); //отпраква данных в модуль управления
tmr1 = millis(); //Сбрасываем таймер
}
}
//----------------------------------------------------------------------------------
void data_set_start() { //записываем данные в память
EEPROM.update(0, 0); //закрываем ключ для начального заполнения
EEPROM.put(1, up_value); //устанавливаем верхнюю границу
EEPROM.put(3, down_value); //устанавливаем нижнюю границу
EEPROM.put(5, frequency); //устанавливаем границу сброса
}
//----------------------------------------------------------------------------------
void data_set_read() { //читаем данные из памяти
EEPROM.get(1, up_value); //читаем данные верхней границы
EEPROM.get(3, down_value); //читаем данные нижней границы
EEPROM.get(5, frequency); //читаем границу сброса
}
//-----------------------------------------------------------------------------------------
void displey(int16_t up, int16_t down, int16_t zero) { //выводим начальные значение на дисплей
lcd.clear(); //очищаем дисплей
lcd.setCursor(1, 0); //устанавливаем курсор на столбец 1, строка 0
lcd.print("UP-");
lcd.setCursor(4, 0); //устанавливаем курсор на столбец 1, строка 0
lcd.print(up);
lcd.setCursor(8, 0); //устанавливаем курсор на столбец 8, строка 0
lcd.print("DOWN-");
lcd.setCursor(13, 0); //устанавливаем курсор на столбец 1, строка 0
lcd.print(down);
lcd.setCursor(5, 1); //устанавливаем курсор на столбец 5, строка 1
lcd.print("ZERO-");
lcd.setCursor(10, 1); //устанавливаем курсор на столбец 1, строка 0
lcd.print(zero);
lcd.setCursor(0, 0);
lcd.write(126);
}
//----------------------------------------------------------------------------------------------
void set_displey(int8_t flag1) { //вывод на дисплей стрелки
switch (flag1) {
case 1:
lcd.setCursor(0, 0);
lcd.write(126);
lcd.setCursor(7, 0);
lcd.print(" ");
lcd.setCursor(4, 1);
lcd.print(" ");
break;
case 2:
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(7, 0);
lcd.write(126);
lcd.setCursor(4, 1);
lcd.print(" ");
break;
case 3:
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(7, 0);
lcd.print(" ");
lcd.setCursor(4, 1);
lcd.write(126);
break;
}
}
//---------------------------------------------------------------------------------------------------
void press_button(int8_t flag) {
switch (flag) {
case 1: lcd.setCursor(0, 0); lcd.write(35); break;
case 2: lcd.setCursor(7, 0); lcd.write(35); break;
case 3: lcd.setCursor(4, 1); lcd.write(35); break;
}
if (enc.isRight()) {
switch (flag){
case 1:
up_value ++;
lcd.setCursor(4, 0); //устанавливаем курсор на столбец 1, строка 0
lcd.print(" ");
lcd.setCursor(4, 0); //устанавливаем курсор на столбец 1, строка 0
lcd.print(up_value);
break;
case 2:
down_value ++;
lcd.setCursor(13, 0); //устанавливаем курсор на столбец 1, строка 0
lcd.print(" ");
lcd.setCursor(13, 0); //устанавливаем курсор на столбец 1, строка 0
lcd.print(down_value);
break;
case 3:
frequency +=100;
lcd.setCursor(10, 1); //устанавливаем курсор на столбец 1, строка 0
lcd.print(" ");
lcd.setCursor(10, 1); //устанавливаем курсор на столбец 1, строка 0
lcd.print(frequency);
break;
}
}
if (enc.isLeft()) {
switch (flag){
case 1:
up_value --;
lcd.setCursor(4, 0); //устанавливаем курсор на столбец 1, строка 0
lcd.print(" ");
lcd.setCursor(4, 0); //устанавливаем курсор на столбец 1, строка 0
lcd.print(up_value);
break;
case 2:
down_value --;
lcd.setCursor(13, 0); //устанавливаем курсор на столбец 1, строка 0
lcd.print(" ");
lcd.setCursor(13, 0); //устанавливаем курсор на столбец 1, строка 0
lcd.print(down_value);
break;
case 3:
frequency -=100;
lcd.setCursor(10, 1); //устанавливаем курсор на столбец 1, строка 0
lcd.print(" ");
lcd.setCursor(10, 1); //устанавливаем курсор на столбец 1, строка 0
lcd.print(frequency);
break;
}
}
if (enc.isClick()) {
switch (flag) {
case 1: lcd.setCursor(0, 0); lcd.write(126); break;
case 2: lcd.setCursor(7, 0); lcd.write(126); break;
case 3: lcd.setCursor(4, 1); lcd.write(126); break;
}
flag2 = 0;
data_set_start();
}
}
//---------------------------------------------------------------------------------------
void novigating_menu() {
if (enc.isRight()) {
Serial.print("право-");
flag1 ++;
if (flag1 > 3) flag1 = 1;
Serial.println(flag1);
set_displey(flag1);
}
if (enc.isLeft()) {
Serial.print("лево-");
flag1 --;
if (flag1 < 1) flag1 = 3;
Serial.println(flag1);
set_displey(flag1);
}
}
//-----------------------------------------------------------------------------------------
void ver1() {
if (analogRead(InputPin < down)) voltageInput = down;
else if (analogRead(InputPin > up)) voltageInput = up;
else voltageInput = analogRead(InputPin);
voltageOutput = map(voltageInput, down, up, down_value, up_value);
voltageOutput = constrain(voltageOutput, down_value, up_value);
analogWrite(9, voltageOutput);
}