Arduino-OWI
One-Wire Interface (OWI) library for Arduino
DS18B20.h
Go to the documentation of this file.
1 
19 #ifndef OWI_DRIVER_DS18B20_H
20 #define OWI_DRIVER_DS18B20_H
21 
22 #include "OWI.h"
23 
41 class DS18B20 : public OWI::Device {
42 public:
44  static const uint8_t FAMILY_CODE = 0x28;
45 
47  static const uint16_t MAX_CONVERSION_TIME = 750;
48 
56  DS18B20(OWI& owi, uint8_t* rom = NULL) :
57  OWI::Device(owi, rom),
58  m_start(0),
59  m_converting(false)
60  {
61  resolution(12);
62  set_trigger(70, 75);
63  }
64 
70  void resolution(uint8_t bits)
71  {
72  if (bits < 9) bits = 9; else if (bits > 12) bits = 12;
73  m_scratchpad.configuration = (((bits - 9) << 5) | 0x1f);
74  }
75 
82  void set_trigger(int8_t low, int8_t high)
83  {
86  }
87 
94  float temperature() const
95  {
96  return (m_scratchpad.temperature * 0.0625);
97  }
98 
103  uint8_t resolution() const
104  {
105  return (9 + (m_scratchpad.configuration >> 5));
106  }
107 
113  void get_trigger(int8_t& low, int8_t& high) const
114  {
116  high = m_scratchpad.high_trigger;
117  }
118 
125  bool convert_request(bool broadcast = false)
126  {
127  if (broadcast) {
128  if (!m_owi.skip_rom()) return (false);
129  }
130  else {
131  if (!m_owi.match_rom(m_rom)) return (false);
132  }
134  m_start = millis();
135  m_converting = true;
136  return (true);
137  }
138 
143  uint16_t conversion_time()
144  {
145  if (!m_converting) return (0);
146  m_converting = false;
147  uint16_t ms = millis() - m_start;
148  uint16_t conv_ms = (MAX_CONVERSION_TIME >> (12 - resolution()));
149  if (conv_ms > ms) return (conv_ms - ms);
150  return (0);
151  }
152 
158  {
159  if (!m_converting) return (true);
160  bool res = m_owi.read(1);
161  if (res) m_converting = false;
162  return (res);
163  }
164 
171  {
172  if (!m_converting) return (false);
173  while (!convert_ready()) delay(1);
174  return (true);
175  }
176 
185  bool read_scratchpad(bool match = true)
186  {
187  if (match && !m_owi.match_rom(m_rom)) return (false);
189  return (m_owi.read(&m_scratchpad, sizeof(m_scratchpad)));
190  }
191 
199  bool write_scratchpad(bool match = true)
200  {
201  if (match && !m_owi.match_rom(m_rom)) return (false);
203  return (true);
204  }
205 
212  bool copy_scratchpad(bool match = true)
213  {
214  if (match && !m_owi.match_rom(m_rom)) return (false);
216  return (true);
217  }
218 
225  bool recall(bool match = true)
226  {
227  if (match && !m_owi.match_rom(m_rom)) return (false);
229  return (true);
230  }
231 
232 protected:
236  enum {
237  CONVERT_T = 0x44,
241  RECALL_E = 0xB8,
243  } __attribute__((packed));
244 
248  struct scratchpad_t {
249  int16_t temperature;
250  int8_t high_trigger;
251  int8_t low_trigger;
252  uint8_t configuration;
253  uint8_t reserved[3];
254  uint8_t crc;
255  } __attribute__((packed));
257 
259  static const uint8_t CONFIG_MAX = 3;
260 
262  uint16_t m_start;
263 
266 };
267 #endif
Definition: OWI.h:29
bool m_converting
Definition: DS18B20.h:265
Write data to scratchpad.
Definition: DS18B20.h:239
scratchpad_t m_scratchpad
Definition: DS18B20.h:256
bool convert_ready()
Definition: DS18B20.h:157
static const uint8_t FAMILY_CODE
Definition: DS18B20.h:44
int16_t temperature
Temperature reading (9-12 bits).
Definition: DS18B20.h:249
bool skip_rom()
Definition: OWI.h:248
int8_t low_trigger
Low temperature trigger.
Definition: DS18B20.h:251
bool recall(bool match=true)
Definition: DS18B20.h:225
uint8_t * rom()
Definition: OWI.h:333
void get_trigger(int8_t &low, int8_t &high) const
Definition: DS18B20.h:113
static const uint8_t CONFIG_MAX
Definition: DS18B20.h:259
OWI & m_owi
Definition: OWI.h:340
Recall configuration data from EEPROM.
Definition: DS18B20.h:241
bool read_scratchpad(bool match=true)
Definition: DS18B20.h:185
bool convert_request(bool broadcast=false)
Definition: DS18B20.h:125
virtual void write(uint8_t value, uint8_t bits=CHARBITS)=0
bool copy_scratchpad(bool match=true)
Definition: DS18B20.h:212
void resolution(uint8_t bits)
Definition: DS18B20.h:70
Read scratchpad including crc byte.
Definition: DS18B20.h:238
Software::OWI< BOARD::D7 > owi
Definition: Alarm.ino:7
uint8_t crc
Check sum.
Definition: DS18B20.h:254
uint8_t resolution() const
Definition: DS18B20.h:103
Signal power supply mode.
Definition: DS18B20.h:242
uint16_t m_start
Definition: DS18B20.h:262
int8_t high_trigger
High temperature trigger.
Definition: DS18B20.h:250
bool write_scratchpad(bool match=true)
Definition: DS18B20.h:199
uint8_t configuration
Configuration; resolution, alarm.
Definition: DS18B20.h:252
uint8_t m_rom[ROM_MAX]
Definition: OWI.h:343
bool convert_await()
Definition: DS18B20.h:170
Copy configuration register to EEPROM.
Definition: DS18B20.h:240
bool match_rom(uint8_t *code)
Definition: OWI.h:236
void set_trigger(int8_t low, int8_t high)
Definition: DS18B20.h:82
float temperature() const
Definition: DS18B20.h:94
Initiate temperature conversion.
Definition: DS18B20.h:237
static const uint16_t MAX_CONVERSION_TIME
Definition: DS18B20.h:47
uint16_t conversion_time()
Definition: DS18B20.h:143
virtual uint8_t read(uint8_t bits=CHARBITS)=0
uint8_t reserved[3]
Reserved.
Definition: DS18B20.h:253
Device(OWI &owi, const uint8_t *rom=NULL)
Definition: OWI.h:293
DS18B20(OWI &owi, uint8_t *rom=NULL)
Definition: DS18B20.h:56