Мой код millis() не работает
Я делаю проект с bluetooth и светодиодом. Я написал код, который должен включать светодиод после того, как он получит байт со значением 1 через 5 секунд, если только он не получит еще один байт со значением 1 (из-за чего ему нужно ждать еще 5 секунд), так что если он периодически получает байт , светодиод не включается, а включается только в том случае, если отправка значения байта остановлена/отключен Bluetooth. Я написал этот код, и он, похоже, не работает. Он даже не включает светодиод через 5 секунд. Не могли бы вы помочь мне найти здесь ошибку?
unsigned long timebetween=5000;
unsigned long lastreceivedtime;
int value;
bool timerReady = false;
void setup() {
pinMode (11,OUTPUT);
Serial.begin(9600);
}
void loop() {
unsigned long currentMillis = millis();
if( Serial.available() >0){
value = Serial.read();
}
if ( value ==1 ){
lastreceivedtime = currentMillis;
timerReady = true;
}
if(timerReady) {
if((unsigned long)(currentMillis - lastreceivedtime) >= timebetween){
digitalWrite(11, HIGH);
delay(90);
}
}
}
1 ответ
Лучший ответ:
Я не думаю, что что-то в вашем коде будет работать. Первый, вы просите serial.Read вернуть целое число, если оно работает. Возможно, вы захотите изменить его на логическое значение.
Во-вторых, Вы запрашиваете 1 и только 1, чтобы сделать ваше следующее утверждение if истинным. Если serial.Read работает, шанс, что он вернет только единицу, я думаю, очень мал
В-третьих, В операторе IF для установки timerReady. Вы будете устанавливать это на новый номер каждый раз, когда программа будет выполняться, с задержкой 90 мс в последнем операторе IF, похоже, что ваш таймер будет сбрасываться примерно каждые 95-100 мс
В-четвертых, Я думаю, что ваши последние 2 утверждения IF неверны, я думаю, вы хотите
if(timerReady==true) {
if((currentMillis - lastreceivedtime) >= timebetween){
digitalWrite(11, HIGH);
delay(90);
Если у вас все-таки получится, вам может понадобиться снова установить логическое значение на false и в какой-то момент переместить вывод 11 в низкий уровень.
Большое спасибо! Я изменил некоторые строки, и это сработало., @Farizki Kurniawan
Почему проблематично сохранить возвращаемое значение Serial.read()
в переменной int
? На самом деле это тот тип, который возвращает эта функция, так зачем использовать здесь логическое значение?, @chrisl
Потому что единственная причина, по которой он смотрит серийный номер. Читает, чтобы увидеть, существует ли он и работает ли он, на самом деле его не волнует, что там, главное, чтобы это работало. Serial.Read используется как выключатель света, включено или выключено, TRUE или FALSE, @Jeff A
- Как справиться с rollover millis()?
- Торговый автомат Arduino для мониторинга ввода монет в слот во время ожидания ввода пользователя
- Bluetooth-модуль HC-05 не принимает AT-команды
- Как прервать соединение HM10 Bluetooth?
- Та же кнопка одним кликом и двойным кликом
- Обеспечиваем более быстрое и точное обнаружение MindWave Mobile
- ПК не может получить доступ к порту HC-06 Bluetooth COM
- Как запустить 4 светодиода последовательно на основе кнопочного входа?
откуда вы знаете, какое значение возвращает
Serial.read()
?, @jsotola