BayEOS-Arduino  1.8.0_0.0.4
DS18B20.cpp
1 
2 #include "DS18B20.h"
3 
4 DS18B20::DS18B20(uint8_t pin,uint8_t channel_offset,uint8_t ds18b20_channels) : OneWire(pin){
5  _channel_offset=channel_offset;
6  _current_channel=_channel_offset;
7  _addr=(uint8_t*) malloc(8*ds18b20_channels);
8  _ds18b20_channels=ds18b20_channels;
9  for (byte ii=0; ii<_ds18b20_channels; ++ii)
10  for (byte jj=0; jj<8; ++jj) _addr[ii+jj*8] = 0x0;
11 }
12 
13 
15  while(_current_channel<(_ds18b20_channels+_channel_offset)){
16  _current_channel++;
17  if(_addr[(_current_channel-1-_channel_offset)*8]) return _current_channel;
18  }
19  _current_channel=_channel_offset;
20  return 0;
21 }
22 
24  _current_channel=_channel_offset;
25  reset();
26  write(0xCC,1); // skip rom
27  write(0x44,1); // start conversion
28 }
29 
30 const uint8_t* DS18B20::search(void){
31  reset_search();
32  while(OneWire::search(_new_addr)){
33  if(OneWire::crc8(_new_addr, 7) !=_new_addr[7]) continue;
34  if (_new_addr[0] != 0x28) continue;
35  if(! getChannel(_new_addr)) return _new_addr;
36  }
37  return 0;
38 }
39 
40 uint8_t DS18B20::checkSensors(void){
41  uint8_t i,j;
42  for(i=0;i<_ds18b20_channels;i++){
43  if(_addr[i*8]){
44  reset();
45  select(&_addr[i*8]);
46  write(0xBE); // Read Scratchpad
47  for (j = 0; j < 9; j++) { // we need 9 uint8_ts
48  _data[j] = read();
49  }
50  if(_data[0]==0xFF && _data[1]==0xFF
51  && _data[2]==0xFF && _data[3]==0xFF ) return (i+1+_channel_offset);
52  }
53  }
54  return 0;
55 }
56 
57 
58 uint8_t DS18B20::addSensor(const uint8_t* new_addr,uint8_t channel){
59  int addr_offset=(channel-1-_channel_offset)*8;
60  for(uint8_t i=0;i<8;i++){
61  _addr[addr_offset+i]=new_addr[i];
62  }
63  writeAddrToEEPROM(channel);
64 }
65 
66 uint8_t DS18B20::readAddrFromEEPROM(uint8_t channel){
67  int ee_offset=(channel-1)*8;
68  int addr_offset=(channel-1-_channel_offset)*8;
69  if(! EEPROM.read(ee_offset)) return 0;
70  for(uint8_t i=0;i<8;i++){
71  _addr[addr_offset+i]=EEPROM.read(ee_offset+i);
72  }
73  if(OneWire::crc8(&_addr[addr_offset], 7) !=_addr[addr_offset+7]){
74  _addr[addr_offset]=0x0;
75  writeAddrToEEPROM(channel);
76  return 0;
77  }
78  return 1;
79 }
80 
82  uint8_t sensors=0;
83  for(uint8_t i=0;i<_ds18b20_channels;i++){
84  sensors+=readAddrFromEEPROM(i+1+_channel_offset);
85  }
86  return sensors;
87 }
88 
90  uint8_t channel;
91  int count=0;
92  const uint8_t* new_addr;
93  while(channel=checkSensors()){
94  new_addr=getChannelAddress(channel);
95  if(deleteChannel(new_addr)) count--;
96  }
97  while(new_addr=search()){
98  if(channel=getNextFreeChannel()){
99  addSensor(new_addr,channel);
100  count++;
101  } else break;
102  }
103  return count;
104 }
105 
106 void DS18B20::writeAddrToEEPROM(uint8_t channel){ //Channel beginnt mit 1
107  int ee_offset=(channel-1)*8;
108  int addr_offset=(channel-1-_channel_offset)*8;
109  for(uint8_t i=0;i<8;i++){
110  EEPROM.write(ee_offset+i,_addr[addr_offset+i]);
111  }
112 }
113 
114 
115 uint8_t DS18B20::readChannel(uint8_t channel, float* f,uint8_t tries){
116  int addr_offset=(channel-1-_channel_offset)*8;
117  if(! _addr[addr_offset]) return 0x1; // not set!
118  uint8_t i;
119  while(tries){
120  tries--;
121  reset();
122  select(&_addr[addr_offset]);
123  write(0xBE); // Read Scratchpad
124  for (i = 0; i < 9; i++) { // we need 9 uint8_ts
125  _data[i] = read();
126  }
127  if ( OneWire::crc8( _data, 8) != _data[8] && _data[7]!=0xFF){
128  if(! tries) return 0x2; //not valid CRC
129  } else tries=0;
130  }
131  if(_data[7]==0xFF) *((long unsigned *) f)=NAN;
132  else *f = *(int16_t *)&_data[0]*0.0625; //_data[0]_data[1] is a LE-INT16
133  return 0x0; // ok!
134 }
135 
137  for(uint8_t i=0;i<_ds18b20_channels;i++){
138  if(_addr[i*8]==0x0) return (i+1+_channel_offset);
139  }
140  return 0;
141 }
142 
143 uint8_t DS18B20::deleteChannel(const uint8_t* addr){
144  uint8_t channel=getChannel(addr);
145  if(channel){
146  _addr[(channel-1-_channel_offset)*8]=0x0;
147  writeAddrToEEPROM(channel);
148  }
149  return channel;
150 }
151 
152 const uint8_t* DS18B20::getChannelAddress(uint8_t channel) const{
153  return &_addr[(channel-1-_channel_offset)*8];
154 }
155 
156 uint8_t DS18B20::getChannel(const uint8_t* addr){
157  for(uint8_t i=0;i<_ds18b20_channels;i++){
158  if(addr[0]==_addr[i*8] && addr[1]==_addr[i*8+1] &&
159  addr[2]==_addr[i*8+2] && addr[3]==_addr[i*8+3] &&
160  addr[4]==_addr[i*8+4] && addr[5]==_addr[i*8+5] &&
161  addr[6]==_addr[i*8+6] && addr[7]==_addr[i*8+7]) return (i+1+_channel_offset);
162  }
163  return 0;
164 }
165 
166 
167 const String DS18B20::addr2String(const uint8_t* addr){
168  String s=String("0x");
169  for(uint8_t i=0;i<8;i++){
170  s+=String(addr[i],16);
171  }
172  return s;
173 }
174 
175 
176 uint8_t DS18B20::getNumberOfChannels(void){return (uint8_t) _ds18b20_channels;}
uint8_t getNextChannel(void)
Definition: DS18B20.cpp:14
DS18B20(uint8_t pin, uint8_t channel_offset=0, uint8_t ds18b20_channels=DS18B20_CHANNELS)
Definition: DS18B20.cpp:4
uint8_t checkSensors(void)
Definition: DS18B20.cpp:40
const uint8_t * getChannelAddress(uint8_t channel) const
Definition: DS18B20.cpp:152
uint8_t getChannel(const uint8_t *addr)
Definition: DS18B20.cpp:156
const String addr2String(const uint8_t *addr)
Definition: DS18B20.cpp:167
uint8_t readChannel(uint8_t channel, float *f, uint8_t tries=1)
Definition: DS18B20.cpp:115
uint8_t getNextFreeChannel(void)
Definition: DS18B20.cpp:136
uint8_t setAllAddrFromEEPROM(void)
Definition: DS18B20.cpp:81
uint8_t getNumberOfChannels(void)
Definition: DS18B20.cpp:176
const uint8_t * search(void)
Definition: DS18B20.cpp:30
uint8_t deleteChannel(const uint8_t *addr)
Definition: DS18B20.cpp:143
int setAllAddr(void)
Definition: DS18B20.cpp:89
void writeAddrToEEPROM(uint8_t channel)
Definition: DS18B20.cpp:106
uint8_t readAddrFromEEPROM(uint8_t channel)
Definition: DS18B20.cpp:66
uint8_t addSensor(const uint8_t *new_addr, uint8_t channel)
Definition: DS18B20.cpp:58
void t_conversion(void)
Definition: DS18B20.cpp:23