Как лучше считать время между 0 и 1 в миллисекундах
Прикрутил к ардуино датчик освещения. Когда свет горит - на дисплее 0, когда света нет - 1. Как вычислить и вывести время в миллисекундах между выключенным и включены светом?
// include the library code:
#include <LiquidCrystal.h> //дисплей
int ledPin = 13; //светодиод на 13 порту
int inPin = 2; // на 2 входе
int val = 0; // переменная для хранения значения
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup()
{
lcd.begin(16, 2); // устанавливаем количество столбцов и строк на ЖК-дисплее:
//lcd.print("hello, world!"); // Выводим сообщение на ЖК-дисплей.
Serial.begin(9600); //скорость передачи данных
pinMode(ledPin, OUTPUT);
pinMode(inPin, INPUT);
}
void loop()
{
val = digitalRead(inPin); //считывет значение с 2го
if (val == 0)
{
lcd.print (val);; //устанавливает значение на светодиод равное значению входа 5 вольт
delay(1);
lcd.clear();
}
lcd.print(val);
delay(100);
lcd.clear();
}
Ответы (1 шт):
Автор решения: vp_arth
→ Ссылка
Дела с Ардуинами не имел, вероятно пишу дичь)
int last_state = 0;
int val = 0;
uint32_t switch_time;
uint32_t duration_0;
uint32_t duration_1;
void loop() {
val = digitalRead(inPin);
if (last_state != val) { // Состояние изменилось, делаем замеры
uint32_t now_time = millis();
if (val == 0) {
duration_0 = 0;
duration_1 = now_time - switch_time;
// lcd.print(duration_1);
} else {
duration_0 = now_time - switch_time;
duration_1 = 0;
lcd.print(duration_0);
}
switch_time = millis();
}
last_state = val;
// ...
}
Скорее всего, лучше всё это вынести в обработчик прерывания а в основном цикле просто печатать волатильную переменную.