Вентилятор 220В
- Войдите на сайт для отправки комментариев
Собственно т.к. потихоньку становится жарко решил заюзать одну из ардуин под вентилятор 220В через реле с управлением через приложение андроид или через браузер.
Проблема возникла вот в чем, при использовании реле с нагрузкой 12В через браузер и приложение всё нормально включается и выключается, а при подключении вентиля 220В начинаются лаги, в виде бесконечного ответа сервера на одну из команд, т.е. после включения или выключения из браузера идет постоянная передача данных, помогает только принудительная перезагрузка страницы и повторный выбор вкл/выкл, если не перезагружать, то ничего не переключается.
При нагрузке 12 вольт никакой длительной передачи, отметил или снял галку и моментально страница обновляется с установленной галкой или нет, в зависимости от запроса.
Скетч использую примитивный из примера управлением реле с помощью езернет шилда, немного подправленный под себя, посмотрите, может где накосячил...
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 0, 105 };
EthernetServer server(80);
int numPins = 1;
int pins[] = { 2 }; // Пин для реле
int pinState[] = {1}; // Состояние пинов
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;
// Считываем первый номер реле, который нужно включить
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;
}
}
}
}
// В соответствие с переданными данными включаем реле
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 ; charset=utf-8");
client.println();
client.println("<html>");
client.println("<head>");
client.println("<title>...</title>");
client.println("</head>");
client.println("<body>");
client.println("<center><h3>...</h3></center>");
client.println("<center><img src=...></center>");
client.println("<form method='post'>");
client.print("<center>Вентилятор</center>");
client.println("<br/>");
client.print("Управление<input type='checkbox'");
if (pinState[0] == 1)
client.print("checked");
client.println(" name='r0'></div>");
client.println("<br/>");
client.println("<br/>");
client.println("<input type='submit' value='Вкл/Выкл'>");
client.println("<br/>");
client.println("<br/>");
client.println("");
client.println("<br/>");
client.println("<br/>");
client.println("...");
client.println("</form>");
client.println("</body>");
client.println("</html>");
client.stop();
}
}
}