Contiki 3.x
ds18b20.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2014, Eistec AB.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the copyright holder nor the names of its contributors
14  * may be used to endorse or promote products derived from this software
15  * without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
21  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27  * POSSIBILITY OF SUCH DAMAGE.
28  *
29  * This file is part of the Mulle platform port of the Contiki operating system.
30  *
31  */
32 
33 /**
34  * \file
35  * Driver for the DS18B20 temperature sensor.
36  *
37  * \author
38  * Joakim Gebart <joakim.gebart@eistec.se>
39  *
40  */
41 
42 #include "onewire.h"
43 #include "ds18b20.h"
44 #include "stdio.h"
45 #include "stdbool.h"
46 
47 /**
48  * Initialize the DS18B20 driver.
49  *
50  * Not much to do here yet.
51  */
52 void
54 {
55 }
56 /**
57  * Tell a DS18B20 sensor to initiate a temperature conversion.
58  *
59  * \param id The ROM code of the sensor, 0 for SKIP ROM.
60  *
61  * \note Parasite power is not supported yet!
62  */
63 void
64 ds18b20_convert_temperature(const ow_rom_code_t id)
65 {
66  static const ds18b20_cmd_t cmd = DS18B20_CONVERT_TEMPERATURE;
67 
69  ow_write_bytes((const uint8_t *)&cmd, 1);
70  /* Keep reading to see status of the conversion, the response will be 1 for as
71  * long as the conversion is in progress, then change to 0. */
72  /*uint8_t status = 0;*/
73  /*ow_read_bytes(&status, 1);*/
74  /*printf("status: %x\n");*/
75 }
76 /**
77  * Read the scratchpad of a DS18B20 sensor.
78  *
79  * \param id The ROM code of the sensor, 0 for SKIP ROM.
80  * \param dest A destination buffer, must be at least 9 bytes long.
81  *
82  * \return 0 if the CRC is correct, non-zero otherwise.
83  */
84 uint8_t
85 ds18b20_read_scratchpad(const ow_rom_code_t id, uint8_t *dest)
86 {
87  static const ds18b20_cmd_t cmd = DS18B20_READ_SCRATCHPAD;
88  uint16_t buf;
89  int i;
90 
92  ow_write_bytes((const uint8_t *)&cmd, 1);
93  ow_read_bytes(&dest[0], DS18B20_SCRATCHPAD_SIZE);
94  printf("Scratchpad: ");
95  for(i = 0; i < DS18B20_SCRATCHPAD_SIZE / 2; ++i) {
96  buf = (dest[2 * i] << 8) | (dest[2 * i + 1]);
97  printf("%x", buf);
98  }
99  printf("\n");
100  printf("CRC: %x (should be %x)\n", dest[8], ow_compute_crc(dest, 8));
101  buf = (dest[1] << 8) | dest[0];
102  printf("Temp (celsius): %d.%d\n", (buf >> 4), (buf & 0x0f) * 625);
103  return ow_compute_crc(dest, DS18B20_SCRATCHPAD_SIZE);
104 }
void ds18b20_convert_temperature(const ow_rom_code_t id)
Tell a DS18B20 sensor to initiate a temperature conversion.
Definition: ds18b20.c:64
Driver for the DS18B20 temperature sensor.
void ow_skip_or_match_rom(const ow_rom_code_t id)
Shorthand function for MATCH ROM or SKIP ROM if id is zero.
Definition: onewire.c:500
void ds18b20_init(void)
Initialize the DS18B20 driver.
Definition: ds18b20.c:53
One wire driver using hardware UART as a bus master.
void ow_read_bytes(uint8_t *dest, const uint8_t count)
Read a sequence of bytes from the 1-wire bus.
Definition: onewire.c:365
uint8_t ds18b20_read_scratchpad(const ow_rom_code_t id, uint8_t *dest)
Read the scratchpad of a DS18B20 sensor.
Definition: ds18b20.c:85
void ow_write_bytes(const uint8_t *src, const uint8_t count)
Write a sequence of bytes to the 1-wire bus.
Definition: onewire.c:329
uint8_t ow_compute_crc(const uint8_t *data, const uint8_t count)
Compute a 1-wire 8-bit CRC.
Definition: onewire.c:401