// выводим кастомные символы
// библиотеки дисплея
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// создаём дисплей
// дисплей 20x4. Если не работает, используйте другой адрес
LiquidCrystal_I2C lcd(0x27, 20, 4);
#define FORWARDBTN 5
#define REVERSEBTN 6
#define POT A0
#define BATTVOL A1
#define LEFTBTN 7
#define RIGHTBTN 8
#define BUZZ 12
boolean FORWARD;
boolean REVERSES;
boolean LEFT;
boolean RIGHT;
int val;
byte STRUP [8] = { 0x00, 0x04, 0x0E, 0x15, 0x04, 0x04, 0x04, 0x00};
byte STRDOWN[8] = {0x00, 0x04, 0x04, 0x04, 0x15, 0x0E, 0x04, 0x00};
byte YE [8] = { 0x0A, 0x04, 0x11, 0x13, 0x15, 0x19, 0x11, 0x00};
void setup() {
pinMode(RIGHTBTN, INPUT_PULLUP);
pinMode(LEFTBTN, INPUT_PULLUP);
// определяем концевик движения вперед
pinMode(FORWARDBTN, INPUT_PULLUP);
// определяем концевик движения вперед
pinMode(REVERSEBTN, INPUT_PULLUP);
pinMode(POT, INPUT);
lcd.init();
lcd.backlight();
lcd.clear();
lcd.createChar(8,YE);
lcd.setCursor(5,1);
lcd.print("3DOPOBO,");
lcd.setCursor(5,2);
lcd.print("MATBE");
lcd.setCursor(10,2);
lcd.write(8);
lcd.setCursor(16,2);
lcd.write(79);
lcd.setCursor(17,2);
lcd.write(95);
lcd.setCursor(18,2);
lcd.write(111);
delay(5000);
lcd.clear();
initBar2();
lcd.setCursor(12,1);
lcd.print("km/h");
lcd.setCursor(8,3);
lcd.print("BATT:");
lcd.setCursor(16,3);
lcd.print("%");
lcd.createChar(6,STRUP);
lcd.createChar(7,STRDOWN);
noTone(BUZZ);
}
void loop() {
//работа со спидометром
val = analogRead(POT);
val = map(val, 0, 1023, 0, 100);
val = constrain(val, 0, 100);
//fillBar2 принимает аргументы (столбец, строка, длина полосы, значение в % (0 - 100) )
fillBar2(8, 0 , 9, val);
if (val < 90) {
int val1 = val;
val1 = constrain(val1, 0, 9);
val1 = map(val, 0, 100, 0, 9);
lcd.setCursor(9,1);
lcd.print(" ");
lcd.setCursor(10,1);
lcd.print(val1);
}
else if (val >= 90) {
int val1 = val;
val1 = constrain(val1, 0, 12);
val1 = map(val, 0, 100, 0, 12);
lcd.setCursor(9,1);
lcd.print(val1);
}
//работа С ПОВОРОТОМ
LEFT = digitalRead(LEFTBTN);
RIGHT = digitalRead(RIGHTBTN);
if ( LEFT == 0 && round(millis() / 500) % 2 == 0 ) { // ищем разницу
tone(BUZZ, 100);
lcd.setCursor(5,0);
lcd.write(60);
lcd.setCursor(6,0);
lcd.write(60);
lcd.setCursor(7,0);
lcd.write(60);
}
else if ( RIGHT == 0 && round(millis() / 500) % 2 == 0 ) { // ищем разницу
tone(BUZZ, 100);
lcd.setCursor(17,0);
lcd.write(62);
lcd.setCursor(18,0);
lcd.write(62);
lcd.setCursor(19,0);
lcd.write(62);
}
else {
noTone(BUZZ);
lcd.setCursor(5,0);
lcd.print(" ");
lcd.setCursor(6,0);
lcd.print(" ");
lcd.setCursor(7,0);
lcd.print(" ");
lcd.setCursor(17,0);
lcd.print(" ");
lcd.setCursor(18,0);
lcd.print(" ");
lcd.setCursor(19,0);
lcd.print(" ");
}
//работа с выбором передачи
FORWARD = digitalRead(FORWARDBTN);
REVERSES = digitalRead(REVERSEBTN);
if (FORWARD < REVERSES) {
lcd.setCursor(0,0);
lcd.write(255);
lcd.setCursor(0,1);
lcd.write(255);
lcd.setCursor(0,2);
lcd.write(255);
lcd.setCursor(0,3);
lcd.write(255);
lcd.setCursor(1,0);
lcd.write(255);
lcd.setCursor(2,0);
lcd.write(255);
lcd.setCursor(3,1);
lcd.write(255);
lcd.setCursor(3,2);
lcd.write(255);
lcd.setCursor(2,3);
lcd.write(255);
lcd.setCursor(1,3);
lcd.write(255);
lcd.setCursor(1,1);
lcd.print(" ");
lcd.setCursor(2,1);
lcd.print(" ");
lcd.setCursor(1,2);
lcd.print(" ");
lcd.setCursor(2,2);
lcd.print(" ");
lcd.setCursor(3,0);
lcd.print(" ");
lcd.setCursor(3,3);
lcd.print(" ");
lcd.setCursor(5,3);
lcd.write(6);
lcd.setCursor(5,2);
lcd.write(6);
lcd.setCursor(5,1);
lcd.write(6);
lcd.setCursor(6,3);
lcd.write(6);
lcd.setCursor(6,2);
lcd.write(6);
lcd.setCursor(6,1);
lcd.write(6);
}
else if (FORWARD > REVERSES) {
lcd.setCursor(0,0);
lcd.write(255);
lcd.setCursor(0,1);
lcd.write(255);
lcd.setCursor(0,2);
lcd.write(255);
lcd.setCursor(0,3);
lcd.write(255);
lcd.setCursor(1,0);
lcd.write(255);
lcd.setCursor(2,0);
lcd.write(255);
lcd.setCursor(3,1);
lcd.write(255);
lcd.setCursor(1,2);
lcd.write(255);
lcd.setCursor(2,2);
lcd.write(255);
lcd.setCursor(3,3);
lcd.write(255);
lcd.setCursor(3,0);
lcd.print(" ");
lcd.setCursor(2,1);
lcd.print(" ");
lcd.setCursor(1,1);
lcd.print(" ");
lcd.setCursor(3,2);
lcd.print(" ");
lcd.setCursor(1,3);
lcd.print(" ");
lcd.setCursor(2,3);
lcd.print(" ");
lcd.setCursor(5,3);
lcd.write(7);
lcd.setCursor(5,2);
lcd.write(7);
lcd.setCursor(5,1);
lcd.write(7);
lcd.setCursor(6,3);
lcd.write(7);
lcd.setCursor(6,2);
lcd.write(7);
lcd.setCursor(6,1);
lcd.write(7);
}
else if (FORWARD == REVERSES) {
lcd.setCursor(0,0);
lcd.write(255);
lcd.setCursor(0,1);
lcd.write(255);
lcd.setCursor(0,2);
lcd.write(255);
lcd.setCursor(0,3);
lcd.write(255);
lcd.setCursor(1,1);
lcd.write(255);
lcd.setCursor(2,2);
lcd.write(255);
lcd.setCursor(3,0);
lcd.write(255);
lcd.setCursor(3,1);
lcd.write(255);
lcd.setCursor(3,2);
lcd.write(255);
lcd.setCursor(3,3);
lcd.write(255);
lcd.setCursor(1,0);
lcd.print(" ");
lcd.setCursor(2,0);
lcd.print(" ");
lcd.setCursor(1,2);
lcd.print(" ");
lcd.setCursor(2,3);
lcd.print(" ");
lcd.setCursor(1,3);
lcd.print(" ");
lcd.setCursor(5,3);
lcd.print(" ");
lcd.setCursor(5,2);
lcd.print(" ");
lcd.setCursor(5,1);
lcd.print(" ");
lcd.setCursor(6,3);
lcd.print(" ");
lcd.setCursor(6,2);
lcd.print(" ");
lcd.setCursor(6,1);
lcd.print(" ");
}
// работа батареи
int BATT = analogRead(BATTVOL);
BATT = map(BATT, 0, 1023, 0, 100);
BATT = constrain(BATT, 0, 100);
if (BATT < 10) {
lcd.setCursor(13,3);
lcd.print(" ");
lcd.setCursor(14,3);
lcd.print(" ");
lcd.setCursor(15,3);
lcd.print(BATT);
}
else if (10 <= BATT && BATT < 100) {
lcd.setCursor(13,3);
lcd.print(" ");
lcd.setCursor(14,3);
lcd.print(BATT);
}
else if (BATT >= 100) {
lcd.setCursor(13,3);
lcd.print(BATT);
}
}
void initBar2() {
// необходимые символы для работы
// создано в http://maxpromer.github.io/LCD-Character-Creator/
byte right_empty[8] = {0b11111, 0b00001, 0b00001, 0b00001, 0b00001, 0b00001, 0b00001, 0b11111};
byte left_empty[8] = {0b11111, 0b10000, 0b10000, 0b10000, 0b10000, 0b10000, 0b10000, 0b11111};
byte center_empty[8] = {0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111};
byte left_full[8] = {0b11111, 0b10000, 0b10111, 0b10111, 0b10111, 0b10111, 0b10000, 0b11111};
byte right_full[8] = {0b11111, 0b00001, 0b11101, 0b11101, 0b11101, 0b11101, 0b00001, 0b11111};
byte center_full[8] = {0b11111, 0b00000, 0b11111, 0b11111, 0b11111, 0b11111, 0b00000, 0b11111};
lcd.createChar(0, left_empty);
lcd.createChar(1, center_empty);
lcd.createChar(2, right_empty);
lcd.createChar(3, left_full);
lcd.createChar(4, center_full);
lcd.createChar(5, right_full);
}
void fillBar2(byte start_pos, byte row, byte bar_length, byte fill_percent) {
byte infill = round((float)bar_length * fill_percent / 100);
lcd.setCursor(start_pos, row);
if (infill == 0) lcd.write(0);
else lcd.write(3);
for (int n = 1; n < bar_length - 1; n++) {
if (n < infill) lcd.write(4);
if (n >= infill) lcd.write(1);
}
if (infill == bar_length) lcd.write(5);
else lcd.write(2);
}