Interrupciones

Buenas, estoy creando un programa que quiero que corra continuamente hasta que reciba una comunicacion por puerto serie, entonces crea una interrupcion y lee el valor para cambiar el tiempo de delay.

En este ejemplo que he encontrado por internet configura una interrupcion con esta linea:

attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);

Alguien sabe como programarlo para que se active cuando reciba informacion por el puerto serie? (si es posible).

const byte ledPin = 13;
const byte interruptPin = 2;
volatile byte state = LOW;
 
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
}
 
void loop() {
digitalWrite(ledPin, state);
}
 
void blink() {
state = !state;
}

El objeto Serial ya dispone de una interrupcion que se ejecuta cada vez que hay datos de entrada en el buffer serie…
https://www.arduino.cc/reference/en/language/functions/communication/serial/serialevent
y un ejemplo:

Gracias por el enlace, ese ejemplo lo vi por otra web, pero cambie el bucle while por un if y no funcionaba.
Yo quiero guardar lo que recibo en una variable int, no se si se puede guardar primero en un char y despues en un int, lo que va a recibir es algo asi:

a255

Dejo aqui el codigo que pensaba usar, pero no funciona.

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10,11);   // (RX, TX)

char comando;
int val;

void setup(){
  Serial.begin(9600);
  mySerial.begin(9600);
  Serial.println("Inicio");
  pinMode(13,OUTPUT);  
}
void loop() {

  switch(comando){
    case 'a':
      Serial.print("Caso: A Valor: ");
      Serial.println(val);
      comando = ' ';
      break;
    case 'b':
      Serial.print("Caso: B Valor: ");
      Serial.println(val);
      comando = ' ';
      break;
    case 'c':
      Serial.print("Caso: C Valor: ");
      Serial.println(val);
      comando = ' ';
      break;
    case 'd':
      Serial.print("Caso: D Valor: ");
      Serial.println(val);
      comando = ' ';
      break;
    case 'e':
      Serial.print("Caso: E Valor: ");
      Serial.println(val);
      comando = ' ';
      break;
    
  }
}

void serialEvent() {
  if(mySerial.available()){
    comando = mySerial.read();
    val = mySerial.parseInt();
    mySerial.flush();
  }
}

La funcion .available() contiene los caracteres (bytes) disponibles en el buffer.

La funcion .read() extrae un caracter (byte) del buffer y lo pone en tu variable.

Ahora déjame contarte algunas particularidades de esta función.

  • Si lo cargas en una variable tipo "char" al hacer print() veras el carácter ASCII (a,b,A, etc)
  • Si lo cargas en una variable tipo "byte" al hacer print() veras el código ASCII del carácter (97,98,65, etc) y si haces write() veras el carácter ASCII (a,b,A, etc).
  • No tiene ningún sentido que lo cargues en una variable tipo "int" porque su capacidad es de 2 bytes y siempre obtendrás solo 1 a la vez.

Hola @jafox007. Tal vez te sirva de guía o inspiración una cosa que hice hace tiempo para una consulta en este foro. Sé que es algo complejo, pero mira la propuesta que hice en https://forum.arduino.cc/index.php?topic=485147.msg3336900#msg3336900