Idea engineering - interruptions by serial port arduino (spanish)

in #idea7 years ago

Buenas tardes a todos, a continuacion adjunto un codigo realizado por mi para de 9 secuencias mostradas por lcd y con interrupciones por puerto serial, lo publico debido a que vi gran cantidad de codigo en internet complejo con interrupciones y la verdad me parecio algo complicado si quieres resolver y necesitas un camino. Ademas de mucho tiempo para poder realizar esto, el codigo que realice usa solamente funciones de retorno para poder realizar las interrupciones.

Espero que les sea de ayuda y estoy atento a sus comentarios.

#include <LiquidCrystal.h> //Libreria pantalla LCD 
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
char n_secuencia;// variable para escoger la secuencia normal
char i_secuencia;// variable para la secuencia de interrupcion
String t_secuencia; //variable para almacenar que tipo de secuencia esta ejecutando
int interrp = 1; // aqui guardo lo que retorna la funcion si es 1 no hace nada si es 0 es una interrupcion  de   la secuencia
int tiempo=100; // tiempo en que el caracter se mueve hacia la izquierda o derecha
String sym; // caracter que movera
int tiempo_actual; // tiempo actual que captura millis()
int tiempo_adelantado; // tiempo adelantando que es el tiempo millis() + el tiempo (esto es para quitar los     delay del codigo y asi hacer las interrupciones)
int D = 0; // posicion inicial del caracter que va a la derecha
int I = 0; // posicion inicial del caracter que va hacia la izquierda
int MAX_D=0; // posicion maxima del caracter hacia la derecha
int MIN_I=0; // posicion minima del caracter hacia la izquierda
int all = 0; // variable para reprodroducir todas las secuencias

void mensaje_welcome(){
  lcd.setCursor(0,0);
  lcd.print("TX/RX Bluetooth");
  delay(1000); 
  lcd.clear();
  lcd.setCursor(4,0); 
  lcd.print("Bienvenidos"); 
  lcd.setCursor(3,1);
  lcd.print("Disfruten"); 
  delay(1000);
  lcd.clear(); 
}

int interrupcion(){
  if( Serial.available() > 0 ){
    i_secuencia = Serial.read();
    /*
    Con este if limito las entradas solo para que sean numeros, es decir, letras y/o caracteres especiales  no   van a afectar el programa
    */
    if ( (n_secuencia != i_secuencia) && ( i_secuencia == '1'  || i_secuencia == '2' || i_secuencia == '3'  ||   i_secuencia == '4' || i_secuencia == '5' || i_secuencia == '6' || i_secuencia == '7' || i_secuencia   == '8'   || i_secuencia == '9' )){
     n_secuencia = i_secuencia;
     if (n_secuencia == '9'){ // si es 9 lo coloco en 1 para que reproduzca todas las secuencias sino es 9 en   0
      all = 1;
     }else{
      all = 0;
     }
     return(0); // significa que hay una interrupcion de la secuencia
    }
    else{
     return(1); // no interrumpe la secuencia
    }
  }
}

int caracter_derecha(){ // funcion para que el caracter se mueva a la derecha
       for ( D ; D < MAX_D ; D++ ){  
       lcd.clear(); 
       lcd.setCursor(0,0); 
       lcd.print(t_secuencia);
       tiempo_adelantado=millis() + tiempo;
       do {
         lcd.setCursor(D,1);
         lcd.print(sym); 
         tiempo_actual= millis();
         interrp = interrupcion();
         if ( interrp == 0){ // si lo que devuelve la funcion es 0 interrumpo la secuencia y asi me voy al    loop()
          return(0);
         }
       }while(tiempo_actual <= tiempo_adelantado);
       lcd.clear();
     }
}
int caracter_izquierda(){ // funcion para que el caracter se mueva hacia la izquierda
       for ( I ; I > MIN_I ; I-- ){  
       lcd.clear(); 
       lcd.setCursor(0,0); 
       lcd.print(t_secuencia);
       tiempo_adelantado=millis() + tiempo;
       do {
         lcd.setCursor(I,1);
         lcd.print(sym); 
         tiempo_actual= millis();
         interrp = interrupcion();
         if ( interrp == 0){ // si lo que devuelve la funcion es 0 interrumpo la secuencia y asi me voy al    loop()
          return(0);
         }
       }while(tiempo_actual <= tiempo_adelantado);
       lcd.clear();
     }
}
void reinicio_var(){ // reinicio de todas las variables
  MAX_D = 0;
  D = 0;
  MIN_I = 0;
  I = 0;
  n_secuencia = 0;
}

void setup() { 
  lcd.begin(16,2);  
  pinMode(13,OUTPUT);
  Serial.begin(9600);
  mensaje_welcome();
} 

void loop(){ 
  lcd.setCursor(0,0);
  lcd.print("Individual: 1-8");
  lcd.setCursor(4,2);
  lcd.print("Todas: 9");
  if( Serial.available() > 0 ){
     n_secuencia = Serial.read();
     inicio:;
     Serial.println(n_secuencia);
     Serial.println(all);
if (n_secuencia == '9'){
        all = 1;
        }
     ///////////////////////////////////////////////////////////
     if (n_secuencia == '1' || all == 1){// secuencia 1 el parametro all significa que cuando se haya     presionado 9 repetiras todas las secuencias
        sym='*'; // escogo el simbolo a reproducir
        MAX_D=17;
        D=0;
        /*
         * se va a mover desde la posicion 0  D = 0
         * hasta la posicion 17 MAX_D = 17
         */
        t_secuencia = "Secuencia 1";
        interrp = caracter_derecha();
        if ( interrp == 0){
          goto inicio; // si todas las funciones retornan 0 significa que hay una interrupcion y voy al   goto.   los gotos solo funcionan en las mismas funciones y no en funciones externas.
        }
        reinicio_var();          
     }
    //////////////////////////////////////////////////////////
    if (n_secuencia == '2' || all == 1 ){
        sym = '=';
        MIN_I=0;
        /*
         * se a a mover de la posicion 17  I = 17
         * hasta la posicion 0
         */
        I=17;
        t_secuencia = "Secuencia 2";
        caracter_izquierda();
        if ( interrp == 0){
          goto inicio;
        }
        reinicio_var();
        }
    //////////////////////////////////////////////////////////
    if (n_secuencia == '3' || all == 1){
        sym = '+'; 
        MIN_I=4;
        I=17;
        MAX_D=6;
        D=0;
        t_secuencia = "Secuencia 3";
        caracter_izquierda();
        if ( interrp == 0){
          goto inicio;
        }
        caracter_derecha();
       if ( interrp == 0){
          goto inicio;
        }
        reinicio_var();
        }
        //////////////////////////////////////////////////////////
     if (n_secuencia == '4' || all == 1){
        sym = '!';
        MIN_I=0;
        I=6;
        MAX_D=17;
        D=4;
        t_secuencia = "Secuencia 4";
        caracter_derecha();
        if ( interrp == 0){
          goto inicio;
        }        
        caracter_izquierda();
        if ( interrp == 0){
          goto inicio;
        }
        caracter_derecha();
       if ( interrp == 0){
          goto inicio;
        }
        reinicio_var();
        }
        //////////////////////////////////////////////////////////
     if (n_secuencia == '5' || all == 1){
        sym = "('_')";
        t_secuencia = "Secuencia 5";
        MIN_I=0;
        I=2;
        caracter_izquierda();
        if ( interrp == 0){
          goto inicio;
        }
        MAX_D=5;
        D=3;
        caracter_derecha();
        if ( interrp == 0){
          goto inicio;
        }
        MIN_I=2;
        I=4;
        caracter_izquierda();
        if ( interrp == 0){
          goto inicio;
        }
        MAX_D=7;
        D=5;
        caracter_derecha();
        if ( interrp == 0){
          goto inicio;
        }
        MIN_I=4;
        I=6;
        caracter_izquierda();
        if ( interrp == 0){
          goto inicio;
        }
        MAX_D=9;
        D=7;
        caracter_derecha();
        if ( interrp == 0){
          goto inicio;
        }
        reinicio_var();
        }
        //////////////////////////////////////////////////////////
    if (n_secuencia == '6' || all == 1){
        sym = "INGENIERIA TELECOMUNICACIONES";
        MIN_I=-39;
        I=17;
        t_secuencia = "Secuencia 6";
        caracter_izquierda();
        if ( interrp == 0){
          goto inicio;
        }
        sym = "MICRO";
        MAX_D=22;
        D=0;
        caracter_derecha();
       if ( interrp == 0){
          goto inicio;
        }
        reinicio_var();
        }
        //////////////////////////////////////////////////////////
    if (n_secuencia == '7' || all == 1){
        sym = "ROCK AND ROLL";
        MIN_I=0;
        I=17;
        MAX_D=27;
        D=0;
        t_secuencia = "Secuencia 7";
        caracter_izquierda();
        if ( interrp == 0){
          goto inicio;
        }
        caracter_derecha();
       if ( interrp == 0){
          goto inicio;
        }
        reinicio_var();
        }
        //////////////////////////////////////////////////////////
    if (n_secuencia == '8' || all == 1){
        sym = '<';
        MIN_I=4;
        I=17;
        MAX_D=13;
        D=0;
        t_secuencia = "Secuencia 8";
        caracter_izquierda();
        if ( interrp == 0){
          goto inicio;
        }
        sym = '>';
        caracter_derecha();
       if ( interrp == 0){
          goto inicio;
        }
        reinicio_var();
        }
        //////////////////////////////////////////////////////////
  }
}  

Conexion final en proteus 8:

Sort:  

Congratulations @retmago! You received a personal award!

Happy Birthday! - You are on the Steem blockchain for 1 year!

You can view your badges on your Steem Board and compare to others on the Steem Ranking

Vote for @Steemitboard as a witness to get one more award and increased upvotes!