Dieser Sensor hat mit seinem Ausfall den kompletten 1-Wire-Bus lahmgelegt, so daß keine neuen Sensorwerte mehr gelesen werden konnten, also die alten Werte fix blieben.
Deshalb: Wenn die Sensoren "produktiv" verwendet wird, sollte die Software das feststellen können und Ersatzwerte bereitstellen sowie ggf. Fehlermeldungsmails o.Ä. verschicken........
Für die Temperaturausgabe auf der Webseite
hier ein Beispielcodeschnipsel aus ds18x20.c
Code: Alles auswählen
#define OW_ERR_CNT_MAX 3 // nach 3 x 10s = 30sek Mail. Ersatzwertreaktion kommt sofort
int8_t ow_array_err[MAX_OW_ARRAY]; // Fehler Sensor
#if OW_EXTERN_POWERED
for (i=0; i<MAXSENSORS; i++)
{
memcpy_P(tempID,DS18B20IDs[i],OW_ROMCODE_SIZE); // erste ID ins RAM holen
if ( DS18X20_read_meas( tempID, &subzero,&cel, &cel_frac_bits) == DS18X20_OK )
{
TWert = DS18X20_temp_to_decicel(subzero, cel, cel_frac_bits);
if (subzero)
{
TWert *= (-1);
}
ow_array[i] = TWert;
ow_array_err[i] = 0; // Fehlerzähler löschen
}
else // kein Wert vom Sensor
{
// if (log_log.logfile) f16_printf_P(log_log.logfile,PSTR("\r\n-> DS1820 CRC Error (lost connection?) \n\r"));
// DS18X20_show_id_uart( tempID, OW_ROMCODE_SIZE );
if (ow_array_err[i]<OW_ERR_CNT_MAX)
{
ow_array_err[i]++;
}
else // Fehlergrenze überschritten
{
testsendmail (MAIL_ONEWIRESENSORFEHLER); // Mail Sensorfehler verschicken
}
}
}
#else
......
if (ow_array_err) // Fehlerzähler > 0
{
*dest = 'F'; // Fnn.n ausgeben (Fehler))
dtostrf(ow_array / 10.0,3,1,(char*)(dest+1)); // °C-Wert als Dezimalzahl ausgeben, eine Nachkommastelle
}
else
{
dtostrf(ow_array / 10.0,3,1,(char*)dest); // °C-Wert als Dezimalzahl ausgeben, eine Nachkommastelle
}
Anmerkung: die Funktions "testsendmail" sorgt dafür, daß der gleiche Mailtyp nur einmal am Tag versendet wird.