// Bis zu vier Temp.Sensoren DS18B20 auf Pin 2 mit Widerstand 4,7k gegen plus

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h> // LCD Display

LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

const int delayTimeM1 = 2000; // Alle 2 Sekunden Temperatur-Auswertung
unsigned long VorherMillesM1 = 0;

const unsigned long Baud_Rate = 9600;
const unsigned char One_Wire_Bus = 2; // Sensoren auf Pin
OneWire oneWire(One_Wire_Bus);
DallasTemperature sensoren (&oneWire);

int Anzahl_Sensoren = 0;
int is = 0; // Zaehler fuer die Sensoren
int ia = 0; // Zaehler fuer die Adressstellen 0-7
int Sensor = 0;

DeviceAddress tempDeviceAddress; // Fuer die Adressausgabe
int numberOfDevices; // Fuer die Adressausgabe
//---------------------------------------------------------------------------
void setup()
{
  sensoren.begin();
  Serial.begin(Baud_Rate);
  lcd.begin(20, 4);
  lcd.backlight();
  lcd.clear();

  // Anzahl der Sesoren ermitteln
  Anzahl_Sensoren = sensoren.getDeviceCount();

  // Ermitteln der Sensor-Adressen
  for (is = 0; is < Anzahl_Sensoren; is++)
  {
    if (sensoren.getAddress(tempDeviceAddress, is))
    {
      Serial.println ();
      printAddress(tempDeviceAddress);
    }
  }
  // Kein blockierendes Warten auf die Messung!!
  // Spart 740ms Loop Zeit bei der Messung
  sensoren.setWaitForConversion(false);
}
//---------------------------------------------------------------------------
// Ausgabe der Sensor-Adressen
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t ia = 0; ia < 8; ia++)
  {
    if (deviceAddress[ia] < 16)
    {
      Serial.print("0"); //ist die Hex Adresse kleiner 16 dann erste Stelle eine "0"
    }
    Serial.print(deviceAddress[ia], HEX);
  }
}
//---------------------------------------------------------------------------
void loop()
{
  if (millis() - VorherMillesM1 >= delayTimeM1)
  {
    VorherMillesM1 = millis();

    //Temperaturen Aulesen
    if (Sensor == 0) { //Bei jedem ersten Durchgang Temperaturen holen
      sensoren.requestTemperatures();
    }
    // Hier werden die Temperaturen aufs Display gebracht
    if (Sensor < Anzahl_Sensoren)
    { Sensor ++;
      float temperatur = sensoren.getTempCByIndex(Sensor - 1);
      lcd.setCursor (0, (Sensor - 1));
      lcd.print ("Temperatur");
      lcd.setCursor (11, (Sensor - 1));
      lcd.print (Sensor);
      lcd.setCursor (14, (Sensor - 1));
      lcd.print (temperatur);
      if (Sensor == Anzahl_Sensoren)
      {
        Sensor = 0;
      }
    }
  }
}