/*
  Creado: Edilberto Carlos Vivas Gonzalez ([email protected])
*/

#include <Ticker.h>    // biblioteca que permite configurar tareas para que se ejecuten cada cierto tiempo

#define pinBoton  2    // Pin de conexion Pulsador 1
#define pinBoton1 3    // Pin de conexion Pulsador 2


byte PORTV[4] = {10, 11, 12, 13}; //agrupar varios pines en un puerto = {bit0 bit1 bit2 bit3}
byte conteo=0;  // variable para guardar el conteo

boolean btn_ant[]={true};   // variable para guardar el estado anterior del pulsador
boolean btn_ant1[]={true};  // variable para guardar el estado anterior del pulsador 1
boolean pres=false;         // variable para guardar si el boton fue presionado


int   S1;  // valor leido en el pin analógico que va de 0 a 1023
float Va;  // variable que guarda la conversión a voltaje
int   Vai; // variable que guarda la conversion en entero


int tbot=100;                  // Periodo de lectura de pulsadores
void tarea1();                 // definir la funcion
Ticker ticTarea1(tarea1,tbot); // asignar al ticker la tarea1

int tpot=200;                  // periodo de lectura analogica
void tarea2();                 // definir la funcion
Ticker ticTarea2(tarea2,tpot); // asignar al ticker la tarea2

int tcom=1000;                 // periodo de comunicacion serial
void tarea3();                 // definir la funcion
Ticker ticTarea3(tarea3,tcom); // asignar al ticker la tarea3


void setup() {
  // put your setup code here, to run once:
   pinMode(pinBoton,INPUT_PULLUP);
   pinMode(pinBoton1,INPUT_PULLUP);
   for (byte i = 0; i <4 ; i++) {
       pinMode(PORTV[i], OUTPUT);}
   Serial.begin(9600); // inicializar comunicacion serial a 9600 baudios
   ticTarea1.start();  // inicializar tarea
   ticTarea2.start();
   ticTarea3.start();
}


void loop() {
  ticTarea1.update();  //verificar si ya se cumplió el tiempo para ejecutar la tarea
  ticTarea2.update();
  ticTarea3.update();
  delay(10);
}


void tarea1()
{   
   // Escribir cada bit en el pin respectivo:
   for (byte i = 0; i <4 ; i++) {
     digitalWrite(PORTV[i],bitRead(conteo,i));}

   pres=pulso(btn_ant,pinBoton); //a la funcion se le entrga el estado anterior del boton y el pin donde está conectado el boton
   if (pres) {
     if (conteo == 15) {
       conteo=0;    }
     else {
       conteo=conteo+1; } }

   pres=pulso(btn_ant1,pinBoton1); //a la funcion se le entrga el estado anterior del boton y el pin donde está conectado el boton
   if (pres) {
     if (conteo == 0) {
       conteo=15;    }
     else {
       conteo=conteo-1; } }
 }



void tarea2()
{
   S1 = analogRead(A0);  // leer la señal en el pin analógico
   Va = S1*(5.0/1023.0); // Convert to a voltage (0 - 5V):
   Vai = round(Va);      // convertir el valor a entero
}



void tarea3()
{
   // print out the value you read:
   Serial.print("Va=");  // enviar caracteres
   Serial.println(Va);  // enviar valor numérico
}


// Esta subrutina es para determinar si cualquier boton fue pulsado
 boolean pulso(boolean* eAnt,int pin_Button){
    boolean presi=false;  //variable para guardar si el boton se presiona
    boolean eActual = digitalRead(pin_Button);
    if (eAnt[0]==true and eActual==false){   // detectar flanco de bajada
       presi=true;}
    eAnt[0]=eActual;  //el estado actual del boton se vuelve el estado anterior en el siguiente instante de muestreo
    return presi;
}
$abcdeabcde151015202530354045505560fghijfghij