Archiv der Kategorie: Ultraschallsensoren

DHT10 mit ESP8266

Ansteuerung eines DHT10 Sensors über den ESP8266

Grundlagen

Feuchtigkeitsmesser DHT11

Aufbau

Testprogramm

#include "DHT.h" //DHT Bibliothek laden

#define DHTPIN 5        // Pin auf dem ESP8266
#define DHTTYPE DHT11   // Typ des Sensors

DHT dht(DHTPIN, DHTTYPE); // Eine Instanz des Sensors erstellen

void setup() {
  Serial.begin(9600); 
  dht.begin(); //DHT11 Sensor starten
}

void loop() {
  
  delay(2000); //Zwei Sekunden Vorlaufzeit bis zur Messung (der Sensor ist etwas träge)

  float wett = dht.readHumidity(); //die Luftfeuchtigkeit auslesen
  float temp = dht.readTemperature();//die Temperatur auslesen 
  Serial.print("Luftfeuchtigkeit: "); //Im seriellen Monitor den Text und 
  Serial.print(wett); //die Dazugehörigen Werte anzeigen
  Serial.print(" % \t");
  Serial.print("Temperatur: ");
  Serial.print(temp);
  Serial.println(" Grad Celsius");

}

Output

Mit dem Raspberry PI 3 den Entfernungsmesser US-100 ansteuern

Ansteuerung eines Ultraschall-Entfernungsmessers US-100 mit dem Raspberry PI3 ( oder früher). Ich habe nur Tutorials für den SR-04 gefunden, dieser wird allerdings analog zum US-100 eingebunden.


Hardware

PI3 (oder älter bitte auf die richtigen Pins achten)
US-100 ( Ultraschallsensor)
Brot-Board (zum leichteren Aufbau)
Diverse Kabel ( Vorgefertigte Pin-Header Kabel)


Aufbau

Der US-100 arbeitet mit 3.3V womit man ihn direkt am Raspberry betreiben kann.

Verdrahtung

  • Trigger Pin am GPIO 28
  • Echo Pin an den GPIO 25

(Die GPIOs gelten nur in Verbindung mit pi4j und wirePi)

 


Software

Entwicklungsumgebung

Als Entwicklungsumgebung verwende ich BlueJ auf dem PI selbst. Hiermit habe ich zwei Klassen erstellt.


Code

Distance-Klasse

Klasse zur Steuerung des US-015, mit den Methoden

  • getDistanceMM – Entfernung in Millimetern
  • getDistanceCM – Entfernung in Zentimetern
import com.pi4j.io.gpio.GpioPinDigitalInput;
import com.pi4j.io.gpio.GpioPinDigitalOutput;

public class Distance
{
    // instance variables - replace the example below with your own

    
    
    public static final int     DIVISOR               = 58200;
    public static final int     ERROR_NO_MEASUREMENT  = -1;
    public static final int     ERROR_DIST_TO_SHORT   = -2;
    
    private GpioPinDigitalInput     echo        = null;
    private GpioPinDigitalOutput    trigger     = null;
    private long                     timeOut     = 250000000; // in ns/ time for 4m for 20°C ~232
    private long                     triggerTime = 2;   // 10ms for SR04, 2 for US-100
    private long                     initTime    = 2;    // default 2 ms
      
    /**
     * Constructor for objects of class Distance
     */
    public Distance(GpioPinDigitalOutput trigger, GpioPinDigitalInput echo)
    {
        this.echo = echo;
        this.trigger = trigger;

    }
    
    /**
     * get the distance in mm
     */
    public double getDistMM()
    {
        return aquire()*1000;
    }
    
     /**
     * get the distance in cm
     */
    public double getDistCM()
    {
        return aquire();
    }
    
    /** 
     * returns the time in milli xeconds
     */
    public double aquire(){
        long start = 0;
        double diff = 0;

        try {
           
          trigger.low();
          Thread.sleep(initTime);
          trigger.high();
          Thread.sleep(triggerTime);
          trigger.low();
    
          while (echo.isLow()) {
            start = System.nanoTime();
          }
    
          while (echo.isHigh()) {
              //System.out.print((System.nanoTime() - start)+",");
              if((System.nanoTime() - start) > timeOut){
                  return ERROR_NO_MEASUREMENT;
              }
          }
    
          // check if distance is to short and return errror
          diff =  ((System.nanoTime() - start) / DIVISOR );
          return diff;
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        return -1.0;
    }
}

Test-Klasse

Klasse mit Main-Methode zum Testen der Distance-Klasse. In der Main-Methode wird alle 5 Sekunde ein neuer Wert vom Sensor abgefragt und auf die Console geschrieben.

import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.GpioPinDigitalInput;
import com.pi4j.io.gpio.GpioPin;
import com.pi4j.io.gpio.Pin;
import com.pi4j.io.gpio.PinState;
import com.pi4j.io.gpio.RaspiPin;
import com.pi4j.io.gpio.PinPullResistance;

public class TestDistance
{

    public static void main(String args[]){
        final GpioController gpio = GpioFactory.getInstance();

        //range sensor pins
        GpioPinDigitalOutput sensor_trigger = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_28, 
                "Sensor Trigger", PinState.LOW);

        GpioPinDigitalInput sensor_echo = gpio.provisionDigitalInputPin(RaspiPin.GPIO_25, 
                "Sensor Echo", PinPullResistance.PULL_DOWN);

        // Create the range sensor
        Distance rangesensor = new Distance(sensor_trigger, sensor_echo);
        int i = 0;
        do {
            i++;
            // Get the range
            double distance = rangesensor.getDistCM();
            
            System.out.println("RangeSensorresult =" + distance + "cm");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        } while (i < 1000);
        

        gpio.unprovisionPin(gpio.getProvisionedPins().toArray(new GpioPin[]{sensor_trigger, sensor_echo}));
        
    }
}

Tips

Bei größerer Beanspruchung des PI ist zu beachten, dass Java die zeitlichen Abfolgen nicht garantiert. Somit kann es zu verfälschten oder keinen Ergebnissen bei der Messung kommen.

Quellen

https://www.modmypi.com/blog/hc-sr04-ultrasonic-range-sensor-on-the-raspberry-pi

http://t1m0b0t.blogspot.de/2014/04/using-ultrasonic-range-sensor-on.html

http://www.lediouris.net/RaspberryPI/HC-SR04/readme.htmlhttps://github.com/OlivierLD/raspberry-pi4j-samples/tree/master/RangeSensor

http://pi4j.com/pins/model-3b-rev1.html

Interfacing HC-SR04 Ultrasonic Sensor with Raspberry Pi

 

Entfernung messen mit Ultraschallsensor HC-SR04 – Raspberry Pi

Anhang

Pin-Belegung

 

US-100

Der US-100 ist ein Ultraschall-Enfernungsmesser mit einer Versorgungsspannung von 3V – 5V.  Er kann somit direkt an modernen Microcontrollern mit 3.3V Versorgungspannung betrieben werden.

Allgemein

Technische Daten

BeschreibungWert
Messung [mm]20 - 3500
Winkel [Grad]15
Genauigkeit [mm]3
Spannung [V]3-5
Strom [mA]2

Technische Daten US-100

Pin-Belegung

  1.  Versorgungsspannung 3-5V
  2. Trigger (Auslöser)
  3. Echo („Empfänger“)
  4. Masse
  5. Masse

Besonderheiten

Der US-100 kann in zwei Modi betrieben werden

  1. Im seriellen modus, Jumper auf der Rückseite ist gesetzt.
  2. Entfernungsmessung per Puls, der Jumper auf der Rückseite ist nicht gesetzt.
Serieller Modus

Hier wird der Trigger-Pin an den TX port der UART-Schnittstelle (Serielle Schnittstelle) und der Echo-Pin an den RX-Port der UART-Schnittstelle angeschlossen.

Um den serielle port mit einem Microcontroller auslesen zu können muss dieser auf 9600 boud, 8 Datenbits, keine Parität und 1 Stopbit eingestellt werden.

Um die Messung zu starten muss ein einzelnes Byte 0x55 über den seriellen Port an den US-100 gesendet werden. Dananch kann die Enfernung mit 2 Bytes gelesen werden (High und Low byte). Um die Entfernung in Millimeter zu berechnen kann die folgenden Formel vewendet werden.

EntfernungInMM = ErstesByte * 256 + ZweitesByte

Durch senden eine Byte 0x50 kann zusätlich die Temperatur abgefragt werden. Die Anwort ist in diesem Fall 1 Byte lang und die Tempatur kann wie folgt berechnet werden

Temperatur °C  = GelesenesByste – 45

Pulsmessung

Hierfür müssenen der Trigger Pin und der Echo pin mit zwei digitalen Pins des Mircocontrollers verbunden werden.

Um die Entfernung abzufragen muss muss der Trigger für mindestens 50 micorsekunden auf low gesetzt werden.

Danach wird der Echo-Pin auf High gesetzt bis das Ultraschallsignal zum Hinderniss und wieder zurück gereist ist. Durch die Messung der Zeit kann die Entfernung mit der folgenden Formel errechnet werden.

Entfernung [cm] = Reisedauer [ms] / 58,2

Quellen

Datenblatt

SR-04

Der SR-04 ist einer der weit verbreitetsten Entfernungssensoren und dementsprechend günstig.

Allgemein

Technische Daten

BeschreibungWert
Messung [mm]20 - 4000
Winkel [Grad]15
Genauigkeit [mm]3
Spannung [V]5
Strom [mA]<2

Technische Daten SR-04

Pin-Belegung

  1.  Versorgungsspannung 5V
  2. Trigger (Auslöser)
  3. Echo („Empfänger“)
  4. Masse

Quellen

Datenblatt

Guter Einführung in den SR04

Super Einführungsvideo in englisch (eher technisch)

US-015

Der US-015 ist eine Ultraschall Entfernungsmesser, er kann Reichweiten bis zu 7m messen und ist gering im Stromverbrauch.

Allgemein

 

Technische Daten

BeschreibungWert
Messung [mm]20 - 7000
Winkel [Grad]15
Genauigkeit [mm]3
Spannung [V]5
Strom [mA]2

Technische Daten US-015

Pin-Belegung

  1.  Versorgungsspannung 5V
  2. Trigger (Auslöser)
  3. Echo („Empfänger“)
  4. Masse

Quellen

Tech Blog