#define _LCD_TYPE 1
#include <Arduino.h>
#include <EncButton.h>
#include <LiquidCrystal_I2C.h>
#include <LCD_1602_RUS_ALL.h>
#include <Wire.h>
//#define EB_NO_BUFFER
//Установка I²C адреса дисплея
#define LCDaddress 39 //Может быть 38, 39, 63
//
//Установка I²C адреса ЦАПов
#define MCP4716A1address 97
#define MCP4716A3address 99
//
//Установка пинов экнодера
#define ENCpinDT 3
#define ENCpinCLK 4
#define ENCpinSW 2
//
LCD_1602_RUS lcd(LCDaddress, 16, 2);
EncButton enc(ENCpinDT, ENCpinCLK, ENCpinSW, INPUT);
uint8_t pointer = 0; //Курсор
uint8_t Page = 0; //Страницы
float Vhigh = 14.8; //Максимальное напряжение заряда
float Vlow = 10.5; //Минимальное напряжение разряда
bool Mode = 0; //Режим работы, заряд - 1, разряд - 0
bool OnWork = 0; //Состояние работы вкл/выкл
void setup() {
// Serial.begin(9600);
analogReference(INTERNAL); //встроенное опорное напряжение 1.1 В
enc.setEncType(EB_STEP2); //выбор типа экодера
lcd.init(); // инициализация дисплея
lcd.backlight(); // включить подсветку дисплея
}
//Обработчик курсора
void printPointer(uint8_t ptr1, uint8_t ptr2, bool type) {
if (type) {
lcd.setCursor(ptr1, ptr2);
lcd.write(126);
} else {
lcd.setCursor(ptr1, ptr2);
lcd.write(127);
}
}
//Обработчик страниц
void PageSelect(uint8_t page, uint8_t point) {
switch (page) {
case 0:
switch (point) {
case 0:
Page = 1;
break;
case 1:
OnWork = 1;
Page = 2;
break;
}
pointer = 0;
break;
case 1:
switch (point) {
case 0:
Mode = 1;
Page = 0;
pointer = 1;
break;
case 1:
Mode = 0;
Page = 0;
pointer = 1;
break;
case 2:
Page = 3;
break;
case 3:
Page = 4;
break;
}
break;
case 2:
Page = 0;
pointer = 0;
break;
case 3:
Page = 1;
pointer = 0;
break;
case 4:
Page = 1;
pointer = 0;
break;
}
}
void loop() {
static uint8_t items = 0; //Количество пунктов на странице меню
static uint32_t timer1 = 0; //Таймер 1
static bool timer1_1 = 0; //Вынос таймера 1
uint8_t VHInt = floor(Vhigh);
uint8_t VHInt1 = VHInt / 10;
uint8_t VHInt2 = VHInt % 10;
uint8_t VHDec = fmod(Vhigh, 1) * 10;
uint8_t VLInt = floor(Vlow);
uint8_t VLInt1 = VLInt / 10;
uint8_t VLInt2 = VLInt % 10;
uint8_t VLDec = fmod(Vlow, 1) * 10;
if (millis() - timer1 >= 350) { //Таймер 1
timer1_1 = !timer1_1;
timer1 = millis();
}
switch (Page) { //Страницы
case 0: //Главная страница
items = 2; //Количество пунктов на странице
if (timer1_1) {
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(9, 0);
lcd.print(" ");
} else {
if (pointer == 0) printPointer(0, 0, 1);
if (pointer == 1) printPointer(9, 0, 1);
}
lcd.setCursor(1, 0);
lcd.print("РЕЖИМ ");
lcd.setCursor(10, 0);
lcd.print("ПУСК ");
break;
case 1: //Страница выбора режима работы
items = 4;
if (timer1_1) {
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(8, 0);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print(" ");
} else {
if (pointer == 0) printPointer(0, 0, 1);
if (pointer == 1) printPointer(8, 0, 1);
if (pointer == 2) printPointer(0, 1, 1);
if (pointer == 3) printPointer(8, 1, 1);
}
lcd.setCursor(1, 0);
lcd.print("ЗАРЯД ");
lcd.setCursor(9, 0);
lcd.print("РАЗРЯД ");
lcd.setCursor(1, 1);
lcd.print("V=");
lcd.write(VHInt1 + 48);
lcd.write(VHInt2 + 48);
lcd.print(",");
lcd.write(VHDec + 48);
lcd.print(" ");
lcd.setCursor(9, 1);
lcd.print("V=");
lcd.write(VLInt1 + 48);
lcd.write(VLInt2 + 48);
lcd.print(",");
lcd.write(VLDec + 48);
lcd.print(" ");
break;
case 2: //Страница работы
items = 1;
if (timer1_1) {
lcd.setCursor(9, 0);
lcd.print(" ");
lcd.setCursor(14, 0);
lcd.print(" ");
} else {
printPointer(9, 0, 1);
printPointer(14, 0, 0);
}
lcd.setCursor(1, 0);
lcd.print("РЕЖИМ ");
lcd.setCursor(10, 0);
lcd.print("СТОП");
break;
case 3: //Страница выбора напряжения заряда
items = 4;
if (timer1_1) {
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(7, 1);
lcd.print(" ");
} else {
printPointer(0, 1, 1);
printPointer(7, 1, 0);
}
lcd.setCursor(3, 1);
lcd.write(VHInt1 + 48);
lcd.write(VHInt2 + 48);
lcd.print(",");
lcd.write(VHDec + 48);
break;
case 4: //Страница выбора напряжения разряда
items = 4;
if (timer1_1) {
lcd.setCursor(8, 1);
lcd.print(" ");
lcd.setCursor(15, 1);
lcd.print(" ");
} else {
printPointer(8, 1, 1);
printPointer(15, 1, 0);
}
lcd.setCursor(11, 1);
lcd.write(VLInt1 + 48);
lcd.write(VLInt2 + 48);
lcd.print(",");
lcd.write(VLDec + 48);
break;
}
enc.tick(); //Опрос экодера
if (enc.click()) PageSelect(Page, pointer);
if (Page == 3) {
if (enc.right()) Vhigh = constrain(Vhigh + 0.1, 10.0, 16.0);
if (enc.left()) Vhigh = constrain(Vhigh - 0.1, 10.0, 16.0);
} else if (Page == 4) {
if (enc.right()) Vlow = constrain(Vlow + 0.1, 10.0, 16.0);
if (enc.left()) Vlow = constrain(Vlow - 0.1, 10.0, 16.0);
} else {
if (enc.right()) {
pointer = constrain(pointer + 1, 0, items - 1);
if (items > 1) timer1_1 = 1;
}
if (enc.left()) {
pointer = constrain(pointer - 1, 0, items - 1);
if (items > 1) timer1_1 = 1;
}
}
}