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 !