21 enero, 2020

Termómetro Arduino (E/S Digital) 1/4

Nos alejamos un poco de los últimos temas de seguridad y volvemos a Arduino con un proyecto bastante completo para aprender diversas cosas, un termometro con historico y calibrable, por eso tendrá varias fases explicando el uso de cada una de las tipos de entradas de Arduino y funciones de los componente.

Descripción

El proyecto a desarrollar es un sensor de temperatura, que se visualizara en un display, dispondrá de un sistema de ajuste para corregir la temperatura leída y ademas podrá verse un histórico de las temperaturas.

  1. Por defecto tendremos la visualización de la temperatura (Led Verde encendido).
  2. Al pulsar el boton1 accederemos al modo calibración(Led Naranja) de la temperatura con el potenciometro1 y tiempo de lecturas con el potenciometro2 y saldremos volviendo a pulsar el boton1.
  3. El boton2 nos da acceso al histórico(Led Azul) pulsandolo otra vez a modo por defecto.

Este proyecto nos permitirá ver:

  1. E/S Digitales para los LEDs y los botones. (1/4)
  2. Entradas analógica para los potenciometros y como no el sensor de temperatura «TMP36» (2/4)
  3. Display (3/4)
  4. Proyecto Termometro en Arduino. (4/4)

Sin perder más tiempo empezamos con esta primera entrega de las E/S Digitales.

E/S Digitales

Resultado tutorial E/S Digitales

Las entradas / salidas que solo permiten los valores ALTO(HIGH 5 o 3,3V con una corriente de 20mA) y BAJO(LOW 0 Voltios) por regla general operan a 5V y 40mA máximo pero siempre intentaremos calcular 20mA. En el arduino UNO tenemos 14 E/S Digitales de las cuales 6 pueden usarse como PWM (D3, D5, D5, D9, D10, D11). Evitaremos usar D0-1 ya que se conectan en la comunicación de USB.

Antes de usarlos pines deberemos definir si son de entrada o salida con la instrucción pinMode(PIN,OUTPUT|INPUT)

pinMode(13,OUTPUT);  // Pone el PIN13 digital como salida.
PinMode(5,INPUT); // Pone el PIN5 digital como entrada.

Para las salidas digitales se utiliza la función digitalWrite(PIN,LOW|HIGH)

digitalWrite(13 , HIGH); // Pone a ALTO el PIN13 (5V o 3,3V según modelo)
digitalWrite(13 , LOW);  // Pone a BAJO el PIN13 (0V)

Y para leerlas usaremos digitalRead(PIN) que nos dara si esta en ALTO o BAJO el pin.

LEDs

Los LEDs se conectaran a salidas digitales «pinMode a OUTPUT» se encenderán o no según este en ALTO o BAJO «digitalWrite.

No podemos conectar directamente el LED al pin ya que lo romperíamos al suministrarle una tensión superior a la soportada, por lo que pondremos una resistencia.

ColorR. TensiónCorriente
Rojo1,8 V20 mA
Naranja2,1 V 20 mA
Amarillo2,2 V 20 mA
Verde 3,2 V20 mA
Azul3,5 V20 mA
Blanco3,8 V20 mA

El calculo de la resistencia por lo tanto es sencillo, sabiendo que arduino nos dará 5V «R=V/I» deberemos de calcular el voltaje a restar para llegar a la especificación del LED.

Así para un LED de 2,2V tendriamos una diferencia de (5-1,8=3,2V) y el calculo de la resistencia sera 3,2V/0,02A=160 Ohm. Hemos pasado los 20mA a A (20/1000)

Si tenemos varios LEDs en el mismo PIN y sabiendo que cada uno consumirá su parte la formula R=(V-(vL1+ … + vLn))/I

La resistencia que se utilizara es un valor normalizado inmediatamente superior por eso con el LED rojo solemos poner 220 Ohm.

Botones

Los botones se conectan a un PIN digital de entrada «pinMode a INPUT» y se leerá el estado con «digitalRead».

Debemos tener en cuenta que una entrada abierta sin más nos puede dar valores aleatorios al estar en alta impedancia, para evitar esto utilizaremos una resistencia de 10K al positivo “pullup” o una resistencia a masa “pulldown”.

Se puede conectar directamente pero en este caso deberemos configurar el pin a “INPUT_PULLUP” para usar la resistencia interna. Normalmente pondremos nosotros la resistencia.

Ejemplo

LED-Rojo Encendido al arrancar, dos botones de forma que indicaran que LEDS encender:

  • Boton 1: LED Verde
  • Boton 2: LED Naranja
  • Boton1 y Boton2: LED Azul.

Calculamos las resistencias para los LEDs (160, 90, 145 y 75 Ohm.) por lo que necesitaremos dos resistencias de 220 Ohm. para el rojo y Naranja y dos de 100 Ohm para Verde y Azul.

El código es el siguiente y se encuentra autocomentado.

// Definimos los nombres simbolicos de los pines
// Salidas digitales
#define LED_Rojo    2
#define LED_Verde   3
#define LED_Naranja 4
#define LED_Azul    5

// Entradas digitales
#define Boton_1     8
#define Boton_2     9


// Inicialización de pines y confirmación de LEDs.
void setup() 
{
  int leds[4] ={LED_Rojo, LED_Verde, LED_Naranja, LED_Azul};
  
  // Definimos los modos de los pines.
  pinMode(LED_Rojo, OUTPUT);
  pinMode(LED_Verde, OUTPUT);
  pinMode(LED_Naranja, OUTPUT);
  pinMode(LED_Azul, OUTPUT);
  pinMode(Boton_1, INPUT);
  pinMode(Boton_2, INPUT);

  // Encendemos y apagamos todos para confirmar funcionamiento
  digitalWrite(LED_Rojo,HIGH);
  digitalWrite(LED_Verde,HIGH);
  digitalWrite(LED_Naranja,HIGH);
  digitalWrite(LED_Azul,HIGH);
  delay(500);
  digitalWrite(LED_Rojo,LOW);
  digitalWrite(LED_Verde,LOW);
  digitalWrite(LED_Naranja,LOW);
  digitalWrite(LED_Azul,LOW);
  for (int i = 0;i<4; i = i +1)
  {
    digitalWrite(leds[i],HIGH);
    delay(500);
    digitalWrite(leds[i],LOW);
    delay(250);
  }
  digitalWrite(LED_Rojo,HIGH);
  
}

// Bucle infinito, que comprueba botones y enciende LEDs
void loop() 
{
  int valor=0;  // Por defecto todos apagado

  if (digitalRead(Boton_1)) valor = valor + 1;
  if (digitalRead(Boton_2)) valor = valor + 2;

  // Encendemos los leds (B1=Verde, B2=Naranga y B1B2=Azul)
  // Se utiliza una codificación binaria (1,2,3 y 0 ninguno)
  switch(valor)
  {
    case 0:
       digitalWrite(LED_Verde,LOW);
       digitalWrite(LED_Naranja,LOW);
       digitalWrite(LED_Azul,LOW);
       break;
    case 1:
       digitalWrite(LED_Verde,HIGH);
       digitalWrite(LED_Naranja,LOW);
       digitalWrite(LED_Azul,LOW);
       break;
    case 2:
       digitalWrite(LED_Verde,LOW);
       digitalWrite(LED_Naranja,HIGH);
       digitalWrite(LED_Azul,LOW);
       break;
    case 3:
       digitalWrite(LED_Verde,LOW);
       digitalWrite(LED_Naranja,LOW);
       digitalWrite(LED_Azul,HIGH);
       break;
  }
}

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Información básica sobre protección de datos

  • Responsable Javier .
  • Finalidad Moderar los comentarios. Responder las consultas.
  • Legitimación Su consentimiento.
  • Destinatarios Hostinger.es.
  • Derechos Acceder, rectificar y suprimir los datos.
  • Información Adicional Puede consultar la información detallada en el Aviso Legal.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.