Idea engineering - interruptions by serial port arduino (spanish)
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:
Congratulations @retmago! You received a personal award!
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!