Hi folks,
tengo una duda, que no se si es una chaladura lo que estoy diciendo o no. A ver si @Brico_Dani, @AMR, @MiguelAngelLV, @JJ_T o cualquier otr@ puede esclarecermela.
Tengo un Arduino Mega conectado por el Serial1 con una RPi en remoto. El Arduino solo se va a usar cuando la RPi le mande alguna orden, por lo demás está inactivo. Ahora mismo está en el loop con la típica función
While( Serial1.available ) {
...
El caso es que lleva un par de semanas rulando y me da la sensación de que el Arduino se queda más payá que pacá (no responde el mamoncete) o puede ser el conversor Serial-TTL que haya murido. Sea como sea, había pensado que no quiero el Arduino haciendo a piñon el loop todo el rato.
Estaba pensando en dormir el Arduino y que se despertase cuando le llegara algo por el Serial1. Usar algo de este estilo (gracias a BooleanBite):
#include <avr/sleep.h>
void setup() {
Serial1.begin(9600);
// Serial1 (RX - Pin 19) - (TX - Pin 18)
attachInterrupt(19, serialInterrupt, CHANGE);
//Establecemos el modo de bajo consumo
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
}
void loop() {
// Inicializamos el modo bajo consumo
sleep_enable();
// Ponemos el modo bajo consumo
sleep_mode();
}
// Variable para saber si se está procesando la interrupción
volatile boolean inService = false;
void serialInterrupt() {
// Si se está procesando la interrupción, no hacer nada
if (inService) return;
// No se está procesando
inService = true;
// Habilitar interrupción de nuevo para permitir trabajar al Serial
interrupts();
// Esperar a que esté activo el Serial
while(!Serial1.available());
// Leer datos del Serial
while(Serial1.available()){
...
}
// Lectura acabada
inService = false;
}
Pero no se si esto es un buen uso o no.
Se que Arduino tiene una interrupción para el Serial, llamada SerialEvent (yo usaría el serialEvent1() ). Pero creo que no funciona si duermo al Arduino (aquí dejo el ejemplo del SerialEvent).