Posts mit dem Label Feuchtigkeit werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Feuchtigkeit werden angezeigt. Alle Posts anzeigen

Sonntag, 14. September 2014

Feuchtigkeitssensor HTU21D mit dem Netduino (Teil 2)

image_thumb1

Damit die gemessenen Werte auch brauchbare Messeinheiten haben, müssen die Rohdaten zunächst umgerechnet werden. Daher kommen zwei weitere Methoden hinzu, die dies erledigen. Der Inhalt zum Lesen des einzelnen Wertes erhält eine eigene Methode, weil dieser Inhalt zweimal verwendet wird und sich nur im einzelnen zusendenden Byte unterscheidet.

// Luftfeuchtigkeit Messen und Rohwert zurückgeben
public int Read()
{
    // Inhalt in eigene Methode umgezogen
}

// Liest mit der Übergabe des Befehls den Sensor Teil aus.
private int ReadSensorPart(byte command)
{
    // Befehl senden.
    if (this.Write(new byte[] { command }) == 0)
    {
        throw new SystemException("Fehler beim Senden!");
    }

    // Warten bis der Sensor mit dem Lesevorgang fertig ist.
    Thread.Sleep(50);

    byte[] data = new byte[3];

    // Messergebnis abrufen
    if (this.Read(data) == data.Length)
    {
        // Es werden für dieses Beispiel zwei Bytes verwendet
        int raw = (data[0] << 8) | data[1];
        raw &= 0xFFFC;
        return raw;
    }

    Debug.Print("Sensor konnte nicht gelesen werden!");
    return 0;
}

Damit wir die Daten zusammengefasst aus der Methode “Read” erhalten, wird das Ergebnis in einem Daten Objekt zusammengefasst. Daszu wird eine neue Klasse angelegt.

// Das Sensor Daten Objekt stellt die gemessenen Werte zur Verfügung.
public class SensorData
{
    // Ruft die gemessene Luftfeuchtigkeit ab.
    public float Humidity { get; private set; }

    // Ruft die gemessene Temperatur ab.
    public float Temperature { get; private set; }

   // Initialsiert das Daten Objekt mit den Rohwert Messungen
    // und rechnet diese auf bekannte Maßeinheiten.
    public SensorData(int rawHumidity, int rawTemperature)
    {
       
// Umrechnung aus den Rohdaten
    }

    // Überschriebene Methode für die Ausgabe der Berechneten Inhalte.
    public override string ToString()
    {
        return "Luftfeuchtigkeit: " + this.Humidity.ToString() +

                "% - Temperatur: " +     this.Temperature.ToString() + "°C";
    }
}

Im Datenblatt sind die Formel zu entnehmen für die Feuchtigkeit und Temperatur, die mit relativ wenig aufwand in einem Programmcode abgebildet werden können.

image
Feuchtigkeitswert = –6 + (125 * (Rohwert / 65536))

Formel für die Temperatur aus dem Rohwert berechnen.

image

Temperaturwert = –46,85 + (175,72 * (Rohwert / 65536))

Grundsätzlich benötigt die Umrechnung drei Werte. Das Summieren und Multiplizieren ist bei beiden Umrechnung die selbe. Diese Aufstellung lässt sich in eine Methode zusammenfassen und in die Klasse SensorData hinzufügen.

// Rechnet aus dem Rohwert das Zielergebnis um.
public float GetCalculateValueByRange(int raw, float start, float range)
{
    // Gemessenen Rohwert durch den Maximalen Ausgabewert.
   float f = raw / 65536f;

    // Messumfang multiplizieren und an den Startwert verschieben.
   return start + (range * f);
}

Nun kann die eigentliche Umrechnung im Konstruktor erfolgen.

...
// Initialsiert das Daten Objekt mit den Rohwert Messungen
// und rechnet diese auf bekannte Maßeinheiten.

public SensorData(int rawHumidity, int rawTemperature)
{
    // Berechnen der Luftfeuchtigkeit.
   this.Humidity = GetCalculateValueByRange(rawHumidity, -6f, 125f);

    // Berechnen der Temperatur.
    this.Temperature = GetCalculateValueByRange(rawTemperature, -46.85f, 175.72f);
}
...

Damit wäre das Daten Objekt mit der Umrechnung fertig. Jetzt muss in der Hauptklasse HTU21D der Lesevorgang vervollständigt werden.

...
// Luftfeuchtigkeit Messen und Rohwert zurückgeben

public SensorData Read()
{
   // Rohwert abholen für Luftfeuchtigkeit
    int rawHumidity = ReadSensorPart(0xf5);

    // Rohwert abholen für Temperatur
    int rawTemperature = ReadSensorPart(0xf3);

   // Neues Datenobjekt erzeugen und die Rohdaten übergeben.
    return new SensorData(rawHumidity, rawTemperature);
}
...

In der Program.cs beleibt noch eine kleine Anpassung und dann ist der Teil fertig.

public class Program
{
    public static void Main()
    {
        // Klasse Initialisieren und Verbindung herstellen.
        HTU21D sensor = new HTU21D();

        while (true)
        {
            // Sensoren lesen
            SensorData sd = sensor.Read();

           // Ergebnis ausgeben.
            Debug.Print(sd.ToString());
        }
    }
}

Vielleicht ist dem einen oder anderen aufgefallen, dass drei Bytes gelesen werden, aber nur zwei Bytes verwendet werden. Das Dritte beinhaltet den CRC Wert, mit dem sich prüfen lässt, ob das Ergebnis Valide ist. Darauf gehe ich dann im nächsten Post ein.

Sonntag, 17. August 2014

Feuchtigkeitssensor HTU21D mit dem Netduino (Teil 1)

image

Zuvor habe ich für meinem Weather Shield einen Feuchtigkeitssensor DHT11 verwendet. Wer diesen kennt, weiss sicherlich wie ungenau die Messwerte sind. Ich möchte den Sensor nicht schlecht reden, denn immerhin ist er sehr günstig. Möchte man allerdings für eine Anwendung mehr Genauigkeit und eine schnelle Abtastung der aktuellen Feuchtigkeit und Temperatur, bieten andere Sensoren deutlich bessere Ergebnisse.

Ein paar interessante Daten zum Sensor:

  • Schnittstelle I²C
  • Betriebsspannung: 3,3V (max. 3,6V)
  • Stromaufnahme: ca. 10mA
  • Temperaturmessung ca. 50ms bei 14Bit (7ms bei 11Bit) (-40°C bis 125°C)
  • Feuchtigkeitmessung ca. 16ms bei 12bit (3ms bei 8Bit)
  • Kostet ab 6,50€ bei Ebay über einem chinesischen Händler

Weitere Daten findet ihr im Datenblatt.

Ansprechen lässt sich der Sensor über den I²C Bus und kann mit dem .NET Micro Framework mit geringen Aufwand programmiert werden. Das Einstiegsverhalten lässt sich mit dem Luftdruck Sensors BMP085 vergleichen, über den ich bereits geschrieben habe.

Erstellen wir eine neue Klasse mit dem Namen des Sensors, um zunächst die Verbindung herzustellen und die Rohdaten zu erhalten.

public class HTU21D : I2CDevice
{
    // Konstruktor mit vererbten Konstruktor aus der I2CDevice Klasse
    // 0x40 = Adresse des Sensors
    //  100 = Takt in kHz

    public HTU21D()
        : base(new Configuration(0x40, 100))
    {
    }

    // Luftfeuchtigkeit Messen und Rohwert zurückgeben
    public int Read()
    {
        // Befehl senden.
        if (this.Write(new byte[] { 0xf5 }) == 0)
        {
            throw new SystemException("Fehler beim Senden!");
        }

        // Warten bis der Sensor mit dem Lesevorgang fertig ist.
        Thread.Sleep(50);

        byte[] data = new byte[3];

       // Messergebnis abrufen
        if (this.Read(data) == data.Length)
        {
           // Es werden für dieses Beispiel zwei Bytes verwendet
            int raw = (data[0] << 8) | data[1];
            raw &= 0xFFFC;
            return raw;
        }

        Debug.Print("Sensor konnte nicht gelesen werden!");
        return 0;
    }

    // Sendet den Inhalt des Byte Arrays
    private int Write(byte[] buffer)
    {
        I2CTransaction[] trans = new I2CTransaction[]
        {
            CreateWriteTransaction(buffer)
        };

        return Execute(trans, 1000);
    }

    // Liest den zu empfangene Byte Array
    private int Read(byte[] buffer)
    {
       I2CTransaction[] trans = new I2CTransaction[]
        {
            CreateReadTransaction(buffer)
        };

        return Execute(trans, 1000);
    }
}

Die Rohdaten können nun über die Program.cs Klasse aufgerufen und über die Ausgabe in Visual Studio ausgegeben werden.

public class Program
{
    public static void Main()
    {
        HTU21D sensor = new HTU21D();

        while (true)
        {
            Debug.Print("Humidity RAW Value: " + sensor.Read().ToString());
            Thread.Sleep(1000);
        }
    }

}

Im nächsten Schritt wird das Modul mit dem Feuchtigkeitsensor mit dem Netduino verbunden. Je nach Ausführung des Sensor, werden eventuell zwei Widerstände mit 2,2kOhm benötigt. In der Variante die ich erhalten habe, sind diese aufgelötet, aber mit der 3,3V Zuleitung nicht verbunden. Das Modul habe ich zunächst so belassen und habe für den Testlauf zwei Pull Up Widerstände hinzu gesteckt.

HTU21D_Pullups_bearbeitet-1

Ansonsten hält sich die Schaltung mit den Netduino und dem Feuchtigkeitssensor sehr Übersichtlich.

image

Wie bereits aus den Technischen Grunddaten hervorgeht, gibt es auch einen Temperatursensor zum Messen. Dafür muss nur in der Methode “Read()”, das zu sendende Byte von 0xf5 auf 0xf3 umgeschrieben werden. Damit erhält man den Rohwert der gemessenen Temperatur.

Ameisen Simulation und andere Dinge

Wer lange sich schon mit C# beschäftig, hat sicherlich schon mal was von AntMe gelesen oder gehört. Diese Idee hatte ich aufgegriffen und mi...