verstehe den DS18B20 nicht so ganz......

hallo zusammen,

ich versuche momentan, den sensor in mein projekt zu integrieren.....
leider funktioniert das nicht so ganz.....

zunächst mal möchte ich den sensor auf fehler prüfen bzw prüfen ob er überhaupt vorhanden ist.....
dann möchte ich die 0 und 85 rausfiltern, die am anfang kommen...(aber ohne die "sleep"-verzögerung, wenns geht) ..

bisher hab ich folgendes:

void DS18B20()
{
  byte data[12];
  byte addr[8];
  int NC = 0; // Not Connected
 
 
// prüfen ob Sensoren vorhanden 
   if (!ds.search(addr)) // Sensoraddressen prüfen 
   {
     
   ds.reset_search(); //keine Sensoren verbunden, Suche reseten
   Error = "NC"; //Array für Fehlercode
   intTemp = 9999; // Fehlercode
   NC = 1;
   }
  
   if (NC == 0) 
   {
 
   ds.search(addr); // Sensoraddressen prüfen 
   
   Sensor -> Temperatur einlesen
   ds.reset(); // reset one wire buss
   ds.select(addr);
   ds.write(0x44,1); // Konvertierung starten -> Convert T aufrufen (44h)und Temperatur ins Scratchpad schreiben
  

// Auf Konvertierung warten -> ATtiny schlafen schicken 
   Sleep_Xms(); // attiny sleep + watchdog
  
 
   ds.reset(); // Bus reseten
   ds.select(addr); // Sensor auswählen
   ds.write(0xBE); // Scratchpad lesen
 
   for (int i = 0; i < 12; i++)  // 12 bytes
   {
    data[i] = ds.read();
   }
 
// Umrechnen der vom Temperatursensor gelesenen Daten
   
   byte high = data[1];
   byte low = data[0];
  
   float SensorRead = ((high << 8) | low);  // Rohdaten von DS18B20 in float umrechnen
   float Temperatur = SensorRead / 16;
 
   Error = "OK"; //Array für Fehlercode 
   intTemp = Temperatur*100; // Temperatur in int umrechnen
   
   }
   
}

ich bekomme aber leider immer "NC" und "9999"

wenn ich diese "if NC == 0" abfrage rausnehme, funktioniert das auslesen, also ich bekomme "OK" und ein Temperaturwert.... wenn ich aber zb den sensor (im laufenden betrieb) abstecke, hängt das program oder ich bekomme keine fehlermeldung...

und um die 85 rauszufiltern wollte ich eigentlich das hier verwenden:

 // Die Ersten Temperaturausgaben des Sensors sind 85.00, deswegen wird die Temperatur so oft abgefragt, bis der Sensor nicht mehr 85.00 ausgibt.
  if (Temperatur == 85.00)
  {
  DS18B20();
  }
  else
  {
 + intTemp = Temperatur*100; // Temperatur in int umrechnen
  }

allerdings wird dann ja die ganze funktion wiederholt (inc der verzögerung)

aktuell ärgere ich mich hiermit rum:

void DS18B20()
{
  byte data[12];
  byte addr[8];
 
 
// prüfen ob Sensoren vorhanden 
  if (!ds.search(addr)) // Sensoraddressen prüfen 
    {
     ds.reset_search(); // Suche reseten
     Error = "NC"; // Array für Fehlercode
     intTemp = 9999; // Fehlercode 
     return;
   }
  
   if ( OneWire::crc8( addr, 7) != addr[7]) 
   {
    Error = "CRC"; // Array für Fehlercode
    intTemp = 9999; // Fehlercode 
    return;
    }
   
     if (addr[0] != 0x28) // DS18B20
     {
     if (addr[0] != 0x10)  // DS18S20
     {
      Error = "FAM"; // Array für Fehlercode
      intTemp = 9999; // Fehlercode 
      return;
      }
      }
  
 
 ds.search(addr); // Sensoraddressen prüfen 
   
// Sensor -> Temperatur einlesen

   ds.reset(); // reset one wire buss
   ds.select(addr);
   ds.write(0x44,1); // Konvertierung (mit Power On am Ende) starten -> Convert T aufrufen (44h)und Temperatur ins Scratchpad schreiben
  

// Auf Konvertierung warten -> ATtiny schlafen schicken 
   Sleep_Xms();
  
   
   byte present = ds.reset(); // Bus reseten
   ds.select(addr); // Sensor auswählen
   ds.write(0xBE); // Scratchpad lesen
 
   for (int i = 0; i < 12; i++)  // 12 bytes
   {
    data[i] = ds.read();
   }
 
// Umrechnen der vom Temperatursensor gelesenen Daten
   
   byte high = data[1];
   byte low = data[0];
  
   float SensorRead = ((high << 8) | low);  // Rohdaten von DS18B20 in float umrechnen
   float Temperatur = SensorRead / 16;
 
   Error = "OK"; //Array für Fehlercode 
   intTemp = Temperatur*100; // Temperatur in int umrechnen

bei was genau wird nc und bei was crc angezeigt ?
nc, dann wenn keine adresse gefunden wird !?
und crc ?

ich habs jetzt irgendwie ans laufen bekommen, dafür sind neue problem ehinzugekommen......

ich möchte verhindern, das der sensor sofort beim ersten fehler einen fehler ausgibt - er soll stattdessen nochmal prüfen und erst beim dritten(einstellbar) mal ein fehler rausgeben......

funktioniert nur leider nicht so ganz:

void DS18B20()
{
  byte data[12];
  byte addr[8];
 
 
// prüfen ob Sensoren vorhanden 
  if (!ds.search(addr)) // Sensoraddressen prüfen 
    {
      if (ErrorCounter1 < maxError)
      {
       ErrorCounter1++;
       delayMicroseconds(50);
       DS18B20(); 
      }
   else if (ErrorCounter1 >= maxError)
      {
     ds.reset_search(); // Suche reseten
     Error = "NC"; // Array für Fehlercode
     intTemp = 9999; // Fehlercode 
     return;
   }
   }
   
// Auf CRC Fehler prüfen
   if ( OneWire::crc8( addr, 7) != addr[7]) 
   {
     if (ErrorCounter2 < maxError)
      {
       ErrorCounter2++;
       delayMicroseconds(50);
       DS18B20(); 
      }
   else if (ErrorCounter2 >= maxError)
      {
    Error = "CRC"; // Array für Fehlercode
    intTemp = 9999; // Fehlercode 
    return;
    }
    }

// Prüfen ob richtige Sensorfamilie
     if (addr[0] != 0x28) // DS18B20
     {
     if (addr[0] != 0x10)  // DS18S20
     {
       if (ErrorCounter3 < maxError)
      {
       ErrorCounter3++;
       delayMicroseconds(50);
       DS18B20(); 
      }
   else if (ErrorCounter3 >= maxError)
      {
      Error = "FAM"; // Array für Fehlercode
      intTemp = 9999; // Fehlercode 
      return;
      }
      }
      }

Hallo,

und was machste wenn wirklich mal 85.00 °C gemessen werden?

Warum nimmst Du nicht die fertige Library? Beim auslesen muß man nämlich paar Dinge beachten. Befehl zum auslesen schicken, x ms warten, Temperaturwert auslesen. So grob formuliert. Die Adresse muß natürlich vorher wissen.

Empfehlung: milesburton.com/Dallas_Temperature_Control_Library geht immer.

Mal eine Kleinigkeit? Ist Error ein Zeiger oder ein Array? Mit einem Zeiger geht das. Falls es ein Array ist, macht das nicht genau was du denkst. Du kannst mit = nicht Arrays Zuweisen und nicht mit == vergleichen. Was du dann machst ist eine Adresse Zuweisen und dann diese Adresse abfragen. Das Ergebnis wird sein was du möchtest, aber es ist unnötig. Sowas kann man speicher-schonend mit enums erledigen.

danke für di ehilfe !

ok, das wäre eine berechtigte frage, bei bestimmten anwendungsfällen,
aber in dem fall werden die niemals 85°C messen ......

weil das ja jetzt auch nicht so viel code ist........
nur sind da ein, zwei dinge, die noch nicht ganz klappen.......
außerdem lernt man so mehr über den sensor bzw die funktion (;

char *Error = "XXXX";

is ein zeiger oder ??

meinst du das ?
"
if (addr[0] != 0x28) // DS18B20
{
"

das hatte ich so aus einem beispiel übernommen.......

wie schaffe ich das denn "if (addr[0] != 0x28) ODER (addr[0] != 0x10)" daraus zu machen ?
mit || hatte es nicht geklappt......

ich verstehe zb das noch nicht so ganz......

if (ds.search(addresse) == false)
{
ds.reset_search();
Error = "NC";
intTemp = 9999;
return;
}

ich schaffs nicht, daraus eine funktion zu basteln,
die nach einer adresse sucht und wenn keine gefunden wir,
soll das gemacht werden:
"
Error = "NC";
intTemp = 9999;
return;
"

wenn ich das richtig verstanden hab mus das als schleife laufen?
ds.search(addresse) und bekomme false, wenn kein sensor mehr gefunden wird

https://www.pjrc.com/teensy/td_libs_OneWire.html

ok, bin grade ein gutes stück weitergekommen........

fehlerabfrage usw klappt jetzt, nur noch ein paar (optische) "verbesserungen" (;

danke !