Работа реле на определенное время

Блин, 40 сообщений - и ни один не посоветовал вывести в сериал результат работы parseInt()

Какой смысл обсуждать работу таймера, если вы даже не знаете, какой у него период?

1 лайк

Туть страньше другое - они все бросились помогать! При достаточном пофигизме ТС и наличии пятницы. :thinking:
Ну тудыть её в качель и я подкину такой же хм-хм рабочий код.


void setup() {
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  if (Serial.available() > 0) {
    digitalWrite(LED_BUILTIN, HIGH);
    Serial.setTimeout(1000UL * Serial.parseInt());
    digitalWrite(LED_BUILTIN, LOW);
  }
}

В общем вот такой у меня сегодня код получился:

Интервал с использованием Millis()
uint32_t seconds, mstart, mstop;
uint8_t flag;

void setup() {
  Serial.begin(9600);
  Serial.println("!!! START PROGRAMM !!!");
  Serial.println(" ");
  Serial.println("Please enter the interval value in seconds:");
  Serial.println(" ");
  flag = 0;
}

void loop() {
  mstop = millis();
  if (Serial.available() > 0) {
    seconds = Serial.parseInt();
    flag = 1;
    mstart = mstop;
    Serial.println("Run ... ");
    Serial.print("Time start: ");
    Serial.print(mstart);
    Serial.println(" ");
    Serial.print(" Parse Int = ");
    Serial.println(seconds);
    Serial.println(" ");
    seconds = seconds * 1000UL;
  }
  if ((mstop - mstart > seconds) && flag) {
    flag = 0;
    Serial.println("Stoping...");
    Serial.print("Time stop: ");
    Serial.println(mstop);
    Serial.print("Interval (stop - start) =  ");
    Serial.println((mstop - mstart));
    Serial.println(" ");
    Serial.println("Please enter the interval value in seconds:");
    Serial.println(" ");
  }
//  delay(10);
}

Полагаю, что лишние миллисекунды из-за работы Serial…
Так же важна настройка Монитора порта, а то “перевод коретки” за число считывал и при парсинге превращал в ноль.

ну это уже вопросы к реализатору функции Serial.parseInt() - почему не удаляет управляющие символы 0D, 0A

Я так понял помогать не надо, всё уже сделали?..
Почитал про Serial.parseInt()…
Вроде должно работать сходу и без всяких приблуд, сам никогда не пользовался.

получается полная хрень с этим parseInt, статическая переменная на втором проходе сбрасывается в ноль, недаром Архат говорит про Ваш лживый СИ

volatile uint32_t old_millis;

void setup() {
  Serial.begin(115200);
  Serial.println("ON");
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);
}


void loop() {

  static  uint16_t sec1 = 20000;
   static int sec;

  if (Serial.available() > 0) {
    sec = Serial.parseInt();
    sec1 = sec * 1000;
     digitalWrite(LED_BUILTIN, HIGH);
     delay(sec1);
     digitalWrite(LED_BUILTIN, LOW);
   // old_millis = millis();
  }
     Serial.println(sec1);
/*
  if (millis() - old_millis >  sec) {
 
    digitalWrite(LED_BUILTIN, LOW);
  } else {
    digitalWrite(LED_BUILTIN, HIGH);
  }
  */
  delay(200);
}

Я же написал в #43, что не нужно перевод каретки отправлять…

я в wokwi исследовал

Всё работает на УНО из сообщения 47, в монитор порте режим -" нет конца строки".

А я о чем и говорил…

ну так надо жеж в скетче поправить, вычитать байтик из буфера, всего одна строчка:

volatile uint32_t old_millis;
int seconds;

void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
}


void loop() {
  if (Serial.available() > 0) {
    seconds = Serial.parseInt();
    old_millis = millis();
    Serial.read(); // вычитать буфер
  }
  if (millis() - old_millis < 1000UL * seconds) {
    digitalWrite(LED_BUILTIN, HIGH);
  } else {
    digitalWrite(LED_BUILTIN, LOW);
  }
  delay(10);
}

Может Александр в русской версии поправит пример использования с учётом выявленного косяка в функции
PS она вообще не описана, непорядок, надо добавить )))

Мне кажется тут один косяк :slight_smile: - нет функции очистки буфера после так называемого чтения.

Ну так одна строка решила проблему
PS вывод в порт активирует монитор порта

Как же неочевидно сделано. Лучше бы если в коде есть Serial. Писал разработчикам - реакции 0(

мы с ними говорим на разных языках )))

Мне кажется функция такая:

void pisec (){
while(Serial.available() > 0){
Serial.read();
}
}

ну да, сам к такой конструкции склонялся

volatile uint32_t old_millis;
int seconds;
bool FLAG=false;

void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
}
void loop() {
  if (Serial.available() > 0&&!FLAG) {
    seconds = Serial.parseInt();
    pisec ();
    old_millis = millis();
    FLAG=true;
    digitalWrite(LED_BUILTIN, HIGH);
    }
  if (millis() - old_millis > 1000UL * seconds&&FLAG) {
    digitalWrite(LED_BUILTIN, LOW);
    FLAG=false;
    pisec ();
  } 
}
//
void pisec (){
while(Serial.available() > 0){
Serial.read();
}
}

Для практического использования вариант :slight_smile:

А заставьте из №42 работать стабильно. А то и махонькая, и без делеев, и без миллисов, и без переменных - но работает через раз :slightly_smiling_face:

1 лайк