ARDUINO + W5100 ethernet shield + 4х канальный модуль реле 5В 10А

Чтобы подружить наш ARDUINO с внешним миром, сегодня попробуем подключить к ардуинке реле и управлять им через web-интерфейс. Для этой незамысловатой задачи понадобится сама ардуинка, Ethernet-шилд W5100 (в моем случае клон), 4х канальный модуль реле ну и конечно же монтажные аксессуары и свободный порт lan.
Как и ранее, информационным вдохновителем и наставником у нас будет ресурс Zelectro где я нашел хорошую статью по текущей задаче http://zelectro.cc/Ethernet_shield_W5100
Для управления платой используется базовая библиотека Arduino IDE - Ethernet library, а для работы microSD картой - SD library. По самой библиотеке Ethernet полезная информация здесь http://arduino.ua/ru/prog/Ethernet

Для работы с Ардуино W5100 использует шину SPI, объединяющей в себе выводы 11, 12 и 13, а в качестве линии SS используется вывод 10 также на шилде имеется слот для microSD карты для работы с которым используется вывод 4 (исходя из официального описания). Поэтому немного модифицируем код от Zelectro, чтобы для управления реле использовать выводы не задействованные W5100, а именно 2, 3, 5, 6 (вместо 2, 3, 4, 5).
Сам скетч (одолжен у Zelectro с внесенными корректировками):

#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес
byte ip[] = { 192, 168, 0, 2 }; // IP адрес (В броузере вводим 192.168.0.2)
EthernetServer server(80);
int numPins = 4;
int pins[] = { 2, 3, 5, 6 }; // Пины для реле
int pinState[] = {0, 0, 0, 0}; // Состояние пинов

void setup()
{
// Изначально выключаем все реле
for (int i = 0; i < numPins; i++)
{
pinMode(pins[i], OUTPUT);
digitalWrite(pins[i], 1);
}
Serial.begin(9600);
Ethernet.begin(mac, ip);
server.begin();
}
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]);
}
// Выводим HTML страницу, на которой пользователь может включить или выключить нужные ему реле
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
client.println("<html>");
client.println("<head>");
client.println("<title>Zelectro. Relay + Ethernet shield.</title>");
client.println("</head>");
client.println("<body>");
client.println("<h3>Zelectro. Relay + Ethernet shield.</h3>");
client.println("<form method='post'>");
client.print("<div>Relay 1 <input type='checkbox' ");
if (pinState[0] == 1)
client.print("checked");
client.println(" name='r0'></div>");
client.print("<div>Relay 2 <input type='checkbox' ");
if (pinState[1] == 1)
client.print("checked");
client.println(" name='r1'></div>");
client.print("<div>Relay 3 <input type='checkbox' ");
if (pinState[2] == 1)
client.print("checked");
client.println(" name='r2'></div>");
client.print("<div>Relay 4 <input type='checkbox' ");
if (pinState[3] == 1)
client.print("checked");
client.println(" name='r3'></div>");
client.println("<input type='submit' value='Refresh'>");
client.println("</form>");
client.println("</body>");
client.println("</html>");
client.stop();
}
}
}
Заливаем сначала скетч на ардуину и уже потом ставим сам шилд, во избежание выведения из строя шилда предыдущим загруженным на ардуину скетчем. Подключаем к сети, запускаем и стучим на 192.168.0.2 и как результат попадаем на нашу мини-страничку
Что говорит о том, что как минимум с  W5100 все хорошо, сеть он держит и теперь можно переходить к подключению реле и проверки его управляемости. По поводу взаимодействия с реле, хорошая статья здесь http://zelectro.cc/relayModule



Интересный вариант решения от Дмитрия Осипова (урок 1 и урок 2) в интерпретации Олега Борейко  оставлю для экспериментов на потом.

Коментарі

Популярні дописи з цього блогу

ESP8266+ARDUINO NANO связь через ESP-link ч.1

ARDUINO + 16х2 LCD keypad shield (двухрядный дисплей с кнопками) + DHT11 (датчика температуры и влажности)