Блин, 40 сообщений - и ни один не посоветовал вывести в сериал результат работы parseInt()
Какой смысл обсуждать работу таймера, если вы даже не знаете, какой у него период?
Блин, 40 сообщений - и ни один не посоветовал вывести в сериал результат работы parseInt()
Какой смысл обсуждать работу таймера, если вы даже не знаете, какой у него период?
Туть страньше другое - они все бросились помогать! При достаточном пофигизме ТС и наличии пятницы.
Ну тудыть её в качель и я подкину такой же хм-хм рабочий код.
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);
}
}
В общем вот такой у меня сегодня код получился:
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 она вообще не описана, непорядок, надо добавить )))
Мне кажется тут один косяк - нет функции очистки буфера после так называемого чтения.
Ну так одна строка решила проблему
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();
}
}
Для практического использования вариант
А заставьте из №42 работать стабильно. А то и махонькая, и без делеев, и без миллисов, и без переменных - но работает через раз