Está en la página 1de 10

ESCUELA SUPERIOR POLITÉCNICA DE CHIMBORAZO

CARRERA DE ELECTRÓNICA Y AUTOMATIZACIÓN


CONTROL EMBEBIDO
Nombre: Alex Quishay (61), Jefferson Lema (105) Fecha: 12/10/2022
Curso: 7mo “A” Docente: Ing. José Guerra

CONTADOR DEL 0 AL 9 EN PROTEUS, MEDIANTE ARDUINO

Figura 1 Contador del 0 al 9 utilizando Arduino Yún

Explicación
El contador es controlado por dos interruptores (ascendente y
descendente), y el resultado se visualiza en un display de 7 segmentos de
cátodo común. El pulsador ascendente añade una unidad a la cuenta
mientras que el pulsador descendente disminuye una unidad al conteo,
cabe recalcar que el contador no sobrepasa el valor de 9 y nunca es menor
a 0.

Función anti rebote


La conexión de los pulsadores es de tipo pull down, por lo que el
Arduino lee un uno en ese pin. Como se sabe, los pulsadores tienen un
defecto conocido como rebote, esto quiere decir que al momento de
presionar o soltar el pulsador, se crea una fluctuación entre sus
conectores internos, por lo tanto, cuando se va a pasar de un 1 (HIGH) a
un 0 (LOW) o viceversa, esas fluctuaciones son leídas por el Arduino y se
producen errores en la simulación. En otras palabras, el Arduino
interpreta los rebotes como si el pulsador hubiese sido presionado varias
veces.
Para vencer el tiempo de rebote se debe esperar unos cuantos
segundos hasta que el display se encienda.

Código fuente hecho en el compilador de Arduino en Proteus


/* Main.ino file generated by New Project wizard
*

* Processor: Arduino Yun


* Compiler: Arduino AVR (Proteus)
*/
// Peripheral Configuration Code (do not edit)
//---CONFIG_BEGIN---
#pragma GCC push_options
#pragma GCC optimize ("Os")

#include <core.h> // Required by cpu


#include <cpu.h>
#include <bridge.h> // Required by server
#include <Yun.h>

#pragma GCC pop_options

// Peripheral Constructors
CPU &cpu = Cpu;
Yun::Server &server = VFP;
Yun::FileStore &storage = FS;

void peripheral_setup () {
server.begin (8080);
storage.begin ();
}
void peripheral_loop() {
server.poll ();
}
//---CONFIG_END---
const int pulsadorIncremento = 6; // Pin digital para el pulsador de
incremento
const int pulsadorDecremento = 5; // Pin digital para el pulsador de
decremento
const int tiempoAntirrebote = 10; // Variable para almacenar el tiempo
antirrebote
// Variables necesarias para los cálculos internos
int cuenta = 0;
int estadoPulsadorIncremento;
int estadoPulsadorAnteriorIncremento;
int estadoPulsadorDecremento;
int estadoPulsadorAnteriorDecremento;
// Función antirrebote
boolean antirrebote(int pin)
{
int contador = 0;
boolean estado;
boolean estadoAnterior;

do
{
estado = digitalRead(pin);
if(estado != estadoAnterior)
{
contador = 0;
estadoAnterior = estado;
}
else
{
contador = contador+ 1;
}
delay(1);
} while(contador < tiempoAntirrebote);
return estado;
}
void display (int a, int b, int c, int d, int e, int f, int g) // Función del
display: Se reciben 7 variables y se asignan a cada una de las salidas
{
digitalWrite (7,a);
digitalWrite (8,b);
digitalWrite (9,c);
digitalWrite (10,d);
digitalWrite (11,e);
digitalWrite (12,f);
digitalWrite (13,g);
}
void actualizarNumero() // Función que actualiza el número que aparece
en el display de 7 segmentos
{
switch(cuenta){
case 0:
display (1,1,1,1,1,1,0); // Número "0"
break;
case 1:
display (0,1,1,0,0,0,0); // Número "1"
break;
case 2:
display (1,1,0,1,1,0,1); // Número "2"
break;
case 3:
display (1,1,1,1,0,0,1); // Número "3"
break;
case 4:
display (0,1,1,0,0,1,1); // Número "4"
break;
case 5:
display (1,0,1,1,0,1,1); // Número "5"
break;
case 6:
display (1,0,1,1,1,1,1); // Número "6"
break;
case 7:
display (1,1,1,0,0,0,0); // Número "7"
break;
case 8:
display (1,1,1,1,1,1,1); // Número "8"
break;
case 9:
display (1,1,1,0,0,1,1); // Número "9"
break;
}
}
void setup () {
peripheral_setup(); // TODO: put your setup code here, to run once:
pinMode(7, OUTPUT); // Asignación de los pines digitales para el
display de 7 segmentos como salidas
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
pinMode(pulsadorIncremento, INPUT); // Asignación de los pines
digitales para los pulsadores como entradas
pinMode(pulsadorDecremento, INPUT);
}
void loop() {
peripheral_loop(); // TODO: put your main code here, to run repeatedly:
estadoPulsadorIncremento = digitalRead(pulsadorIncremento); //
Leemos el estado del pulsador de incremento
if(estadoPulsadorIncremento !=
estadoPulsadorAnteriorIncremento) // Si hay un cambio en el estado
del pulsador de incremento
{
if(antirrebote(pulsadorIncremento))
{
cuenta++; // Se incrementa la cuenta en una unidad
if(cuenta > 9) // Si la cuenta es mayor que 9, permanece en 9.
{
cuenta = 9;
}
}
}
estadoPulsadorAnteriorIncremento = estadoPulsadorIncremento; //
Actualizamos el estado anterior del pulsador de incremento
estadoPulsadorDecremento = digitalRead(pulsadorDecremento); //
Leemos el estado del pulsador de decremento
if(estadoPulsadorDecremento !=
estadoPulsadorAnteriorDecremento) // Si hay un cambio en el estado del
pulsador de decremento
{
if(antirrebote(pulsadorDecremento))
{
cuenta--; // Se decrementa la cuenta en una unidad
if(cuenta < 0) // Si la cuenta es menor que 0, permanece en 0.
{
cuenta = 0;
}
}
}
estadoPulsadorAnteriorDecremento = estadoPulsadorDecremento; //
Actualizamos el estado anterior del pulsador de decremento
actualizarNumero(); // Actualizamos el número que aparece en el
display de 7 segmentos

RESULTADOS
Pulsador ascendente
Prueba descendente
DIAGRAMA DE FLUJO
INICIO

const int pulsadorIncremento = 6;


const int pulsadorDecremento = 5;
const int tiempoAntirrebote = 10;
int cuenta = 0;
int estadoPulsadorIncremento;
int estadoPulsadorAnteriorIncremento;
int estadoPulsadorDecremento;
int estadoPulsadorAnteriorDecremento;
int contador = 0;
boolean estado;
boolean
estadoAnterior;

estado = digitalRead(pin)

contador = 0; Si if(estado No
estadoAnterior = != contador = contador+ 1;
estado; estadoAn
terior)

while(contador <
tiempoAntirrebote)

return estado

(int a, int b, int c, int


d, int e, int f, int g

pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
pinMode(pulsadorIncremento, INPUT);
pinMode(pulsadorDecremento, INPUT);

estadoPulsadorIncremento =
digitalRead(pulsadorIncremento);
if(estadoPulsadorInc
Si No
remento !=
estadoPulsadorAnte
riorIncremento)

Si if(antirrebote(pulsadorInc
remento))

cuenta++
No

if(cuenta > No
Si 9)

cuenta = 9

estadoPulsadorAnteriorIncrement
o = estadoPulsadorIncremento;

actualizarNumero();

FIN

También podría gustarte