Как я делал удаленное управление теплом в гараже.

Как я делал удаленное управление теплом в гараже. Гараж, Мастерская, Arduino, Удаленный доступ, Скетч, Длиннопост

Для обогрева своего гаража, я использую 2 "конвектора". Один конвектор включен постоянно на +5 градусов, для поддержания плюсовой температуры, второй "конвектор" включается по необходимости.


Раньше приходилось бегать, включать его, уходить домой, ждать час-два пока температура поднимется до комфортных +20, но это быстро надоело, одолела лень и я решил применить максимально бюджетный вариант удаленного включения на Arduino.


Что необходимо было купить:

Arduino nano: https://ru.aliexpress.com/item/Freeshipping-1PCS-Nano-3-0-co...

146 руб

Как я делал удаленное управление теплом в гараже. Гараж, Мастерская, Arduino, Удаленный доступ, Скетч, Длиннопост

Модуль ENC28J60: https://ru.aliexpress.com/item/2PCS-ENC28J60-Ethernet-LAN-Ne...

165 руб

Как я делал удаленное управление теплом в гараже. Гараж, Мастерская, Arduino, Удаленный доступ, Скетч, Длиннопост

Датчик температуры DHT22: https://ru.aliexpress.com/item/1pcs-DHT22-digital-temperatur...

151руб

Как я делал удаленное управление теплом в гараже. Гараж, Мастерская, Arduino, Удаленный доступ, Скетч, Длиннопост

Реле: https://ru.aliexpress.com/item/5PCS-LOY-1-Channel-5V-Relay-M...

40руб

Как я делал удаленное управление теплом в гараже. Гараж, Мастерская, Arduino, Удаленный доступ, Скетч, Длиннопост

Коротко о подключении всего этого барахла.


Модуль ENC28J60:

VCC к 5V

GND к GND

SCK к Pin 13

SO к Pin 12

ST к Pin 11

CS к Pin 10


Реле:

S к Pin 2

Vcc к 5V

GND к GND


Датчик температуры DHT22:

Vcc к 3.3V

GND к GND

DATA к Pin4

Как я делал удаленное управление теплом в гараже. Гараж, Мастерская, Arduino, Удаленный доступ, Скетч, Длиннопост

Здесь все понятно без схем, если не понятно, в интернете есть масса материала о том, как подключать эти модули. А вот готового скетча, я не нашел, да и искать было лень… Проще было найти скетч управления реле и скетч вывода данных с датчика, скрестить их и набросать страницу, чтоб ей было удобно управлять с телефона и обычного ПК.


Что из этого вышло:


#include "DHT.h"

#include <EEPROM.h>

#define DHTPIN 4

#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);

#include <EtherCard.h>

static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; // MAC Address должен быть уникальным в локальной сети

static byte myip[] = { 192,168,1,222 }; // Постоянный IP адресс нашей страницы

byte Ethernet::buffer[1000];

BufferFiller bfill;

// Начальные данные

int LedPins[] = {

2,3,5,6,7,8,9};

int t=0;

int h=0;

boolean PinStatus[7];

const char http_OK[] PROGMEM =

"HTTP/1.0 200 OK\r\n"

"Content-Type: text/html\r\n"

"Pragma: no-cache\r\n\r\n"

"\r\n"

"<meta charset='UTF-8'>"

"<meta name='viewport' content='width=device-width, initial-scale=1.0'>"

"<meta http-equiv='refresh' content='10'/>";

const char http_Found[] PROGMEM =

"HTTP/1.0 302 Found\r\n"

"Location: /\r\n\r\n";

const char http_Unauthorized[] PROGMEM =

"HTTP/1.0 401 Unauthorized\r\n"

"Content-Type: text/html\r\n\r\n"

"<h1>401 Unauthorized</h1>";

// Подключаем Ethernet порт HR911105A и датчик DHT22

void setup () {

if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0)

Serial.println( "Failed to access Ethernet controller");

ether.staticSetup(myip);

for(int i = 0; i <= 7; i++)

{

pinMode(LedPins[i],OUTPUT);

PinStatus[i]=EEPROM.read(i);

digitalWrite(LedPins[i],PinStatus[i]);

}

dht.begin();

}

// Получаем данные от DHT22

static void ReadDHT22()

{

h = dht.readHumidity();

t = dht.readTemperature();

}

// Оформление Web страницы

static word homePage() {

bfill = ether.tcpOffset();

bfill.emit_p(PSTR("$F"

"<title>Гараж</title>"

"<p style=\"text-align: center;\"><br />Конвектор: <br> <span style=\"font-size: 4em;\"><a href=\"?ArduinoPIN2=$F\">$F</a></span>"),

http_OK,

PinStatus[0]?PSTR("off"):PSTR("on"),

PinStatus[0]?PSTR("<font color=\"green\"><b>ON</b></font>"):PSTR("<font color=\"red\">OFF</font>"));

bfill.emit_p(PSTR(

"<br><br>Температура: <br> <span style=\"font-size: 4em;\">$D C</span> <br /><br />Влажность:<br> <span style=\"font-size: 4em;\"> $D %</span></p>"),t, h);

return bfill.position();

}

void loop () {

delay(1); // Задержка

word len = ether.packetReceive();

word pos = ether.packetLoop(len);

if (pos) // check if valid tcp data is received

{

ReadDHT22();

bfill = ether.tcpOffset();

char *data = (char *) Ethernet::buffer + pos;

if (strncmp("GET /", data, 5) != 0) {

bfill.emit_p(http_Unauthorized);

}

else {

data += 5;

if (data[0] == ' ') {

homePage();

}

else if (strncmp("?ArduinoPIN2=on ", data, 16) == 0) {

PinStatus[0] = true;

digitalWrite(LedPins[0],PinStatus[0]);

EEPROM.write(0,PinStatus[0]); // записываем в ячейку EEPROM №0, текущее состояние LedPins[0].

bfill.emit_p(http_Found);

}

else if (strncmp("?ArduinoPIN2=off ", data, 17) == 0) {

PinStatus[0] = false;

digitalWrite(LedPins[0],PinStatus[0]);

EEPROM.write(0,PinStatus[0]);

bfill.emit_p(http_Found);

}

else {

// Page not found

bfill.emit_p(http_Unauthorized);

}

}

ether.httpServerReply(bfill.position()); // send http response

}

}


Коротко о данном скетче:

В память ардуины (EEPROM) сохраняется информация о последнем положении кнопки реле, перебои со светом нам не страшны, положение кнопки всегда отражает реальное состояние реле, не будет такого, что на странице выводится OFF а на самом деле ON.


Далее подключаю сборку к локалке, для питания использую старую зарядку от мобильного телефона.


Вызываю страницу по IP адресу, который мы задали в начале скетча: http://192.168.1.222


Получаю страницу с данными:

Как я делал удаленное управление теплом в гараже. Гараж, Мастерская, Arduino, Удаленный доступ, Скетч, Длиннопост

Всё открывается, данные с датчика верные, реле на нажатие кнопки реагирует, положение запоминает.


Далее нужен корпус. Можно заколхозить из какого-нибудь пластикового контейнера, или заказать на али типовой пластиковый корпус для подобного барахла, или купить распределительную коробку в электротоварах, но мне лень выходить из дома, поэтому, я по-быстрому накидал в солиде уродца и распечатал его на 3D принтере.

Как я делал удаленное управление теплом в гараже. Гараж, Мастерская, Arduino, Удаленный доступ, Скетч, Длиннопост
Как я делал удаленное управление теплом в гараже. Гараж, Мастерская, Arduino, Удаленный доступ, Скетч, Длиннопост
Как я делал удаленное управление теплом в гараже. Гараж, Мастерская, Arduino, Удаленный доступ, Скетч, Длиннопост

Собрал все в корпус, закрепил модули термоклеем.

Как я делал удаленное управление теплом в гараже. Гараж, Мастерская, Arduino, Удаленный доступ, Скетч, Длиннопост

Установил крышку, держится и без шурупов, можно было и не предусматривать отверстия под них.

Как я делал удаленное управление теплом в гараже. Гараж, Мастерская, Arduino, Удаленный доступ, Скетч, Длиннопост

Когда моделировал корпус, особо головой не думал, по этому реле почему-то сделал по середине… Лучше было его разместить с краю. Ну да ладно, и так сойдет…

Как я делал удаленное управление теплом в гараже. Гараж, Мастерская, Arduino, Удаленный доступ, Скетч, Длиннопост

Притащил все в гараж, подключил, проверил. Вывел двойную розетку т.к. одинарной под руками не было.

Как я делал удаленное управление теплом в гараже. Гараж, Мастерская, Arduino, Удаленный доступ, Скетч, Длиннопост

Вывел датчик DHT22 примерно на среднюю высоту стены, т.к. конвекторы сильно греют потолок, а пол помещения долго остается прохладным.


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

Провел интернет в гараж. Купил недорогую направленную Wi-Fi антенну, поставил её на карниз пока вот так, летом если дойдут руки и не будет лень сделаю нормальный кронштейн.

Как я делал удаленное управление теплом в гараже. Гараж, Мастерская, Arduino, Удаленный доступ, Скетч, Длиннопост

В гараже установил обычную точку доступа и настроил её как адаптер. Поймал сигнал от направленной антенны, которая без труда пробила стену гаража, поставил небольшой коммутатор и подключил к нему нашу систему.


Теперь гараж с домом у нас в одной сети и самое время настроить виртуальный сервер на домашнем роутере.


Прописываем порт который мы открываем например 7777, прописываем IP нашей системы 192.168.1.222, прописываем порт по которому будет доступна наша страница, для доступа из браузера порт 80.

Как я делал удаленное управление теплом в гараже. Гараж, Мастерская, Arduino, Удаленный доступ, Скетч, Длиннопост

При наличии статического IP адреса от провайдера, наша система теперь доступна откуда угодно по адресу http://нашip:порт


Если провайдер не предоставляет статический IP, можно сделать и другими способами, но для этого потребуется всегда включенный ПК в доме.


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

Как я делал удаленное управление теплом в гараже. Гараж, Мастерская, Arduino, Удаленный доступ, Скетч, Длиннопост

Не знаю, как на андроиде, а на айфоне можно вывести закладку на экран, она будет доступна как приложение, тем самым мы имеем быстрый доступ к нашей системе без лишних телодвижений и рытья в закладках.

Как я делал удаленное управление теплом в гараже. Гараж, Мастерская, Arduino, Удаленный доступ, Скетч, Длиннопост

Далее в планах сделать автоматическую вытяжку при большой влажности или задымленности. Задымленность появляется, когда работаешь фрезером или, когда работает лазерный станок.


Спасибо за внимание. Если есть вопросы, готов ответить )

Arduino & Pi

1.4K постов20.6K подписчика

Добавить пост

Правила сообщества

В нашем сообществе запрещается:

• Добавлять посты не относящиеся к тематике сообщества, либо не несущие какой-либо полезной нагрузки (флуд)

• Задавать очевидные вопросы в виде постов, не воспользовавшись перед этим поиском

• Выкладывать код прямо в посте - используйте для этого сервисы ideone.com, gist.github.com или схожие ресурсы (pastebin запрещен)

• Рассуждать на темы политики

• Нарушать установленные правила Пикабу

Вы смотрите срез комментариев. Показать все
245
Автор поста оценил этот комментарий
Нет, спасибо, я лучше померзну)
раскрыть ветку (30)
28
Автор поста оценил этот комментарий

вешай стальной лист, будет холодно - пройдешься паяльной лампой.

раскрыть ветку (10)
81
Автор поста оценил этот комментарий
надо было просто купить ебаный удлиннитель и протянуть его от гаража к дому
раскрыть ветку (9)
23
Автор поста оценил этот комментарий
А ты хорош
7
Автор поста оценил этот комментарий
Истинно бюджетный и истинно простой способ)
раскрыть ветку (2)
13
Автор поста оценил этот комментарий

Самый простой, выключатель, а автор не ищет легких путей))

Иллюстрация к комментарию
раскрыть ветку (1)
6
Автор поста оценил этот комментарий

потому что в буханке 2 бака на случай зомбиапокалипсиса.

1
Автор поста оценил этот комментарий

ебаный, а потом пизженый провод потом где искать ?

раскрыть ветку (4)
1
Автор поста оценил этот комментарий
Лол, покажи мне тех, кто пиздит провода от удлинителей))) много ты с него наваришься, ага)
Тем более, как я понял, речь идет о частном доме
раскрыть ветку (3)
5
Автор поста оценил этот комментарий

я бы спиздил. люблю провода )))

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

С языка сорвал, стервец

2
Автор поста оценил этот комментарий

Знаешь, кроме шуток: Есть у меня друг, из окна квартиры вытаскиваЛ удлинитель до своей машины, чтоб включать электро котел перед работой (холодно на улице, до -35, машина дизельная). Ну че, потом кабель начали регулярно резать, он упорно, или упорото вешал его вновь. Не знаю, занимается ли он сейчас этим, но мы даже сигнализацию на кабель придумывали, чтоб при перегрызании провода звенел звонок и можно было бежать бить ебало.

37
Автор поста оценил этот комментарий

Сорри, что под топовым, чтобы не пропало.

@Zaibatsu, касаемо статического IP - открой для себя сервисы динамических DNS. Вроде noip.com. Но только учти, что без авторизации на хост сможет кто-угодно зайти и рулить твоей печкой.

Даже с авторизацией, ардуинко легко заддосят боты, которые сканируют HTTP. Поэтому лучше напрямую порт не открывать в инет, а на роутере поднять на альтернативной прошивке (OpenWRT и т.п.) nginx в качестве reverse proxy и с него уже проксировать запросы на ардуинку. Плюс можно сделать блэклисты и rate limit, дабы боты не грузили.


PS: А еще можно было без кабелей и лишнего роутера сделать на ESP8266 - сразу по WiFi подключаться.

раскрыть ветку (18)
76
Автор поста оценил этот комментарий

Прочитал вслух, открылся портал

раскрыть ветку (4)
2
Автор поста оценил этот комментарий

Закрылся только через 15 дней.

6
Автор поста оценил этот комментарий

Ты просто далек от веб разработки...

раскрыть ветку (1)
59
DELETED
Автор поста оценил этот комментарий
так веб-портал и открылся)
3
Автор поста оценил этот комментарий

Зачем вам тогда пост из технического сообщества? В игнор добавьте его и всё.

3
Автор поста оценил этот комментарий

Про noip.com в курсе, у меня сервер дома с сайтом, статический адрес сделан был по этой причине. О безопасности и защите страницы, я думаю и думаю как лучше сделать, так, чтоб самому не напряжно было её постоянно обходить. А вообще, я думаю мало кому интересно спецом узнавать мой домашний IP ) Потом сканировать все порты... ) Для чего? )

раскрыть ветку (9)
16
Автор поста оценил этот комментарий

Никто спецом узнавать не будет. В сети тонна ботов, которые постоянно сканируют "весь Интернет" потихоньку. Стоит только поднять HTTP сервер на "белом" IP - по-любому в течение 24ч увидишь не одну попытку туда залезть от ботов. На нестандартном порту - вопрос лишь времени.

PS: Про безопасность - nginx на роутере с простыми правилами. Скажем запросы my.domain/[AF84124DA123] (некий ключ) пропускать на Arduino, все остальные запросы просто игнорировать. В телефоне достаточно просто будет ярлык/закладку на полный URL сохранить с "ключиком" и всё. Думаю этого достаточно, чтобы отсеять ботов. Ну плюс там же при входе по правильному URL с ключиком еще пароль можно запрашивать (HTTP Auth).

раскрыть ветку (2)
3
Автор поста оценил этот комментарий

Спасибо, попробую реализовать!

Автор поста оценил этот комментарий
😖
Автор поста оценил этот комментарий
Можно через URL параметры передавать токен.
Автор поста оценил этот комментарий

vpn

раскрыть ветку (4)
1
Автор поста оценил этот комментарий

Не то. Как я понял задачу - надо иметь возможность быстро с любого места подключиться. А не поднимать VPN туннель каждый раз, когда это понадобится. Парольная авторизация и некая обфускация (сокрытие) в данном случае вполне достаточно и главное просто к использованию.

раскрыть ветку (3)
Автор поста оценил этот комментарий

И зачем каждый раз тунель поднимать? Один раз поднять сервер, настроить роуты, профит. В любой нужный момент, на телефоне впн включаешь, вбиваешь локальный ип этой приблуды и готово.

раскрыть ветку (2)
1
Автор поста оценил этот комментарий

А завтра телефона под рукой нет и надо с компа рабочего зайти скажем или еще откуда. Я ж говорю - нет универсальности, способ не гибкий, поэтому в данном случае не подходит.

раскрыть ветку (1)
Автор поста оценил этот комментарий
Мозг у вас не гибкий. Впн настраивается штаьными средствами за минуту - две на любом устройстве.
Автор поста оценил этот комментарий
Самый простой варинт — реле от Sonoff на ESP8266. Но я не помню нагрузку, на которую он рассчитан.
Автор поста оценил этот комментарий

Многие провайдеры используют NAT))) да-да с ipv4 напряг))))

раскрыть ветку (1)
Автор поста оценил этот комментарий

Это да. Но ТС написал, что у него даже статика уже докуплена. Если за NAT - надо или покупать белый у провайдера или можно какой-нибудь недорогой VDS купить (я знаю места, где продают за 1-3 доллара-евро в год) с IPv4 и повесить там (VPN поднять и форвардить порты можно). Иногда с провайдером за NAT, особенно если он небольшой, можно договорится о форварде группы портов, слышал некоторые такое бесплатно делают.

Ну и еще хитрожопые варианты для "обхода" NAT - STUN и т.п. Но это имхо ненадежное решение.

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку