Code: Alles auswählen
// hier die ausgelesenen ROM-IDs der DS18B20 eintragen
#define OW_ID_T01 {0x10,0x26,0x5f,0x24,0x01,8,0,0xa6}
Ausgabe von OWREADScanning Bus for DS18X20
2 1-Wire Sensoren gefunden.
#1 ist ein DS18S20/DS1820 mit externer Spannungsversorgung. 10 (18S)24 5a 24 1 8 0 c3 CRC O.K. 0 19.0010 C 196
#2 ist ein DS18S20/DS1820 mit externer Spannungsversorgung. 10 (18S)4c 67 24 1 8 0 43 CRC O.K. 0 19.0007 C 194
In der config.h habe ich eingetragenFixed T-Sensor Werte:
1: 0
2: 0
Ich habe bereits den Sourcecode rauf- und runter durchsucht um evt. selber an des Rätsels Lösung zu kommen,/** 1-Wire ************/
#define USE_OW 1 // 1-Wire bus einbinden
#define MAXSENSORS 2 // max. Anzahl der 1-wire sensoren (DS18B20)
#define OW_ONE_BUS 1 // nur ein fest eingestellter 1-wire bus; keine Auswahl
// die Ports werden in onewire.h definiert
#define OW_ROMCODE_SIZE 8 // rom-code DS18B20 size including CRC
// hier die ausgelesenen ROM-IDs der DS18B20 eintragen
#define OW_ID_T01 {0x10,0x24,0x5a,0x24,0x01,8,0,0xc3}
#define OW_ID_T02 {0x10,0x4c,0x67,0x24,0x01,8,0,0x43}
#define OW_ID_T03 {0x28,0x11,0x22,0x33,0x44,0,0,0x77}
#define OW_ID_T04 {0x28,0x22,0x33,0x44,0x55,0,0,0x77}
#define OW_ID_Last {0x00,0x00,0x00,0x00,0x00,0,0,0x00}
Code: Alles auswählen
/**
* \ingroup messen
* bekannte DS18x20 auslesen
*/
void lese_Temperatur(void)
{
#if USE_OW
uint8_t i = 0;
uint16_t TWert;
uint8_t subzero, cel, cel_frac_bits;
uint8_t tempID[OW_ROMCODE_SIZE];
memcpy_P(tempID,DS18B20IDs[0],OW_ROMCODE_SIZE); // erste ID ins RAM holen
while (tempID[0] != 0 ) { // <<<--- auf 0 testen; nicht nur auf DS18B20_ID
// T messen
if ( DS18X20_start_meas( DS18X20_POWER_PARASITE, tempID ) == DS18X20_OK ) {
_delay_ms(DS18B20_TCONV_10BIT);
if ( DS18X20_read_meas( tempID, &subzero,&cel, &cel_frac_bits) == DS18X20_OK ) {
TWert = DS18X20_temp_to_decicel(subzero, cel, cel_frac_bits);
ow_array[i] = TWert;
}
else {
MES_DEBUG("\r\nCRC Error (lost connection?) ");
//DS18X20_show_id_uart( tempID, OW_ROMCODE_SIZE );
}
}
else MES_DEBUG("\r\n*** Messung fehlgeschlagen. (Kurzschluss?) ***");
memcpy_P(tempID,DS18B20IDs[++i],OW_ROMCODE_SIZE); // nächste ID ins RAM holen
}
#endif
}
Code: Alles auswählen
#if USE_OW
set_SensorResolution();
#endif
So steht es im Datenblatt des DS18S20.The power-on reset value of the temperature register is +85°C.
Code: Alles auswählen
_delay_ms(DS18S20_TCONV);
Code: Alles auswählen
if (subzero)
TWert *= (-1);
ow_array[i] = TWert;
Code: Alles auswählen
if (b >= 20) { // Offset bei Sensor# abziehen und Wert als Dezimalzahl ausgeben
b -= 20;
int8_t i = (int8_t)(ow_array[b] / 10);
itoa (i,var_conversion_buffer,10);
str_len = strnlen(var_conversion_buffer,CONVERSION_BUFFER_LEN);
var_conversion_buffer[str_len] = ',';
str_len++;
memmove(ð_buffer[TCP_DATA_START+a],var_conversion_buffer,str_len);
a += str_len;
i = ow_array[b] % 10;
itoa (i,var_conversion_buffer,10);
} else {
itoa (ow_array[b],var_conversion_buffer,10);
}
Code: Alles auswählen
sprintf(TEMP_I,"INNEN: %i.%i",(ow_array[0] / 10),ow_array[0] %10); //Innen
sprintf(TEMP_A,"AUSSEN: %i.%i",(ow_array[1] / 10),ow_array[1] %10); //Aussen
while (tempID[0] !=0 ) {
// T messen
if ( DS18X20_start_meas( DS18X20_POWER_PARASITE, tempID ) == DS18X20_OK ) {
//_delay_ms(DS18B20_TCONV_10BIT);
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 = TWert;
}
else {
MES_DEBUG("\r\nCRC Error (lost connection?) ");
//DS18X20_show_id_uart( tempID, OW_ROMCODE_SIZE );
}
}
else MES_DEBUG("\r\n*** Messung fehlgeschlagen. (Kurzschluss?) ***");
memcpy_P(tempID,DS18B20IDs[++i],OW_ROMCODE_SIZE); // nächste ID ins RAM holen
}
Code: Alles auswählen
sprintf(TEMP_I,"INNEN: %f",ow_array[0] / 10.0);
Code: Alles auswählen
dtostrf(ow_array[1] / 10.0,3,1,TEMP_A);