From d7dfe910ffa0e0fd8e56fc6ef6d69e404a0f5c77 Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 3 Jun 2017 11:40:09 +0800 Subject: [PATCH] Define errors in SimpleDHT --- SimpleDHT.cpp | 69 ++++++++++--------- SimpleDHT.h | 40 ++++++----- examples/DHT11Default/DHT11Default.ino | 4 +- .../DHT11WithRawBits/DHT11WithRawBits.ino | 4 +- .../TwoSensorsDefault/TwoSensorsDefault.ino | 9 +-- 5 files changed, 66 insertions(+), 60 deletions(-) diff --git a/SimpleDHT.cpp b/SimpleDHT.cpp index fa24ae0..8ca3ec0 100644 --- a/SimpleDHT.cpp +++ b/SimpleDHT.cpp @@ -24,40 +24,13 @@ SOFTWARE. #include "SimpleDHT.h" -int SimpleDHT11::ErrSuccess = 0; -int SimpleDHT11::ErrStartLow = 100; -int SimpleDHT11::ErrStartHigh = 101; -int SimpleDHT11::ErrDataLow = 102; -int SimpleDHT11::ErrDataRead = 103; -int SimpleDHT11::ErrDataEOF = 104; -int SimpleDHT11::ErrDataChecksum = 105; - -int SimpleDHT11::confirm(int pin, int us, byte level) { - // wait one more count to ensure. - int cnt = us / 10 + 1; - - bool ok = false; - for (int i = 0; i < cnt; i++) { - if (digitalRead(pin) != level) { - ok = true; - break; - } - delayMicroseconds(10); - } - - if (!ok) { - return -1; - } - return ErrSuccess; -} - -byte SimpleDHT11::bits2byte(byte data[8]) { - byte v = 0; - for (int i = 0; i < 8; i++) { - v += data[i] << (7 - i); - } - return v; -} +int SimpleDHT::ErrSuccess = 0; +int SimpleDHT::ErrStartLow = 100; +int SimpleDHT::ErrStartHigh = 101; +int SimpleDHT::ErrDataLow = 102; +int SimpleDHT::ErrDataRead = 103; +int SimpleDHT::ErrDataEOF = 104; +int SimpleDHT::ErrDataChecksum = 105; int SimpleDHT11::sample(int pin, byte data[40]) { // empty output data. @@ -120,6 +93,33 @@ int SimpleDHT11::sample(int pin, byte data[40]) { return ErrSuccess; } +int SimpleDHT11::confirm(int pin, int us, byte level) { + // wait one more count to ensure. + int cnt = us / 10 + 1; + + bool ok = false; + for (int i = 0; i < cnt; i++) { + if (digitalRead(pin) != level) { + ok = true; + break; + } + delayMicroseconds(10); + } + + if (!ok) { + return -1; + } + return ErrSuccess; +} + +byte SimpleDHT11::bits2byte(byte data[8]) { + byte v = 0; + for (int i = 0; i < 8; i++) { + v += data[i] << (7 - i); + } + return v; +} + int SimpleDHT11::parse(byte data[40], byte* ptemperature, byte* phumidity) { byte humidity = bits2byte(data); byte humidity2 = bits2byte(data + 8); @@ -161,3 +161,4 @@ int SimpleDHT11::read(int pin, byte* ptemperature, byte* phumidity, byte pdata[4 return ret; } + diff --git a/SimpleDHT.h b/SimpleDHT.h index 02a9b6a..3d0f564 100644 --- a/SimpleDHT.h +++ b/SimpleDHT.h @@ -27,6 +27,25 @@ #include +class SimpleDHT { +public: + // Success. + static int ErrSuccess; + // Error to wait for start low signal. + static int ErrStartLow; + // Error to wait for start high signal. + static int ErrStartHigh; + // Error to wait for data start low signal. + static int ErrDataLow; + // Error to wait for data read signal. + static int ErrDataRead; + // Error to wait for data EOF signal. + static int ErrDataEOF; + // Error to validate the checksum. + static int ErrDataChecksum; +}; + + /* Simple DHT11 @@ -43,22 +62,7 @@ https://cdn-shop.adafruit.com/datasheets/DHT11-chinese.pdf */ -class SimpleDHT11 { -public: - // Success. - static int ErrSuccess; - // Error to wait for start low signal. - static int ErrStartLow; - // Error to wait for start high signal. - static int ErrStartHigh; - // Error to wait for data start low signal. - static int ErrDataLow; - // Error to wait for data read signal. - static int ErrDataRead; - // Error to wait for data EOF signal. - static int ErrDataEOF; - // Error to validate the checksum. - static int ErrDataChecksum; +class SimpleDHT11 : public SimpleDHT { public: // to read from dht11. // @param pin the DHT11 pin. @@ -68,7 +72,7 @@ class SimpleDHT11 { // @remark the min delay for this method is 1s. // @return SimpleDHT11::ErrSuccess is success; otherwise, failed. int read(int pin, byte* ptemperature, byte* phumidity, byte pdata[40]); -private: +protected: // confirm the OUTPUT is level in us, // for example, when DHT11 start sample, it will // 1. PULL LOW 80us, call confirm(pin, 80, LOW) @@ -86,7 +90,7 @@ class SimpleDHT11 { // @param data a byte[40] to read bits to 5bytes. // @return 0 success; otherwise, error. // @remark please use simple_dht11_read(). - int sample(int pin, byte data[40]); + virtual int sample(int pin, byte data[40]); // parse the 40bits data to temperature and humidity. // @remark please use simple_dht11_read(). int parse(byte data[40], byte* ptemperature, byte* phumidity); diff --git a/examples/DHT11Default/DHT11Default.ino b/examples/DHT11Default/DHT11Default.ino index 122646d..b409f05 100644 --- a/examples/DHT11Default/DHT11Default.ino +++ b/examples/DHT11Default/DHT11Default.ino @@ -19,8 +19,8 @@ void loop() { // read without samples. byte temperature = 0; byte humidity = 0; - int err = SimpleDHT11::ErrSuccess; - if ((err = dht11.read(pinDHT11, &temperature, &humidity, NULL)) != SimpleDHT11::ErrSuccess) { + int err = SimpleDHT::ErrSuccess; + if ((err = dht11.read(pinDHT11, &temperature, &humidity, NULL)) != SimpleDHT::ErrSuccess) { Serial.print("Read DHT11 failed, err="); Serial.print(err); return; } diff --git a/examples/DHT11WithRawBits/DHT11WithRawBits.ino b/examples/DHT11WithRawBits/DHT11WithRawBits.ino index fd6ff05..3110f13 100644 --- a/examples/DHT11WithRawBits/DHT11WithRawBits.ino +++ b/examples/DHT11WithRawBits/DHT11WithRawBits.ino @@ -20,8 +20,8 @@ void loop() { byte temperature = 0; byte humidity = 0; byte data[40] = {0}; - int err = SimpleDHT11::ErrSuccess; - if ((err = dht11.read(pinDHT11, &temperature, &humidity, data)) != SimpleDHT11::ErrSuccess) { + int err = SimpleDHT::ErrSuccess; + if ((err = dht11.read(pinDHT11, &temperature, &humidity, data)) != SimpleDHT::ErrSuccess) { Serial.print("Read DHT11 failed, err="); Serial.print(err); return; } diff --git a/examples/TwoSensorsDefault/TwoSensorsDefault.ino b/examples/TwoSensorsDefault/TwoSensorsDefault.ino index 2d1e4be..d157104 100644 --- a/examples/TwoSensorsDefault/TwoSensorsDefault.ino +++ b/examples/TwoSensorsDefault/TwoSensorsDefault.ino @@ -25,8 +25,9 @@ void loop() { // read without samples. byte temperature = 0; byte humidity = 0; - if (dht11.read(dataPinSensor1, &temperature, &humidity, NULL)) { - Serial.print("Communication error with Sensor 1"); + int err = SimpleDHT::ErrSuccess; + if ((err = dht11.read(dataPinSensor1, &temperature, &humidity, NULL)) != SimpleDHT::ErrSuccess) { + Serial.print("Communication error with Sensor 1, err="); Serial.print(err); return; } @@ -46,8 +47,8 @@ void loop() { byte temperature2 = 0; byte humidity2 = 0; - if (dht11.read(dataPinSensor2, &temperature2, &humidity2, NULL)) { - Serial.print("Communication error with sensor 2"); + if ((err = dht11.read(dataPinSensor2, &temperature, &humidity, NULL)) != SimpleDHT::ErrSuccess) { + Serial.print("Communication error with Sensor 2, err="); Serial.print(err); return; }