Voila je vous poste le script en C pour récupérer le taux d'humidité que j'ai essayé d'expliquer ligne par ligne. Dsl j'ai honte de vous le présenter tellement c'est pathétique :'( J'ai eu du mal à comprendre pas mal de lignes. Mais je souhaitais commenter ces lignes pour les mettre dans mon rapport.
Pourriez-vous svp m'aider en modifiant mes commentaires ? O

Je voulais aussi supprimer certaines lignes, comme celles en rapport avec le capteur DHT11 et celles en rapport avec la température, mais j'ai évité car j'ai peur de faire des erreurs dans le programme. Je n'ai besoin que du capteur DHT22 et de son taux d'humidité
Code :
[== C++ ==]
// Comment accéder aux registres GPIO depuis un code C sur la Raspberry-Pi
#define BCM2708_PERI_BASE 0x20000000
#define GPIO_BASE (BCM2708_PERI_BASE + 0x200000) // GPIO contrôleur
#include <stdio.h> // appel de la librairie <stdio.h>
#include <string.h> // appel de la librairie <string.h>
#include <stdlib.h> // appel de la librairie <stdlib.h>
#include <dirent.h> // appel de la librairie <dirent.h>
#include <fcntl.h> // appel de la librairie <fcntl.h>
#include <assert.h> // appel de la librairie <assert.h>
#include <unistd.h> // appel de la librairie <unistd.h>
#include <sys/mman.h> // appel de la librairie <sys/mman.h>
#include <sys/types.h> // appel de la librairie <sys/types.h>
#include <sys/stat.h> // appel de la librairie <sys/stat.h>
#include <sys/time.h> // appel de la librairie <sys/time.h>
#include <bcm2835.h> // appel de la librairie <bcm2835.h>
#include <unistd.h> // appel de la librairie <unistd.h>
#define MAXTIMINGS 100 // macro MAXTIMINGS
//#define DEBUG
#define DHT11 11 // macro DHT11 11
#define DHT22 22 // macro DHT22 22
#define AM2302 22 // macro AM2302 22
int readDHT(int type, int pin); // déclaration de la variable readDHT contenant 2 variables type et pin
int main(int argc, char **argv) // déclaration de la variable main contenant 2 variables argc et argv
{
if (!bcm2835_init()) // initialisation du processeur de la Raspberry
return 1;
if (argc != 3) { // argc vaut 3 donc argv pointe sur 3 chaînes de caractères
printf("usage: %s [11|22|2302] GPIOpin#\n", argv[0]); // affiche sur l'écran les mesures des capteurs DHT11, DHT22 et AM2302 sur les pins paramétrées
printf("example: %s 2302 4 - Read from an AM2302 connected to GPIO #4\n", argv[0]); // par exemple si le capteur AM2302 est connecté au pin 4 alors il sera affiché sa mesure
return 2;
}
int type = 0; // la variable type est égale à 0
if (strcmp(argv[1], "11") == 0) type = DHT11; // le capteur DHT11 démarre à 0
if (strcmp(argv[1], "22") == 0) type = DHT22; // le capteur DHT22 démarre à 0
if (strcmp(argv[1], "2302") == 0) type = AM2302; // le capteur AM2302 démarre à 0
if (type == 0) { // Si la variable type est à 0
printf("Select 11, 22, 2302 as type!\n"); // alors on affiche sur l'écran "Select 11, 22, 2302 as type!"
return 3;
}
int dhtpin = atoi(argv[2]); // déclaration de la variable dhtpin
if (dhtpin <= 0) { // Si dhtpin est inférieure à 0
printf("Please select a valid GPIO pin #\n"); // on affiche sur l'écran "Please select a valid GPIO pin"
return 3;
}
printf("Using pin #%d\n", dhtpin); // on affiche sur l'écran le pin qu'on utilise
readDHT(type, dhtpin); // on utilise la variable readDHT
return 0;
} // main
int bits[250], data[100]; // on utilise 250 bits et 100 de data
int bitidx = 0; // la variable bitidx est à 0
int readDHT(int type, int pin) { // déclaration de la variable readDHT contenant 2 variables type et pin
int counter = 0; // début d'une boucle commençant à 0
int laststate = HIGH; // le dernier état doit être haut
int j=0; // déclaration d'une variable j égale à 0
// Réglage des pins GPIO en sortie
bcm2835_gpio_fsel(pin, BCM2835_GPIO_FSEL_OUTP); // on travaille sur les pins GPIO en sortie
bcm2835_gpio_write(pin, HIGH); // les pins GPIO sont à l'état haut
usleep(500000); // pause de 500 ms
bcm2835_gpio_write(pin, LOW); // les pins GPIO sont à l'état bas
usleep(20000); // pause de 200 ms
bcm2835_gpio_fsel(pin, BCM2835_GPIO_FSEL_INPT); // on travaille sur les pins GPIO en entrée
data[0] = data[1] = data[2] = data[3] = data[4] = 0; // ???
// wait for pin to drop ?
while (bcm2835_gpio_lev(pin) == 1) { // Tant que le niveau des pins est à 1
usleep(1); // pause de 0,001 ms
}
// read data!
for (int i=0; i< MAXTIMINGS; i++) { // Pour i=0 et i<MAXTIMINGS et i s'incrémente à chaque fois de 1
counter = 0; // Début d'une boucle démarrant à 0
while ( bcm2835_gpio_lev(pin) == laststate) { // Tant que le niveau des pins est le dernier état
counter++; // On continue la boucle en incrémentant de 1
//nanosleep(1); // overclocking might change this?
if (counter == 1000) // Si la boucle arrive à 1000
break; // on fait une pause
}
laststate = bcm2835_gpio_lev(pin); // le dernier état est le niveau des pins
if (counter == 1000) break; // Si la boucle est égale à 1000 on fait une pause
bits[bitidx++] = counter; // le nombre de bits est égal à la boucle
if ((i>3) && (i%2 == 0)) { // Si i>3 et que ?
// shove each bit into the storage bytes
data[j/8] <<= 1; // ?
if (counter > 200) // Si la boucle est supérieure à 200
data[j/8] |= 1; // ?
j++; // la variable j s'incrémente de 1
}
}
#ifdef DEBUG // ?
for (int i=3; i<bitidx; i+=2) { // Pour i=3 et i<bitidx et ?
printf("bit %d: %d\n", i-3, bits[i]); // on affiche sur l'écran ?
printf("bit %d: %d (%d)\n", i-2, bits[i+1], bits[i+1] > 200); // on affiche sur l'écran ?
}
#endif // ?
printf("Data (%d): 0x%x 0x%x 0x%x 0x%x 0x%x\n", j, data[0], data[1], data[2], data[3], data[4]); // ?
if ((j >= 39) && // Si j est supérieure ou égale à 39 et ?
(data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) ) { // ?
// yay!
if (type == DHT11) // Si le type est égale à DHT11
printf("Temp = %d *C, Hum = %d \%\n", data[2], data[0]); // on affiche sa température et son humidité
if (type == DHT22) { // Si le type est égale à DHT22
float f, h; // f et h sont des nombres à virgule
h = data[0] * 256 + data[1]; // ?
h /= 10; // ?
f = (data[2] & 0x7F)* 256 + data[3]; // ?
f /= 10.0; // ?
if (data[2] & 0x80) f *= -1; // ?
printf("Temp = %.1f *C, Hum = %.1f \%\n", f, h); // on affiche sa température et son humidité
}
return 1;
}
return 0;
}