This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| en:examples:sensor:1-wire [2012/06/06 21:51] – raivo.sell | en:examples:sensor:1-wire [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== 1-wire temperature sensor | + | ====== 1-wire temperature sensor ====== |
| //The necessary knowledge: [HW] [[en: | //The necessary knowledge: [HW] [[en: | ||
| [HW] [[en: | [HW] [[en: | ||
| Line 11: | Line 12: | ||
| 1-wire communication is mostly used for communicating between different sensors and memory units. Bus data transfer rate is approximately 16.3 kbit/s. Communication is started by a master with the " | 1-wire communication is mostly used for communicating between different sensors and memory units. Bus data transfer rate is approximately 16.3 kbit/s. Communication is started by a master with the " | ||
| - | [{{ : | + | [{{ : |
| + | |||
| + | [{{ : | ||
| To find all devices, master send an enumeration command, and an address. For each bit master listens the answer. If slave device has all right address bits it returns a 0. Master uses this simple behavior to search for valid sequences of address bits. An enumeration of 10 or 15 devices finishes very quickly. | To find all devices, master send an enumeration command, and an address. For each bit master listens the answer. If slave device has all right address bits it returns a 0. Master uses this simple behavior to search for valid sequences of address bits. An enumeration of 10 or 15 devices finishes very quickly. | ||
| - | + | A read-time is initiated by master device pulling the 1-wire bus low for a minimum of 1 µs and then releasing the bus. Slave device transmits a 1 by leaving the bus high and transmits a 0 by pulling the bus low. | |
| - | + | ||
| - | [{{ : | + | |
| - | + | ||
| - | A read-time is initiated by master device pulling the 1-wire bus low for a | + | |
| - | minimum of 1 µs and then releasing the bus. Slave device transmits a 1 by leaving the bus high | + | |
| - | and transmits a 0 by pulling the bus low. | + | |
| When transmitting a 0, slave device releases the bus by the end of the time, and the bus will be pulled back to its high idle state by pull-up resistor. Output data from the slave is valid for 15 µs after the falling edge which initiated read-time. | When transmitting a 0, slave device releases the bus by the end of the time, and the bus will be pulled back to its high idle state by pull-up resistor. Output data from the slave is valid for 15 µs after the falling edge which initiated read-time. | ||
| Line 27: | Line 24: | ||
| ===== Practice ===== | ===== Practice ===== | ||
| - | The DS18S20 digital thermometer provides 9–bit centigrade temperature measurements and has an | + | The DS18S20 digital thermometer provides 9–bit centigrade temperature measurements and has an alarm function with nonvolatile user-programmable upper and lower trigger points. A digital thermometer DS18S20 with a 1-wire communication protocol can be connected with Robotic HomeLab Sensor module external sensor connectors. |
| - | alarm function with nonvolatile user-programmable upper and lower trigger points. A digital thermometer DS18S20 with a 1-wire communication protocol can be connected with Robotic HomeLab Sensor module external sensor connectors. | + | |
| Sensors' | Sensors' | ||
| Line 47: | Line 43: | ||
| Example code enabling to read the temperature with 1-wire protocol is shown below. It is important to include | Example code enabling to read the temperature with 1-wire protocol is shown below. It is important to include | ||
| - | ~~PB~~ | + | < |
| <code c> | <code c> | ||
| Line 53: | Line 49: | ||
| #include < | #include < | ||
| #include < | #include < | ||
| - | |||
| - | |||
| #include " | #include " | ||
| #include " | #include " | ||
| - | |||
| #include < | #include < | ||
| #include < | #include < | ||
| #include < | #include < | ||
| - | // | ||
| // Sensor queue number and sensor' | // Sensor queue number and sensor' | ||
| - | // | ||
| extern uint8_t gSensorIDs[MAXSENSORS][OW_ROMCODE_SIZE]; | extern uint8_t gSensorIDs[MAXSENSORS][OW_ROMCODE_SIZE]; | ||
| + | // Main program | ||
| int main( void ) | int main( void ) | ||
| { | { | ||
| Line 88: | Line 80: | ||
| // Multiplexer' | // Multiplexer' | ||
| - | // to connect external sensor with the controller . | + | // to connect external sensor with the controller. |
| pin_setup_output(multiplexer_pin); | pin_setup_output(multiplexer_pin); | ||
| pin_set(multiplexer_pin); | pin_set(multiplexer_pin); | ||
| Line 100: | Line 92: | ||
| while(1) | while(1) | ||
| - | { | + | { |
| error = 0; | error = 0; | ||
| Line 122: | Line 113: | ||
| if (DS18X20_read_decicelsius(& | if (DS18X20_read_decicelsius(& | ||
| { | { | ||
| - | |||
| // Displaying the word " | // Displaying the word " | ||
| lcd_gfx_goto_char_xy(2, | lcd_gfx_goto_char_xy(2, | ||
| Line 130: | Line 120: | ||
| lcd_gfx_goto_char_xy(13, | lcd_gfx_goto_char_xy(13, | ||
| lcd_gfx_write_string(" | lcd_gfx_write_string(" | ||
| - | + | ||
| // Making the readings to strings and adding +/-. | // Making the readings to strings and adding +/-. | ||
| DS18X20_format_from_decicelsius( decicelsius, | DS18X20_format_from_decicelsius( decicelsius, | ||
| - | // If is needed maximum accuracy use this function: | ||
| - | // DS18X20_format_from_maxres( tval, s, 10 ); | ||
| - | |||
| // Displaying the temprerature | // Displaying the temprerature | ||
| lcd_gfx_goto_char_xy(7, | lcd_gfx_goto_char_xy(7, | ||
| lcd_gfx_write_string(s); | lcd_gfx_write_string(s); | ||
| - | + | ||
| - | // Displaying sensors queue number. Firstly it's converted to a string. | + | // Displaying sensors queue number. |
| + | // Firstly it's converted to a string. | ||
| lcd_gfx_goto_char_xy(0, | lcd_gfx_goto_char_xy(0, | ||
| sprintf(sensor_nr, | sprintf(sensor_nr, | ||
| Line 151: | Line 139: | ||
| error++; | error++; | ||
| } | } | ||
| - | |||
| } | } | ||
| else | else | ||
| { | { | ||
| - | // Taking the measurements failed, maybe in data bus has a short circuit | ||
| error++; | error++; | ||
| } | } | ||
| - | } | + | } |
| - | + | ||
| - | + | ||
| // Displaying the error messege. | // Displaying the error messege. | ||
| if ( error ) | if ( error ) | ||
| Line 173: | Line 157: | ||
| lcd_gfx_write_string(" | lcd_gfx_write_string(" | ||
| } | } | ||
| - | |||
| sw_delay_ms(500); | sw_delay_ms(500); | ||
| } | } | ||
| } | } | ||
| - | |||
| </ | </ | ||