#define _LCD_TYPE 1
#define VERSION "Проект V 2.0.2"
#include "font_LCD_1602_RUS.h"
#include "LCD_1602_RUS_ALL.h"
//#include <LiquidCrystal_I2C.h>
//LiquidCrystal_I2C lcd_i2c(0x27, 20, 4); // I2C address 0x27, 16 column and 2 rows
//LCD_1602_RUS lcd_i2c(0x27, 20, 4);
unsigned long CurrentTime, LastTime;
enum eEncoderState { eNone,
eLeft,
eRight,
eButton };
uint8_t EncoderA, EncoderB, EncoderAPrev;
int8_t counter;
bool ButtonPrev;
#define SPI_SPEED SD_SCK_MHZ(4)
#define CS_PIN 5
#define TXEN 4
#define LEFT 1 //не пин
#define RIGHT 2 //не пин
#define ENTER 3 //не пин
#define ERASESCREEN true
#define NOERASESCREEN false
#define OffUpDown 4 //не пин
#define pin_CLK 36 //17 //право
#define pin_DT 39 //16 //лево
#define pin_Btn 32 //ввод
#define IN_MOTOR_STOP 27
#define IN_MOTOR_UP 13
#define IN_MOTOR_DOWN 33
#define OUT_MOTOR_STOP 26
#define OUT_MOTOR_UP 25
#define OUT_MOTOR_DOWN 12
//**********РАЗОБРАТЬ
#define IN_AMPER 35 //Аналог. Ток с сдатчика VP
#define OUT_PUSH 5 //Режим подъема
#define IN_HEGH 34 //высота подъема. 1 тик в минуту
//#define IN_VP 36
//#define IN_PR 39
#define MAXPOWER 14
int activScreen = 0;
int menuPositionMain = 1;
int menuPositionMain2 = 1;
int menuPositionManual = 0;
int menuPositionDigitalManual = 0;
int menuPositionSettings = 0;
int menuPositionDigitalSettings = 0;
int selectColor = 0;
String ManualOnOff = "ВЫК";
String ManualUPOnOff = "ВЫК";
String ManualDOWNOnOff = "ВЫК";
String ManualModeOnOff = "ВЫК";
String ModeStateOnOff = "ВЫК";
String AutoModeOnOff = "ВЫК";
String PushModeOnOff = "ВЫК";
String HalfAutoModeOnOff = "ВЫК";
String CyclePause = "";
bool ClickManualUPOnOff = false;
bool ClickManualDOWNOnOff = false;
bool ClickSettingsOnOff = false;
bool ClickManualModes = false;
bool ClickManualModeState = false;
int ManualModes = 0;
bool ClickAutoOnOff = false;
bool edit = false;
//int counter = 0;
String Time = "";
String Date = "";
float power = 2.00; //Потребляемая мощность
String dimensionPower = ""; //Единицы измерения мощности
int vp = 0; //Управляющие сигналы с датчиков ограничения движения 0/1
int pr = 0; //Управляющие сигналы с датчиков ограничения движения 0/1
int heigh; //Высота подъема/спуска
String VP;
String PR;
String H;
String MODES;
int upMax = 0;
int downMax = 10; //Максимальные точки подъема\спуска
int _cycle = 0;
int _switch = 0;
int cntCycle = 0;
int cycle = 3; //Количество подъемов\спусков
int pauseCycle = 10; //пауза между циклами
int dd = 11;
int mm = 3;
int gg = 23;
int hh = 12;
int mnt = 55; //Время дата
volatile bool pauseAuto = false;
volatile int cntPause = 0;
int positionDigital = 1;
int positionCursor = 2;
int tenPosition, hundredPosition, onePosition;
int positionMin = 13;
int positionMax = 18;
int positionCycl = 15;
int positionPause = 19;
int positionDD = 6;
int positionMM = 12;
int positionG = 19;
int positionHH = 6;
int position_MM = 12;
int id = 3;
float AcsValue = 0.0, Samples = 0.0, AvgAcs = 0.0, AcsValueF = 0.0;
bool cycleOK = false;
int modbasCommand = 0;
//String modes[4] = {"MANUAL ", "HALF-AUTO", "AUTO ", "PUSH "};
String modes[4] = { "РУЧНОЙ ", "ПОЛУАВТО ", "АВТО ", "ТОЛКНУТЬ " };
//upMax, downMax, cycle, _cycle cntCycle pauseCycle vp pr heigh ManualOnOff ManualUPOnOff
//ManualModeOnOff ModeStateOnOff AutoModeOnOff PushModeOnOff HalfAutoModeOnOff
//uint16_t modbus_array[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; //первоначально в массив записываем нулевые значения, размер устанавливаем сами
//uint16_t modbus_array[] = {0, 0, 0, 0, 0};
uint16_t modbus_array[18];
//LiquidCrystal_I2C lcd(0x27, 20, 4);
LCD_1602_RUS lcd(0x27, 20, 4);
//RTC_DS1307 rtc;
//DateTime now;
//Modbus slave(4, Serial2, TXEN);
//SdFat sd;
//File root;
//Preferences preferences;
void helloScreen(bool erase) {
activScreen = 0;
if (erase) lcd.clear();
lcd.setCursor(5, 1);
lcd.print("ЭЛЕВАТОР");
lcd.setCursor(2, 2);
lcd.print(VERSION);
}
void manualScreen(bool erase, int UpDown) {
lcd.setCursor(2, 0);
/*lcd.write(255);
lcd.write(255);
lcd.write(255);
lcd.write(255);
lcd.write(255);
lcd.write(255);
lcd.write(255);
lcd.write(255);
lcd.write(255);
delay(150);*/
lcd.setCursor(2, 0);
lcd.print("ПОЛУАВТО ");
lcd.setCursor(16, 0);
lcd.print(ModeStateOnOff);
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(14, 0);
lcd.write(char(126));
lcd.setCursor(2, 1);
lcd.print("ВВЕРХ");
lcd.setCursor(9, 1);
lcd.print(ManualUPOnOff);
lcd.setCursor(2, 2);
lcd.print("ВНИЗ");
lcd.setCursor(9, 2);
lcd.print(ManualDOWNOnOff);
lcd.setCursor(16, 1);
lcd.print(VP);
lcd.setCursor(16, 2);
lcd.print(PR);
lcd.setCursor(2, 3);
lcd.print(H);
lcd.setCursor(13, 3);
lcd.print(CyclePause);
}
void settingsScreen(bool erase, int UpDown) {
activScreen = 2;
//Очистить если true
if (erase) {
lcd.clear();
menuPositionSettings = 0;
}
if (UpDown == LEFT) menuPositionSettings--;
if (UpDown == RIGHT) menuPositionSettings++;
Serial.printf("SETTINGS menuPositionSettings=%d\n\n", menuPositionSettings);
if (menuPositionSettings > 3) {
helloScreen(ERASESCREEN);
return;
}
if (menuPositionSettings < 0) {
manualScreen(ERASESCREEN, OffUpDown);
return;
}
lcd.setCursor(2, 0);
lcd.print("MinMax=");
lcd.setCursor(10, 0);
//lcd.print(String(upMax));
lcd.printf("%04d",upMax);
lcd.setCursor(14, 0);
lcd.print("/");
lcd.setCursor(15, 0);
//lcd.print(String(downMax));
lcd.printf("%04d",downMax);
lcd.setCursor(2, 1);
lcd.print("ЦиклПауза=");
lcd.setCursor(13, 1);
//lcd.print(String(cycle));
lcd.printf("%03d",cycle);
lcd.setCursor(16, 1);
lcd.print("/");
lcd.setCursor(17, 1);
//lcd.print(String(pauseCycle));
lcd.printf("%03d",pauseCycle);
lcd.setCursor(2, 2);
//lcd.print(" ");
lcd.setCursor(2, 2);
//lcd.print(String(dd));
lcd.printf("%02d",dd);
lcd.setCursor(4, 2);
lcd.print("/");
lcd.setCursor(5, 2);
//lcd.print(" ");
//lcd.setCursor(5, 2);
//lcd.print(String(mm));
lcd.printf("%02d",mm);
lcd.setCursor(7, 2);
lcd.print("/");
lcd.setCursor(8, 2);
lcd.print(" ");
lcd.setCursor(8, 2);
lcd.print(String(gg));
lcd.setCursor(2, 3);
//lcd.print(" ");
lcd.setCursor(2, 3);
//lcd.print(String(hh));
lcd.printf("%02d",hh);
lcd.setCursor(4, 3);
lcd.print(":");
lcd.setCursor(5, 3);
//lcd.print(" ");
lcd.setCursor(5, 3);
//lcd.print(String(mnt));
lcd.printf("%02d",mnt);
lcd.setCursor(13, 3);
lcd.print("ID=");
lcd.setCursor(16, 3);
lcd.printf("%03d",id);
//lcd.printf("%d")
if (UpDown == RIGHT) {
lcd.setCursor(0, menuPositionSettings - 1);
lcd.print(" ");
if (menuPositionSettings > 3) {
helloScreen(ERASESCREEN);
return;
}
}
if (UpDown == LEFT) {
lcd.setCursor(0, menuPositionSettings + 1);
lcd.print(" ");
if (menuPositionSettings < 0) {
manualScreen(ERASESCREEN, 30);
return;
}
}
lcd.setCursor(0, menuPositionSettings);
lcd.write(char(126)); //lcd.print(">");
}
void setup() {
Serial.begin(115200);
lcd.init(); // This is the I2C LCD object initialization.
lcd.backlight(); // Включаем подсветку LCD дисплея
VP = "VP-" + String(1); //36
vp = 1;
PR = "PR-" + String("0"); //39
pr = 0;
H = "ВЫСОТА-" + String(heigh) + "M ";
//helloScreen(ERASESCREEN);
//manualScreen(ERASESCREEN, OffUpDown);
settingsScreen(ERASESCREEN, OffUpDown);
/*
//Проверить верхнее положение элеватора. Поднять элеватор наверх. Мотор UP
MODES = "УСТАНОВКА... ";
ModeStateOnOff = " ";
ClickManualUPOnOff != ClickManualUPOnOff; //щелкнуть выключатель
ManualUPOnOff = "ВКЛ";
ManualDOWNOnOff = "ВЫК"; //Нарисовать выключатели
manualScreen(ERASESCREEN, OffUpDown); //нарисовать экран
digitalWrite(OUT_MOTOR_UP, HIGH); //Поехали ВВЕРХ
//Выключить по дачику vp (пин 27) и датчику MAXPOWER
bool whl = true;
do {
digitalWrite(OUT_MOTOR_UP, HIGH);
H = "ВЫСОТА-...";
vp = digitalRead(IN_MOTOR_STOP); //на один пин заведены СТОП, VP, PR
VP = "VP-" + String(vp);
PR = "PR-" + String("0");
//https://www.engineersgarage.com/acs712-current-sensor-with-arduino/
//AcsValue = analogRead(IN_AMPER); //Read current sensor values
//AcsValue = (2.5 - (AcsValue * (3.3 / 1024.0))) / 0.185;
//dimensionPower = String(AcsValue) + "A ";
manualScreen(NOERASESCREEN, OffUpDown); //нарисовать экран
if (digitalRead(IN_MOTOR_STOP) == HIGH or digitalRead(MAXPOWER) == HIGH)
whl = false; //стоп по СТОП или перегрузу или верхнему датчику VP
} while (whl);
digitalWrite(OUT_MOTOR_UP, LOW); //STOP мотор вверх. ДОЕХАЛИ ВВЕРХ
delay(200);
digitalWrite(OUT_MOTOR_DOWN, HIGH);
delay(200); //Регулировка зазора VP
while (digitalRead(IN_MOTOR_STOP) == HIGH)
; //Ждем размыкания VP
digitalWrite(OUT_MOTOR_DOWN, LOW);
H = "";
heigh = 0; //Обнуляем счетчик высоты
//Опустить на высоту установленную в SETTINGS
while (heigh < upMax or digitalRead(MAXPOWER) == HIGH or digitalRead(IN_MOTOR_STOP) == HIGH) {
digitalWrite(OUT_MOTOR_DOWN, HIGH);
heigh++;
manualScreen(NOERASESCREEN, OffUpDown); //нарисовать экран
}
ClickManualUPOnOff != ClickManualUPOnOff; //щелкнуть выключатель
VP = "VP-" + String(1); //36
vp = 1;
PR = "PR-" + String("0"); //39
pr = 0;
H = "ВЫСОТА-" + String(heigh) + "M ";
//Еще раз все выключили
digitalWrite(OUT_MOTOR_DOWN, LOW);
digitalWrite(OUT_MOTOR_UP, LOW);
ClickManualUPOnOff != ClickManualUPOnOff; //щелкнуть выключатель
ManualUPOnOff = "ВЫК";
ManualDOWNOnOff = "ВЫК"; //Нарисовать выключатели
MODES = "РУЧНОЙ ";
ModeStateOnOff = " ";
manualScreen(ERASESCREEN, 30); //нарисовать экран
//delay(5000);
*/
}
void loop() {
delay(10); // this speeds up the simulation
}