Иногда возникает необходимость в удаленном включении чего-то.
Имея статический 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 ©</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 °С</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());
}
}
Удачи в нашем хобби,друзья!