Lesen Sie die Temperatur DHT11, mit pi4j
Ich versuche, die Temperatur ablesen von Daten aus einem DHT11 Temperatur-sensor, mit pi4j. Ich folgte den code geschrieben in c und in python, die in dieser Website:
http://www.uugear.com/portfolio/dht11-h ... oder-Modul/
Aber es funktioniert nicht. wenn ich zum testen den Befehl 'dht11Pin.getState()' es ist immer im HOHEN Zustand, nie ändern. Gibt es etwas falsch in meinem code?
Unten ist mein 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));
}
}
InformationsquelleAutor Júnior Mascarenhas | 2015-02-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Angefangen habe ich mit der original-poster ist java-code und ersetzt die com.pi4j.io.gpio package-Referenzen mit der com.pi4j.wiringpi Paket. Ich hatte vor kurzem installiert die neueste pi4j-Paket und wiringpi version auf meinem Raspberry Pi.
Mit diesem Paket der Java-code unten funktioniert ungefähr das gleiche wie die c-version dieses Programms. Ich bin immer über 80% - 85% genaue Antworten mit einem DHT-11. Das ist in etwa die gleiche wie ich, war immer mit wiringPi in c.
Dies funktioniert für mich, vielen Dank. Ich brauche ~25 liest (ohne Verzögerung), um einen gültigen Wert, aber in einer Schleife ausgeführt, ist dies kein problem.
Nur aus Neugier: Auf welcher hardware-Typ von Pi hast du diesen code ausführen?
Und noch eine Frage: denkst du, dass dein code auch funktionieren würde für ein DHT22 oder AM2302?
Ich verwendet einen Pi-2. Ich bin nicht vertraut mit dem DHT22 oder AM2302, ich habe nur versucht, es mit den DHT11.
InformationsquelleAutor Eric Smith
Wenn Sie immer einen Hohen Stand könnte es gut sein, um zu überprüfen, ob die Verdrahtung korrekt ist (oder wenn die Drähte gebrochen sind, testen Sie es mit einer led).
Ich habe adafruit ist tutorial in C und python und es funktionierte auf meinem DHT22.
InformationsquelleAutor Txugo
Ich habe das gleiche Problem und leider habe ich gelesen, dass Java nicht Lesen können, Daten aus DHT11/22 auf diese Weise für timing-Probleme.
Ich gefunden habe im Raspberry-Forum ist ein thread, dort findet man einige Lösungen unter SPI oder pigpio.
Ein weiteres Bad mit Java mögliche Lösung ist es.
Ich habe meinen sensor gestern und ich habe nicht schon versucht diese Lösungen. Wenn ich werde versuchen, ich werde es dich wissen lassen.
[BEARBEITEN]
Hallo, ich habe das problem das aufrufen eines python-Skripts (die verwendet die Adafruit-Treiber) und Lesen Sie die Ausgabe.
Das python-Skript ist einfach das Beispiel, veröffentlicht in der Adafruit-Bibliothek. Ich habe nur geändert, die Ausgabe in Zeile 48 in
Die Java-Methode aktualisiert die Werte mit den neuen Werten ist:
Damit es funktioniert, müssen Sie installieren Sie die Adafruit-Bibliothek, wie beschrieben auf der verlinkten Seite und ändern DHTReader.py mit dem Pfad der scipt.
Ich arbeite zum Aufbau einer "Bibliothek". Wenn Sie brauchen, wenn ich fertig bin, werde ich es veröffentlichen auf GitHub.
InformationsquelleAutor Carlo
Bekam ich die Lösung mit dem Java Native Interface JNI und WiringPi.
Ich bin mit java openjdk 7 in den raspberry pi. Dies ist wichtig für die Unterstützung von JNI-Funktionen der JVM. Ich mit dem DHT11 sensor an GPIO1 oder pin 1.
Aus dem root-Paket in src/main/java Sie können die Installation der Bibliothek. Ich hab ein Skript, das Sie ausführen können mit dem Befehl:
Dann zu testen, ob es funktioniert versuchen, die DHT11SensorReader Klasse mit dem Befehl
Wenn es ist alles in Ordnung und Sie möchten mehrere Werte, die alle 1,5 Sekunden versuchen, die übung 20 aus dem Projekt-root-Ordner.
Wenn Sie irgendeine Frage haben, hinterlassen Sie mir einen Kommentar.
Ich hoffe, es hilft.
Marc Andreu,
Hallo Manoj, haben Sie versucht, mit dem script jniDHT11SensorReaderBuilder.sh ? Stellen Sie sicher, dass Sie tatsächlich die Ausführung von JAVA-OpenJDK 1.7, und führen Sie es aus dem Ordner "src/main/java/" in den raspberry pi. Auch Folgen, stellen Sie sicher, dass Sie installiert Pi4j und die wiringpi Bibliotheken für Ihre version der raspberry pi
InformationsquelleAutor
Eric Smith ' s ausgezeichnetes code funktioniert gut für mich mit zwei kleinen mods, Zuerst habe ich bearbeitet diese Zeile:
:
Laut specs von dht11, die "1" - bit übertragen, wenn die Verzögerung von "Gpio.HIGH" ist über 70us, und "0" - bit übertragen, wenn die Verzögerung von 26-28us. Es ist klar, dass Java braucht einige Zeit, um auszuführen, so ist es sicher anzunehmen, dass, wenn die Verspätung mehr als 30us müssen die Daten "1" ist. Aber das kann auch anders sein Wert, wenn die Ausführungszeit von Java-Programmen unterscheidet sich in Ihrem Computer (vielleicht ist der Prozessor des pi ist schneller/langsamer, es wird mehr hintergrund Programme etc). Also, die 30 ist nicht unbedingt der richtige Wert für jede situation.
Laut specs Eins, es kann auch darauf hingewiesen, dass der sender (raspberry pi, genannt MCU in den specs), sollte auch senden Gpio.HOCH für mindestens 18ms. Nach, dass die MCU schicken sollte 20-40 uns "Gpio.HIGH". Getestet habe ich mit System.nanoTime (), wie viel Zeit es braucht, für die Java zur Ausführung der Einstellung des Gpio.Pinmode der "Input". Es dauerte etwas, wie 20us, so fügte ich hinzu:
...nur um sicher zu sein, dass der Pin HIGH ist für mindestens 20us, so dass der Sensor registrieren kann, dass signal und starten Sie die übertragung der Temperatur-und Luftfeuchte-Daten. Nach diesen änderungen, die Temperatur, die Daten Lesen sich fast immer Recht, die Erfolgsquote liegt bei etwa 90%. Im nicht sicher, können die änderungen, die Arbeit mit einem anderen system, aber hoffentlich diese Art von änderungen vornehmen können, andere Experimente mehr Erfolg!
(p.s. Ich habe auch den ewigen Schleife, so dass die Klasse erstellt wird jedesmal, immer und immer wieder, wenn die Methode aufgerufen wird.)
InformationsquelleAutor iltelko
Fand ich, dass die RPi3b geladen mit Raspian war zu langsam, um die Verwendung der code-Beispiele, die hier gezeigt werden, bereits. Wahrscheinlich etwas zu tun mit einem java - >pi4j>wiringpi propagation-delay. Meine Vorgehensweise war wie folgt; nach dem senden der Befehl um den sensor zu aktivieren, ich habe gelesen und die Zeit änderungen in der Lautstärke auf die gewünschte pin ein und speichern Sie die Werte in ein array. Dann die Analyse erfolgt später. Ich bekomme eine 95 - % - Erfolg-rate mit diesem code. Habe ich es mit in eine Runnable-Klasse, die mit einer Schleife, so hat es seinen eigenen thread. Wenn Sie finden, Ihre timings sind nicht ganz richtig, versuchen Sie, den Zähler offset. Auch ermöglichen die println markiert für das Debuggen, hilft es, anzugeben, welche bits wurden nicht erhalten (gekennzeichnet durch 0).
die run-Methode:
ReadTempRH Konstruktor:
Sorry mein code ist ein wenig unordentlich, ich hatte keine Zeit, um ordentlich Dinge! Aber Sie sollten Sie bekommen die Idee. Ich bin normalerweise ein c# - Typ und Netbeans funktioniert nicht wie VS in das Aufräumen vor!
InformationsquelleAutor Bobby Bridgeman