#include LiquidCrystal_I2C lcd(0x27, 16, 2); float r_speed, rev_time_1 , rev_time_2, difference ; volatile unsigned long lastflash1 ,lastflash2, flash_1, flash_2, lastshow ; float RPM; String spaces = " "; // 3 очищающх пробелов String spaces2 = " "; // 4 очищающх пробелов void setup() { attachInterrupt(PB9, sens, FALLING); // подключить прерывание на B9 пин по падающему фронту attachInterrupt(PB8, sens_two, FALLING); //подключить прерывание на B8 пин по падающему фронту //pinMode (PC13, OUTPUT) ; lcd.begin(); // инициализация дисплея lcd.backlight(); // включить подсветку } void sens() { flash_1 = micros() - lastflash1; // вычислить время оборота 1 колеса lastflash1 = micros(); //digitalWrite(PC13, !digitalRead(PC13)); } void sens_two() { flash_2 = micros() - lastflash2; // вычислить время оборота 2 колеса lastflash2 = micros(); // запомнить время оборота //digitalWrite(PC13, !digitalRead(PC13)); } void loop() { if (micros() - lastflash1 > 2000000) // если сигнала нет больше N - секунд { rev_time_1 = 0; // считаем, что всё стоит и не крутится rev_time_2 = 0; // считаем, что всё стоит и не крутится difference = 0; // считаем, что всё стоит и не крутится r_speed = 0 ; // считаем, что всё стоит и не крутится } else { rev_time_1 = (double) flash_1 / 1000000; // время оборота 1 колеса в секундах rev_time_2 = (double) flash_2 / 1000000; // время оборота 2 колеса в секундах difference = (rev_time_1 - rev_time_2)*1000; // диференциальное значение времени в милисекундах r_speed = (162/rev_time_2)/100 ; // скорость метров/минуту (60*9*300/время импульса )/1000 } if (micros() - lastshow > 200000) // каждые 80000 микросекунд { lcd.setCursor(0, 0); // курсор в начале слева на 1й строчке lcd.print("r1"); // слово revolve 1 lcd.setCursor(3, 0); // курсор на 1й строчке, позиция 3 lcd.print(rev_time_1,3); // выводим значение время оборота 1 колеса в секундах lcd.setCursor(8, 0); // курсор на 1й строчке, позиция 7 lcd.print(spaces); // очищаем цифры с прошлого вывода lcd.setCursor(0, 1); // курсор в начале слева на 2й строчка lcd.print("r2"); // слово revolve 2 lcd.setCursor(3, 1); // курсор на 2й строчке, позиция 3 lcd.print(rev_time_2,3); // выводим значение время оборота 2 колеса в секундах lcd.setCursor(8, 1); // курсор на 2й строчке, позиция 7 lcd.print(spaces2); // очищаем цифры с прошлого вывода lcd.setCursor(10, 0); // lcd.print("S="); // lcd.setCursor(12, 0); // lcd.print(r_speed,1); // выводим значение r_speed lcd.setCursor(12, 1); // lcd.print(difference,2); // выводим значение difference lastshow = micros(); // сброс таймера } }