Skip to content

Instantly share code, notes, and snippets.

@Viiprogrammer
Created July 22, 2023 08:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Viiprogrammer/382df96eeb603e1051a63c8bee49d2e0 to your computer and use it in GitHub Desktop.
Save Viiprogrammer/382df96eeb603e1051a63c8bee49d2e0 to your computer and use it in GitHub Desktop.
#include <LiquidCrystal.h>
#include <EEPROM.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
#define BTN_UP 1
#define BTN_DOWN 2
#define BTN_LEFT 3
#define BTN_RIGHT 4
#define BTN_SELECT 5
#define BTN_NONE 10
#define BTN_DELAY 200
#define MAX_PULSES 100
#define MIN_PULSES 2
#define EEPROM_PULSES_ADDR 0
byte CHAR_YA[8] = {B01111,B10001,B10001,B01111,B00101,B01001,B10001,B00000,}; // Буква "Я"
byte CHAR_I[8] = {B10001,B10011,B10011,B10101,B11001,B11001,B10001,B00000,}; // Буква "И"
byte CHAR_P[8] = {B11111,B10001,B10001,B10001,B10001,B10001,B10001,B00000,}; // Буква "П"
byte CHAR_Y[8] = {B10001,B10001,B10001,B01010,B00100,B01000,B10000,B00000,}; // Буква "У"
byte CHAR_L[8] = {B00011,B00111,B00101,B00101,B01101,B01001,B11001,B00000,}; // Буква "Л"
byte CHAR_MZ[8] = {B10000,B10000,B10000,B11110,B10001,B10001,B11110,B00000,}; // Буква "Ь"
byte CHAR_IYI[8] = {B10001,B10001,B10001,B11001,B10101,B10101,B11001,B00000,}; // Буква "Ы"
bool menu = false;
bool started = false;
uint8_t maxPulsesCount = MIN_PULSES;
uint8_t currentPulses = 0;
uint32_t lastMillis = 0;
uint32_t startMillis = 0;
uint32_t resultMillis = 0;
uint16_t detectButton() {
int keyAnalog = analogRead(A0);
if (keyAnalog < 100) {
// Значение меньше 100 – нажата кнопка right
return BTN_RIGHT;
} else if (keyAnalog < 200) {
// Значение больше 100 (иначе мы бы вошли в предыдущий блок результата сравнения, но меньше 200 – нажата кнопка UP
return BTN_UP;
} else if (keyAnalog < 400) {
// Значение больше 200, но меньше 400 – нажата кнопка DOWN
return BTN_DOWN;
} else if (keyAnalog < 600) {
// Значение больше 400, но меньше 600 – нажата кнопка LEFT
return BTN_LEFT;
} else if (keyAnalog < 800) {
// Значение больше 600, но меньше 800 – нажата кнопка SELECT
return BTN_SELECT;
} else {
// Все остальные значения (до 1023) будут означать, что нажатий не было
return BTN_NONE;
}
}
void displayImpulses () {
lcd.print('\6');
lcd.print('M');
lcd.print('\5');
lcd.print('\4');
lcd.print('\3');
lcd.print('\2');
lcd.print('C');
}
void printDisplay(uint32_t currentMillis){
if (!menu) {
lcd.setCursor(0, 0);
lcd.print("BPEM");
lcd.print('\7');
lcd.print(':');
uint32_t millis = started ? currentMillis : resultMillis;
uint32_t buf = millis ? (millis - startMillis) : 0;
uint32_t tmp = buf;
lcd.print(tmp / 1000);
tmp = (tmp % 1000);
lcd.print('.');
lcd.print(tmp / 100);
tmp = (tmp % 100);
lcd.print(tmp / 10);
tmp = (tmp % 10);
lcd.print(tmp);
lcd.setCursor(0, 1);
displayImpulses();
lcd.print(":");
lcd.print(currentPulses);
lcd.print(" ");
} else {
lcd.setCursor(0, 0);
displayImpulses();
lcd.print('\1');
lcd.print(":");
lcd.print(maxPulsesCount);
lcd.print(" ");
}
}
void setup() {
Serial.begin(9600);
maxPulsesCount = EEPROM.read(EEPROM_PULSES_ADDR);
maxPulsesCount = maxPulsesCount == 0xFF ? MIN_PULSES : maxPulsesCount;
lcd.begin(16, 2);
lcd.createChar(7, CHAR_YA);
lcd.createChar(6, CHAR_I);
lcd.createChar(5, CHAR_P);
lcd.createChar(4, CHAR_Y);
lcd.createChar(3, CHAR_L);
lcd.createChar(2, CHAR_MZ);
lcd.createChar(1, CHAR_IYI);
}
void loop() {
uint16_t button = detectButton();
uint32_t currentMillis = millis();
if (button != BTN_NONE && currentMillis - lastMillis > BTN_DELAY) {
if (button == BTN_SELECT && menu == false) {
menu = true;
while (detectButton() == BTN_SELECT) {};
lcd.clear();
} else if (menu == true) {
if (button == BTN_SELECT) {
EEPROM.write(EEPROM_PULSES_ADDR, maxPulsesCount);
menu = false;
lcd.clear();
} else if (button == BTN_UP) {
if (maxPulsesCount < MAX_PULSES) {
maxPulsesCount++;
} else {
maxPulsesCount = MIN_PULSES;
}
} else if (button == BTN_DOWN) {
if (maxPulsesCount > MIN_PULSES) {
maxPulsesCount--;
} else {
maxPulsesCount = MAX_PULSES;
}
}
}
lastMillis = millis();
}
printDisplay(currentMillis);
if (menu == false && resultMillis == 0 && button == BTN_LEFT && started == false) {
started = true;
startMillis = millis();
currentPulses++;
} else if (button == BTN_LEFT && started == true) {
currentPulses++;
if (maxPulsesCount <= currentPulses) {
started = false;
resultMillis = millis();
}
} else if (menu == false && button == BTN_RIGHT) {
resultMillis = 0;
currentPulses = 0;
currentPulses = 0;
}
delay(100);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment