Подключим датчик температуры и влажности к Orange Pi, напишем и скомпилируем фрагмент кода C, чтобы отобразить показания датчика.
Для этого проекта понадобится:
- Одноплатный компьютер Orange Pi
- датчик температуры и влажности DHT22 (также будет работать DHT11)
- Соединительные провода
Описание датчика
DHT22 (AM2302) представляет собой откалиброванный датчик влажности и температуры с цифровым выходом, для измерения используется емкостной датчик влажности и термистор, все показания передаются по цифровой информационной шине. Сверхмалый размер, низкое энергопотребление, дальность передачи сигнала до 20 метров. Сделало его лучшим выбором для всех видов приложений.
DHT22 имеет 3 вывода. Один предназначен для питания (VCC), другой — для выхода данных (DOUT), а третий — для заземления (GND).
Технические параметры
- Модель: DHT22
- Напряжение питания: 3.3 В … 5 В
- Выходной сигнал: цифровой
- Чувствительный элемент: полимерный конденсатор
- Диапазон измерения влажности: 0 … 100%, погрешность ±2%
- Диапазон измерения температуры: -40°С … +80°С, погрешность ±0.5°С
- Задержка: 2с
Принцип работы датчика
DHT22 (AM2302) использует упрощенную технологию единой шины для связи, в которой для обмена и управления данными в системе применяется только одна линия данных. В приложениях обычно требуется внешний подтягивающий резистор, около 5,1 кОм. Когда шина свободна, ее статус переключится на HIGH. SDA используется для передачи данных и синхронизации между микропроцессором и AM2302. Он принимает формат данных с одной шиной, 40 бит данных в одной передаче, старший бит первым. Соответствующая временная диаграмма показана ниже.
Название | Данные по одной шине и формат сигнала |
Start signal (Стартовый сигнал ) | Микропроцессор устанавливает SDA на LOW на период времени (не менее 800 мкс), чтобы информировать датчик для подготовки данных. |
Response signal (Ответный сигнал) | Датчик устанавливает SDA на LOW на 80 мкс, а затем на HIGH на 80 мкс, чтобы ответить на сигнал запуска. |
Data format (Формат данных) | После получения сигнала запуска датчик считывает строку данных (40 бит) через SDA, старший бит выводится сначала. |
Humidity (Влажность) | Разрешение по влажности 16 бит, старший бит первым; Значение, считываемое датчиком, в 10 раз превышает фактическую влажность. |
Temp. (Температура) | Разрешение по температуре составляет 16 бит, старший бит первый; Значение, считываемое датчиком, в 10 раз превышает фактическую температуру. Когда MSB (бит 15) равен «1», это указывает на отрицательную температуру; Когда MSB (бит 15) равен «0», это указывает на положительную температуру; Другие биты (бит 14 ~ бит 0) указывают на обнаруженное значение температуры. |
Parity bit (Бит четности) | Бит четности = влажность высокая + влажность низкая + температура высокая + температура низкая |
Сравнение датчиков DHT22 и DHT11
Датчик DHT11:
- определение влажности в диапозоне 20-80%
- определение температуры от 0°C до +50°C
- частота опроса 1 раз в секунду
Датчик DHT22:
- определение влажности в диапазоне 0-100%
- определение температуры от -40°C до +125°C
- частота опроса 1 раз в 2 секунды
Подключение к Orange Pi
Для подключения будем использовать контакты GPIO. Orange Pi имеет 40 контактов GPIO. Можно использовать контакты GPIO для связи и передачи питания на светодиоды, датчики, двигатели и даже другие микроконтроллеры, такие как Arduino. Расположение выводов для Orange Pi, более подробно описано здесь .
Прежде всего, отключим питание Orange Pi при подключении датчиков. С помощью соединительных проводов соединим следующие контакты (датчик с пи):
- DOUT к PIN 7 (GPCLK)
- GND к PIN 6 (GND)
- VCC к PIN 1 (VCC-3.3V)
Настроив аппаратное обеспечение, нам нужно настроить программную часть.
Код C для выводов GPIO
Для того, чтобы прочитать данные , переданные с помощью датчика надо написать программу C. Для этого нам нужно установить библиотеку C, которая поможет получить доступ к выводам GPIO. Для Orange Pi соответствующая библиотека называется WiringOP . Установим его, выполнив команду в домашней папке:
git clone https://github.com/zhaolei/WiringOP.git -b h3
Затем, следуя инструкциям на Github, запустим:
cd WiringOP
chmod +x ./build
sudo ./build
Можно подтвердить расположение выводов, выполнив команду, которая выведет макет таблицы GPIO:
gpio readall
Теперь можно написать и скомпилировать скрипт C, который считывает данные с датчика. Вернемся в домашнюю папку и откроем файл C с именем dht с помощью nano:
cd
nano dht.c
Затем, запишем в файл:
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#define MAX_TIMINGS 85
#define DHT_PIN 7
int data[5] = { 0, 0, 0, 0, 0 };
void read_dht_data()
{
uint8_t laststate = HIGH;
uint8_t counter = 0;
uint8_t j = 0, i;
data[0] = data[1] = data[2] = data[3] = data[4] = 0;
/* pull pin down for 18 milliseconds */
pinMode( DHT_PIN, OUTPUT );
digitalWrite( DHT_PIN, LOW );
delay( 18 );
/* prepare to read the pin */
pinMode( DHT_PIN, INPUT );
/* detect change and read data */
for ( i = 0; i < MAX_TIMINGS; i++ )
{
counter = 0;
while ( digitalRead( DHT_PIN ) == laststate )
{
counter++;
delayMicroseconds( 1 );
if ( counter == 255 )
{
break;
}
}
laststate = digitalRead( DHT_PIN );
if ( counter == 255 )
break;
/* ignore first 3 transitions */
if ( (i >= 4) && (i % 2 == 0) )
{
/* shove each bit into the storage bytes */
data[j / 8] <<= 1;
if ( counter > 16 )
data[j / 8] |= 1;
j++;
}
}
/*
* check we read 40 bits (8bit x 5 ) + verify checksum in the last byte
* print it out if data is good
*/
if ( (j >= 40) &&
(data[4] == ( (data[0] + data[1] + data[2] + data[3]) & 0xFF) ) )
{
float h = (float)((data[0] << 8) + data[1]) / 10;
if ( h > 100 )
{
h = data[0]; // for DHT11
}
float c = (float)(((data[2] & 0x7F) << 8) + data[3]) / 10;
if ( c > 125 )
{
c = data[2]; // for DHT11
}
if ( data[2] & 0x80 )
{
c = -c;
}
float f = c * 1.8f + 32;
printf( "Humidity = %.1f %% Temperature = %.1f *C (%.1f *F)\n", h, c, f );
}
else {
printf( "Data not good, skip\n" );
}
}
int main( void )
{
printf( "DHT22 temperature/humidity test\n" );
if ( wiringPiSetup() == -1 )
exit( 1 );
while ( 1 )
{
read_dht_data();
delay( 2000 ); /* wait 2 seconds before next read */
}
return(0);
}
Затем сохраним код с помощью Ctrl + O, закроем командой Ctrl + X и скомпилируем командой:
cc -Wall -o dht dht.c -lwiringPi
Чтобы выполнить, просто запустим:
sudo ./dht
Результат должен быть:
И готово, скрипт выводит влажность и температуру из DHT22!
заебала скачущая реклама
Исправили )
Компилить лучше так (см.ниже). Без последних библиотек выдает ошибку.
cc -Wall -o dht dht.c -lwiringPi -lwiringPiDev -pthread -lpthread