Найти в Дзене
РАДИОканальчик

Ардуино Удаленное включение реле

Иногда возникает необходимость в удаленном включении чего-то.

Имея статический ip- адрес на домашнем роутере или используя такой сервис как No-ip и настроив ваш роутер на проброс портов, можно удаленно подключится к веб-страничке,на которой будет расположена кнопка включения или выключения. Так же можно выводить разные параметры...например температуру. Так же можно считать показания пульта (код включения) и посылать команду через ардуино к примеру на кондиционер. В общем вариант Вашего решения зависит только от Вашей фантазии и от задач.

Внутренний вид блока удаленного включения
Внутренний вид блока удаленного включения
Вид сбоку.
Вид сбоку.

Код программы:

//* ==============================

// ардуино web - сервер v 1.0

// ============================== */

#include <EtherCard.h>

#include <IRremote.h>

#include <OneWire.h>

#include <DallasTemperature.h>

#define BUF_SIZE 700

#define ONE_WIRE_BUS 7 // пин термодатчика

/* -----переменные */

//параметры сетевого подключения

const static byte mac[] = {0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A};

const static byte ip[] = {192, 168, 0, 10};

const static byte gateway[] = {192.168, 0, 1};

const static byte dns[] = {192, 168, 0, 1};

const static byte mask[] = {255, 255, 255, 0};

//параметры пинов ардуино

int pin[] = {1, 2, 3, 4, 5, 6};

boolean pinstatus[] = {false, false, false, false, false, false};

//буфер обмена

byte Ethernet::buffer[BUF_SIZE];

//форматированный текст

BufferFiller ftext;

//ИК

IRrecv irrecv(9); // указываем пин, к которому подключен приемник

decode_results results;// прием с ик

IRsend irsend; // указываем пин, к которому подключен передатчик (по умолчанию пин 3)

//термодатчик

OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensors(&oneWire);

int temperature;

//формирование страницы - "доступен"

const char page_ok[] PROGMEM =

"HTTP/1.0 200 OK\r\n"

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

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

const char http_Found[] PROGMEM =

"HTTP/1.0 302 Found\r\n"

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

//формирование страницы - "недоступен"

const char page_not[] PROGMEM =

"HTTP/1.0 401 Unauthorized\r\n"

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

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

/*=================== процедуры ===================

1 - initpin() - процедура инициализации пинов

2 - home_page() - процедура страницы веб-сервера

3 - on_pin() - процедура включение пинов

4 - initIR() - процедура инициализации ИК (прием)

5 - on_IR() - процедура управления по ИК

6 - read_IR() - процедура считывания с ДУ

7 - sendIR(team) - процедура передачи команд (передача)

===================================================*/

//=== 1 - процедура инициализации пинов ===

void initpin() {

//обычные выходы

for (int i = 0; i <= 4; i++) {

pinMode(pin[i], OUTPUT);

digitalWrite(pin[i], LOW);

}

//иверсионные выходы

digitalWrite(pin[5], HIGH);

pinMode(pin[5], OUTPUT);

digitalWrite(pin[5], HIGH);

pinstatus[5] = true;

}

//=== 2 - процедура страницы веб-сервера ===

void home_page() {

ftext.emit_p(PSTR("$F"

"<!DOCTYPE html>"

"<html>"

"<head>"

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

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

"<title>Home arduino server</title>"

"</head>"

"<body>"

"<h1>ARDUINO &copy</h1>"

//"<img src='https://robom.ru/static/img/head_img.jpg' />"

"<table border>"

"<tr>"

"<th>Кондиционер</th><th>Carrier</th> <th>Mitsubishi</th>"

"</tr>"

"<tr>"

"<td>Температура</td> <td>помещения</td><td> <font color=\"blue\">$D &deg;С</font> </td>"

"</tr>"

"<tr>"

"<td>Управление</td>"

"<td> <a href=\"?ArduinoPIN4=$F\">$F</a> </td>"

"<td> <a href=\"?ArduinoPIN6=$F\">$F</a> </td>"

"</tr>"

"</table>"

"</body>"

"</html>"

),page_ok,

temperature,

pinstatus[3] ? PSTR("off") : PSTR("on"),

pinstatus[3] ? PSTR("<font color=\"green\">ON</font>") : PSTR("<font color=\"red\">OFF</font>"),

pinstatus[5] ? PSTR("on") : PSTR("off"),

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

}

//=== 3 - включение пинов ардуино ===

void on_pin() {

for (int i = 0; i <= 5; i++) {

if (pinstatus[i] == true) {

digitalWrite(pin[i], HIGH);

}

else {

digitalWrite(pin[i], LOW);

}

}

}

//=== 4 - инициализация ИК приемника ===

void initIR() {

Serial.begin(9600);

irrecv.enableIRIn(); // запускаем прием с ик

}

//=== 5 - выполнение команд с ик датчика ===

void on_IR() {

if ( irrecv.decode( &results )) { // если данные пришли

switch ( results.value ) {

case 0xFFE817:

digitalWrite(4, HIGH);

break;

case 0xFFB24D:

digitalWrite(6, LOW);

break;

}

irrecv.resume(); // принимаем следующую команду

}

}

//=== 6 - считывание команд с пульта ДУ ===

void read_IR() {

if (irrecv.decode(&results)) {

Serial.println(results.value, HEX);

irrecv.resume();

}

}

//=== 7 -передача команды по ИК ===

//void send_IR(int team){

// switch (team) {

// case 1:

// irsend.sendNEC(0xB24DBF40,32);

// break;

// case 2:

// irsend.sendNEC(0xB24D7B84,32);

// break;

// }

//delay(250);

//}

//главная процедура инициализации

void setup() {

initpin(); //инициализация пинов ардуино

if (ether.begin(sizeof Ethernet::buffer, mac, 10) != 0) { //инициализация сетевого интерфейса

ether.staticSetup(ip, gateway, dns, mask); //статические сетевые параметры интерфейса

initIR(); //инициализация ИК приемника

sensors.begin(); //инициализация термодатчика

}

}

//main

void loop() {

sensors.requestTemperatures(); // Send the command to get temperatures

temperature = floor(sensors.getTempCByIndex(0));

//Serial.println(temperature);

delay(10);//прерывание

word len = ether.packetReceive(); //проверка ethernet пакетов

word pos = ether.packetLoop(len); //проверка наличия tsp пакетов

read_IR();//монитор порта

//on_IR();//включение пинов по ИК

if (pos > 0) {

ftext = ether.tcpOffset();

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

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

ftext.emit_p(page_not);

}

else

{

data += 5;

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

home_page(); //если обнаружено изменения на станице, запускаем функцию.

}

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

pinstatus[3] = true;

ftext.emit_p(http_Found);

}

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

pinstatus[3] = false;

ftext.emit_p(http_Found);

}

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

pinstatus[5] = false;

ftext.emit_p(http_Found);

}

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

pinstatus[5] = true;

ftext.emit_p(http_Found);

}

}

on_pin(); //включение пинов,если есть такие

pinstatus[5] = true;

// delay(50);

ether.httpServerReply(ftext.position());

}

}

Удачи в нашем хобби,друзья!