Эксклюзив C# Дистанционная система мониторинга климатических условий

Статус
В этой теме нельзя размещать новые ответы.

hnnssy

Известный
Автор темы
Друг
2,684
2,744
Итак, доброго времени суток, дамы и господа, которым так же как и мне нехуй нечего делать, а руки чешутся.

Сегодня бы соберём примитивную и, что самое главное, копеечную систему дистанционного мониторинга климатических условий в нашем УМНОМ доме.
На самом деле мне заставили это сделать для участия в конференции в университете, но мне понравилось.

Необходимое:
- микропроцессорное устройство;
- модуль передачи данных (в нашем случае Wi-Fi);
- датчики этих самых климатических условий (покажу на примере температуры и влажности, других нет);
- сервер;
- прямые руки (на самом деле нет, ибо все нужные коды и инструкции будут ниже).

Общая схема:

7308a5sgf9kmdojmf5zm3o0uy.jpg


Бороздя поздним вечерком по просторам интернета в компании бутылочки хмельного, я примерно подобрал нужные комплектующие: МПУ - Arduino* UNO, Wi-Fi модуль - ESP8266, датчик температуры/влажности - DHT11-MOD (модульный). В качестве сервера будет выступать хостинг с SQL базой данных и PHP-скриптом, который будет принимать данные от нашей системы мониторинга и вносить их в БД. Данные будут отправляться в виде GET-запросов.

* Arduino — торговая марка аппаратно-программных средств для построения простых систем автоматики и робототехники, программная часть которых состоит из бесплатной программной оболочки (IDE) для написания программ, их компиляции и программирования аппаратуры. Аппаратная часть представляет собой набор смонтированных печатных плат. Полностью открытая архитектура системы позволяет свободно копировать или дополнять линейку продукции Arduino.
Arduino может использоваться как для создания автономных объектов автоматики, так и подключаться к программному обеспечению на компьютере через стандартные проводные и беспроводные интерфейсы.


Но потом меня постигло разочарование, когда я увидел, что ESP8266 работает от 3.3 Вольт, в то время как Arduino UNO работает на 5В-логике. Да, на борту присутствует 3.3-вольтовый выход, но его рабочий ток до 40 мА, а наш Wi-Fi передатчик в пике потребляет до 200 мА. Поэтому для работы понадобился бы ещё понижающий преобразователь, что автоматически повышает себестоимость системы, а дешевизна - один из важнейших факторов, тем более собираем бы "копеечную" систему, как я говорил выше.
И тут я увидел его - чудо - аналог Arduino UNO, но с интегрированным Wi-Fi-передатчиком ESP8266, и имя сему чуду - Wemos D1.

3892ad6b-3324-4790-bddf-0197ed6ca8f8.jpg


Можно было, конечно, взять его мини версию, но вдруг нам вздумается доработать нашу систему, подключив ещё несколько датчиков.
Датчик температуры/влажности менять не стал, он нам вполне подходит:

295137511_w200_h200_arduinodht11pr__1391361047.jpg


Характеристики DHT11-MOD:
- диапазон температур: 0-50 С (мы ведь в нашей уютной комнатке будем температуру мерить, зачем нам шире диапазон, верно?);
- диапазон влажности: 20-90%;
- питание: 3.5-5 В.

Итак, после того как мы сгоняли на радиорынок и приобрели все комплектующие (не забудьте про соединительные провода, их нужно всего 3, зачастую они идут в комплекте с DHT11, но там типа МАМА-МАМА, а нам нужны 3 провода ПАПА-МАМА). Я зачем-то взял набора проводов 20 и 30см, в каждом по 40 штук, не знаю зачем.

Подключение:
Распиновка у DHT11-MOD примитивная, 1-ый контакт - земля (GND), 2-ой - данные (DATA), 3-ий - питание (VCC).
1-ый контакт датчика соединяем проводом с землёй на нашей плате МПУ, 2-ой - с любым цифровым выходом на плате (я подключил к 4), 3-ий - к 5В.

lv9wv1ouvplf0vie9imwg7w3w.jpg


Подготовка ПК к прошивке:
Прежде всего необходимо установить среду разработки для Arduino, скачать которую с их официального сайта.
Arduino - Software(https://www.arduino.cc/en/Main/Software)

После установки запускаем нашу IDE, переходим в Файл - Настройки и в поле "Дополнительные ссылки для менеджера плат" вставляем следующую ссылку:
Код:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
Нажимаем ОК.
Далее идём в Инструменты - Плата - Менеджер плат, в поиске вбиваем Wemos и устанавливаем то, что там предложит среда (esp8266 by ESP8266 Community).
Так же загружаем библиотеку для работы с DHT11 - http://zelectro.cc/Content/Uploads/Common/libraries/dht11.zip
Её необходимо распаковать и добавить в папку "libraries" в папке с Arduino IDE.
После установки перезапускаем среду.

Подключение платы:
Думаю у всех дома найдётся лишний MicroUSB провод (обязательно с возможностью передачи данных, очевидно), который нам понадобится для подключения платы к ПК. Подключаем, при первом подключении Windows установит нужные драйвера. Если системе не удаётся распознать наш девайс (сбой запроса дескриптора устройства), то смените шнур, мне помогло. Подключили? Окей.

Прошивка:
В IDE заходим в Настройки - Плата и выбираем там Wemos, в моём случае это Wemos D1 R1, у вас может быть ревизия поновее (впрочем я вообще сомневаюсь, что кто-то читает это, а тем более собирает систему по гайду), то выбираете Wemos D1 R2 & mini.
Далее Настройки - Порт и выбираем порт, к которому подключена плата.

В окно редактора вставляем демонстрационный скетч, который заставит светодиод мигать с интервалом 1с:
Код:
void setup() {
  pinMode(BUILTIN_LED, OUTPUT); 
}

void loop() {
  digitalWrite(BUILTIN_LED, HIGH); // включаем
  delay(1000);
  digitalWrite(BUILTIN_LED, LOW); // выключаем
  delay(1000);
}
Нажимаем на иконку загрузки, если возникла ошибка, то либо неверно указан порт, либо указана не та плата, выше упоминал про ревизию.

Если всё заработало, переходим уже к кодингу главной прошивки. Вставляем в IDE код:
C++:
#include <ESP8266WiFi.h>
#include <dht11.h>

dht11 DHT;
#define DHT11_PIN 4

const char* ssid     = "connect-me"; // имя Wi-Fi сети
const char* password = "12345432"; // пароль Wi-Fi сети
const char* host = "oursmarthouse.esy.es"; // адрес нашего сервера

void setup() {
  Serial.begin(115200); // частота "общения"
  delay(10);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password); // начинаем подключение
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }

  Serial.println("WiFi connected"); 
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP()); // выводим наш локальный IP адрес платы
}

void loop() {
  delay(10000); // задержка между загрузками данных на сервер

  int chk;
  chk = DHT.read(DHT11_PIN); // опрос датчика влажности и температуры
  Serial.print("Humidity = ");
  Serial.print(DHT.humidity, 1); // выводим в монитор порта влажность
  Serial.print(", Temp = ");
  Serial.println(DHT.temperature,1); // выводим в монитор порта температуру
  delay(1000);

  WiFiClient client;
  const int httpPort = 80; // задаём 80 порт - дефолт для сайтов
  if (!client.connect(host, httpPort)) { // проверяем успешность подключения
    Serial.println("connection failed");
    return;
  }
 
  String url = "/house.php?"; // начинаем создавать GET-запрос
  url += "temp=";
  url += DHT.temperature;
  url += "&";
  url += "hum=";
  url += DHT.humidity; 
  Serial.print("Requesting URL: ");
  Serial.println(url); // выводим полученную ссылку запроса
 
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n"); // отправляем запрос
              
  unsigned long timeout = millis(); // таймаут
  while (client.available() == 0) {
    if (millis() - timeout > 5000) {
      Serial.println(">>> Client Timeout !");
      client.stop();
      return;
    }
  }
}

Клиентская часть готова, приступаем к подготовке серверной.

Серверная часть:
Хочу напомнить, что в веб-части я полный нуб.
Для работы нам нужен хостинг, подойдёт даже бесплатный, например от hostinger.com
Регистрируем, создаём на нём базу данных, в которой делаем таблицу из 3-х полей:
temp
hum
date
Подключаемся по FTP к хостингу и создаём там php файл "house.php" со следующим содержимым:

PHP:
<?php
$DataBase = new mysqli('localhost', 'login', 'password', 'base_name'); // подключаемся к БД,
$DataBase -> query("SET NAMES 'cp1251'");
$DataBase -> query("SET CHARACTER SET 'cp1251'");

if(isset($_GET['temp'])) // если в запросе фигурирует temp
{
  $Add_Info = $DataBase -> query(sprintf("INSERT INTO `house` (`temp`, `hum`, `date`) VALUES(%d, %d, '%s')", intval($_GET['temp']), intval($_GET['hum']), date('H:i:s Y-m-d') )); // то записываем данные в нашу базу, а именно влажность, температуру и время запроса
}

if(isset($_GET['check'])) // если в запросе фигурирует check, то отображаем нашу таблицу с данными
{
$Get_Info = $DataBase -> query("SELECT * FROM `house` ORDER BY date DESC"); // сортировка по дате запроса от нового к старому
    {
    echo '<center><table border = "1">';
    echo iconv('UTF-8', 'Windows-1251','<tr align="center"><td>ТЕМПЕРАТУРА</td>');
    echo iconv('UTF-8', 'Windows-1251','<td>ВЛАЖНОСТЬ</td>');
    echo iconv('UTF-8', 'Windows-1251','<td>ДАТА И ВРЕМЯ</td>');
    while($Get_Info2 = $Get_Info->fetch_array())
        {
        echo '<tr align="center"><td>'.$Get_Info2['temp'].'</td>';
        echo '<td>'.$Get_Info2['hum'].'</td>';
        echo '<td>'.$Get_Info2['date'].'</td>';
        }
    echo "</table></center>";
    }
}
$DataBase -> close(); // закрываем БД

?>

Конечный запуск:
На этом наша работа окончена, всё, что осталось сделать - скомпилировать и загрузить наш скетч.
Открываем монитор порта и наблюдаем за происходящим.
Если всё получилось, то при переходе по ссылке oursmarthouse.esy.es/house.php?check мы будем лицезреть примерно следующее:

vm37gt4fj7bouwvmtq61asmnv.png


Осталось лишь адекватно оформить, если вам не лень и если вы вообще это читаете.
Задавайте ответы, получайте вопросы в комментариях.
 

hnnssy

Известный
Автор темы
Друг
2,684
2,744
Еще надо написать апи и припоять к луа скрипту!
я думал уже оверлей накинуть и играя в самп смотреть температуру, но это уже 2-ая стадия долбоебизма, я пока на 1-ой
 

#Rin

Известный
Всефорумный модератор
1,214
1,035
А при чем тут C#, если это Arduino Wiring (Типо C/C++)?
 

ShuffleBoy

Известный
Друг
754
429
Я понял твою идею, уже заказал реле, ардуино и wifi. Сделаю себе умный чайник, с управлением на imgui:monkey:
 
  • Нравится
Реакции: Vintik

Vovich

HOT
Проверенный
717
196
Ардуинки вещь конечно хорошая, но мой препод сказал что все это говно, и нужно потом выпаивать нормальную микросхему.
Ну а это, ну типа поиграться, протестить.
Хотя видел довольно хорошие проекты реализованы на ардуино, вплоть до роботов.
Но все что я смог сделать это блять разные режимы для светодиодной ленты в машину)00)0)
 
Статус
В этой теме нельзя размещать новые ответы.