First commit

This commit is contained in:
EoF 2020-01-24 00:11:35 +05:00
commit 2af0bac489
7 changed files with 267 additions and 0 deletions

11
TroykaDHT/README.md Normal file
View File

@ -0,0 +1,11 @@
TroykaDHT
=========
Библиотека для Arduino, позволяющая считывать данные датчиков серии DHT, например [DHT11 (Troyka-модуль) ](http://amperka.ru/product/troyka-temperature-humidity-sensor-dht11), с помощью Arduino без необходимости задумываться о деталях протокола.
Установка
=========
В Arduino IDE выберите пункт меню «Скетч» → «Импортировать библиотеку» →
«Добавить библиотеку…». В появившемся окне выберите скачаный архив с
библиотекой. Установка завершена.

View File

@ -0,0 +1,53 @@
// библиотека для работы с датчиками серии DHT
#include <TroykaDHT.h>
// создаём объект класса 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);
}

33
TroykaDHT/keywords.txt Normal file
View File

@ -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

View File

@ -0,0 +1,9 @@
name=TroykaDHT
version=1.0.0
author=Igor Dementiev <igor@amperka.ru>
maintainer=Amperka <amperka.ru>
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=*

112
TroykaDHT/src/TroykaDHT.cpp Normal file
View File

@ -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;
}

48
TroykaDHT/src/TroykaDHT.h Normal file
View File

@ -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 <Arduino.h>
#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__

1
readme.txt Normal file
View File

@ -0,0 +1 @@
Информация по установке библиотек: http://www.arduino.cc/en/Guide/Libraries