Форум программистов, компьютерный форум, киберфорум
popryduhin
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Температура и влажность (Вывод информации с arduino на ПК)

Запись от popryduhin размещена 19.11.2016 в 14:32
Показов 10156 Комментарии 3

Температура и влажность (Вывод информации с arduino на ПК)

Меня всегда интересовала тема передачи информации с ПК на периферийные устройства и обратно.
И наконец тема слегка коснулась меня. Далее встал вопрос, с какой стороны все таки подступить?

На этот вопрос помогла ответить - Arduino

До этого я некогда не имел дел с контроллерами в плане программирования.

Проект достаточно прост, я не буду особо сопровождать код комментариями , разделим на две составляющих
  1. Аппаратная чать (Arduino и ПК)
  2. Программная часть

Нажмите на изображение для увеличения
Название: 1.jpg
Просмотров: 600
Размер:	233.6 Кб
ID:	4027

Для проекта понадобится:
  1. Arduino
  2. Датчик температуры и влажности "DHT11" или аналогичный
  3. USB Кабель
  4. Три провода для соединения датчика к Arduino
  5. Пк

Настроим аппаратную часть: у датчика DHT11 существует три вывода
S - Для считывания цифровой информации (в нашем случае pin 8)
+ - Питание 5 вольт
GND

Настроим программную часть:

Зальем на Arduino
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <SimpleDHT.h>
 
// for DHT11, 
//      VCC: 5V or 3V
//      GND: GND
//      DATA: 2
int pinDHT11 = 8;
int n = 0;
SimpleDHT11 dht11;
 
void setup() {
  Serial.begin(9600);
}
 
void loop() {
  
  // read without samples.
  byte temperature = 0;
  byte humidity = 0;
  if (dht11.read(pinDHT11, &temperature, &humidity, NULL)) {
    Serial.print("Read DHT11 failed.");
    return;
  }
 
  Serial.print("<TEMPERARURE="+String(temperature)+">"); 
  Serial.print(" <HUMEDYTY="+String(humidity)+">");
  delay(300);
 
}


Теги TEMPERARURE и HUMEDYTY служат для интерпретации в программе приемнике.

Программная часть Delphi:

Скачаем библиотеку для проекта
На счет самой библиотеки, вы можете использовать любые други библиотеки, компоненты, модули для работы с com портом, наверное найдутся люди которые осудят работу данной библиотеки

Тело программы на Delphi
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
{
                            Версия среды разработки
     Embarcadero® Delphi 10 Seattle Version 23.0.21418.4207
     Copyright © 2015 Embarcadero Technologies, Inc. All Rights Reserved.
}
 
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, Vcl.ComCtrls,
  Vcl.Menus;
 
const
   READ_COM_STR = WM_USER + 4242;
 
type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    Label1: TLabel;
    Label2: TLabel;
    procedure N6Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure InquiryPort(Sender: TObject); {опрос существующих портов}
  private
    FHandlCOM : THandle;
    FCOMPortList : TStringList;
    { Private declarations }
  public
    { Public declarations }
    function GetParam(str, param1, param2 : string): string;
 
   // ключевой метод чтения сообщений с com порта
    procedure ReadCOMStr(var msg : TMessage); message READ_COM_STR;
  end;
 
var
  Form1: TForm1;
 
implementation
 
uses Unit2;
        // Устанавливаем наш com port
        Procedure SetComPort(comPort : string); stdcall; external 'comReadSend.dll';
        // Открываем порт
        Function COMOpen : boolean; stdcall; External 'comReadSend.dll';
        function COMClose : boolean; stdcall; External 'comReadSend.dll';
        // Инициализация com порта (InicializeCOMPort обязательно выполнить до вызова всех остальных методов)
        // В качестве параметра передаем Handle окна, это сделано для
        // того что бы событие возникающее в dll передавала сообщение
        // по средствам PostMessage нашей программе
        Procedure InicializeCOMPort(var hwnd: THandle); stdcall; External 'comReadSend.dll';
        procedure DestroyCOMport; stdcall;  External 'comReadSend.dll';
        function GetOpened : boolean; stdcall; External 'comReadSend.dll';
        /// Запись строки в com port
        function WriteComStr( str : string) : integer; stdcall; External 'comReadSend.dll';
        function DSRState : boolean; stdcall; External 'comReadSend.dll';
        Function RLSDState : boolean; stdcall; External 'comReadSend.dll';
 
{$R *.dfm}
 
procedure TForm1.InquiryPort(Sender: TObject);
var
  i: integer;
begin {опрос существующих портов}
 
  for i := 0 to 31 do {цикл опроса}
  begin {пробуем получить дескриптор порта}
    FHandlCOM := CreateFile(PChar('\\.\COM' + IntToStr(i + 1)),
      GENERIC_READ or GENERIC_WRITE,
      0,
      nil,
      OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
    if FHandlCOM <> INVALID_HANDLE_VALUE then {если порт есть то добавить в список}
      Unit2.Form2.ComboBox1.Items.Add('COM' + IntToStr(i + 1));
    CloseHandle(FHandlCOM); {закрыть дескриптор}
  end;
end;
 
procedure TForm1.N2Click(Sender: TObject);
var
  h:Thandle;
begin
  h := Handle;
  InicializeCOMPort(h);
  SetComPort(Unit2.Form2.ComboBox1.Items.Strings[Unit2.Form2.ComboBox1.ItemIndex]);
  COMOpen;
end;
 
procedure TForm1.N6Click(Sender: TObject);
begin
  Form2.Show;
end;
 
procedure TForm1.ReadCOMStr(var msg: TMessage);
var
  str : string;
begin
   str := stringreplace(PCHar(msg.LParam),#10#13,'',[rfReplaceAll]);
 
   if length(str) > 0 then
   begin
       Form1.Label1.Caption := 'Температура: '+GetParam(str, '<TEMPERATURE= ', '>')+' Cº';
       Form1.Label2.Caption := 'Влажность: '+GetParam(str, '<HUMEDYTY=', '>')+' %';
   end;
end;
 
function TForm1.GetParam(str, param1, param2: string): string;
var
  c           // количество символов
   : integer;
begin
  c := Length(str);
  result := Copy(str,Pos(param1,str)+Length(param1),c);
  Result := Copy(result,0,Pos(param2,result)-1);
end;
end.


Небольшая демонстрация
Кликните здесь для просмотра всего текста


Нажмите на изображение для увеличения
Название: 2016-11-19_140915.png
Просмотров: 420
Размер:	6.7 Кб
ID:	4028

Нажмите на изображение для увеличения
Название: 2016-11-19_140929.png
Просмотров: 583
Размер:	6.7 Кб
ID:	4029


Скачать сам проект
Размещено в Arduino и Delphi
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 3
Комментарии
  1. Старый комментарий
    Аватар для SatanaXIII
    Спасибо за лаконичность.
    Запись от SatanaXIII размещена 21.11.2016 в 14:13 SatanaXIII вне форума
  2. Старый комментарий
    Спасибо за тему! Интересно посмотреть было. А вот теперь вопрос по улучшению проекта:
    Постоянный вывод целесообразен на экран, подключенный к Arduino, но постоянно посылать информацию на com-порт мне не кажется излишне. Вместо этого предлагаю доработать void loop(), добавив в него прослушивание com-порта, идет ли на него запрос, а уже на запрос (если он правильный) отправлять запрашиваемый параметр (в вашем случае температура или влажность). Мне кажется это правильнее будет или я все таки заблуждаюсь?
    (PS. Ваше мнение на мой комментарий интересно мне. Т.к. сам заказал себе Arduino и скоро хотелось подобный проект реализовать и там как раз постоянное обновление нужно в момент включения этапа замера на программе компьютера, во все остальные этапы работы программы они не нужны)
    Запись от mustimur размещена 25.11.2016 в 10:26 mustimur вне форума
  3. Старый комментарий
    А вот теперь вопрос по улучшению проекта:
    Постоянный вывод целесообразен на экран, подключенный к Arduino, но постоянно посылать информацию на com-порт мне не кажется излишне. Вместо этого предлагаю доработать void loop(), добавив в него прослушивание com-порта, идет ли на него запрос, а уже на запрос (если он правильный) отправлять запрашиваемый параметр (в вашем случае температура или влажность). Мне кажется это правильнее будет или я все таки заблуждаюсь?
    Я думаю вы правы. Постоянный вывод информации целесообразен на led.
    Есть в Arduino функция serialEvent()
    Автоматически вызываетcя при поступлении новых данных.
    Есть один проект у меня.
    В нем как раз подобная идея.
    Идея ЧПУ станка.
    Я посылаю в Serial c компьютера: G0 1000 2000 500
    serialEvent() интерпретирует команду, раскладывает так сказать по полочкам

    comand = G0
    fX = 1000
    fY = 2000
    fZ = 500


    как только данные распознаны, разрешаю выполнять в loop с помощью флага "все что мне нужно"
    тем самым экономим лишние такты микросхемы.

    На проект можно взглянуть
    Запись от popryduhin размещена 25.11.2016 в 12:48 popryduhin вне форума
 
Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru