Después de ver como trabajan las entradas analógicas, el puerto serial, vamos a aprender como se usan las entradas/salidas digitales y a “multiplexarlas” para usar un display de 4 dígitos 7 segmentos de 12 pines con cátodo común para el termómetro que hicimos, además de mejorar la resolución de lectura mediante el pin AREF. Primero os presentamos como hemos nombrado los pines del display, a que hacen referencia y como los conectamos al Arduino.
-
Pin Display
Referencia
Pin Arduino
1
GND1
8
2
C
2
3
A
0
4
GND2
9
5
GND3
10
6
F
5
7
B
1
8
E
4
9
H
7
10
G
6
11
D
3
12
GND4
11
El siguiente paso para las conexiones es explicaros como funciona el pin AREF y por qué lo usaremos para mejorar la resolución de las lecturas analógicas. Como vimos en el tutorial anterior, Arduino codifica con 10bits y 5V. Con el pin AREF podemos cambiar esto aplicando una tensión de entrada, pero como los pines tienen una resistancia interna de 32KΩ debemos hacer un pequeño calculo para saber que resitencia y tensión aplicar para la resolución que deseemos, la función para el divistor resistivo es la siguiente:
Como vamos a usar la salida de 3,3V de Arduino, vamos a calcular el valor de la resistencia para obtener una entrada de unos 2V:
(3,3*32K)-(2*32k)/2 = Rin -> 20,8K
Como la que tengo más a mano parecida es de 22K yo usaré en la lectura 1,955V. Vosotros podéis escoger la que más os convenga según la resolución que deseeis.
Y lo conectaremos de la siguiente manera:
La resistencia entre la salida del LM35 puede ser una de 1K mismo, y el diodo situeado entre GND del LM35 es para poder leer temperaturas negativas, por tanto también vamos a leer la tensión que hay entre el diodo y el LM35, que será nuestro valor de referencia.
Aquí tenéis todo el código con comentararios en las partes interesantes.
float temp,aux_1,aux_0;
int neg[7],cod1[7],cod2[7],cod3[7];
int decenas,unidades,decimas,cont=0;
void setup() {
// Pines Display
// LEDS
pinMode(0,OUTPUT); //A
pinMode(1,OUTPUT); //B
pinMode(2,OUTPUT); //C
pinMode(3,OUTPUT); //D
pinMode(4,OUTPUT); //E
pinMode(5,OUTPUT); //F
pinMode(6,OUTPUT); //G
pinMode(7,OUTPUT); //H (Punto)
// GND
pinMode(8,OUTPUT);//XOOO
pinMode(9,OUTPUT);//OXOO
pinMode(10,OUTPUT);//O0XO
pinMode(11,OUTPUT);//OOOX
//Inicializar valores
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(11,HIGH);
analogReference(EXTERNAL); // Activar lectura pin AREF {DEFAULT,INTERNAL,EXTERNAL,INTERNAL1V1,INTERNAL2V56}
}
void loop(){
//Lectura temperatura
aux_1 = ((analogRead(0)-analogRead(1))*195.5)/1023.0; // Valor leido. Referencia * Tension maxima de lectura / Valor maximo codificacion
if(cont == 35){
temp = aux_1;
cont = 0;
}else{
if(aux_1 == temp){
cont = 0;
aux_0 = aux_1;
}else{
if(aux_1 == aux_0){
cont++;
}else{
cont == 0;
aux_0 = aux_1;
}
}
}
if(temp < 0){
neg[3] = 1;
}else{
neg[3] = 0;
}
// Descomposion en digitos
decenas = temp/10;
unidades = temp-(decenas*10);
decimas = (temp-(decenas*10+unidades))*10;
// Llamadas a funciones
codificar(decenas,cod1);
codificar(unidades,cod2);
codificar(decimas,cod3);
// Escribir en display
// Multiplexacion
digitalWrite(8,LOW);
mostrar(neg);
digitalWrite(8,HIGH);
digitalWrite(9,LOW);
mostrar(cod1);
digitalWrite(9,HIGH);
digitalWrite(10,LOW);
digitalWrite(7,HIGH);
mostrar(cod2);
digitalWrite(7,LOW);
digitalWrite(10,HIGH);
digitalWrite(11,LOW);
mostrar(cod3);
digitalWrite(11,HIGH);
}
// Creacion de funciones propias
void codificar(int val, int cod[]){
switch(val){
case 0:
cod[0] = 1;
cod[1] = 1;
cod[2] = 1;
cod[3] = 0;
cod[4] = 1;
cod[5] = 1;
cod[6] = 1;
break;
case 1:
cod[0] = 0;
cod[1] = 0;
cod[2] = 0;
cod[3] = 0;
cod[4] = 0;
cod[5] = 1;
cod[6] = 1;
break;
case 2:
cod[0] = 0;
cod[1] = 1;
cod[2] = 1;
cod[3] = 1;
cod[4] = 1;
cod[5] = 1;
cod[6] = 0;
break;
case 3:
cod[0] = 0;
cod[1] = 0;
cod[2] = 1;
cod[3] = 1;
cod[4] = 1;
cod[5] = 1;
cod[6] = 1;
break;
case 4:
cod[0] = 1;
cod[1] = 0;
cod[2] = 0;
cod[3] = 1;
cod[4] = 0;
cod[5] = 1;
cod[6] = 1;
break;
case 5:
cod[0] = 1;
cod[1] = 0;
cod[2] = 1;
cod[3] = 1;
cod[4] = 1;
cod[5] = 0;
cod[6] = 1;
break;
case 6:
cod[0] = 1;
cod[1] = 1;
cod[2] = 1;
cod[3] = 1;
cod[4] = 1;
cod[5] = 0;
cod[6] = 1;
break;
case 7:
cod[0] = 0;
cod[1] = 0;
cod[2] = 1;
cod[3] = 0;
cod[4] = 0;
cod[5] = 1;
cod[6] = 1;
break;
case 8:
cod[0] = 1;
cod[1] = 1;
cod[2] = 1;
cod[3] = 1;
cod[4] = 1;
cod[5] = 1;
cod[6] = 1;
break;
case 9:
cod[0] = 1;
cod[1] = 0;
cod[2] = 1;
cod[3] = 1;
cod[4] = 1;
cod[5] = 1;
cod[6] = 1;
break;
}
}
void mostrar(int cod[7]){
for(int i =0; i< 7;i++){
if(cod[i]!=1)
digitalWrite(i,LOW);
else
digitalWrite(i,HIGH);
}
delay(5);
}