Skip to content

Instantly share code, notes, and snippets.

@ma2shita
Created June 11, 2018 08:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ma2shita/2cc3ade811f42406c6f51f9d62a35fa3 to your computer and use it in GitHub Desktop.
Save ma2shita/2cc3ade811f42406c6f51f9d62a35fa3 to your computer and use it in GitHub Desktop.
/* 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