Датчик температуры и влажности DHT22 + freepascal

Планы, идеология, архитектура и т.п.

Модератор: Модераторы

Датчик температуры и влажности DHT22 + freepascal

Сообщение ssm78 » 02.11.2021 12:41:06

Коллеги, день добрый.

Понадобилась поддержка датчика влажности и температуры DHT22 для моего самогонного аппарата, работающего под управлением Raspberry PI.
Но, к сожалению, готового примера на паскале я так и не нашел. В интернетах нашел только на С. Портировал. Берите, вдруг кому нужно.

Код: Выделить всё
unit DHT22U;

interface

uses
  wiringpi;

function ReadDHT22Data(Pin             : Integer;
                       var Temperature : Real;
                       var Humidity    : Real) : Boolean;

implementation

function ReadDHT22Data(Pin             : Integer;
                       var Temperature : Real;
                       var Humidity    : Real) : Boolean;
const
MAX_TIMINGS = 85;

var
initResult : longint;
data       : array [0 ..4] of Integer;
counter    : Integer;
lastState  : Integer;
i,j        : Integer;

begin
result      := False;
Temperature := 0;
Humidity    := 0;

for i := 0 to 4 do
begin
  data[i] := 0;
end;

j := 0;

initResult := wiringPiSetup();

if (initResult <> -1) then
begin
  lastState := HIGH;

  // pull pin down for 20 milliseconds

  pinMode(Pin,OUTPUT);
  digitalWrite(Pin,HIGH);
  delay(500);
  digitalWrite(Pin,LOW);
  delay(20);

  // prepare to read the pin

  pinMode(Pin,INPUT);

  // detect change and read data

  for i := 0 to MAX_TIMINGS - 1 do
  begin
   counter := 0;

   while (digitalRead(Pin) = laststate) do
   begin
    Inc(counter);

    delayMicroseconds(2);

    if (counter = 255) then
    begin
     Break;
    end;
   end;

   laststate := digitalRead(Pin);

   if (counter = 255) then
   begin
    Break;
   end;

   // ignore first 3 transitions

   if ((i >= 4) and (i mod 2 = 0)) then
   begin
    // shove each bit into the storage bytes

    data[j div 8] := data[j div 8] shl 1;

    if (counter > 16) then
    begin
     data[j div 8] := data[j div 8] or 1;
    end;

    Inc(j);
   end;
  end;

  // check we read 40 bits (8bit x 5) + verify checksum in the last byte

  if ((j >= 40) and
      (data[4] = ((data[0] + data[1] + data[2] + data[3]) and $FF))) then
  begin
   Humidity    := ((data[0] * 256) + data[1]) / 10;
   Temperature := (((data[2] and $7F) * 256) + data[3]) / 10;

   if ((data[2] and $80) <> 0) then
   begin
    Temperature := -Temperature;
   end;

   result := True
  end;
end;
end;

end.
ssm78
новенький
 
Сообщения: 13
Зарегистрирован: 02.11.2021 12:32:50

Re: Датчик температуры и влажности DHT22 + freepascal

Сообщение ssm78 » 28.01.2022 18:57:51

В догонку.

Код гарантированно рабочий.
Протестирован на платах Raspberry pi 3 и Raspberry pi 4
ssm78
новенький
 
Сообщения: 13
Зарегистрирован: 02.11.2021 12:32:50

Re: Датчик температуры и влажности DHT22 + freepascal

Сообщение Seenkao » 30.01.2022 19:17:53

Надо было в "разработки на нашем сайте" кидать. )))
Но таких вещей я ещё не встречал. Но думаю полезно эксплуатировать FPC для повседневных нужд. )))
Seenkao
энтузиаст
 
Сообщения: 526
Зарегистрирован: 01.04.2020 03:37:12

Re: Датчик температуры и влажности DHT22 + freepascal

Сообщение ssm78 » 02.02.2022 17:53:19

Да, возможно раздел форума был выбран неверно. Если админы могут перенести, то буду признателен.

Про самогонный аппарат это была, конечно, шутка.

Код написан в рамках любительского проекта по созданию блока для управления функциями умной теплицы.

В основе проекта использована плата Raspberry PI.
Плата управляет блоком реле, с помощью которого подается напряжение на несколько розеток.

Возможны следующие режимы:

- управление освещением (включить в одно время, выключить в другое)
- управление поливом (включить в определенное время, подержать напряжение в течении определенного промежутка)
- управление отоплением (меряем температуру, включаем отопитель при достижении минимального порога)

На текущий момент в разработке мобильное приложение под андроид для упрощения процедуры настройки блока и просмотра параметров его работы.

Управляющий софт для платы написан на free pascal. Мобильное приложение пишется на Delphi XE 10.

Кому интересно, приложил фотографию блока.
Вложения
20211128_193125.jpg
20211128_193058.jpg
ssm78
новенький
 
Сообщения: 13
Зарегистрирован: 02.11.2021 12:32:50

Re: Датчик температуры и влажности DHT22 + freepascal

Сообщение ssm78 » 25.02.2022 13:20:04

Добавлена поддержка oled дисплея SSD1305 (128x32, 2.23") для вывода параметров работы аппарата.
Во вложении пример кода для работы с дисплеем.
Вложения
oled.zip
(7.63 КБ) Скачиваний: 622
20220220_175839.jpg
ssm78
новенький
 
Сообщения: 13
Зарегистрирован: 02.11.2021 12:32:50

Re: Датчик температуры и влажности DHT22 + freepascal

Сообщение ssm78 » 14.03.2022 17:18:37

Коллеги, день добрый.

Доработан пример работы с дисплеем.

Немного оптипимизирован код. Исправлена ошибка, присутствовавшая в оригинальном коде на С от производителя.
Добавлена возможность вращения выводимых данных, т.е. программной установки положения точки с координатами 0,0.
Может быть удобно для выведения параметров работы устройства при различном положении платы.
Кому интересно, можете пользоваться.
Вложения
oled.ZIP
(7.78 КБ) Скачиваний: 627
ssm78
новенький
 
Сообщения: 13
Зарегистрирован: 02.11.2021 12:32:50


Вернуться в Разработки на нашем сайте

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

Рейтинг@Mail.ru