INFO pour écran LCD avec touches de commande "SainSmart"

edited juillet 2013 in General
Bonjour à tous

J'ai acheté ce composant
http://www.sainsmart.com/sainsmart-1602-lcd-keypad-shield-for-arduino-duemilanove-uno-mega2560-mega1280.html

Trouvé pour moins de 4€ sur ebay livré

Les exemples qui se trouvent avec l'arduino, commence l'initialisation par la commande

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

Si vous voulez que votre programme fonctionne avec ce type d'écran LCD, il faut alors remplacer cette ligne par

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

Après tout fonctionne normalement....

Le but de cet achat est de faire une boitier autonome (comme une centrale de température) qui m'affiche les températures en fonction des capteurs soit DS18B20 et du capteur DTH22 (Température et le taux d'humidité), puis cette "centrale" communique avec le serveur YANA.


PS : Pour IDLEMAN, j'espère être dans la bonne section

@+
Lamalicefr

Commentaires

  • tu es dans la bonne section si c'est juste une info que tu donne comme ça mais si tu compte faire un petit tuto où que cela fais partie d'un projet dis-le que je déplace dans la bonne catégorie.
  • @ Lamalice si tu fais un truc là dessus un petit tuto serait tip top
    Merci
  • Pour le moment c'est une info, j'espère en faire un "composant YANA".

    @+
    Lamalicefr
  • ok alors tu est au bon endroit et quand tu fera un tuto là dessus tu pouras le mettre dans la section "Le tuto du poivrot" si tu as envie de montrer l'intégralité de ton projet avec les avancements et les découvertes tu peux le faire dans la section "Projets"
  • Salut @LAMALICE

    pourrais tu nous faire un petit tuto pour cet écran stp ?
    ça serait vraiment cool
  • Il est en cours de rédaction, avec des fonctions ....

    @+
  • cool :-) J'attends avec impatience
  • @LAMALICE , ton tuto est disponible ? :)
  • Je n'ai pas trop avancé sur cette partie pour le moment...
  • sniff ...
    T'aurai même pas un bout de code a partager stp?
  • Voici ce que j'ai fait....
    Pour le moment, je ne l'utilise uniquement en tant qu'afficheur, je n'ai pas encore implémenté la gestion des boutons, afin de faire des menus ....
    La déclaration des bouton est déjà faite....   ;o)
    J'espère que tu trouveras des infos à exploiter.

    PS: je suis obligé de séparer le code en 2 postes, car j'ai un message de refus trop de lignes...

    Donc voici le code:


    // Définition des constantes pour le programme
    #define NOM_PROGRAMME "Affiche tempe"
    #define VERSION_PROGRAMME "Ver 1.0"

    #define MAX_CAR_LIGNE 16
    #define MAX_LIGNE_LCD 2
    #define DEBUT_LIGNE_LCD 0
    #define LIGNE_1 0
    #define LIGNE_2 1

    /* Type de sonde :
        type 1 = Sonde DHT22    affiche T° et % Hygro
        type 2 = Sonde DS18B20  affiche T°
    */
    #define SONDE_DHT22 1
    #define SONDE_DS18B20 2

    //---------------------------------------------


    /* Sainsmart LCD Shield for Arduino
    Key Codes (in left-to-right order):
    None   - 0
    Select - 1
    Left   - 2
    Up     - 3
    Down   - 4
    Right  - 5

    Utilise le port Analogique A0
    */

    #include <LiquidCrystal.h>
    #include <DFR_Key.h>

    //Pin assignments for SainSmart LCD Keypad Shield
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
    //---------------------------------------------

    // Capteur Dallas DS18B20
    #include <OneWire.h>
    #include <DallasTemperature.h>

    // Data wire is plugged into pin 2 on the Arduino
    #define ONE_WIRE_BUS 2

    // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
    OneWire oneWire(ONE_WIRE_BUS);

    // Pass our oneWire reference to Dallas Temperature.
    DallasTemperature sensors(&oneWire);
    //---------------------------------------------
    // Capteur DHT22
    #include "DHT.h"
    DHT dht;
    // Data wire is plugged into port 3 on the Arduino
    // Connect a 4.7K resistor between VCC and the data pin (strong pullup)
    #define DHT22_PIN 3

    //---------------------------------------------

    void setup()
    {
    //setup de l'écran LCD
        lcd.begin(MAX_CAR_LIGNE, MAX_LIGNE_LCD);
       
    // affiche le nom et la version du programme pendant 2 secondes
        Affichage_LCD(NOM_PROGRAMME,VERSION_PROGRAMME);
        delay(2000);
        lcd.clear();
       
        // start serial port
        Serial.begin(9600);
        Serial.println(NOM_PROGRAMME);
        Serial.println(VERSION_PROGRAMME);

        // Start up the library
        // Setup des composants DALLAS DS18B20
       
    sensors.begin(); // IC Default 9 bit. If you have troubles consider
    upping it 12. Ups the delay giving the IC more time to process the
    temperature measurement
        dht.setup(DHT22_PIN); // data pin 3
    }

    void loop(void)
    {
        delay(dht.getMinimumSamplingPeriod());

        float humidite = dht.getHumidity();            //humidité du capteur DHT22
        float temperature22 = dht.getTemperature();    //température du capteur DHT22

        float temperature;                            // température du DS18B20
        char temp[10];                                // pour la conversion de float en string
        String tempAsString;                        // pour la conversion de float en string
         
        // call sensors.requestTemperatures() to issue a global temperature
        // request to all devices on the bus
        Serial.print("Requesting temperatures...");
        sensors.requestTemperatures(); // Send the command to get temperatures
        Serial.println("DONE");

        Serial.print("Temperature for Device 1 is: ");
       
    Serial.print(sensors.getTempCByIndex(0)); // Why "byIndex"? You can
    have more than one IC on the same bus. 0 refers to the first IC on the
    wire

        // capteur 1
        temperature=sensors.getTempCByIndex(0);
        tempAsString=Prepare_ligne2(SONDE_DS18B20,temperature,0);
        Affichage_LCD("Temp capteur 1 :",tempAsString);
        delay(3000);

        // capteur 2
        temperature=sensors.getTempCByIndex(1);
        tempAsString=Prepare_ligne2(SONDE_DS18B20,temperature,0);
        Affichage_LCD("Temp capteur 2 :",tempAsString);
        delay(3000);

        //capteur 3
        tempAsString=Prepare_ligne2(SONDE_DHT22,temperature22,humidite);
        Affichage_LCD("Temp capteur 3 :",tempAsString);
        delay(3000);
     
    }

  • void Affichage_LCD(String ligne1,String ligne2)
    { // le but de cette fonction est d'afficher les 2 lignes recu en parametre
        lcd.clear();
        lcd.setCursor(DEBUT_LIGNE_LCD, LIGNE_1);
        lcd.print(ligne1);
        lcd.setCursor(DEBUT_LIGNE_LCD, LIGNE_2);
        lcd.print(ligne2);
    }

    String Prepare_ligne2(byte type_capteur,float valeur_1,float valeur_2)
    {/* Le but de cette fonction est de preparer l'affichage de la ligne "2" du LCD
    type_capteur = type de capteur soit DALLAS18B20, soit SONDE_DHT22 soit SONDE_DS18B20
    valeur_1 = température (c'est une valeur de type float)
    valeur_2 = % d'humidité provenant du capteur DTH22 de type float)

    En retour il y aura la chaine de caractère a afficher sur la seconde ligne de l'afficheur LCD
    */

    String ligne2;
    char temp[10];

    switch (type_capteur) {
        case SONDE_DHT22:
            Serial.println("Capteur type DHT22");
            Serial.println(valeur_1);
            Serial.println(valeur_2);
            dtostrf(valeur_1,1,2,temp);        //convertie la température de type float en string
            ligne2 = String(temp);
            ligne2=ligne2+(char)223+"C | "; //Ajoute le caractère "°" puis "C | " pour la séparation de l'humidité
            Serial.println(ligne2);
            dtostrf(valeur_2,1,2,temp);        //convertie l'humidité de type float en string
            ligne2=ligne2+temp+"%";            //Ajoute le caractère % de l'humidité
            Serial.println(ligne2);
            return (ligne2);
            break;
        case SONDE_DS18B20 :
            Serial.println("Capteur type DS18B20");
            Serial.println(valeur_1);
            dtostrf(valeur_1,1,2,temp);        //convertie la température de type float en string
            ligne2 = String(temp);
            ligne2=ligne2+(char)223+"C";    //Ajoute le caractère "°" puis C;
            Serial.println(ligne2);
            return (ligne2);
            break;
        default:
            Serial.println("Mauvaise définition de capteur");
        }
    }



  • Merci pour ton code.
    Il va m’être utile .
    Par contre , tu n'utilise pas du tout l'arduino pour ce projet ?
    Car je vois que la sonde de température est connecté au pin 2 de l'arduino
  • Pour le moment tout le code est arduino et autonome.
    - Sur le port 2 tu as le rsx one wire avec 2 sondes
    - Sur le port 3 tu as un DHT22
  • Ok, j'aurai plutôt cru que tu voulais le rendre compatible avec le Raspberry :-)
    Bon quoi qu'il en soit merci pour ton Code , je vais tester tout ça sur mon Arduino ^^
  • Dans un second temps, il faudra le faire communiquer avec le rasp => en incluant la lib de communication.
    J'ai déjà les composants RF 433 => entre 2 Arduino, ca fonctionne => il ne doit pas y avoir de problème avec le rasp...

  • edited novembre 2013
    Salut LAMALICE,

    j'ai repris une partie de ton code pour l'affichage du LCD.
    J'y ai ajouté des fonctions pour les boutons .
    Par contre tes capteurs tu les as soudé directement sur les trous du Shield LCD ? A02 et A03
  • Pour le moment c'était en fils volants, mais je pensais acheter des barrettes afin de les souder et de mettre des connecteurs sur les composants, c'est plus modulaire et mieux pour le SAV....

    SUPER que tu ai pu avancer.

    Les fonctions pour l'affichage et les boutons j'allais le faire => tu m'as fait gagner tu temps....  ;o)

    Après, il faudra s'occuper de la communication avec YANA.(je ne sais pas quand j'aurai du temps....)
Sign In or Register to comment.