destroyedlolo
7 years ago
1 changed files with 112 additions and 0 deletions
@ -0,0 +1,112 @@ |
|||||||
|
/* Emulates a DS18B20 using a DHT22
|
||||||
|
*
|
||||||
|
* Provided by Destroyedlolo. (http://destroyedlolo.info)
|
||||||
|
* |
||||||
|
* 23/03/2018 - First version |
||||||
|
*/ |
||||||
|
|
||||||
|
#include <Arduino.h> |
||||||
|
#include <LowLevel.h> |
||||||
|
#include <OneWireSlave.h> |
||||||
|
|
||||||
|
Pin oneWireData(2); // Where the 1-wire bus is connected to
|
||||||
|
|
||||||
|
const byte owROM[7] = { 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 }; |
||||||
|
|
||||||
|
enum OW_Cmd { |
||||||
|
START_CONVERSION = 0x44, |
||||||
|
READ_SCRATCHPAD = 0xBE |
||||||
|
}; |
||||||
|
|
||||||
|
volatile byte scratchpad[9]; |
||||||
|
|
||||||
|
/*
|
||||||
|
* DHT22 related |
||||||
|
*/ |
||||||
|
#include <SimpleDHT.h> // https://github.com/winlinvip/SimpleDHT |
||||||
|
|
||||||
|
SimpleDHT22 DHT; |
||||||
|
#define pinDHT 3 |
||||||
|
|
||||||
|
/*
|
||||||
|
* Let's go |
||||||
|
*/ |
||||||
|
#define DEBUG // Comment out to be silence
|
||||||
|
|
||||||
|
enum DeviceState { |
||||||
|
WAIT4RESET, |
||||||
|
WAIT4COMMAND, |
||||||
|
CONVERTING, |
||||||
|
TEMPERATUREREADY |
||||||
|
}; |
||||||
|
|
||||||
|
volatile DeviceState state = DeviceState::WAIT4RESET; |
||||||
|
|
||||||
|
void owRcv( OneWireSlave::ReceiveEvent evt, byte cmd ){ |
||||||
|
switch( evt ){ |
||||||
|
case OneWireSlave::RE_Reset: |
||||||
|
state = DeviceState::WAIT4COMMAND; |
||||||
|
break; |
||||||
|
case OneWireSlave::RE_Error: |
||||||
|
state = DeviceState::WAIT4RESET; |
||||||
|
break; |
||||||
|
case OneWireSlave::RE_Byte: |
||||||
|
switch( cmd ){ |
||||||
|
case OW_Cmd::START_CONVERSION: |
||||||
|
state = DeviceState::CONVERTING; |
||||||
|
OWSlave.beginWriteBit(0, true); // send zeros as long as the conversion is not finished
|
||||||
|
break; |
||||||
|
case OW_Cmd::READ_SCRATCHPAD: |
||||||
|
state = DeviceState::WAIT4RESET; |
||||||
|
OWSlave.beginWrite((const byte*)scratchpad, 9, 0); |
||||||
|
break; |
||||||
|
#ifdef DEBUG |
||||||
|
default: |
||||||
|
Serial.print(F("Unknown command :")); |
||||||
|
Serial.println( cmd, HEX ); |
||||||
|
#endif |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void setTemperature( float temp ){ // Write given temperature to the scratchpad
|
||||||
|
int16_t raw = (int16_t)(temp * 16.0f + 0.5f); |
||||||
|
|
||||||
|
scratchpad[0] = (byte)raw; |
||||||
|
scratchpad[1] = (byte)(raw >> 8); |
||||||
|
scratchpad[8] = OWSlave.crc8((const byte*)scratchpad, 8); |
||||||
|
} |
||||||
|
|
||||||
|
void setup(){ |
||||||
|
Serial.begin(115200); // debugging
|
||||||
|
|
||||||
|
for(int i = 2; i<8; i++) |
||||||
|
scratchpad[i] = 0; |
||||||
|
setTemperature( 85 ); |
||||||
|
|
||||||
|
OWSlave.setReceiveCallback(&owRcv); |
||||||
|
OWSlave.begin(owROM, oneWireData.getPinNumber()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
void loop(){ |
||||||
|
delay(10); |
||||||
|
|
||||||
|
if(state == DeviceState::CONVERTING){ // start conversion
|
||||||
|
float temperature = 0; |
||||||
|
float humidite = 0; |
||||||
|
int err; |
||||||
|
|
||||||
|
if((err = DHT.read2(pinDHT, &temperature, &humidite, NULL)) != SimpleDHTErrSuccess){ |
||||||
|
#ifdef DEBUG |
||||||
|
Serial.print("\nError while reading, err="); |
||||||
|
Serial.println(err); |
||||||
|
#endif |
||||||
|
temperature = 85; |
||||||
|
} else { |
||||||
|
setTemperature( temperature ); |
||||||
|
state = DeviceState::TEMPERATUREREADY; |
||||||
|
OWSlave.beginWriteBit(1, true); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue