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