Accueil > Arduino, Matériel > Projet HomeLab : interface humaine

Projet HomeLab : interface humaine

Nous allons nous intéresser à la centrale et plus particulièrement à l’interface humaine. La centrale sera équipée d’un afficheur LCD 2×16 caractères, ainsi qu’un bouton poussoir qui permettra d’afficher les informations.

Le schéma sera le suivant :

photo 2

La particularité est que j’utilise les broches analogiques (A0 à A3) en tant que sortie digitale pour piloter une partie de l’afficheur LCD.

J’ai effectué une maquette pour valider le bon fonctionnement :

photo 1

Un premier appui sur le bouton poussoir va allumer l’afficheur LCD et afficher la température intérieure, un second appui affiche la température extérieure, un troisième appui affiche la pression atmosphérique et enfin un quatrième appui affiche l’humidité.

Au bout de 10 secondes s’il n’y a pas d’appui sur le bouton, l’afficheur s’éteint.

Voici le squelette du programme qui gèrera l’interface humaine :

/*     Projet Homelab     */

// Gestion afficheur LCD
#include <LiquidCrystal.h>
/* initialise la librairie en précisant les sorties utilisées
Les connexions sont les suivantes :
* LCD broche RS connectée à la broche 5 de l’Atmega (digital pin 3)
* LCD broche Enable connecté à la broche 15 de l’Atmega (digital pin 9)
* LCD broche D4 connectée à la broche 16 de l’Atmega (digital pin 10)
* LCD broche D5 connectée à la broche 23 de l’Atmega (digital pin 14 –> analogue port A0)
* LCD broche D6 connectée à la broche 24 de l’Atmega (digital pin 15 –> analogue port A1)
* LCD broche D7 connectée à la broche 25 de l’Atmega (digital pin 16 –> analogue port A2)
*/
LiquidCrystal lcd(3, 9, 10, 14, 15, 16);
byte degre[8] = {B00111,B00101,B00111,B00000,B00000,B00000,B00000,};
byte pourcent[8] = {B11100,B10101,B11110,B00100,B01111,B10101,B00111,};
byte e_accent[8] = {B00010,B00100,B01110,B10001,B11111,B10000,B01110,};
int caractere_degre = 0;
int caractere_pourcent = 1;
int caractere_e_accent = 2;
int lcd_on = 17; // traitement allumage/extinction LCD via port analogue A3

// traitement du bouton affichage information
int bouton_0 = 0; // interruption 0, pin 2
byte nbr_pression_bouton_0 = 0;
boolean interruption_bouton_0 = false;

void setup()
{
  lcd.begin(16, 2); // initialise le nombre de caractères et de lignes
  lcd.setCursor(1,0);
  lcd.print("Initialisation");
  lcd.setCursor(4,1);
  lcd.print("HomeLab");
  attachInterrupt(bouton_0, traite_bouton_0, FALLING);
  pinMode(lcd_on, OUTPUT);
  digitalWrite(lcd_on, HIGH); // afficheur allumé
  lcd.createChar(caractere_degre, degre); // création du caractère personnalisé
  lcd.createChar(caractere_pourcent, pourcent);
  lcd.createChar(caractere_e_accent, e_accent);
  delay(5000);
  digitalWrite(lcd_on, LOW); // afficheur éteint
  lcd.noDisplay(); // désactivation d’affichage
}

void traite_bouton_0()
{
  lcd.clear();
  lcd.display(); // activation affichage
  nbr_pression_bouton_0++;
  digitalWrite(lcd_on, HIGH); // afficheur allumé
  if (nbr_pression_bouton_0 == 1)
  {
    // un 1er appui sur le bouton 0, affiche la température intérieure
    lcd.setCursor(0,0);
    lcd.print("Temp");
    lcd.write(caractere_e_accent);
    lcd.print("rature int.");
    lcd.setCursor(4,1);
    lcd.print(temp_int);
    lcd.write(caractere_degre);
    lcd.print("C");
    interruption_bouton_0 = true;
  }
  if (nbr_pression_bouton_0 == 2)
  {
    // un second appui sur le bouton 0, affiche la température extérieure
    lcd.setCursor(0,0);
    lcd.print("Temp");
    lcd.write(caractere_e_accent);
    lcd.print("rature ext.");
    interruption_bouton_0 = true;
  }
  if (nbr_pression_bouton_0 == 3)
  {
    // un troisième appui sur le bouton 0, affiche la pression
    lcd.setCursor(4,0);
    lcd.print("Pression");
    pression = bmp085GetPressure(bmp085ReadUP());
    lcd.setCursor(4,1);
    lcd.print(pression);
    lcd.print(" hPa");
    interruption_bouton_0 = true;
  }
  if (nbr_pression_bouton_0 == 4)
  {
    // un quatrième appui sur le bouton 0, affiche l’humidité
    lcd.setCursor(4,0);
    lcd.print("Humidit");
    lcd.write(caractere_e_accent);
    lcd.setCursor(6,1);
    lcd.write(caractere_pourcent);
    interruption_bouton_0 = true;
    nbr_pression_bouton_0 = 0;
  }
}

void loop()
{
  if (interruption_bouton_0)
  {
    // le bouton 0 a été appuyé
    for (int i=0; i<=10000; i++)
    {
      // temporisation 10 secondes
      if (interruption_bouton_0)
      {
        // si appui bouton 0, on repart pour 10 secondes
        interruption_bouton_0 = false;
        i = 0;
      }
      delayMicroseconds(1000);
    }
    interruption_bouton_0 = false;
    nbr_pression_bouton_0 = 0;
    lcd.clear();
    digitalWrite(lcd_on, LOW); // afficheur éteint
    lcd.noDisplay(); // désactivation affichage
  }
}

 

Il ne reste plus qu’à souder tout ceci. Je vous invite également à regarder mes différents articles :

– construire un Arduino.

– utilisation de l’afficheur LCD avec un Arduino.

– utilisation des interruptions de l’Arduino.

Publicités
Catégories :Arduino, Matériel Étiquettes : , , ,
  1. Aucun commentaire pour l’instant.
  1. No trackbacks yet.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :