#include <Arduino.h>
#include <U8g2lib.h>
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 16, /* data=*/ 17); // ESP32 Thing, HW I2C with pin remapping
byte CompletedPercents, MarginTop, VolumeAccuracy = 0;
unsigned long timeDisplay;
byte Animation;
unsigned long HeatMills = 0;
float DrainVolume = 400;
float VolumeCritical = 5000;
float VolumeAuto = 4400;
float MinimumVolume = 400;
bool setTask = false;
bool pumpIsEnabled = false;
bool pumpProtection = false;
bool showItem = false;
bool SelectItem = false;
float CompletedVolume = 3600;
float FullVolume = 5000;
void setup(void) {
//Dispaly
u8g2.begin();
u8g2.enableUTF8Print();
}
void loop(void) {
if(millis() - timeDisplay > 333) {
timeDisplay = millis();
u8g2.firstPage();
do {
Prepare();
u8g2.setCursor(0, -1);
u8g2.print("Cвoбoднo:");
//u8g2.print("Q: ?");
u8g2.setCursor(50, -1);
u8g2.print(2680);
//Нарисовать горизонтальную линюю
u8g2.drawHLine(0,10,100);
u8g2.setCursor(0, 12);
u8g2.print("Уpoвeнь:");
u8g2.setCursor(50, 12);
u8g2.print("1.023");
u8g2.setCursor(0, 21);
u8g2.print("3aнято:");
u8g2.setCursor(50, 21);
u8g2.print(3400);
//Нарисовать горизонтальную линюю
u8g2.drawHLine(0,33,100);
u8g2.setCursor(0, 34);
u8g2.print("3: 350");
u8g2.setCursor(43, 34);
u8g2.print("03:00");
u8g2.setCursor(75, 34);
u8g2.print("04:45");
u8g2.setCursor(0, 44);
u8g2.print("P: 3500");
u8g2.setCursor(43, 44);
u8g2.print("K: 4800");
u8g2.setCursor(0, 54);
//Отобразить время с ведущими нулями
u8g2.print("00:00:00");
u8g2.setCursor(43, 54);
u8g2.print(" l : ");
if(pumpIsEnabled) {
//Отобразить счетчик откачанной за текущую сессию жидкости
u8g2.drawHLine(44,57,3); //Стрелка вверх
u8g2.drawHLine(43,58,5); //Стрелка вверх
}
else {
u8g2.drawHLine(43,60,5); //Стрелка вниз
u8g2.drawHLine(44,61,3); //Стрелка вниз
}
//u8g2.drawHLine(44,57,3); //Стрелка вверх
//u8g2.drawHLine(43,58,5); //Стрелка вверх
u8g2.print("248");
u8g2.setCursor(95, -2);
u8g2.print("*");
u8g2.setCursor(43, 54);
//u8g2.print("+") + u8g2.print("248") + u8g2.print(" -") + u8g2.print("400");
if(pumpIsEnabled) {
Animation = GetAnimation();
ShowCircle();
}
if(showItem) {
byte radius = (pumpIsEnabled) ? 7 : 9;
u8g2.drawDisc(90, 54, radius, 31);
u8g2.setDrawColor(0);
//u8g2.drawCircle(90, 54, 9);
if(SelectItem) {
u8g2.setCursor(84, 49);
u8g2.print("0|1");
}
else {
u8g2.setCursor(88, 49);
u8g2.print("H");
}
u8g2.setDrawColor(1);
}
if(!pumpIsEnabled && !showItem) {
u8g2.setCursor(97, 54);
u8g2.print("l");
u8g2.drawHLine(96,57,3); //Стрелка вверх
u8g2.drawHLine(95,58,5); //Стрелка вверх
}
calculateCompletePercents(CompletedVolume);
if(setTask) calculateCompletePercents(MinimumVolume);
ShowBoxPercent();
}
while( u8g2.nextPage() );
}
}
//Показать процеты заполнения емкости
void ShowBoxPercent() {
u8g2.drawFrame(101,0,27,64);
byte CompletedPercentsMainBox = CompletedPercents;
byte MarginTopMainMainBox = MarginTop;
bool color = true;
//Нарисовать прерывистую линию для установки задания
//if(setTask) drawDottedLine();
if(!setTask) {
// u8g2.drawHLine(102,MarginTopMainMainBox,25);
u8g2.drawBox(102,MarginTopMainMainBox,25,64);
if(CompletedPercentsMainBox > 23) {
u8g2.setCursor(102, 54);
u8g2.setDrawColor(0);
color = false;
}
else u8g2.setCursor(103, 0);
}
ShowLinesForJob(color);
if(!setTask) {
if (HeatMills > 0) u8g2.print((millis() - HeatMills)/1000) + u8g2.print("c");
else if(DrainVolume > 0) u8g2.print(DrainVolume, VolumeAccuracy);
}
if(CompletedPercentsMainBox < 16) u8g2.setCursor(103, MarginTopMainMainBox - 10);
else {
if(!setTask) u8g2.setDrawColor(0);
char MCorrection = (!setTask) ? 1 : 0;
u8g2.setCursor(103 - MCorrection, MarginTopMainMainBox - MCorrection);
}
u8g2.print(CompletedPercentsMainBox) + u8g2.print("%");
}
//Нарисовать прерывистые линии на процентной шкале, для критического, расписания и минимального уровня
void ShowLinesForJob(bool color) {
float volume = VolumeCritical;
for(byte i=0;i<3;i++){
if(i==1) volume = VolumeAuto;
else if(i==2) volume = MinimumVolume;
if(volume) {
calculateCompletePercents(volume);
drawDottedLine();
u8g2.setDrawColor(color);
}
}
}
//Нарисовать прерывистую линию на процентной шкале
void drawDottedLine() {
byte i = 101;
bool color = true;
for(i;i<128;i++){
u8g2.setDrawColor(color);
u8g2.drawPixel(i,MarginTop);
color = !color;
}
}
//Посчитать проценты заполнения емкости
void calculateCompletePercents(float volume) {
CompletedPercents = (volume / FullVolume) * 100;
MarginTop = (6300 - (63 * CompletedPercents)) / 100;
}
void Prepare(void) {
u8g2.setFont(u8g2_font_haxrcorp4089_t_cyrillic);
u8g2.setFontRefHeightExtendedText();
u8g2.setDrawColor(1);
u8g2.setFontPosTop();
//u8g2.setFontDirection(0);
}
//Плучить анимацию для вращения насоса
byte GetAnimation(void) {
if(pumpProtection) return (Animation == 16) ? 31 : 16; //Анимация для насоса если он не может прокачать
//return (Animation == 10) ? 5 : 10;
//Анимация для нормальной работы насоса (4 кадра по часовой стрелке)
//if(Animation==8) return 4;
//if(Animation==4) return 2;
//return (Animation==2) ? 1 : 8;
//Анимация для нормальной работы насоса (4 кадра против часовой стрелки)
if(Animation==2) return 4;
if(Animation==4) return 8;
return (Animation==8) ? 1 : 2;
}
//Показать вращение насоса
void ShowCircle(void) {
u8g2.drawDisc(90, 54, 9, GetAnimation());
u8g2.drawDisc(90, 54, 4, 31);
u8g2.drawCircle(90, 54, 9);
}