commit 2af0bac4893274b6fd52d0211fe165002c6f37bd Author: EoF Date: Fri Jan 24 00:11:35 2020 +0500 First commit diff --git a/TroykaDHT/README.md b/TroykaDHT/README.md new file mode 100644 index 0000000..3c848df --- /dev/null +++ b/TroykaDHT/README.md @@ -0,0 +1,11 @@ +TroykaDHT +========= + +Библиотека для Arduino, позволяющая считывать данные датчиков серии DHT, например [DHT11 (Troyka-модуль) ](http://amperka.ru/product/troyka-temperature-humidity-sensor-dht11), с помощью Arduino без необходимости задумываться о деталях протокола. + +Установка +========= + +В Arduino IDE выберите пункт меню «Скетч» → «Импортировать библиотеку» → +«Добавить библиотеку…». В появившемся окне выберите скачаный архив с +библиотекой. Установка завершена. diff --git a/TroykaDHT/examples/testDHT/testDHT.ino b/TroykaDHT/examples/testDHT/testDHT.ino new file mode 100644 index 0000000..b1828a1 --- /dev/null +++ b/TroykaDHT/examples/testDHT/testDHT.ino @@ -0,0 +1,53 @@ +// библиотека для работы с датчиками серии DHT +#include +// создаём объект класса DHT +// передаём номер пина к которому подключён датчик и тип датчика +// типы сенсоров: DHT11, DHT21, DHT22 +DHT dht(4, DHT11); + +void setup() +{ + // открываем последовательный порт для мониторинга действий в программе + Serial.begin(9600); + dht.begin(); +} + +void loop() +{ + // считывание данных с датчика + dht.read(); + // проверяем состояние данных + switch(dht.getState()) { + // всё OK + case DHT_OK: + // выводим показания влажности и температуры + Serial.print("Temperature = "); + Serial.print(dht.getTemperatureC()); + Serial.println(" C \t"); + Serial.print("Temperature = "); + Serial.print(dht.getTemperatureK()); + Serial.println(" K \t"); + Serial.print("Temperature = "); + Serial.print(dht.getTemperatureF()); + Serial.println(" F \t"); + Serial.print("Humidity = "); + Serial.print(dht.getHumidity()); + Serial.println(" %"); + break; + // ошибка контрольной суммы + case DHT_ERROR_CHECKSUM: + Serial.println("Checksum error"); + break; + // превышение времени ожидания + case DHT_ERROR_TIMEOUT: + Serial.println("Time out error"); + break; + // данных нет, датчик не реагирует или отсутствует + case DHT_ERROR_NO_REPLY: + Serial.println("Sensor not connected"); + break; + } + + // ждём две секунды + delay(2000); +} diff --git a/TroykaDHT/keywords.txt b/TroykaDHT/keywords.txt new file mode 100644 index 0000000..f513489 --- /dev/null +++ b/TroykaDHT/keywords.txt @@ -0,0 +1,33 @@ +####################################### +# Syntax Coloring Map TroykaDHT +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +DHT KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +begin KEYWORD2 +read KEYWORD2 +getState KEYWORD2 +getTemperatureC KEYWORD2 +getTemperatureK KEYWORD2 +getTemperatureF KEYWORD2 +getHumidity KEYWORD2 + +####################################### +# Constants (LITERAL1) +####################################### + +DHT_OK LITERAL1 +DHT_ERROR_CHECKSUM LITERAL1 +DHT_ERROR_TIMEOUT LITERAL1 +DHT_ERROR_NO_REPLY LITERAL1 +DHT11 LITERAL1 +DHT21 LITERAL1 +DHT22 LITERAL1 diff --git a/TroykaDHT/library.properties b/TroykaDHT/library.properties new file mode 100644 index 0000000..40b62b0 --- /dev/null +++ b/TroykaDHT/library.properties @@ -0,0 +1,9 @@ +name=TroykaDHT +version=1.0.0 +author=Igor Dementiev +maintainer=Amperka +sentence=Allows you to read the temperature and humidity from the DHT series sensors. +paragraph=The library allows to obtain data of relative humidity and temperature in degrees Celsius, Kelvin and Fahrenheit. Supported sensors: DH11, DHT21, DHT22. +category=Sensors +url=https://github.com/amperka/TroykaDHT +architectures=* diff --git a/TroykaDHT/src/TroykaDHT.cpp b/TroykaDHT/src/TroykaDHT.cpp new file mode 100644 index 0000000..9e111a3 --- /dev/null +++ b/TroykaDHT/src/TroykaDHT.cpp @@ -0,0 +1,112 @@ +/****************************************************************************/ +// Function: Cpp file for TroykaDHT +// Hardware: DHT11, DHT21, DHT22 +// Arduino IDE: Arduino-1.8.2 +// Author: Igor Dementiev +// Date: Feb 22,2018 +// Version: v1.0 +// by www.amperka.ru +/****************************************************************************/ + +#include "TroykaDHT.h" + +DHT::DHT(uint8_t pin, uint8_t type) { + _pin = pin; + _type = type; +} + +void DHT::begin() { +} + +int8_t DHT::read() { + // буффер данных + uint8_t data[5]; + // бит данных + uint8_t dataBit; + // контрольнная сумма + uint8_t checkSum; + // очистка буффера + for (int i = 0; i < 5; i++) + data[i] = 0; + // прижимаем шину к земле на 18 мс + pinMode(_pin, OUTPUT); + digitalWrite(_pin, LOW); + delay(18); + // отпускаем шину + pinMode(_pin, INPUT_PULLUP); + // проверяем реакцию датчика + // в течении 20-40 мкс датчик зажимает шину в 0 и держит 80 мкс + // потом отпускает на 80 мкс (формирует сигнал присутствия) + if (pulseInLength(_pin, HIGH, 40) == 0) { + _state = DHT_ERROR_NO_REPLY; + return _state; + } + + if (pulseInLength(_pin, LOW, 80) == 0) { + _state = DHT_ERROR_NO_REPLY; + return _state; + } + + if (pulseInLength(_pin, HIGH, 80) == 0) { + _state = DHT_ERROR_NO_REPLY; + return _state; + } + + // считываем 40 бит данных + // с одинаковым стартом — зажатием шины около 50 мкс и битом данных + // датчик «отпускает» шину на ~27мкс если хочет передать «0», или на ~70мкс если хочет передать «1» + for (int i = 0; i < 40; i++) { + pulseInLength(_pin, LOW, 50); + dataBit = pulseInLength(_pin, HIGH, 100); + if (dataBit) { + data[i / 8] <<= 1; + data[i / 8] += dataBit > 45 ? 1 : 0; + } else { + _state = DHT_ERROR_TIMEOUT; + return _state; + } + } + + // проверка контрольной суммы + checkSum = data[0] + data[1] + data[2] + data[3]; + // проверка контрольнной суммы + if (data[4] != checkSum) { + _state = DHT_ERROR_CHECKSUM; + return _state; + } + + // запись данных + switch (_type) { + case DHT11: + _humidity = data[0]; + _temperatureC = data[3] & 0x80 ? (data[2] + (1 - (data[3] & 0x7F) * 0.1)) * -1 : (data[2] + (data[3] & 0x7F) * 0.1); + _temperatureF = (_temperatureC * 9.0 / 5.0) + 32.0; + _temperatureK = _temperatureC + CELSIUS_TO_KELVIN; + break; + case DHT21: + _humidity = ((data[0] << 8) + data[1]) * 0.1; + _temperatureC = (((data[2] & 0x7F) << 8) + data[3]) * (data[2] & 0x80 ? -0.1 : 0.1); + _temperatureF = (_temperatureC * 9.0 / 5.0) + 32.0; + _temperatureK = _temperatureC + CELSIUS_TO_KELVIN; + break; + case DHT22: + _humidity = ((data[0] << 8) + data[1]) * 0.1; + _temperatureC = (((data[2] & 0x7F) << 8) + data[3]) * (data[2] & 0x80 ? -0.1 : 0.1); + _temperatureF = (_temperatureC * 9.0 / 5.0) + 32.0; + _temperatureK = _temperatureC + CELSIUS_TO_KELVIN; + break; + } + + _state = DHT_OK; + return _state; +} + +unsigned long DHT::pulseInLength(uint8_t pin, bool state, unsigned long timeout) { + unsigned long startMicros = micros(); + // ожидание окончания текущего пульса + while (digitalRead(pin) == state) { + if (micros() - startMicros > timeout) + return 0; + } + return micros() - startMicros; +} \ No newline at end of file diff --git a/TroykaDHT/src/TroykaDHT.h b/TroykaDHT/src/TroykaDHT.h new file mode 100644 index 0000000..d0cf5b4 --- /dev/null +++ b/TroykaDHT/src/TroykaDHT.h @@ -0,0 +1,48 @@ +/****************************************************************************/ +// Function: Header file for TroykaDHT +// Hardware: DHT11, DHT21, DHT22 +// Arduino IDE: Arduino-1.8.2 +// Author: Igor Dementiev +// Date: Feb 22,2018 +// Version: v1.0 +// by www.amperka.ru +/****************************************************************************/ + +#ifndef __TROYKA_DHT_H__ +#define __TROYKA_DHT_H__ + +#include + +#define DHT11 11 +#define DHT21 21 +#define DHT22 22 + +#define DHT_OK 0 +#define DHT_ERROR_CHECKSUM -1 +#define DHT_ERROR_TIMEOUT -2 +#define DHT_ERROR_NO_REPLY -3 + +#define CELSIUS_TO_KELVIN 273.15 + +class DHT +{ +public: + explicit DHT(uint8_t pin, uint8_t type); + void begin(); + int8_t read(); + int8_t getState() const { return _state; } + float getTemperatureC() const { return _temperatureC; } + float getTemperatureF() const { return _temperatureF; } + float getTemperatureK() const { return _temperatureK; } + float getHumidity() const { return _humidity; } +private: + unsigned long pulseInLength(uint8_t pin, bool state, unsigned long timeout = 1000000L); + uint8_t _pin; + int8_t _type; + int8_t _state; + float _temperatureC; + float _temperatureF; + float _temperatureK; + float _humidity; +}; +#endif // __TROYKA_DHT_H__ \ No newline at end of file diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..76f3b3f --- /dev/null +++ b/readme.txt @@ -0,0 +1 @@ +Информация по установке библиотек: http://www.arduino.cc/en/Guide/Libraries