#include <SoftwareSerial.h>
#include <LiquidCrystal.h>
#include <TimerOne.h>
#define LED LED_BUILTIN
char data = "";
int pressure1 = 0;
float pressure2 = 0;
int temperature = 80;
float pressure1_watts = 0;
float pressure2_watts = 0;
float pump_watts = 0;
bool pumpOn = false;
uint8_t bukva_I[8] = {0x11, 0x13, 0x13, 0x15, 0x19, 0x19, 0x11};
uint8_t bukva_D[8] = {B01111, B00101, B00101, B01001, B10001, B11111, 0x11};
uint8_t bukva_Y[8] = {B10001, B10001, B10001, B01010, B00100, B01000, B10000};
uint8_t bukva_P[8] = {0x1F, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11};
uint8_t bukva_ZH[8] = {B10101, B10101, B10101, B11111, B10101, B10101, B10101};
uint8_t bukva_Mz[8] = {0x10, 0x10, 0x10, 0x1E, 0x11, 0x11, 0x1E};
uint8_t bukva_Shch[8] = {B10101, B10101, B10101, B10101, B10101, B10101, B11111, B00001};
uint8_t bukva_Z[8] = {B01110, B10001, B00001, B00010, B00001, B10001, B01110};
uint8_t bukva_G[8] = {B11111, B10001, B10000, B10000, B10000, B10000, B10000};
uint8_t bukva_L[8] = {0x3, 0x7, 0x5, 0x5, 0xD, 0x9, 0x19};
SoftwareSerial mySerial(8, 9); // RX, TX
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
mySerial.begin(9600);
pinMode(LED, OUTPUT);
pinMode(6, OUTPUT);
lcd.begin(20, 4);
lcd.createChar(1, bukva_Z);
lcd.createChar(2, bukva_G);
lcd.createChar(3, bukva_Y);
lcd.clear();
lcd.write(1);
lcd.print("A");
lcd.write(2);
lcd.print("P");
lcd.write(3);
lcd.write(1);
lcd.write("KA...");
delay(3000);
lcd.clear();
lcd.write(2);
lcd.print("OTOBO!");
delay(1000);
updateDisplay();
Timer1.initialize(3000000);
Timer1.attachInterrupt(tempUpdate);
}
void loop() {
if (mySerial.available()) {
digitalWrite(LED, HIGH);
data = mySerial.read();
delay(10);
if (data == 'q') {
pressure1 += mySerial.parseInt();
pressure1 = limitInt(pressure1, 0, 350);
pressure1_watts = (float) pressure1 / 350 * 57.63;
if ((float) pressure1 <= pressure2) {
pressure2 = pressure1;
}
updateDisplay();
}
if (data == 'w') {
pressure2 += mySerial.parseFloat();
pressure2 = limitFloat(pressure2, 0, 2.2);
pressure2_watts = (float) pressure2 / 2.2 * 9.49;
updateDisplay();
}
}
delay(100);
digitalWrite(LED, LOW);
}
void tempUpdate() {
if (!pumpOn) {
if (temperature >= 70) {
digitalWrite(6, HIGH);
pump_watts = 7.88;
pumpOn = true;
}
} else {
if (temperature <= 60) {
digitalWrite(6, LOW);
pump_watts = 0;
pumpOn = false;
}
}
if (pumpOn) {
temperature -= 1;
updateDisplay();
} else {
temperature += 1;
updateDisplay();
}
}
void updateDisplay() {
lcd.createChar(1, bukva_D);
lcd.createChar(2, bukva_Mz);
lcd.createChar(3, bukva_I);
lcd.createChar(4, bukva_Y);
lcd.createChar(5, bukva_P);
lcd.createChar(6, bukva_Shch);
lcd.createChar(7, bukva_L);
lcd.clear();
lcd.write(1);
lcd.print("AB");
lcd.write(7);
lcd.print("EH");
lcd.write(3);
lcd.print("E 1: ");
lcd.print(pressure1);
lcd.print("ATM.");
lcd.setCursor(0, 1);
lcd.write(1);
lcd.print("AB");
lcd.write(7);
lcd.print("EH");
lcd.write(3);
lcd.print("E 2: ");
lcd.print(pressure2);
lcd.print("ATM.");
lcd.setCursor(0, 2);
lcd.print("TEM");
lcd.write(5);
lcd.print("EPAT");
lcd.write(4);
lcd.print("PA: ");
lcd.print(temperature);
lcd.print(char(223));
lcd.print("C");
lcd.setCursor(0, 3);
lcd.print("MO");
lcd.write(6);
lcd.print("HOCT");
lcd.write(2);
lcd.print(": ");
lcd.print(pressure1_watts + pressure2_watts + pump_watts);
lcd.print("KBT");
}
int limitInt(int num, int minNum, int maxNum) {
if (num > maxNum) {
num = maxNum;
} else if (num < minNum) {
num = minNum;
}
return num;
}
float limitFloat(float num, float minNum, float maxNum) {
if (num > maxNum) {
num = maxNum;
} else if (num < minNum) {
num = minNum;
}
return num;
}