#include <LiquidCrystal_I2C.h> //Библиотека работы с экраном
volatile int seconds_s = 0; // время старта
volatile int seconds_f = 0; // время финиша
String s; // служебная переменная для строк
int seconds_l = 0; // предыдущее значение
LiquidCrystal_I2C lcd(0x27, 16, 2); // объявляем переменную lcd как экран двухстрочный 16 символов на строку по адресу шины 0x27
// рисуем символ Л для знакогенератора экрана
byte ru_L[8] = {
0b00011,
0b00101,
0b01001,
0b01001,
0b10001,
0b10001,
0b10001,
0b00000
};
// рисуем символ П для знакогенератора экрана
byte ru_P[8] = {
0b11111,
0b10001,
0b10001,
0b10001,
0b10001,
0b10001,
0b10001,
0b00000
};
// рисуем символ Ш для знакогенератора экрана
byte ru_SH[8] = {
0b10001,
0b10101,
0b10101,
0b10101,
0b10101,
0b10101,
0b11111,
0b00000
};
// рисуем символ Ы для знакогенератора экрана
byte ru_JY[8] = {
0b10001,
0b10001,
0b10001,
0b11101,
0b10011,
0b10011,
0b11101,
0b00000
};
// рисуем символ Й для знакогенератора экрана
byte ru_JI[8] = {
0b10110,
0b10101,
0b10001,
0b10011,
0b10101,
0b11001,
0b10001,
0b00000
};
// рисуем символ И для знакогенератора экрана
byte ru_I[8] = {
0b10001,
0b10001,
0b10001,
0b10011,
0b10101,
0b11001,
0b10001,
0b00000
};
void setup()
{
lcd.init(); // инициализация экрана
// грузим символы в экран
lcd.createChar(0, ru_L);
lcd.createChar(1, ru_P);
lcd.createChar(2, ru_SH);
lcd.createChar(3, ru_JY);
lcd.createChar(4, ru_JI);
lcd.createChar(5, ru_I);
lcd.backlight(); // включить подсветку экрана
lcd.setCursor(5, 0); // курсор на нулевой строке 5й символ
// печатаем текст приветстивия
lcd.write(byte(1)); // печатаем загруженную букву П
lcd.print("P");
lcd.write(byte(5)); // печатаем загруженную букву И
lcd.print("BET!");
attachInterrupt(digitalPinToInterrupt(2),buttonPressed1,FALLING ); // Прерывания по первому датчику (когда в вноль нога)
attachInterrupt(digitalPinToInterrupt(3),buttonPressed2,FALLING ); // Прерывания по второму датчику (когда в вноль нога)
}
void loop()
{
if (seconds_s != 0) // если стартовый сработал то гасим экран (чтобы сигнализировать режим)
{
lcd.clear(); // очистить экран
lcd.noBacklight(); // выключить подсветку экрана
}
if (seconds_f != 0) // если конечные секунды не 0, значит сработал финишный датчик
{
if (seconds_s == 0) // на всяуий случай стартовый проверим (вдруг финиш нажали до старта)
{
seconds_f = 0; // тогла обнулим финиш и продолжим ждать старт
}
else
{
lcd.clear(); // очищаем экран
lcd.backlight(); // включить подсветку экрана
lcd.setCursor(0, 0); // курсор на 0 символ 0 строки
lcd.print("PE3Y");
lcd.write(byte(0)); // печатаем загруженную букву Л
lcd.print("bTAT 0,000c"); // сразу маска с запятой и "с"
// Сделаем цикл с конца строки до начала - и по одному символу будем заполнять сразу в экран поверх маски
// сначала получим строку из целого
s = seconds_f - seconds_s;
// цикл от длины строки до нуля
for(int i = s.length()-1; i >= 0; i-- )
{
//для запятой курсор смещаем еще на 1 позицию левее
if (15 - (s.length() - i) < 12)
{
lcd.setCursor(15 - (s.length() - i) - 1, 0);
}
else //если правее запятой, то без смещения
{
lcd.setCursor(15 - (s.length() - i), 0);
}
lcd.print(s[i]); // Печатаем один символ в позицию курсора
}
if (seconds_l != 0) // если есть прошлый результат то печатаем его на второй строке
{
lcd.setCursor(0, 1); // курсор на 0 символ 1 строки
lcd.write(byte(1)); // печатаем загруженную букву П
lcd.print("PO");
lcd.write(byte(2)); // печатаем загруженную букву Ш
lcd.write(byte(0)); // печатаем загруженную букву Л
lcd.write(byte(3)); // печатаем загруженную букву Ы
lcd.write(byte(4)); // печатаем загруженную букву Й
lcd.print(" 0,000c");
// Сделаем цикл с конца строки до начала - и по одному символу будем заполнять сразу в экран поверх маски
// сначала получим строку из целого
s = seconds_l;
// цикл от длины строки до нуля
for(int i = s.length()-1; i >= 0; i-- )
{
//для запятой курсор смещаем еще на 1 позицию левее
if (15 - (s.length() - i) < 12)
{
lcd.setCursor(15 - (s.length() - i) - 1, 1);
}
else //если правее запятой, то без смещения
{
lcd.setCursor(15 - (s.length() - i), 1);
}
lcd.print(s[i]); // Печатаем один символ в позицию курсора
}
}
seconds_l = seconds_f - seconds_s; // сохраняем новый прошлый результат
seconds_f = 0; // обнуляем переменные для следующего цикла
seconds_s = 0; // обнуляем переменные для следующего цикла
}
}
}
void buttonPressed1() // эта функция для обработки прерывания выполняется при нажатии кнопки 1
{
seconds_s = millis(); // сохраняем миллисекунды старта
}
void buttonPressed2() // эта функция для обработки прерывания выполняется при нажатии кнопки 2
{
seconds_f = millis(); //сохраняем миллисекунды финиша
}