lire la température de DHT11, à l'aide de pi4j
Je suis en train de lire les données de température à partir d'un DHT11 capteur de température, à l'aide de pi4j. J'ai suivi le code écrit en c et python dans ce site:
http://www.uugear.com/portfolio/dht11-h ... ou-module/
Mais cela ne fonctionne pas. quand je test l'instruction " dht11Pin.getState()' il est toujours en HAUT de l'état, qui ne change jamais. Est-il rien qui cloche dans mon code?
Ci-dessous mon code:
import java.util.concurrent.TimeUnit;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.pi4j.component.ObserveableComponentBase;
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalMultipurpose;
import com.pi4j.io.gpio.Pin;
import com.pi4j.io.gpio.PinMode;
import com.pi4j.io.gpio.PinPullResistance;
import com.pi4j.io.gpio.PinState;
import com.pi4j.io.gpio.RaspiPin;
public class DHT11 extends ObserveableComponentBase {
private static final Pin DEFAULT_PIN = RaspiPin.GPIO_04;
private static final int MAXTIMINGS = 85;
private int[] dht11_dat = { 0, 0, 0, 0, 0 };
private GpioPinDigitalMultipurpose dht11Pin;
private static final Logger LOGGER = LogManager.getLogger(DHT11.class
.getName());
public DHT11() {
final GpioController gpio = GpioFactory.getInstance();
dht11Pin = gpio.provisionDigitalMultipurposePin(DEFAULT_PIN,
PinMode.DIGITAL_INPUT, PinPullResistance.PULL_UP);
}
public DHT11(int pin) {
final GpioController gpio = GpioFactory.getInstance();
dht11Pin = gpio.provisionDigitalMultipurposePin(LibPins.getPin(pin),
PinMode.DIGITAL_INPUT, PinPullResistance.PULL_UP);
}
public double getTemperature() {
PinState laststate = PinState.HIGH;
int j = 0;
dht11_dat[0] = dht11_dat[1] = dht11_dat[2] = dht11_dat[3] = dht11_dat[4] = 0;
StringBuilder value = new StringBuilder();
try {
dht11Pin.setMode(PinMode.DIGITAL_OUTPUT);
dht11Pin.low();
Thread.sleep(18);
dht11Pin.high();
TimeUnit.MICROSECONDS.sleep(40);
dht11Pin.setMode(PinMode.DIGITAL_INPUT);
for (int i = 0; i < MAXTIMINGS; i++) {
int counter = 0;
while (dht11Pin.getState() == laststate) {
counter++;
TimeUnit.MICROSECONDS.sleep(1);
if (counter == 255) {
break;
}
}
laststate = dht11Pin.getState();
if (counter == 255) {
break;
}
/* ignore first 3 transitions */
if ((i >= 4) && (i % 2 == 0)) {
/* shove each bit into the storage bytes */
dht11_dat[j / 8] <<= 1;
if (counter > 16) {
dht11_dat[j / 8] |= 1;
}
j++;
}
}
//check we read 40 bits (8bit x 5 ) + verify checksum in the last
//byte
if ((j >= 40) && checkParity()) {
value.append(dht11_dat[2]).append(".").append(dht11_dat[3]);
LOGGER.info("temperature value readed: " + value.toString());
}
} catch (InterruptedException e) {
LOGGER.error("InterruptedException: " + e.getMessage(), e);
}
if (value.toString().isEmpty()) {
value.append(-1);
}
return Double.parseDouble(value.toString());
}
private boolean checkParity() {
return (dht11_dat[4] == ((dht11_dat[0] + dht11_dat[1] + dht11_dat[2] + dht11_dat[3]) & 0xFF));
}
}
OriginalL'auteur Júnior Mascarenhas | 2015-02-12
Vous devez vous connecter pour publier un commentaire.
J'ai commencé avec l'affiche originale du code java, et remplacé le com.pi4j.io.gpio paquet de références avec les com.pi4j.wiringpi paquet. J'ai récemment installé la dernière pi4j paquet et wiringpi version sur mon Raspberry Pi.
À l'aide de ce package Java code ci-dessous fonctionne environ le même que la version c de ce programme. Je reçois environ 80% - 85% de réponses exactes avec une DHT-11. Ce qui est environ le même que j'ai été faire à l'aide de wiringPi dans c.
Cela fonctionne pour moi, merci beaucoup. J'ai besoin de ~25 des lectures (sans retard) pour obtenir une valeur correcte, mais exécutée dans une Boucle, ce n'est pas un problème.
Juste par curiosité: Sur quel type de matériel de Pi ne vous exécutez ce code?
Et une autre question: pensez-vous que votre code fonctionne également pour un DHT22 ou AM2302?
J'ai utilisé une Pi 2. Je ne suis pas familier avec le DHT22 ou AM2302, je ne l'ai essayé avec le DHT11.
OriginalL'auteur Eric Smith
Si vous êtes toujours obtenir un État Haut, il pourrait être bon de vérifier si le câblage est correct (ou si les broches sont cassées, de le tester avec une led).
J'ai utilisé adafruit est tutoriel en C et python, et il a travaillé sur mon DHT22.
OriginalL'auteur Txugo
J'ai le même problème et, malheureusement, je n'ai lu que Java ne peut pas lire les données à partir de DHT11/22 pour des problèmes de calendrier.
J'ai trouvé dans la Framboise Forum un fil où vous pouvez trouver quelques solutions à l'aide de SPI ou pigpio.
Un autre Java solution possible est il y.
J'ai reçu mon capteur hier et je n'ai pas déjà essayé ces solutions. Quand je vais essayer, je vais vous laisser savoir.
[MODIFIER]
Salut, j'ai résolu le problème en appelant un script python (qui utilise le Adafruit Pilote) et de lire de la sortie.
Le script python est tout simplement l'exemple publié dans le Adafruit de la bibliothèque. J'ai seulement changé la sortie à la ligne 48 à
La méthode Java qui met à jour les valeurs avec les nouvelles valeurs est:
Pour le faire fonctionner, vous devez installer le Adafruit bibliothèque comme décrit dans la page du lien et de changement DHTReader.py avec le chemin de la scipt.
Je suis en train de créer une "bibliothèque". Si vous avez besoin, quand j'ai terminé, je vais le publier sur GitHub.
OriginalL'auteur Carlo
J'ai une solution avec Java Native Interface JNI et WiringPi.
Je suis à l'aide de java openjdk 7 dans le raspberry pi. Cela est important pour obtenir de l'aide JNI presses de la JVM. J'ai branché le capteur DHT11 à GPIO1 ou la broche 1.
À partir de la racine de package dans le dossier src/main/java, vous pouvez installer la bibliothèque. J'ai préparé un script que vous pouvez exécuter avec la commande:
Ensuite tester si cela fonctionne, essayez d'exécuter la DHT11SensorReader classe avec la commande
Si elle est toute fine et vous voulez plus de valeurs de toutes les 1,5 secondes, essayez d'exécuter la exercice 20 à partir du dossier racine du projet.
Si vous avez une question, laissez-moi un commentaire.
J'espère que cela aide.
Marc Andreu,
Bonjour Manoj, avez-vous essayer avec le script jniDHT11SensorReaderBuilder.sh ? Assurez-vous que vous êtes effectivement en cours d'exécution JAVA OpenJDK 1.7 et l'exécuter à partir du dossier "src/main/java/" dans le raspberry pi. Également suivre assurez-vous que vous avez installé Pi4j et la wiringpi libs pour votre version du raspberry pi
OriginalL'auteur
Eric Smith est excellent code fonctionne très bien pour moi avec deux petits mods, j'ai d'Abord modifié cette ligne:
:
Selon les spécifications de dht11, le "1" du bit est transmis lorsque le retard de la "Gpio.HAUTE" est d'environ 70us, et "0" bit est transmis si le retard est de 26 28us. Il est clair que Java prend un certain temps à s'exécuter, de sorte qu'il est sûr de supposer que si le retard est de plus de 30us les données doivent être "1". Mais c'est peut-être différente de la valeur si le temps d'exécution d'un programme Java est différent dans votre machine (peut-être le processeur de pi est vite/- vite, il n'y a plus de programmes en tâche de fond, etc). Par conséquent, le 30 n'est pas nécessairement la bonne valeur pour chaque situation.
Selon les spécifications Un, il peut également être noté que l'expéditeur (raspberry pi, appelé MCU dans les specs), devrait également envoyer des Gpio.ÉLEVÉ au moins 18ms. Après cela, le MCU doit envoyer 20-40 nous "Gpio.HAUT". J'ai testé avec le Système.nanoTime() combien de temps il faut pour le Java pour exécuter le réglage de la Gpio.Pinmode à la "Entrée". Il a fallu quelque chose comme 20us, j'ai donc ajouté:
...juste pour être sûr que le code Pin est ÉLEVÉ pendant au moins 20us de sorte que le Capteur peut enregistrer le signal et le début de l'envoi de la température et de l'humidité de données. Après ces modifications, la température de données est lu presque toujours à droite, le taux de réussite est quelque chose comme 90%. Je ne sais pas peut les modifications de travailler avec un autre système, mais j'espère que ces modifications peuvent faire d'autres expériences plus de succès!
(p.s. J'ai aussi fait la boucle sans fin de sorte que la classe est créé à chaque fois de plus et une fois de plus lorsque la méthode est appelée.)
OriginalL'auteur iltelko
J'ai trouvé que le RPi3b chargé avec Raspian était trop lente pour utiliser les exemples de code présentés ici déjà. Probablement quelque chose à voir avec java>pi4j>wiringpi délai de propagation. Mon approche était comme suit; après l'envoi de la commande pour activer le capteur, j'ai lu de temps et les changements de niveau de la broche et de sauvegarder les valeurs dans un tableau. Ensuite, l'analyse est faite plus tard. Je reçois un 95% de taux de réussite avec ce code. J'ai en cours d'exécution dans une classe Runnable avec une boucle, de sorte qu'il a son propre thread. Si vous trouvez que votre timings ne sont pas tout à fait juste, essayez de régler le compteur de décalage. Également activer la println marqué pour le débogage, il permet d'indiquer les bits n'ont pas été reçus (indiqué par un 0).
la méthode run:
ReadTempRH constructeur:
Désolé mon code est un peu bordélique, je n'ai pas eu le temps de ranger les choses! Mais vous devriez obtenir l'idée. Je suis normalement un c# guy et Netbeans ne fonctionne pas comme VS dans le rangement à l'avant!
OriginalL'auteur Bobby Bridgeman