AVR-NET-IO - 1-Wire Sensoren (Temperatur) ========================================= Anschluss der Sensoren an PORTA7 (Widerstand von 4,7k gegen VCC/5V) --------- -> config.h: ----------- /** 1-Wire ************/ #define USE_OW 1 // 1-Wire bus einbinden #define MAXSENSORS 8 // 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 {0x28,0xd7,0x00,0x32,0x01,0,0,0xbb} #define OW_ID_T02 {0x28,0xc9,0x1f,0x32,0x01,0,0,0xe0} #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} -> onewire.h: ------------ #ifdef OW_ONE_BUS #define OW_PIN PA7 #define OW_IN PINA #define OW_OUT PORTA #define OW_DDR DDRA #define OW_CONF_DELAYOFFSET 0 -> main.c: --------- #if USE_OW #include "1-wire/ds18x20.h" // Variable -> config.h (OW_ID_T...) volatile uint16_t ow_array[MAXSENSORS]; // Speicherplatz für 1-wire Sensorwerte PROGMEM uint8_t DS18B20IDs[MAXSENSORS+1][OW_ROMCODE_SIZE] = { OW_ID_T01, // 1. DS18B20 OW_ID_T02, // 2. DS18B20 ... OW_ID_Last }; // Endmarker #endif ... //DS18B20 auslesen // // RoBue: // In diesem Programm wird jeder Sensor einzeln zum Messen aufgefordert // und dann ausgelesen. // Es wäre besser, alle auf einmal zum Messen aufzufordern // und dann die Sensoren einzeln auszulesen. // // Die Routine // ( DS18X20_start_meas( DS18X20_POWER_PARASITE, tempID ) // -> 1-Wire/ds18x20.c // veranlasst die Sensoren zum Berechnen der Temperatur. // Sie ruft die Routine // void ow_command( uint8_t command, uint8_t *id ) // -> 1-wire/onewire.c // auf. Diese funktioniert aber auch ohne "*id"-Wert // und schickt dann den Befehl für ALLE Sensoren über den Bus. // // Bessere Lösung (über interne Uhr/Timer): // Ca. alle 60s den Messvorgang auslösen (ohne dalay!) // Dann 1s später einfach die Sensoren auslesen. // Das müsste bei 8 Sensoren eigentlich auf einen Rutsch funktionieren. // Im Notfall liese sich dann pro s ein Sensor auslesen // 59 -> Start Messung, 00 -> Sensor0, 01 -> Sensor1, ...) // // Achtung: // Kennung der 1-Wire-Temperatur-Sensoren beginnt mit 0x10 nicht mit 0x28 // => DS18B20_ID -> DS18S20_ID umschreiben, sonst geht nix // 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]; // erste ID ins RAM holen memcpy_P(tempID,DS18B20IDs[0],OW_ROMCODE_SIZE); // RoBue // DS18B20_ID -> DS18S20_ID umschreiben (s.o.) !!! while (tempID[0] == DS18S20_ID) { // RoBue: // Hiermit werden die Sensoren zum Messen aufgefordert. if ( DS18X20_start_meas( DS18X20_POWER_PARASITE, tempID ) == DS18X20_OK ) { // RoBue: // Pause von 750 ms zum Berechnen der Temperatur _delay_ms(750); // // RoBue: // Hiermit wird ein einzelner Sensor ausgelesen // und die Temperatur in ow_array abgelegt (8 Werte/Sensor). // Position 0-4 eig. ID, Pos. 5+6 ist die Temperatur, Pos. 7 CRC-Byte 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; // // Testausgabe auf UART usart_write("%4i\r\n",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?) ***"); // nächste ID ins RAM holen memcpy_P(tempID,DS18B20IDs[++i],OW_ROMCODE_SIZE); } #endif } ... -> http.c: --------- #if USE_OW /* * 1-Wire Temperatursensoren * ------------------------- * OW@nn nn = 00 bis MAXSENSORS-1 gibt Werte in 1/10 °C aus * OW@mm mm = 20 bis MAXSENSORS-1+20 gibt Werte in °C mit einer Nachkommastelle aus * d.h. OW@nn für Balkenbreite verwenden und OW@mm für Celsius-Anzeige */ if (strncasecmp_P(token,PSTR("OW@"),3)==0) { HTTP_DEBUG(" - 1-wire"); b = (token[3]-48)*10; b +=(token[4]-48); 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); } str_len = strnlen(var_conversion_buffer,CONVERSION_BUFFER_LEN); memmove(ð_buffer[TCP_DATA_START+a],var_conversion_buffer,str_len); a += str_len-1; nchars = 5; } #endif -> webpage.h: ------------ #if USE_OW "" "

1-Wire Wert1

" "" "

%OW@20

" "\r\n" "" "

1-Wire Wert2

" "" "

%OW@21

" "\r\n" #endif