Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5

Lecture mesure dht22 raspberry sur page web php
#1

Bonjour à tous,

Je suis en Terminale STI2D SIN et pour mon projet bac je dois contrôler l'humidité d'une pièce via une IHM en m'occupant seulement de l'apport d'humidité. Pour cela j'utilise le capteur DHT22.

Je me suis aidé de ce tuto : http://www.manuel-esteban.com/lire-une-s...pberry-pi/

Voila comment faire pour récupérer ces valeurs et les afficher sur une page web en php en temps réel ? J'aimerais vraiment utiliser le php car j'arrive à comprendre ce langage. Je mettrai ce script dans le dossier /var/www de la Raspberry.

Il ne faut pas que les mesures défilent en verticale et en continu. Il faut que les mesures changent seulement sur les pointillés comme ceci :

Humidité = .... %

Merci d'avance pour votre aide Big Grin
Répondre
#2

Salut,
Si ton script retourne le pourcentage, tu fais un call au script via PHP avec l'instruction system. Tu pourras ensuite formater ton résultat

Raspberry Pi Home Server : http://www.pihomeserver.fr
Hotspot Wifi avec portail captif pour Raspberry Pi: Kupiki Hotspot
Répondre
#3

Ola,

C'est toi qui m'a laissé un commentaire hier sur mon blog à ce sujet ?

Globalement, le script doit être fait en python ou en C.
Tu ne pourrais le faire en PHP.
Par contre, tu peux ensuite faire 2 choses :

- Depuis le script python, appeler un script php pour enregistrer en base de données, et faire une page php qui exploite cette base de données
- Ou : Appeler ce script python depuis un script PHP en utilisant les fonctions systèmes

Serial Organisateur d'aPIro
Bloggeur Bidouilleur
Ydle, domotique DIY basée sur un raspberry pi
Répondre
#4

Yaug a écrit :- Depuis le script python, appeler un script php pour enregistrer en base de données, et faire une page php qui exploite cette base de données
- Ou : Appeler ce script python depuis un script PHP en utilisant les fonctions systèmes
Ou écrire ta page/ton site en Python. Big Grin
Mais bon, tu sembles préférer PHP.
Répondre
#5

Ou utiliser un websocket. En python ou js coté serveur, js coté client. Et pas besoin de base de données.

Cool
Répondre
#6

Yaug a écrit :- Depuis le script python, appeler un script php pour enregistrer en base de données, et faire une page php qui exploite cette base de données
Ou enregistrer en BDD depuis le script python et se servir de PHP uniquement pour l'exploitation des données
(ça fonctionne très bien pour mes sondes, et j'ai l'impression (mais ce n'est que mon avis) que c'est moins gourmand en ressources)
Répondre
#7

Hahaha et oui c'est moi Yaug qui t'ai envoyé un message sur ton blog hier soir ! Tongue Et encore merci pour ce super tuto Smile

Je vous remercie pour vos rapides réponses.

Mais le Python je ne m'y connais absolument pas. Donc je me vois mal maîtriser ce langage rapidement et l'expliquer devant un jury 8.(

En revanche je connais mieux le langage C.

Serait-il possible svp de m'expliquer en détail la démarche la plus simple à suivre afin d'afficher sur une page web mise sur ma Raspberry Humidité = .... % ?

Je suis totalement perdu et ça m'angoisse car l'échéance arrive bientôt ...
Répondre
#8

Sur le principe :
  1. choisir ta sonde
  2. la connecter au RPi
  3. exécuter un script (C ou Python) pour récupérer ton taux d'humidité toutes les 2 secondes (intervalle minimum entre chaque relevé d'une sonde DHT)
  4. archiver cette valeur (à la rigueur, vu que tu n'aurais que cette dernière, un simple fichier texte pourrais peut-être suffire ?)
  5. exécuter le fichier PHP qui lit la dernière valeur archivée
  6. actualiser la page (ou la div contenant "Humidité...") toutes les x secondes


Enfin, moi, c'est comme ça que je ferais.
Répondre
#9

Hawkeye a écrit :Sur le principe :
  1. choisir ta sonde
  2. la connecter au RPi
  3. exécuter un script (C ou Python) pour récupérer ton taux d'humidité toutes les 2 secondes (intervalle minimum entre chaque relevé d'une sonde DHT)
  4. archiver cette valeur (à la rigueur, vu que tu n'aurais que cette dernière, un simple fichier texte pourrais peut-être suffire ?)
  5. exécuter le fichier PHP qui lit la dernière valeur archivée
  6. actualiser la page (ou la div contenant "Humidité...") toutes les x secondes


Enfin, moi, c'est comme ça que je ferais.
C'est aussi la façon que j'emploierais. Wink
Répondre
#10

Hawkeye a écrit :Sur le principe :
  1. choisir ta sonde
  2. la connecter au RPi
  3. exécuter un script (C ou Python) pour récupérer ton taux d'humidité toutes les 2 secondes (intervalle minimum entre chaque relevé d'une sonde DHT)
  4. archiver cette valeur (à la rigueur, vu que tu n'aurais que cette dernière, un simple fichier texte pourrais peut-être suffire ?)
  5. exécuter le fichier PHP qui lit la dernière valeur archivée
  6. actualiser la page (ou la div contenant "Humidité...") toutes les x secondes


Enfin, moi, c'est comme ça que je ferais.

Merci beaucoup Hawkeye j'y vois clairement plus clair ! Wink

Mais le problème c'est que je ne sais pas du tout comment réaliser les étapes 3, 4 et 5. Je pense que les étapes 4 et 5 je pourrais les réussir en prenant le temps de réfléchir. Mais pour l'étape 3 alors là je ne sais vraiment pas du tout comment m'y prendre. Je ne sais pas comment écrire le script en C pour permettre de récupérer les mesures d'humidité du DHT22.

Je sais que je vais abuser de votre gentillesse, mais je vous serais très reconnaissant si une personne pourrait me poster un script simple en C, permettant de récupérer ces mesures du pin 4 de la Raspberry comme sur le tuto de Yaug :8
Répondre
#11

Adafruit en propose : https://github.com/adafruit/Adafruit-Ras...ruit_DHT.c Wink
Tu peux également fouiller dans ce sujet http://forum.raspfr.org/viewtopic.php?id=222 où on en a parlé.
Répondre
#12

l'étape 3 est simple, c'est quasiment le script que je fournissais.
Tu peux le faire en python ou en C.

Commence par ça Smile
Et là pour le coup, je founi déjà tout sur le tuto Smile

Serial Organisateur d'aPIro
Bloggeur Bidouilleur
Ydle, domotique DIY basée sur un raspberry pi
Répondre
#13

Merci chevelu je vais étudier le script d'Adafruit en détail ce soir Smile

C'est bien de ce script que tu parles Yaug https://github.com/adafruit/Adafruit-Ras...master.zip ? Ensuite il faut aller dans Adafruit-Raspberry-Pi-Python-Code-master\Adafruit_DHT_Driver\Adafruit_DHT.c ou Adafruit-Raspberry-Pi-Python-Code-master\Adafruit_DHT_Driver_Python\dhtreader.c ?

Vous me conseillez de travailler avec quel script ? Celui de chevelu ( https://github.com/adafruit/Adafruit-Ras...ruit_DHT.c ) ou de Yaug ?
Répondre
#14

Si tu maitrise le C, le Python ne devrait pas te poser beaucoup de problème.

Anciennement vodkaorange Wink
Forum français et communauté sur les caméras embarqués et dashcam : Dashcam-France.fr
Blog notes - Github
Répondre
#15

Prav26 a écrit :Merci chevelu je vais étudier le script d'Adafruit en détail ce soir Smile
Avec plaisir. Wink

Prav26 a écrit :Vous me conseillez de travailler avec quel script ? Celui de chevelu ( https://github.com/adafruit/Adafruit-Ras...ruit_DHT.c ) ou de Yaug ?
En fait, le lien de Yaug est plus complet que le mien. Je t'ai donné le lien vers 1 fichier du repo, Yaug vers l'archive du repo. Donc utilise celui de Yaug, décompresse, et sers-toi de Adafruit-Raspberry-Pi-Python-Code-master\Adafruit_DHT_Driver\Adafruit_DHT.c si tu veux coder en C, et de Adafruit-Raspberry-Pi-Python-Code-master\Adafruit_DHT_Driver_Python\dhtreader.c si tu préfères Python. Smile
Répondre
#16

Super chevelu tu gères ! Wink Je vous tiendrai au courant de l'avancée de mon projet Smile
Répondre
#17

Voici mon schéma de câblage :

[Image: fkii.jpg]
Répondre
#18

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 ? OSmile 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é Smile

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;
}
Répondre
#19

Salut,

Tu peux t'inspirer de mon projet, a toi de le modifier à tes envies Wink

http://forum.raspfr.org/viewtopic.php?id=306
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)