Привет ! Нашел готовое решение под свою электрику в доме . Но мне нужен функционал проще чем реализован в примере . Я пробовал сам урезать код, но уже 3 часа валятся ошибки. Смоделировал схему в tinkercad.
Убрать нужно ИК, интернет морду .
Вот сам код :
Убрать нужно ИК, интернет морду .
Вот сам код :
C++:
#include <Ethernet.h>
#include "IRremote.h"
IRrecv irrecv (7); // Указываем пин, к которому подключен ИК-приемник
decode_results результаты; // строка для ИК-приёма
// задаем константы
const int ledPin = 6; // номер выхода светодиода
const int buttonPin = 2; // номер входа, подключенный к кнопке
const int Relay1 = 5; // к 5-ому пину подключено реле IN1
// переменные
логическое lastButton = LOW; // Переменная для сохранения предыдущего состояния кнопки
логическое currentButton = LOW; // Переменная для сохранения текущего кнопки состояния
логическое ledOn = false; // Текущее состояние светодиода (включен / выключен)
логическое Relay1On = false; // Текущее состояние реле
Строка readString = String (30);
//являем переменную MY_IP со значением 10.36.1.52 - это IP-адрес назначаемый сетевому модулю Arduino
#define MY_IP "10.36.1.52"
// указываем настройки сетевого интерфейса и порт веб-сервера
// mac - это mac-адрес назначаемый сетевому модулю Arduino
byte mac [] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
// в IPAddress ещё раз указываем IP-адрес
IP-адрес ip (10, 36, 1, 52);
Сервер EthernetServer (80);
void setup () {
задержка (500);
// Запускаем прием с ИК
irrecv.enableIRIn ();
/ *
* без строки "digitalWrite (Relay1, LOW);" перед "pinMode" при включении
* ардуины будет происходить кратковременное переключение реле,
* а значит кратковременно подастся питание, что нам категорически
* не надо!
* /
digitalWrite (Relay1, LOW);
// инициализируем пин, подключенный к светодиоду, как выход
pinMode (ledPin, ВЫХОД);
// инициализируем пин, подключенный к кнопке, как вход
pinMode (buttonPin, ВВОД);
// инициализируем пин, подключенный к реле, как выход
pinMode (Relay1, ВЫХОД);
// стартуем сетевой интерфейс
Ethernet.begin (mac, ip);
server.begin ();
Serial.begin (9600);
Serial.print («сервер находится в»);
Serial.println (Ethernet.localIP ());
}
/ *
* функция сглаживания дребезга
* принимает в качестве кнопки аргумента предыдущее состояние
* и выдаёт фактическое.
* /
boolean debounce (boolean last) {
логическое значение current = digitalRead (buttonPin); // Считать состояние кнопки
if (last! = current) // Если изменилось ...
{
задержка (5); // ждём 5 мс
текущий = digitalRead (buttonPin); // Считываем состояние кнопки
обратный ток; // Возвращаем состояние кнопки
}
}
void loop () {
EthernetClient client = server.available ();
if (client) {
Serial.println («новый клиент»);
// логическое значение currentLineIsBlank = true;
while (client.connected ()) {
if (client.available ()) {
char c = client.read ();
// Serial.write (c);
if (readString.length () <30) {
readString.concat (с); }
Serial.print (c);
if (c == '\ n') {
// Проверяем включили ли реле и светодиод?
// Уровень = 1 - включен
// Уровень = 0 - выключен
if (readString.indexOf ("Level = 1")> = 0) {
// Включаем реле
digitalWrite (Relay1, HIGH);
Relay1On = true;
// Включаем светодиод
digitalWrite (ledPin, HIGH);
ledOn = true;
} else if (readString.indexOf ("Level = 0")> = 0) {
// Выключаем реле
digitalWrite (Relay1, LOW);
Relay1On = false;
// Выключаем светодиод
digitalWrite (ledPin, LOW);
ledOn = false;
}
client.println («HTTP / 1.1 200 ОК»);
client.println ("Content-Type: text / html");
client.println ("Соединение: закрыть"); // соединение будет закрыто после завершения ответа
//client.println("Refresh: 5 "); // обновляем страницу автоматически каждые 5 секунд
client.println ();
client.println ("<! DOCTYPE HTML>");
client.println ("<html>");
client.println ("<meta http-Equiv = 'Content-Type' content = 'text / html; charset = utf-8' />");
client.println ("<head> <meta http-Equiv = \" refresh \ "content = \" 5; URL = http: // "MY_IP" / \ "> </head>");
client.println (F ("<тело>"));
client.println (F ("<center> <head> <title> Relay Control </title> </head>"));
if (Relay1On) {
client.println ("<form method = get name = LED>");
client.println ("<input type = radio name = Level value = 1> Включить");
client.println ("<input type = radio name = Level value = 0 CHECKED> Выключить");
client.println ("<input type = submit value = Применить>");
client.println ("</form>");
client.println ("<font size = '5 ′> Состояние реле:");
client.println ("<font size = '5 ′> Вкл.");
client.println ("<br> </br>");
} else {
client.println ("<form method = get name = LED>");
client.println ("<input type = radio name = Level value = 1 CHECKED> Включить");
client.println ("<input type = radio name = Level value = 0> Выключить");
client.println ("<input type = submit value = Применить>");
client.println ("</form>");
client.println ("<font size = '5 ′> Состояние реле:");
client.println ("<font size = '5 ′> Выкл");
client.println ("<br> </br>");
}
//client.print(F("<input type = button value = 'Light ON' onmousedown = location.href = '/? Level = 1'> "));
//client.println(F("<input type = button value = 'Light OFF' onmousedown = location.href = '/? Level = 0'> <br/> <br/> "));
client.println ("<a href=\"/?Level=1\"\"> Включите свет </a> <br />");
client.println ("<a href=\"/?Level=0\"\"> Выключить свет </a> <br />");
client.println (F ("</center> </body>"));
client.println ("</html>");
readString = "";
// останавливаем веб-клиент
client.stop ();
}
}
}
}
// часть кода для кнопки, реле и светодиода
currentButton = debounce (lastButton);
if (lastButton == LOW & currentButton == HIGH) // Если гноди (условия для светода на пине 6)
{
ledOn =! ledOn;
}
if (lastButton == LOW& currentButton == HIGH) // Если разъемие (условие для реле)
{
Relay1On =! Relay1On;
}
lastButton = currentButton;
digitalWrite (ledPin, ledOn); // Изменить статус состояния светодиода
digitalWrite (Relay1, Relay1On); // Изменить статус состояния реле
// часть кода для ИК, реле и светодиода
if (irrecv.decode (& результаты)) {
int значение = results.value;
Serial.println (значение, HEX);
/ *
* мы знаем, что у цифры 2 значение сигнала 20DF48B7
* /
if (value == 0x48B7) // Если нажата кнопка "2"
{
ledOn =! ledOn;
Relay1On =! Relay1On;
}
irrecv.resume ();
}
}