Управление реле по ethernet при помощи arduino

Обновлено: 05.07.2024

Arduino - управление реле через веб интерефейс.

void loop()
EthernetClient client = server.available();
if (client)
// Проверяем подключен ли клиент к серверу
while (client.connected())
// Проверяем идет ли запрос к серверу
int dataCount = client.available();
if (dataCount > 0)
// Считываем данные передаваемые серверу с клиента (броузера)
for (int i = 0; i < dataCount; i++)
char ch = client.read();
// Если данные передаются, то они будут переданы POST запросом, который начинается с символа 'P'
if (i == 0 && ch != 'P')
break;
if (ch == '\n' && i < dataCount - 1)
// Находим строку, в которой содержатся передаваемые данные
char chNext = client.read();
// Формат строки r2=on&r3=on&r4=on (Пример если нужно включены 2,3,4 реле)
if (chNext == 'r')
// Выключаем все реле
pinState[0] = 0;
pinState[1] = 0;
pinState[2] = 0;
pinState[3] = 0;

// Считываем первый номер реле, который нужно включить
char relayNum = client.read();
pinState[relayNum-'0'] = 1;
Serial.write(relayNum);

// Считываем вспомогательную информацию (=on&)
relayNum = client.read();
relayNum = client.read();
relayNum = client.read();
relayNum = client.read();

// Пока есть данные об остальных реле, считываем и заносим в массив pinState
while (relayNum != -1)
relayNum = client.read();
relayNum = client.read();
pinState[relayNum-'0'] = 1;
Serial.write(relayNum);
relayNum = client.read();
relayNum = client.read();
relayNum = client.read();
relayNum = client.read();
>
> else
// Если не было передано данных, то выключаем все реле
pinState[0] = 0;
pinState[1] = 0;
pinState[2] = 0;
pinState[3] = 0;
>
>
>
>

// В соответствие с переданными данными включаем реле
for (int i = 0; i < 4; i++)
digitalWrite(pins[i], !pinState[i]);
>

Это руководство рассказывает, как при помощи платы Arduino и шилда Arduino Ethernet создать веб-сервер, управляющий реле, к которому подключена к лампе.

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

СОБЛЮДАЙТЕ ТЕХНИКУ БЕЗОПАСНОСТИ! При работе с проектами, использующими сетевое напряжение, вы должны действительно разбираться в том, что делаете. В противном случае можно получить удар электрическим током. Это очень серьезно, и я не хочу, чтобы работа над этим проектом принесла вред вашему здоровью. Если вы не на 100% уверены в том, что делаете, сделайте себе одолжение и ничего не трогайте. Попросите того, кто знает!

Примечание: Если вам не хочется иметь дело с сетевым напряжением, но вы по-прежнему хотите поработать над проектом, то реле-модуль можно заменить, к примеру, на светодиод. Для этого придется изменить код и схему, но эти изменения будут незначительными.

Шилд Arduino Ethernet Shield

Сначала подключите шилд к плате Arduino, а затем подсоедините его к сети при помощи кабеля RJ45. Ethernet-кабель, идущий от роутера к шилду Ethernet, должен быть подключен следующим образом:

Ethernet-Shield 1.jpg

Использование контактов

Когда шилд Ethernet подключен к плате Arduino, вы не можете использовать цифровые контакты 10, 11, 12 и 13, потому что они используются для коммуникации между платой и шилдом.

Ethernet-shield-pinout.jpg

Реле-модуль

Реле – это переключатель с электрическим приводом. Это значит, что его можно включать и выключать, управляя тем, может ли проходить через него электрический ток. Как выглядит реле-модуль, показано на картинке ниже:

Relay-module 2.jpg

В частности, модуль на картинке выше состоит из двух реле (это синие кубы).

Что касается сетевого напряжения, то у каждого реле для работы с ним имеется три выходных контакта.

Relay-labeled 3.jpg

  • COM (от «common») – общий контакт.
  • NO (от «normally open») – нормально разомкнутый контакт. Общий контакт и нормально разомкнутый контакт между собой не соединены. Но когда вы включаете реле, эти контакты замыкаются и потребитель (в нашем случае – лампа) начинает получать питание.
  • NC (от «normally closed») – нормально замкнутый контакт. Общий контакт и нормально замкнутый контакт соединены друг с другом, даже если реле выключено. Но если включить реле, цепь размыкается и питание перестает идти потребителю.

Хотя это зависит от проекта, но в нашем случае лучше использовать нормально разомкнутый контакт, потому что мы будем включать лампу время от времени. Более подробно об использовании реле-модуля с платой Arduino можно почитать тут.

Реле и плата Arduino подключаются друг к другу очень просто:

IMG 6361-279x300 4.jpg

  • GND – к «земле»
  • IN1 – к цифровому контакту Arduino (используется для управления первым реле)
  • IN2 – к цифровому контакту Arduino (используется для управления вторым реле)
  • VCC – к 5 вольтам

Необходимое оборудование

Ниже – полный список компонентов, необходимых для этого проекта:

    – на eBay – на eBay
  • Реле-модуль – на eBay
  • Шнур-соединитель для лампы – на eBay
  • Макетная плата – на eBay
  • Провода-перемычки – на eBay

Скопируйте код, показанный ниже, в IDE Arduino, но перед тем, как загружать его на плату Arduino, прочитайте раздел «Настройка сети», расположенный еще ниже.

Настройка сети

Обратите внимание на фрагмент в коде выше, где находятся данные для подключения к сети:

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

Кроме того, возможно, придется заменить все значения в строчке для IP-адреса:

В моем случае IP-адрес был в диапазоне «192.168.1.X», и при помощи программы Angry IP Scanner я узнал, что в моей сети доступен IP-адрес «192.168.1.111». То есть в моей сети не было активных устройств, использующих тот же самый адрес.

Схема

Соберите цепь, как показано на картинке ниже:

Schematicsfinal 5.jpg

Демонстрация

Это просто быстрая адаптация на примере Arduino Ethernet для управления парой реле для автоматической настройки теста.


Я надеюсь, что исходный код не требует пояснений. Помните, что использовать необходимо Arduino IDE 1.0.1 или более позднюю версию, т.к. DHCP в библиотеке Ethernet глючит в версии 1.0.

/*
Control 2 relays over Ethernet (Ethernet shield)
Supports DHCP
Relays are connected to pins 6 (relay 1) and 7 (relay 2). More relays can be added by putting their pin numbers to the relayPins array
Listening on TCP/IP port 22000
Control command syntax: R ( [aa],[bb])<CR><LF> where [aa]= relay number 00 for both, 01 or 02. [bb] is 00 (off ) or 01 (on )
Response: OK<CR><LF> or ERROR<CR><LF> if a bad relay number or command is given
Multiple commands may be given. The server closes the client socket after 30s inactivity timeout
*/

// if need to change the MAC address (Very Rare)
byte mac[] = < 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED >;

int relayPins[] = ;
int numRelays = sizeof (relayPins ) / sizeof (int );
const bool useDhcp = true;

void setup ( )
// configure relay pins to output, OFF
for (int i = 0; i < numRelays; i++)pinMode (relayPins [i], OUTPUT);
digitalWrite (relayPins [i], HIGH);
>

//Pins 10,11,12 & 13 are used by the ethernet shield
Serial.println ( «Start »);
Serial.print ( «Number of relays:») ;
Serial.println (numRelays );

if (useDhcp ) Ethernet.begin (mac ); // DHCP
> else Ethernet.begin (mac , ip, gateway, subnet); //for manual setup
>

server.begin ( );
Serial.println (Ethernet .localIP ( ));
>

void loop ( )
if (useDhcp ) Ethernet.maintain ( );
>

// listen for incoming clients, and process request.
checkForClient ( );
>

int state = 0;
int relayNumber = 0;
int action = 0;

// reset command state machine
void Reset ( )
state = 0;
relayNumber = 0;
action = 0;
>

void checkForClient ( )
EthernetClient client = server.available ( );

if (client ) int timeout = 1000;

while (client .connected ( )) if (client .available ( )) char c = client.read ( );

// command parser is implemented as a simple state machine
switch (state )case 0:
if (c == 'R') state++; break;
case 1:
if (c == ' ( ') state++; else Reset ( ); break;
case 2:
case 3:
state++;
if ( (c ≤ '9') && (c >= '0'))relayNumber = relayNumber * 10 + (c — '0');
> else Reset ( );
>
break;
case 4:
if ( (c == ':') || (c == ',') || (c == '.') || (c == ';')) state++; else Reset ( ); break;
case 5:
case 6:
state++;
if ( (c ≤ '9') && (c >= '0'))action = action * 10 + (c — '0');
> else Reset ( );
>
break;
case 7:
if (c == ')') state++; else Reset ( ); break;
case 8:
if (c == '\r') state++; else Reset ( ); break;
case 9:
if (c == '\n') if ( (relayNumber > numRelays) || (action > 1))client.print ( «ERROR \r\n»);
> else setRelay (relayNumber , action);
client.print ( «OK \r\n»);
>
client.flush ( );
delay (100 );
>
Reset ( );
break;
>
if (state > 0)timeout = 1000;
>
> else timeout--;
if (timeout == 0)Serial.println ( «Disconnecting — timeout»);
client.stop ( ); // close the connection:
return;
> else delay (30 ); // 30ms * 1000 = 30s disconnect on idle timeout
>
>
>
Serial.println ( «Client disconnect»);
>
>

void setRelay (int relayNumber, int action)
if (relayNumber == 0) < // 0 — all relays
for (int i = 0; i < numRelays; i++)digitalWrite (relayPins [i], (action )?LOW:HIGH);
>
return;
>

Ethernet Shield и электромагнитное реле

В предыдущем уроке мы говорили о bluetooth модуле и электромагнитном реле. Это тоже часть проектов на Ардуино, которые помогают в интернете вещей и беспроводной передаче информации от Ардуино к приложениям в телефоне или компьютере. Поэтому, посмотрите его, если пропустили или уже забыли.

А сегодня мы повторим предыдущий урок, но вместо bluetooth модуля используем подключение через ethernet. Напишем сервер, к которому можно будет подключиться из браузера. И простую веб страницу, на которой можно будет зажигать свет.

Для того, чтобы выполнить этот урок нам понадобиться

  • Ардуино UNO
  • Макетная плата
  • Перемычки
  • Ethernet Shield
  • Реле SRD-05VDC-SL-C
  • Лампа на 220 вольт и патрон к ней
  • Ethernet провод
  • Кабель USB

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

Управляющий сигнал будем получать от платы расширения Ethernet shield и веб страницы, которая будет генерироваться внутри кода. Когда пользователь нажмет на кнопку, чтобы включить свет, сервер получит данные и использует, для управления реле.

Ethernet Shield

В нашем распоряжении оказался ethernet shield hanrun hr91105a или w5100. Он имеет форм фактор для подключения к плате Ардуино Uno.

Он предоставляет доступ к TCP и UDP стекам. А библиотека для работы с ethernet shield позволяет быстро подключить устройство и настроить скетч.

Контакты сверху платы позволяют подключать дополнительные устройства и использовать контакты Ардуино как обычно.

Имейте в виду, при подключении платы, пины 4, 10, 11, 12 и 13 используются для взаимодействия платы с Ардуино. Использовать их для других устройств уже нельзя.

Так же на плате есть слот для карты micro-SD. С его помощью можно сохранять необходимую информацию на карту памяти. Или загружать на нее веб страницы. Памяти внутри Ардуино хватит только на небольшую страницу с парой кнопок.

На плате расширения есть несколько индикаторных светодиодов

  • PWR: показывает, что платы подключены к питанию
  • LINK: показывает, подключение к сетевому устройству и мигает когда плата получает или отправляет данные
  • FULLD: показывает, что интернет соединение full duplex
  • 100M: показывает, что скорость соединения поддерживает 100 Mb/s (а не 10 Mb/s)
  • RX: мигает, когда плата получает данные
  • TX: мигает, когда плата отправляет данные
  • COLL: мигает, когда обнаружены интернет коллизии

Принципиальная схема

Подключим Ethernet shield к материнской плате Ардуино. А электромагнитное реле уже к плате расширения. Используем питание 5 вольт и землю. А для управление реле возьмем 7 цифровой пин.

Принципиальная схема подключения Ethernet shield и реле

Программа

Смысл проекта такой же как и с bluetooth. Плата должна получить от нас сигнал и установить реле в нужное состояние. Тогда подключенное к реле оборудование включится или выключится соответственно.

Используем пример из библиотеки Ethernet.

Откроем скетч из Меню File -> Examples -> Ethernet -> WebServer

Здесь используются библиотеки <SPI.h> и <Ethernet.h>

В функции setup() настраиваем все необходимые функции для работы через интернет. И раскомментируем строку Ethernet.init(10);

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

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

Теперь мы можемиспользовать информацию о состоянии реле и сформировать нужную веб страницу для пользователя.

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

Полный текст программы

Если все настроено правильно, то зайдя по адресу указанному в настройках IPAddress ip(192, 168, 0, 177) мы увидим веб страницу.

И нажав на кнопку мы сможем управлять реле, соединенным с платой Ардуино.

Web страница на Ардуино

Заключение

Мы использовали Ethernet shield для Ардуино, чтобы подключить устройство к интернету. И настроили управление светом через веб страницу сгенерированную на Ардуино.

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

Читайте также: