#include <EEPROM.h> // підключаємо бібліотеку ЕЕпром
#define RED 500 // період блимання в мс
uint32_t red; // змінна таймера
String command; // змінна для збереження отриманої команди
String firstWord; // змінна для збереження першого слова в команді
String secondWord; // змінна для збереження другого слова в команді
byte number = -1; // змінна для збереження числа, якщо воно є
int counter1 = 0; // зміння для обмеження кількості разів виконання циклу
int counter2 = 0; // зміння для обмеження кількості разів виконання циклу
byte value; // змінна якій присвоюємо байт з ЕЕпрому
int redCount = 0; // змінна яка дозволяє лампочці моргнути лише три рази
byte rflag = 0; // байт стану червоної лампочки
byte flag_r = 0; // байт виконання циклу "Помилка"
byte err = 0; // змінна для обмеження кількості виводів повідомлення "Помилка" в Serial
void setup() {
pinMode(6, OUTPUT); // 6 пін як вихід
pinMode(10, OUTPUT); // 10 пін як вихід
Serial.begin(9600); // ініціалізація Serial порту
Serial.println("System is ready");
}
void loop() {
if (Serial.available() > 0) { // перевірка, чи є дані в Serial порті
counter1 = 0; //обнуляємо змінну для можливості циклу зі зчитуванням
counter2 = 0; //обнуляємо змінну для можливості циклі із записування
command = Serial.readStringUntil('?'); // зчитування команди до знаку '?'
command.trim(); // видалення пробілів з початку та кінця команди
int slashIndex = command.indexOf('/'); // пошук індексу першого знаку '/'
firstWord = command.substring(0, slashIndex); // виокремлення першого слова з команди
command = command.substring(slashIndex + 1); // видалення першого слова з команди
slashIndex = command.indexOf('/'); // пошук індексу другого знаку '/'
if (slashIndex == -1) { // якщо другого знаку '/' немає, то команда складається з двох слів
secondWord = command;
} else { // якщо другий знак '/' є, то команда складається з трьох слів
secondWord = command.substring(0, slashIndex); // виокремлення другого слова з команди
command = command.substring(slashIndex + 1); // видалення другого слова з команди
number = command.toInt(); // конвертування останнього елементу в число
}
if ((firstWord == "Oleg" && secondWord == "Read") || (firstWord == "Oleg" && secondWord == "Write" && number < 2) || (firstWord == "" && secondWord == "" && number < 2)) { //якщо умова паролю зчитування чи записування виконується
readEEPROM(); // виконується відповідний цикл
writeEEPROM();
}
else flag_r = 1; // якщо умова не виконуєтьсяб запускаємо Код Помилка
}
if (flag_r == 1) {
if (millis() - red >= RED && redCount < 6) { // кожні 500мс стан лампочки буде змінюватися
red = millis(); // скидаємо таймер
digitalWrite(6, !rflag); // запалюємо чи гасимо діод
rflag = !rflag; // інвертуємо стан діода
redCount += 1; // збільшуємо лічильник на одиницю
}
if (err < 1) { // якщо Код Помилка
err += 1;
Serial.println("ERROR CODE"); // відповідне повідомлення
}
}
if (redCount == 6) { // якщо лічильник переповнився, вимимкаємо Код Помилку
flag_r = 0;
err = 0;
redCount = 0;
}
}
void readEEPROM() { // цикл для зчитування данних з ЕЕпром
if (firstWord == "Oleg" && secondWord == "Read" && counter1 < 1) {
value = (EEPROM[1]);
Serial.print("EEPROM Read: ");
Serial.println(value);
digitalWrite(10, 1);
delay(2000);
digitalWrite(10, 0);
counter1 += 1;
}
}
void writeEEPROM() { // цикл запису данних в ЕЕпром
if (firstWord == "Oleg" && secondWord == "Write" && counter2 < 1) {
EEPROM.update(1, number);
Serial.println("EEPROM Write");
digitalWrite(10, 1);
delay(2000);
digitalWrite(10, 0);
counter2 += 1;
}
}