El código es un programa para controlar un circuito con un botón que activa y desactiva diferentes elementos en el circuito.
La primera parte del código importa las librerías LiquidCrystal_I2C y Stepper para controlar el display LCD y el motor paso a paso, respectivamente. Luego, se definen algunas constantes y variables, se inicializan los pines del Arduino y se configuran algunos elementos del circuito, como el motor paso a paso y el LED RGB.
Para este proyecto es necesario: Placa Arduino UNO, Sensor infrarrojo Ky-032, Módulo LCD i2c, Mótor de paso 28BYJ-48, Módulo controlador del motor de paso, Módulo RGB, Un Botón, Un Buzzer, 3 resistencias de 220 Ohms, 2 Leds 1 verde y 1 rojo, Jumpers
#include <LiquidCrystal_I2C.h>//Incluimos la libreria para el módulo LCD i2c
#include <Stepper.h>//Incluimos la libreria para el motor de paso
//Establecemos las constantes y variables a usar en el circuito
const int buttonPin = 2;//Pin del arduino donde recibimos la señal del boton
const int ledPinGreen = 12;//Pin del arduino donde controlamos el LED verde
const int ledPinRed = 13;//Pin del arduino donde controlamos el LED rojp
bool buttonState = false;//Variable booleana para controlar si el circuito esta encendido o apagado
int Buzzer = 3;//Pin del arduino donde enviaremos una señal al buzzer
int AvoidancePin = 4;//Pin del arduino donde recibimos la señal del módulo infrarojo
LiquidCrystal_I2C lcd(0x27,16,2);//Ubicamos el módulo LCD i2c en el circuito y el arduino
const int stepsPerRevolution = 2048;//Constante para determinar cuantos paso da el motor de paso por revolución
Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);//Ubicamos y configuramos el motor de paso en el circuito y en el arduino
int R = 5;//Pin del arduino donde recibimos la señal del rojo del RGB
int G = 6;//Pin del arduino donde recibimos la señal del verde del RGB
int B = 7;//Pin del arduino donde recibimos la señal del azul del RGB
void setup() {//Inicializamos el sistema
//Indicamos las entradas, salidas, valores iniciales y determinados para el sistema
pinMode(ledPinGreen, OUTPUT);//Salida del Led verde
pinMode(ledPinRed, OUTPUT);//Salida del led rojo
pinMode(buttonPin, INPUT);//Entrada del boton
pinMode (Buzzer, OUTPUT);//Salida del buzzer
pinMode (AvoidancePin, INPUT);//Entrada del infrarojo
lcd.init();//Iniciamos el LCD
lcd.backlight();//Encendemos el fondo del LCD
lcd.print("Presione boton");//Escribimos en LCD un mensaje en la posición cero del cursor
lcd.setCursor(0,1);//Pasamos el cursor del LCD a la posición uno
lcd.print("para iniciar.");//Escribimos en LCD un mensaje en la posición uno del cursor
//El anterio mensaje en el LCD indica como encender el circuito
myStepper.setSpeed(15);//Establecemos la velocidad del motor de paso
pinMode( R , OUTPUT );//Salida del RGB en la escala de rojo
pinMode( G , OUTPUT );//Salida del RGB en la escala de verde
pinMode( B , OUTPUT );//Salida del RGB en la escala de azul
}
void loop(){//Ciclo evolutivo del sistema
//Iniciamos el circuito presionando el boton y validando la variable bandera buttonState
if (digitalRead(buttonPin) == HIGH && buttonState == false) {//CIRCUITO ENCENDIDO
tone(Buzzer, 261);//Enviamos un tono al buzzer para indicar que se encendio el circuito
delay(100);//Espera de 100 milisegundos
noTone(Buzzer);//Apagamos el buzzer
digitalWrite(ledPinGreen, HIGH);//Encendemos el Led verde para indicar que se encuentra encendido el circuito
digitalWrite(ledPinRed, LOW);//Apagamos el Led rojo
buttonState = true;//Pasamos la variable bandera de false a true
lcd.clear();//Limpiamos el LCD
lcd.print("Pasar mano");//Escribimos en LCD un mensaje en la posición cero del cursor
lcd.setCursor(0,1);//Pasamos el cursor del LCD a la posición uno
lcd.print("encima circuito.");//Escribimos en LCD un mensaje en la posición uno del cursor
//El anterio mensaje en el LCD indica como controlar el circuito
//Si presionamos nuevamente el boton indicamos que el circuito se apagá
} else if (digitalRead(buttonPin) == HIGH && buttonState ) {//CIRCUITO APAGADO
digitalWrite(ledPinRed, HIGH);//Encendemos el Led rojo para indicar que el circuito se apago
digitalWrite(ledPinGreen, LOW);//Apagamos el led verde
buttonState = false;//Pasamos la variable bandera de true a false
lcd.clear();//Limpiamos el LCD
lcd.print("Presione boton");//Escribimos en LCD un mensaje en la posición cero del cursor
lcd.setCursor(0,1);//Pasamos el cursor del LCD a la posición uno
lcd.print("para iniciar.");//Escribimos en LCD un mensaje en la posición uno del cursor
//El anterio mensaje en el LCD indica como encender el circuito
tone(Buzzer, 369);//Enviamos un tono al buzzer para indicar que se apago el circuito
delay(100);//Espera de 100 milisegundos
noTone(Buzzer);//Apagamos el buzzer
//Apagamos el RGB
analogWrite( R , 0 );
analogWrite( G , 0 );
analogWrite( B , 0 );
}
//El encendido y apagado del circuito es controlado por el boton
//Pero el comportamiento del circuito es controlado por el infrarojo
//Iniciamos validando si el circuito se encuentra encendido y que el sensor infrarojo no esta siendo obstaculizado
//Esto nos indica que el circuito esta apagado
if (digitalRead (AvoidancePin) == HIGH && buttonState == false) {//CIRCUITO APAGADO
digitalWrite (Buzzer, LOW);//Apagamos el buzzer
noTone(Buzzer);//Sin tono en el buzzer
//Si la validación anterior nos indica que es falsa quiere decir que el circuito esta encendido
} else if (digitalRead (AvoidancePin) == LOW && buttonState == true) {//CIRCUITO ENCENDIDO
analogWrite( R , random(256) );//Pintamos un color aleatorio en el rojo del RGB
analogWrite( G , random(256) );//Pintamos un color aleatorio en el verde del RGB
analogWrite( B , random(256) );//Pintamos un color aleatorio en el azul del RGB
digitalWrite (Buzzer, HIGH);//Encendemos el buzzer
tone(Buzzer, 554);//Enviamos un tono al buzzer para indicar que se encendio el circuito
delay(100);//Espera de 100 milisegundos
noTone(Buzzer);//Apagamos el buzzer
lcd.backlight();//Encendemos el fondo del LCD
lcd.clear();//Limpiamos el LCD
lcd.print("Espere hasta");//Escribimos en LCD un mensaje en la posición cero del cursor
lcd.setCursor(0,1);//Pasamos el cursor del LCD a la posición uno
lcd.print("finalizar girar.");//Escribimos en LCD un mensaje en la posición uno del cursor
//El anterior mensaje en el LCD indica que se debe esperar hasta que el motor de paso finalice el giro
myStepper.step(stepsPerRevolution / 4);//Giramos el motor de paso 90° para mostrar la imagen a escanear y visualizar en realidad aumentada
//El motor paso a paso 28BYJ-48, da 64 pasos por revolución, por tanto 360°/64 nos resulta 5.62° para cada paso del motor. Si el motor paso a paso gira en saltos de 90°
//Es decir, el número pasos para dar un giro completo son 4.
delay(500);//Esperamos 500 milisegundos
lcd.clear();//Limpiamos el LCD
lcd.print("Escanee celular");//Escribimos en LCD un mensaje en la posición cero del cursor
lcd.setCursor(0,1);//Pasamos el cursor del LCD a la posición uno
lcd.print("Realidad aumentada.");//Escribimos en LCD un mensaje en la posición uno del cursor
//El anterio mensaje en el LCD indica que la imagen debe escanearse con el celular
}
delay(100);//Espera de 100 milisegundos
}