First commit
This commit is contained in:
commit
2af0bac489
11
TroykaDHT/README.md
Normal file
11
TroykaDHT/README.md
Normal file
@ -0,0 +1,11 @@
|
||||
TroykaDHT
|
||||
=========
|
||||
|
||||
Библиотека для Arduino, позволяющая считывать данные датчиков серии DHT, например [DHT11 (Troyka-модуль) ](http://amperka.ru/product/troyka-temperature-humidity-sensor-dht11), с помощью Arduino без необходимости задумываться о деталях протокола.
|
||||
|
||||
Установка
|
||||
=========
|
||||
|
||||
В Arduino IDE выберите пункт меню «Скетч» → «Импортировать библиотеку» →
|
||||
«Добавить библиотеку…». В появившемся окне выберите скачаный архив с
|
||||
библиотекой. Установка завершена.
|
53
TroykaDHT/examples/testDHT/testDHT.ino
Normal file
53
TroykaDHT/examples/testDHT/testDHT.ino
Normal 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
33
TroykaDHT/keywords.txt
Normal 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
|
9
TroykaDHT/library.properties
Normal file
9
TroykaDHT/library.properties
Normal 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
112
TroykaDHT/src/TroykaDHT.cpp
Normal 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
48
TroykaDHT/src/TroykaDHT.h
Normal 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
1
readme.txt
Normal file
@ -0,0 +1 @@
|
||||
Информация по установке библиотек: http://www.arduino.cc/en/Guide/Libraries
|
Loading…
Reference in New Issue
Block a user