Auf die Funktionsweise des OneWire-Protokolls wurde schon in dem obrigem Kapitel "Schnittstellen" eingegangen.

Nun werden 2 Sensoren über den 1Wire an den Bus angeschlossen. Hier werden Temperatursensoren und Luftfeuchtigkeitsensoren gewählt. Die Schaltung kann für die nächsten 2 Abschnitte weiter verwendet werden. In diesen Abschnitten wird auch genauer erklärt, wie welcher Sensor angeschlossen werden muss.

Wichtig ist es in jedem Fall den Abschlusswiederstand nicht zu vergessen.

Auf der Extra-Platine der Fritzingschaltung ist der Luftfeuchtigkeitssensor angebracht. Dies ist leider nicht mit Fritzing darstellbar.


.

Abb.: Aufbau Temperatur- und Luftfeuchtigkeitssensor am OneWire Bus; Quelle: BBS2 Wolfsburg

Für die Kommunikation über OneWire empfiehlt es sich sowohl in Atmel Studio als auch in Arduino IDE eine Bibliothek herunter zu laden.

Eine mögliche Bibliothek für Arduino IDE ist unter folgendem Link zu finden:

https://github.com/PaulStoffregen/OneWire

Der Bus wird durch die Funktion "OneWire ow(4)" initialisiert. Das übergebene Attribut gibt den Pin für die Datenübertragung an.

Der einfachste Weg um zu testen, ob die Kommunikation über OneWire funktioniert, ist sich den Sensorcode ausgeben zu lassen.

Hierfür werden über die Funktion "ow.search(address)" alle angeschlossene Sensor aufgefordert, ihre Adresse an den Mikrocontroller zu übermitteln.

Diese wird dann über die EIA232 Schnittstelle auf dem Monitor angezeigt.

Zur Erinnerung: Die ersten 8 Bits der Adresse geben den Sensortypen an.

Ein möglicher Programmcode der diese Funktion realisiert sieht so aus:

Hier wird speziell nach den Sensoren gesucht, die für die Realisierung der Umweltdatenerfassung ausgesucht worden sind.

Ihre Adresse wird in einem 8 Byte Array gespeichert und anschliesend ausgegeben.

#include <OneWire.h>                                              //OneWire-Bibliothek
 
OneWire ow(4);                                                    //Initialisiert den OneWireBus
 
void setup(void) 
{
  Serial.begin(9600);                                             //Beginn des Seriellen Monitors
  lookUpSensors();
}
 
void lookUpSensors()
{
  byte address[8];
  int i=0;
  byte ok = 0, tmp = 0;                                           //Rücksetzen der Variablen
 
  Serial.println("--Suche gestartet--");
  Serial.println("");
  while (ow.search(address))                                      //Suche nach Sensoren wird gestartet
  {
    tmp = 0;
    if (address[0] == 0x28)
    {
      Serial.println("Device is a DS18B20: ");
      tmp = 1;                                                    //tmp=1: Adresse wurde gefunden
    } 
    else if (address[0] == 0x26)
    {
      Serial.println("Device is a DS2438: ");
      tmp = 1;                                                    //tmp=1: Adresse wurde gefunden
    }
    else 
    {
        Serial.print("Other Device : ");
        tmp = 1;                                                  //tmp=1: Adresse wurde gefunden
    }
                                                                  //display the address, if tmp is ok
    if (tmp == 1)
    {
      if (OneWire::crc8(address, 7) != address[7])                //CRC wird geprüft
      {
        Serial.println("but it doesn't have a valid CRC!");
      } 
      else 
      {
                                                                  //alles ok; die Adresse wird angezeigt
        for (i=0;i<8;i++)                                         //Die Adresse wird byteweise ausgegeben
        {
          Serial.print("0x");
          if (address[i] < 9)
          {
            Serial.print("0");
          }
          Serial.print(address[i],HEX);
          if (i<7)
          {
            Serial.print(", ");
          }
        }
        Serial.println("");
        Serial.println("");
        ok = 1;
      }
    }//end if tmp
  }//end while
  if (ok == 0)                                                    //Wenn keine Sensoren gefunden,
  {                                                               //wurden soll eine Fehlermeldung erscheinen.
    Serial.println("Keine Sensoren gefunden");
  }
  Serial.println("--Suche beendet--");
}
 
void loop(void) 
{
  //do nothing :)
}


So kann der Monitor aussehen:

Abb.: Serieller Monitor Ausgabe der Adressen ; Quelle: BBS2 Wolfsburg

Zuletzt geändert: Montag, 21. Februar 2022, 11:25