/* -----------------------------------------------------------------
------------------------- Codigo MultiHardWare ---------------------
----------------------------------------------------------------- */
#if defined(ESP8266)
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
ESP8266WiFiMulti wifiMulti;
#pragma message "Codigo para ESP8266!"
#elif defined(ESP32)
#include <WiFi.h>
#include <WiFiMulti.h>
WiFiMulti wifiMulti;
#pragma message "Codigo para ESP32!"
#elif defined(ARDUINO)
#pragma message "Codigo para Arduino basado AVR (UNO, MEGA, etc)!"
#else
#pragma message "No es ni ESP32 o ES8266 o AVR, que es?"
#endif
/* -----------------------------------------------------------------
-------------------------- Librerias y Objetos ---------------------
----------------------------------------------------------------- */
template<class T> inline Print &operator <<(Print &obj, T arg) {
obj.print(arg);
return obj;
}
/* -----------------------------------------------------------------
---------------- Declaracion de Variables y constantes -------------
----------------------------------------------------------------- */
#define cantidadled 10 //definimos el numero de leds que tiene nuestro circuito osea el tamano del arreglo
#define esperar 100 //definimos una constante en 100 llamda esperar
int pin_leds[cantidadled] = {18, 5, 19, 21, 22, 23, 2, 4, 12, 14}; //aca seleccionamos los pines para sus respectivos leds creados en un arreglo llamado cantidad led
int pin_boton = 13; //creamos una variable de tipo entero para el boton asignada en el pin 13
int derecha = 1;
int izquierda = 0; //en esta parte creamos 3 variables de tipo entero llamadas derecha, izquierda y direccion(se explicara despues para que), solo en la variable derecha la inicializamos en 1
int direccion = 0;
int ledinicial = pin_leds[0]; //en esta parte llamamos al arreglo pin leds y extraemos la primera posicion[0] y la guardamos en la variable led inicial
int ledactual = ledinicial; //creamos una variable de tipo entero llamada led actual el cual va a hacer igual al led inicial
boolean estado = true; //creamos una variable de tipo booleano llamada estado y que inicialice en verdadero
float tiempoanterior = 0; //creamos una variable de tipo flotante o decimal llamada tiempo anterior
/* -----------------------------------------------------------------
------------------------- Configuracion ESP --------------------
----------------------------------------------------------------- */
void setup() {
Serial.begin(9600); //abrimos el canal serial
pinMode(pin_boton, INPUT); //establecemos que el boton va como una entrada
for (int i = 0; i <= cantidadled ; i++){ //aca utilizamos una estructura for para cada i que vaya desde la posicion 0 y sea menor o igual a la cantidad de leds, donde aumente de uno en uno
pinMode(pin_leds[i], OUTPUT); //establecemos que todos los pines de los leds son de salida, es decir que empieza a encender desde el primer led que es la posicon [0, en este caso el naranja] y asi sucesivamente.
}
}
/* -----------------------------------------------------------------
---------------------------- Codigo Principal ----------------------
----------------------------------------------------------------- */
void loop() {
actualizarboton(); //llamamos a las funciones actualizar boton y actualizar leds
actualizarled();
}
/* ----------------------------------------------------------------
-------------------------------- Funciones -------------------------
----------------------------------------------------------------- */
void actualizarboton(){ //en esta funcion lo que hace es leer el estado del boton y una vez oprimido cambiar el estado actual del led, imprimiendo un mensaje en pantalla
if (digitalRead(pin_boton)) { //diciendo "cambiando de estado" e imprimiendo el valor de este mismo[false or true]
estado = !estado;
Serial.print("cambiando estado ");
Serial.println(estado);
delay(400);
}
}
void actualizarled(){
if(estado) {
if(derecha){
float tiempoactual = millis();
if (tiempoactual - tiempoanterior > esperar) {
tiempoanterior = tiempoactual;
ledactual = pin_leds[direccion]; //aca simplemente recorremos el arreglo de los leds hacia la derecha prendiendo cada uno, utilizando la funcion de millis
digitalWrite(ledactual, 1); //para hacerlo de manera simultanea, de manera que si yo presiono el boton este tendria la prioridad y pararia el programa
direccion ++;
}
if (direccion == 10){ //la variable direccion me permite saber en que led va
derecha = 0; //ya cuando llegue al ultimo led se cambia el sentido de encendido
izquierda = 1;
}
}
if (izquierda){
float tiempoactual = millis();
if (tiempoactual - tiempoanterior > esperar) {
tiempoanterior = tiempoactual;
ledactual = pin_leds[direccion];
digitalWrite(ledactual, 0); //aca es simplemente la misma instruccion que arriba pero en el otro sentido
direccion --;
}
if (direccion < 0){
derecha = 1;
izquierda = 0;
}
}
}
}