Проблемы с таймером

Тема в разделе "Arduino & Shields", создана пользователем Никита Мещеряков, 29 мар 2019.

Метки:
  1. Мне необходимо получать команду от пользователя через порт и проверять ввел ли он. Если в течение 10 секунд не получаем команду то выводим (ок).

    код
    Код (C++):
    unsigned long time;
    unsigned long time1;
    char c;
    void setup() {
    Serial.begin(9600);
    }

    void loop() {
      c=Serial.read();
    if (c=='4'){
        time1=time+10000;
      time = millis();
       if (time1=time){
       Serial.print("ok");
       }
    }

    }
     
    Последнее редактирование модератором: 29 мар 2019
  2. b707

    b707 Гуру

    Никита, так работать не будет. Строчку time = millis(); перенесите в самое начало loop() - тогда заработает
     
  3. DIYMan

    DIYMan Guest

    Если ничего не вводится - то каждые 10 секунд будет выводить в порт "ОК". Если что-то вводится с интервалами, меньшими чем 10 секунд - то время вывода ОК сдвигается. Анализируйте.

    Код (C++):
    uint32_t lastCommandGotAt = 0;

    void setup()
    {
        Serial.begin(9600);
    }

    void loop()
    {
        while(Serial.available())
        {
            char ch = Serial.read();
            lastCommandGotAt = millis();      
        }
       
        if(millis() - lastCommandGotAt > 10000)
        {
            lastCommandGotAt = millis();
            Serial.println(F("OK"));
        }
    }
     
    Tomasina и Daniil нравится это.
  4. Daniil

    Daniil Гуру

    Добавлю, что операция присваивания ("=") и операция сравнение на равенство ("==") пишутся по-разному.
    У ТС в ифе "=", и код не будет работать так, как хочет ТС, т.к. после первой проверки времени код не "доползет" до проверки времени, т.к. в следующем цикле loop`а serial.read уже не даст "4".
    DIYmаn, что такое F("OK")?
     
  5. DIYMan

    DIYMan Guest

    Daniil нравится это.