Created
July 22, 2023 08:20
-
-
Save Viiprogrammer/382df96eeb603e1051a63c8bee49d2e0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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