Мой код 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()?, @jsotola


1 ответ


Лучший ответ:

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