ARDUINO Как посчитать в миллисекундах интервал?

denzel

✩✩✩✩✩✩✩
21 Окт 2020
27
2
Все привет! Прикрутил к ардуино датчик освещения. Когда свет горит - на дисплее 0, когда света нет - 1. Знатоки, подскажите, как вычислить и вывести время в миллисекундах между выключенным и включены светом? Буду очень благодарен!

C++:
// 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();
  }
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
Это что за время Между какими событиями ?
Свет зажигается практически мгновенно. Другое дело, если надо запомнить время сколько был свет выключен или включен.
 

denzel

✩✩✩✩✩✩✩
21 Окт 2020
27
2
Это что за время Между какими событиями ?
Свет зажигается практически мгновенно. Другое дело, если надо запомнить время сколько был свет выключен или включен.
Привет!
Нужно узнать точное время между сигналом 0 (включенным светом) и сигналом 1 (выключенный свет).
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
Ага, это время пока свет был включен.
Заводишь логический флаг, который будет ЛОЖЬ
Пока свет выключен и флаг ЛОЖЬ все время запоминаешь текущее время.
Пока свет выключен и флаг ИСТИНА это значит надо вывести запомненное время
Пока свет включен Флаг установить в ИСТИНА
Как то так
 

denzel

✩✩✩✩✩✩✩
21 Окт 2020
27
2
Ага, это время пока свет был включен.
Заводишь логический флаг, который будет ЛОЖЬ
Пока свет выключен и флаг ЛОЖЬ все время запоминаешь текущее время.
Пока свет выключен и флаг ИСТИНА это значит надо вывести запомненное время
Пока свет включен Флаг установить в ИСТИНА
Как то так
Спасибо за ответ! Правильно понимаю что для этого лучше всего подойдет цикл for?
 

Boroda

✩✩✩✩✩✩✩
20 Янв 2020
17
2
А вывести куда? Просто у Вас ещё и порт открыт.
 

Neo110001

✩✩✩✩✩✩✩
14 Окт 2020
16
4
Создать 2 переменных. Когда начинается 0, Присвоить переменной значение с начала работы ардуино (функция millis()). Когда значение 1, 2я переменная=millis()- 1я переменная. Во 2й переменной хранится значение
 

Boroda

✩✩✩✩✩✩✩
20 Янв 2020
17
2
Создать 2 переменных. Когда начинается 0, Присвоить переменной значение с начала работы ардуино (функция millis()). Когда значение 1, 2я переменная=millis()- 1я переменная. Во 2й переменной хранится значение
И заодно убрать делей и очищать дисплей только при появлении "1"
 

denzel

✩✩✩✩✩✩✩
21 Окт 2020
27
2
Создать 2 переменных. Когда начинается 0, Присвоить переменной значение с начала работы ардуино (функция millis()). Когда значение 1, 2я переменная=millis()- 1я переменная. Во 2й переменной хранится значение
Привет. Как-то так верно?

C++:
// include the library code:
#include <LiquidCrystal.h> //дисплай
int ledPin = 13; //светодиод на 13 порту
int inPin = 2; // на 2 входе
int val = 0; // переменая для хранения значения
int timeMy = 0;
int timeMy2 = 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) {
    

  
    timeMy =  millis();
  }
  
 
  delay(100);
   lcd.clear();
   timeMy2 =  millis() - timeMy;
   lcd.print (timeMy2);
  }
 

Neo110001

✩✩✩✩✩✩✩
14 Окт 2020
16
4
наверно нет. Первая переменная будет перезаписываться все время, пока 0. Не корректно будет работать. Нужно создать еще одну логическую и сделать ее 1, когда изменяешь первую переменную

и в условии учитывать, 0 или 1 она равна.

и в условии учитывать, 0 или 1 она равна.
и если значение с датчика переходит к 0 , а было 1, перезаписать логическую переменную на 0
 

Boroda

✩✩✩✩✩✩✩
20 Янв 2020
17
2
Как говорится: - А во сколько лет ты это узнал. - В сегодня лет.
Оказалось, что в ардуино языке есть встроенная функция pulseln() для измерения времени периуда между сменой сигналя на пине. Возвращает значение в микросекундах(лечится делением на 1000) Если время между выкл/вкл у Вас не превышает 3 мин, по вполне подойдёт.
 

bort707

★★★★★★✩
21 Сен 2020
3,056
910
Оказалось, что в ардуино языке есть встроенная функция pulseln() для измерения времени периуда между сменой сигналя на пине. Возвращает значение в микросекундах(лечится делением на 1000) Если время между выкл/вкл у Вас не превышает 3 мин, по вполне подойдёт.
очень неудачный выбор, эта функция вешает МК пока ждет смены уровня на пине. Если речь идет о минутах, лучше использовать просто чтение уровня пина
 

Boroda

✩✩✩✩✩✩✩
20 Янв 2020
17
2
Ну, по тех заданию, проц больше ничего и не должен делать т.ч. допустимо(меньше дисплей моргать будет если опять лишних клиров наставят) :) , а про ограничение по времени я написал.