GPIO – LCD 16*02 et DHT11 en terminal et sur LCD

#OS : PIXEL, OSMC, MultiOS
#niveau 2
#temps de manipulation : 60 mins environ et selon rpi2 ou 3 et hors mise à jour (
#Outils nécessaires : de la patience
#Pré-requis : connexion internet et un RPi pret
#date de dernière révision : 17/04/2017

Avant de commencer, ce tuto a été réalisé en suivant un site américain avec un auteur bienveillant. (je cite ma source a la fin)
Ce dernier explique la nuance entre les DHT11 a 3 ou 4 pattes et pour le DHT22.
Le fonctionnement est sensiblement le même et surtout les scripts utilisés sont strictement les mêmes, il s’agit uniquement de différences dans le cablage.

 

Il faut donc commencer par câbler

Pour un DHT11 a 3 pattes (donc avec la résistance intégrée) voici le schéma a suivre :

une fois le cablage réalisé, on va installer les outils « habituels » nécessaires pour récupérer les librairies et les sources du code qui nous serviront a faire fonctionner indépendamment notre DHT11 et le LCD et ensuite le tout !
ndlr : Attention au repertoire dans lequel vous vous trouvez

#sudo apt-get install git-core
#git clone git://git.drogon.net/wiringPi

Maintenant on installe (on construit) la librairie

#cd wiringPi
#./build

voila, notre librairie est prête, il ne nous reste qu’a créer notre fichier qui va recevoir le code pour dans un premier temps tester notre sonde DHT11. Je passe par l’étape « contrôle » de la sonde par réflexe, j’ai déjà vu des capteurs HS me coûter du temps de réflexion sur pourquoi mon projet ne fonctionne pas ….

#sudo vi DHT11.c

et je rentre le code suivant completement, et bien sur on enregistre

#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#define MAXTIMINGS 85
#define DHTPIN 7
int dht11_dat[5] = { 0, 0, 0, 0, 0 };
 
void read_dht11_dat()
{
 uint8_t laststate = HIGH;
 uint8_t counter = 0;
 uint8_t j = 0, i;
 float f; 
 
 dht11_dat[0] = dht11_dat[1] = dht11_dat[2] = dht11_dat[3] = dht11_dat[4] = 0;
 
 pinMode( DHTPIN, OUTPUT );
 digitalWrite( DHTPIN, LOW );
 delay( 18 );
 digitalWrite( DHTPIN, HIGH );
 delayMicroseconds( 40 );
 pinMode( DHTPIN, INPUT );
 
 for ( i = 0; i < MAXTIMINGS; i++ )
 {
 counter = 0;
 while ( digitalRead( DHTPIN ) == laststate )
 {
 counter++;
 delayMicroseconds( 1 );
 if ( counter == 255 )
 {
 break;
 }
 }
 laststate = digitalRead( DHTPIN );
 
 if ( counter == 255 )
 break;
 
 if ( (i >= 4) && (i % 2 == 0) )
 {
 dht11_dat[j / 8] <<= 1;
 if ( counter > 16 )
 dht11_dat[j / 8] |= 1;
 j++;
 }
 }
 
 if ( (j >= 40) &&
 (dht11_dat[4] == ( (dht11_dat[0] + dht11_dat[1] + dht11_dat[2] + dht11_dat[3]) & 0xFF) ) )
 {
 f = dht11_dat[2] * 9. / 5. + 32;
 printf( "Humidity = %d.%d %% Temperature = %d.%d C (%.1f F)\n",
 dht11_dat[0], dht11_dat[1], dht11_dat[2], dht11_dat[3], f );
 }else {
 printf( "Data not good, skip\n" );
 }
}
 
int main( void )
{
 printf( "Raspberry Pi wiringPi DHT11 Temperature test program\n" );
 
 if ( wiringPiSetup() == -1 )
 exit( 1 );
 
 while ( 1 )
 {
 read_dht11_dat();
 delay( 1000 ); 
 }
 
 return(0);
}

maintenant on compile notre fichier qui n’est qu’un fichier, pour en faire un programme avec la commande suivante :

gcc -o DHT11 DHT11.c -lwiringPi -lwiringPiDev

Pour léger détail, gcc est notre compilateur, DHT11 est le nom du programme final que l’on souhaite obtenir, DHT11.c est la source qui va servir a gcc de compiler le programme, et les lwiringPi sont les librairies que notre code utilise en dehors des librairies communes déjà présente dans le système par défaut.

Et maintenant on exécute notre programme et on doit obtenir quelquechose comme ca en resultat :

#sudo ./DHT11

 

 

 

Yattah !!!

Rebelote on va pouvoir tenter l’affichage sur notre LCD de la sortie de notre sonde ! on créé un fichier, on compile et on test comme des fifous

#sudo vi LCD_DHT11.c
#include <wiringPi.h>
#include <lcd.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

//USE WIRINGPI PIN NUMBERS
#define LCD_RS 25 //Register select pin
#define LCD_E 24 //Enable Pin
#define LCD_D4 23 //Data pin 4
#define LCD_D5 22 //Data pin 5
#define LCD_D6 21 //Data pin 6
#define LCD_D7 14 //Data pin 7
#define MAXTIMINGS 85
#define DHTPIN 7

int lcd;
int dht11_dat[5] = {0, 0, 0, 0, 0};

void read_dht11_dat()
{
 uint8_t laststate = HIGH;
 uint8_t counter = 0;
 uint8_t j = 0, i;
 float f; 

 dht11_dat[0] = dht11_dat[1] = dht11_dat[2] = dht11_dat[3] = dht11_dat[4] = 0;

 pinMode(DHTPIN, OUTPUT);
 digitalWrite(DHTPIN, LOW);
 delay(18);
 
 digitalWrite(DHTPIN, HIGH);
 delayMicroseconds(40);
 
 pinMode(DHTPIN, INPUT);

 for (i = 0; i < MAXTIMINGS; i++)
 {
 counter = 0;
 while (digitalRead(DHTPIN) == laststate)
 {
 counter++;
 delayMicroseconds(1);
 if (counter == 255)
 {
 break;
 }
 }
 laststate = digitalRead(DHTPIN);

 if (counter == 255)
 break;

 if ((i >= 4) && (i % 2 == 0))
 {
 dht11_dat[j / 8] <<= 1;
 if (counter > 16)
 dht11_dat[j / 8] |= 1;
 j++;
 }
 }

 if ((j >= 40) && (dht11_dat[4] == ((dht11_dat[0] + dht11_dat[1] + dht11_dat[2] + dht11_dat[3]) & 0xFF)))
 {
 f = dht11_dat[2] * 9. / 5. + 32;

 lcdPosition(lcd, 0, 0);
 lcdPrintf(lcd, "Humidity: %d.%d %%\n", dht11_dat[0], dht11_dat[1]);

 lcdPosition(lcd, 0, 1);
 lcdPrintf(lcd, "Temp: %d.0 C", dht11_dat[2]); //Uncomment for Celsius
 //lcdPrintf(lcd, "Temp: %.1f F", f); //Comment out for Celsius
 }
}

int main(void)
{
 int lcd;
 wiringPiSetup();
 lcd = lcdInit (2, 16, 4, LCD_RS, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7, 0, 0, 0, 0);
 
 while (1)
 {
 read_dht11_dat();
 delay(1000); 
 }

 return(0);
}
#gcc -o LCD_DHT11 LCD_DHT11.c -lwiringPi -lwiringPiDev

On serre les fesses et on test !

#sudo ./LCD_DHT11

 

 

 

 

 

 

YATTAH RE YATTAH ca marche !

on fait ctrl+c pour stopper et je vous donne l’astuce du chef pour que ca tourne sans « utiliser » un terminal

#sudo ./LCD_DHT11 &

ce « & » va lancer votre programme en démon, et vous retourner le « numéro » du processus, pour l’arreter

#sudo kill "numéroduprocessus"

 

Et voila, prochain tuto, l’affichage sur une page web de nos résultats !

 

 

 

 

source : http://www.circuitbasics.com/how-to-set-up-the-dht11-humidity-sensor-on-the-raspberry-pi/

 

 

Partage cet article !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *