Created
June 11, 2018 08:55
-
-
Save ma2shita/2cc3ade811f42406c6f51f9d62a35fa3 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* TemperatureAndHumidity Class for DHT11 ==== */ | |
class TemperatureAndHumidity | |
{ | |
public: | |
TemperatureAndHumidity(int pin); | |
bool Read(float* temperature, float* humidity); | |
private: | |
int _pin; | |
void DHT11Init(int pin); | |
void DHT11Start(int pin); | |
byte DHT11ReadByte(int pin); | |
void DHT11Finish(int pin); | |
bool DHT11Check(const byte* data, int dataSize); | |
}; | |
void TemperatureAndHumidity::DHT11Init(int pin) | |
{ | |
digitalWrite(pin, HIGH); | |
pinMode(pin, OUTPUT); | |
} | |
void TemperatureAndHumidity::DHT11Start(int pin) | |
{ | |
digitalWrite(pin, LOW); | |
delay(18); | |
pinMode(pin, INPUT); | |
while (!digitalRead(pin)) ; | |
while (digitalRead(pin)) ; | |
while (!digitalRead(pin)) ; | |
} | |
byte TemperatureAndHumidity::DHT11ReadByte(int pin) | |
{ | |
byte data = 0; | |
for (int i = 0; i < 8; i++) { | |
while (digitalRead(pin)) ; | |
while (!digitalRead(pin)) ; | |
unsigned long start = micros(); | |
while (digitalRead(pin)) ; | |
unsigned long finish = micros(); | |
if ((unsigned long)(finish - start) > 50) data |= 1 << (7 - i); | |
} | |
return data; | |
} | |
void TemperatureAndHumidity::DHT11Finish(int pin) | |
{ | |
while (!digitalRead(pin)) ; | |
digitalWrite(pin, HIGH); | |
pinMode(pin, OUTPUT); | |
} | |
bool TemperatureAndHumidity::DHT11Check(const byte* data, int dataSize) | |
{ | |
if (dataSize != 5) return false; | |
byte sum = 0; | |
for (int i = 0; i < dataSize - 1; i++) sum += data[i]; | |
return data[dataSize - 1] == sum; | |
} | |
TemperatureAndHumidity::TemperatureAndHumidity(int pin) | |
{ | |
_pin = pin; | |
DHT11Init(_pin); | |
} | |
bool TemperatureAndHumidity::Read(float* temperature, float* humidity) | |
{ | |
byte data[5]; | |
DHT11Start(_pin); | |
for (int i = 0; i < 5; i++) data[i] = DHT11ReadByte(_pin); | |
DHT11Finish(_pin); | |
if(!DHT11Check(data, sizeof (data))) return false; | |
if (data[1] >= 10) return false; | |
if (data[3] >= 10) return false; | |
*humidity = (float)data[0] + (float)data[1] / 10.0f; | |
*temperature = (float)data[2] + (float)data[3] / 10.0f; | |
return true; | |
} | |
/* TemperatureAndHumidity Class for DHT11 ==== END */ | |
#include <WioLTEforArduino.h> | |
WioLTE Wio; | |
TemperatureAndHumidity* t_d38; | |
TemperatureAndHumidity* t_a4; | |
void setup() | |
{ | |
Wio.Init(); | |
Wio.PowerSupplyGrove(true); | |
t_d38 = new TemperatureAndHumidity(WIOLTE_D38); | |
t_a4 = new TemperatureAndHumidity(WIOLTE_A4); | |
} | |
void loop() | |
{ | |
float temp_d38, humi_d38; | |
if (!t_d38->Read(&temp_d38, &humi_d38)) { | |
SerialUSB.println("ERROR!"); | |
goto err; | |
} | |
SerialUSB.print("Current humidity D38 = "); | |
SerialUSB.print(humi_d38); | |
SerialUSB.print("% "); | |
SerialUSB.print("temperature = "); | |
SerialUSB.print(temp_d38); | |
SerialUSB.println("C"); | |
float temp_a4, humi_a4; | |
if (!t_a4->Read(&temp_a4, &humi_a4)) { | |
SerialUSB.println("ERROR!"); | |
goto err; | |
} | |
SerialUSB.print("Current humidity A4 = "); | |
SerialUSB.print(humi_a4); | |
SerialUSB.print("% "); | |
SerialUSB.print("temperature = "); | |
SerialUSB.print(temp_a4); | |
SerialUSB.println("C"); | |
err: | |
delay(2000); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment