[Solucionado] Temporizador puerto serial..

Hola a todos, quería consultar si se podía poner un temporizador que chequee el puerto serial y si por un determinado tiempo (30 seg o 1 min) no ingresa nada ejecute una acción.. por ejemplo, yo tengo este código:

#define DEBUG(a) Serial.println(a);
 
void setup()
{
   Serial.begin(9600);
   pinMode(5, OUTPUT);
   pinMode(13, OUTPUT);
   digitalWrite(5, HIGH);
   digitalWrite(13, LOW);
}
 
void loop()
{
   if (Serial.available())
   {
      String data = Serial.readStringUntil('\n');
      DEBUG(data);
      if (data == "Start") {
      digitalWrite(5, LOW);
  }
  if (data == "Stop") {
      digitalWrite(5, HIGH);
  }
 }
}

yo quisiera que si no ingresa ni start ni stop haga: digitalWrite(5, HIGH); para apagar el rele...

como puedo hacer para leer todo el tiempo el puerto serial y si pasa el tiempo máximo deseado sin que se lea nada, ejecute la instrucción? gracias de antemano, y saludos

Any.

Y para qué quieres eso si esto lo hace por ti

if (Serial.available()>0) {
    // proceso del puerto serie
}

Busca en google Arduino Serial.available() para que entiendas que hace, pero básicamente cuando recibe caracteres se vuelve verdadera la condición y ejecuta lo que le pidas que haga.

Hola surbyte gracias por responderme, mira yo hago esto:

#define DEBUG(a) Serial.println(a);
 
void setup()
{
   Serial.begin(9600);
   pinMode(5, OUTPUT);
   pinMode(13, OUTPUT);
   digitalWrite(5, HIGH);
   digitalWrite(13, LOW);
}
 
void loop()
{
   if (Serial.available())
   {
      String data = Serial.readStringUntil('\n');
      DEBUG(data);

      if (data == "") {
      digitalWrite(5, HIGH);
  }
      if (data == "Start") {
      digitalWrite(5, LOW);
  }
  if (data == "Stop") {
      digitalWrite(5, HIGH);
  }
 }
}

anda, siempre que le de enter al monitor, yo quiero que automáticamente chequee cada 30s o 1m si esta llegando datos si no es así, que ejecute digitalWrite(5, HIGH);

Intente así:

#define DEBUG(a) Serial.println(a);

double serial;

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

void loop()
{
   if (Serial.available())
   {
      String data = Serial.readStringUntil('\n');
      DEBUG(data);
      serial = (serial + 1);

      if (data == "A") {
      Serial.println(serial);
      digitalWrite(5, LOW);
      serial = 0;
  }
  if (data == "S") {
      digitalWrite(5, HIGH);
      serial = 0;
   }
   if(data != "A" && serial > 30){
     digitalWrite(5, HIGH);      
  }
 }
}

funcionaria, digo funcionaria porque tengo que darle enter como para simular que recibe caracter,
hay alguna manera de lograr que se chequee el serial automáticamente y si no recibió ningún caracter por x tiempo, ejecute una acción determinada?

Pensando un poco y probando muchooo jaja hice esto, con el tip que me deslizó surbyte:

#define DEBUG(a) Serial.println(a);
unsigned long task_time_ms=0;
double serial;

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

void loop()
{
   if (Serial.available()>0)
   {
      String data = Serial.readStringUntil('\n');
      DEBUG(data);
      if (data == "A") {
      Serial.println(serial);
      digitalWrite(5, LOW);
      serial = 0;
  }
  if (data == "S") {
      digitalWrite(5, HIGH);
      serial = 0;
   }
 }

else {
  if((millis()-task_time_ms)>=1000){
  task_time_ms=millis();
   serial = (serial + 1);
   Serial.println(serial);
   if(serial == 30){     
   digitalWrite(5, HIGH);      
   serial = 0;
  }
 }
}
}

solo pido porfa, que me ayuden si en el código hay algo sea redundante o que se puede expresar mejor y ahorrar recursos, lo que sea que haga que el código mejore y sea mas robusto y confiable...
lo digo porque se que no soy experta y muchas veces puedo resolver algo pero tal vez hay mejores formas de optimizarlo para performance, y así evitar gastos de recursos innecesarios y posible errores o cuelgues...
aguardo sus comentarios gracias..

Esta sería una versión un poco (solo un poco mas limpia) pero lo que hiciste esta bien.
Los cambios que introduzco son:

  1. En lugar de double usar int (entero). Si solo incrementas con valores enteros double no tiene sentido. Es doble mantisa para operaciones matemáticas con punto flotante.
  2. Quite el else porque mas allá que la única vez que no se ejecuta es cuando hay caracteres, hablas de solo uno de modo que algo que cada 1 seg presentará valores no se altera mucho como lo he hecho Tu versión estaba bien pero solo considera mi punto de vista aunque por digo que el tuyo tmb lo esta.
  3. La actualización de task_time_ms = millis() la haces siempre al final del if (condicional) porque de ese modo aseguras que es el momento adecuado. Una buena costumbre evita problemas.
  4. Solo por mostrarte algo distinto esto serial = serial +1; es lo mismo que serial++;
    Si pones como yo hice ++serial primero se incrementa y lo que va a presentar será el valor tal como tu lo habías hecho. Si en cambio pusieras
    Serial.println(serial++); el valor presentado seria el que tiene y luego se incrementa.
    Viene con serial = 5.
    Si encuentra Serial.print(serial++) presenta 5 y luego se incrementa a 6.
    Si encuentra Serial.print(++serial) se incrementa y presenta 6.
#define DEBUG(a) Serial.println(a);
unsigned long task_time_ms;
int serial = 0;

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

void loop(){
	if (Serial.available()>0)  {
		String data = Serial.readStringUntil('\n');
		DEBUG(data);
		if (data == "A") {
			Serial.println(serial);
			digitalWrite(5, LOW);
			serial = 0;
		}
		if (data == "S") {
			digitalWrite(5, HIGH);
			serial = 0;
		}
	}
	if ( millis()-task_time_ms >= 1000){
		Serial.println(++serial);
		if (serial == 30){     
			digitalWrite(5, HIGH);     
			serial = 0;
		}
		task_time_ms = millis();
	}
}