Помогите доделать 3 кнопки включения реле в скетче. Mega 2560
- Войдите на сайт для отправки комментариев
Чт, 01/01/2015 - 01:57
Имею Ардуино Мега 2560 r2/
Подцепил к ней реле шилд- он использует 4,5,6,7 пины ардуины.
Подцепил к ней ENC2860 сетевуху- она тоже прекрасно отрабатывает, использует 50,51,52,53 контакты ардуино.
Подцепил к ней DHT11 датчик температуры и влажности. Использует 3 пин на ардуине.
Загружаю скетч, вижу страницу в браузере по адресу 192.168.1.35
Нажимаю включить- Включается реле 1
Нажимаю выключить - выключается реле 1
----------------------------------------------------------------
Теперь сама суть:
Хочу чтоб появились кнопки для всех реле. Чтобы тоже включать и выключать их когда хочу через браузер.
Вот код всего скетча:
#include "DHT.h"
#include "etherShield.h"
#include "ETHER_28J60.h"
#define DHTPIN 3
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
int rele1 = 4;
int rele2 = 5;
int rele3 = 6;
int rele4 = 7;
static uint8_t mac[6] = {0x2E, 0x35, 0xB5, 0xAB, 0x3F, 0x70};
static uint8_t ip[4] = {192, 168, 1, 35};
static uint16_t port = 80;
ETHER_28J60 ethernet;
void setup()
{
ethernet.setup(mac, ip, port);
dht.begin();
pinMode(rele1, OUTPUT);
pinMode(rele2, OUTPUT);
pinMode(rele3, OUTPUT);
pinMode(rele4, OUTPUT);
}
void loop()
{
char* params;
int h = dht.readHumidity();
int t = dht.readTemperature();
for (int i=0; i <= 1000; i++)
{
if (params = ethernet.serviceRequest())
{
ethernet.print("<body background='http://bigsoft.moy.su/BackgroundSite.jpg' repeat;>");
ethernet.print("<center><H2>Temperature:<font color=#00FF00> ");
ethernet.print(t);
ethernet.print("</font><br></center></H2>");
ethernet.print("<H2><center>Humidity:<font color=#FF8C00> ");
ethernet.print(h);
ethernet.print("<br></font></center></H2>");
ethernet.print("<H1><center><A HREF='?cmd=on'>ON- Vkluchit Rele 1 </A><br></H1></center>");
ethernet.print("<center><H1><A HREF='?cmd=off'>OFF- Vikluchit Rele 1 </A></H1></center>");
if (strcmp(params, "?cmd=on") == 0) //проверка полученного запроса
{
digitalWrite(rele1, HIGH);
}
else if (strcmp(params, "?cmd=off") == 0)
{
digitalWrite(rele1, LOW);
}
ethernet.respond();
}
delay(2);
}
}

Вместо строк 54-55 переписать:
ethernet.print("<center><H1><A HREF='?cmd1=on'>ON- Vkluchit Rele 1 </A><br></H1></center>"); ethernet.print("<center><H1><A HREF='?cmd1=off'>OFF- Vikluchit Rele 1 </A></H1></center>"); ethernet.print("<center><H1><A HREF='?cmd2=on'>ON- Vkluchit Rele 2 </A><br></H1></center>"); ethernet.print("<center><H1><A HREF='?cmd2=off'>OFF- Vikluchit Rele 2 </A></H1></center>"); ethernet.print("<center><H1><A HREF='?cmd3=on'>ON- Vkluchit Rele 3 </A><br></H1></center>"); ethernet.print("<center><H1><A HREF='?cmd3=off'>OFF- Vikluchit Rele 3 </A></H1></center>"); ethernet.print("<center><H1><A HREF='?cmd4=on'>ON- Vkluchit Rele 4 </A><br></H1></center>"); ethernet.print("<center><H1><A HREF='?cmd4=off'>OFF- Vikluchit Rele 4 </A></H1></center>");Вместо строк 57-66 переписать:
if (strcmp(params, "?cmd1=on") == 0) //проверка полученного запроса { digitalWrite(rele1, HIGH); } else if (strcmp(params, "?cmd1=off") == 0) { digitalWrite(rele1, LOW); } else if (strcmp(params, "?cmd2=on") == 0) { digitalWrite(rele2, HIGH); } else if (strcmp(params, "?cmd2=off") == 0) { digitalWrite(rele2, LOW); } else if (strcmp(params, "?cmd3=on") == 0) { digitalWrite(rele3, HIGH); } else if (strcmp(params, "?cmd3=off") == 0) { digitalWrite(rele3, LOW); } else if (strcmp(params, "?cmd4=on") == 0) { digitalWrite(rele4, HIGH); } else if (strcmp(params, "?cmd4=off") == 0) { digitalWrite(rele4, LOW); }Но это по-тупому. То, что быстро пришло в голову. Можно оптимизировать.
Ну я так первым делом попробовал.
Всегда так для начала делаю, а потом додумываю.
Но в данном случае это не сработало:
по адресу 192.168.1.35 долго долго грузится страница и открывается только это:
200 OK
A
адрес стаёт таким: http://192.168.1.35/?cmd1=on
if (strcmp(params, "?cmd1=on") == 0) { digitalWrite(rele1, HIGH); ethernet.println("HTTP/1.0 302 Found"); ethernet.println("Location: /"); } else if (strcmp(params, "?cmd1=off") == 0) { digitalWrite(rele1, LOW); ethernet.println("HTTP/1.0 302 Found"); ethernet.println("Location: /"); }И сделайте выбор либо вывод основной страницы, либо если идет команда то страница не выводится.
Вот таким образом включает и выключает все реле одновременно.
Не пойму как их разделить.
#include "DHT.h" #include "etherShield.h" #include "ETHER_28J60.h" #define DHTPIN 3 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); int rele1 = 7; int rele2 = 6; int rele3 = 5; int rele4 = 4; static uint8_t mac[6] = {0x2E, 0x35, 0xB5, 0xAB, 0x3F, 0x70}; // мак адрес вашего модуля (я генерировал в интернете) static uint8_t ip[4] = {192, 168, 1, 35}; // ip адрес модуля (должен соответствовать вашей сети) static uint16_t port = 80; // порт (хттп по умалчанию 80) ETHER_28J60 ethernet; void setup() { ethernet.setup(mac, ip, port); dht.begin(); pinMode(rele1, OUTPUT); pinMode(rele2, OUTPUT); pinMode(rele3, OUTPUT); pinMode(rele4, OUTPUT); } void loop() { char* params; int h = dht.readHumidity(); int t = dht.readTemperature(); for (int i=0; i <= 1000; i++) { if (params = ethernet.serviceRequest()) { ethernet.print("<body background='http://bigsoft.moy.su/BackgroundSite.jpg' repeat;>"); ethernet.print("<center><H2>Temperatura:<font color=#00FF00> "); ethernet.print(t); ethernet.print("</font><br></center></H2>"); ethernet.print("<H2><center>Humidity:<font color=#FF8C00> "); ethernet.print(h); ethernet.print("<br></font></center></H2>"); ethernet.print("<center><H1><A HREF='?cmd1=on'>ON- Vkluchit Rele 1 </A><br></H1></center>"); ethernet.print("<center><H1><A HREF='?cmd1=off'>OFF- Vikluchit Rele 1 </A><br></H1></center>"); if (strcmp(params, "?cmd1=on") == 0) //проверка полученного запроса { digitalWrite(rele1, HIGH); digitalWrite(rele2, HIGH); digitalWrite(rele3, HIGH); digitalWrite(rele4, HIGH); } else if (strcmp(params, "?cmd1=off") == 0) { digitalWrite(rele1, LOW); digitalWrite(rele2, LOW); digitalWrite(rele3, LOW); digitalWrite(rele4, LOW); } ethernet.respond(); } delay(2); } }таким образом тоже работает.только внизу отображается HTTP/1.0 302 FoundLocation: /
#include "DHT.h" #include "etherShield.h" #include "ETHER_28J60.h" #define DHTPIN 3 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); int rele1 = 7; int rele2 = 6; int rele3 = 5; int rele4 = 4; static uint8_t mac[6] = {0x2E, 0x35, 0xB5, 0xAB, 0x3F, 0x70}; // мак адрес вашего модуля (я генерировал в интернете) static uint8_t ip[4] = {192, 168, 1, 35}; // ip адрес модуля (должен соответствовать вашей сети) static uint16_t port = 80; // порт (хттп по умалчанию 80) ETHER_28J60 ethernet; void setup() { ethernet.setup(mac, ip, port); dht.begin(); pinMode(rele1, OUTPUT); pinMode(rele2, OUTPUT); pinMode(rele3, OUTPUT); pinMode(rele4, OUTPUT); } void loop() { char* params; int h = dht.readHumidity(); int t = dht.readTemperature(); for (int i=0; i <= 1000; i++) { if (params = ethernet.serviceRequest()) { ethernet.print("<body background='http://bigsoft.moy.su/BackgroundSite.jpg' repeat;>"); ethernet.print("<center><H2>Temperatura:<font color=#00FF00> "); ethernet.print(t); ethernet.print("</font><br></center></H2>"); ethernet.print("<H2><center>Humidity:<font color=#FF8C00> "); ethernet.print(h); ethernet.print("<br></font></center></H2>"); ethernet.print("<center><H1><A HREF='?cmd1=on'>ON- Vkluchit Rele 1 </A><br></H1></center>"); ethernet.print("<center><H1><A HREF='?cmd1=off'>OFF- Vikluchit Rele 1 </A><br></H1></center>"); if (strcmp(params, "?cmd1=on") == 0) { digitalWrite(rele1, HIGH); ethernet.print("HTTP/1.0 302 Found"); ethernet.print("Location: /"); } else if (strcmp(params, "?cmd1=off") == 0) { digitalWrite(rele1, LOW); ethernet.print("HTTP/1.0 302 Found"); ethernet.print("Location: /"); } ethernet.respond(); } delay(2); } }насколько я понимаю, реле включается по адресу http://192.168.1.35/?cmd1=on
и выключается по адресу http://192.168.1.35/?cmd1=off
Значит мне надо создать 8 страниц для каждого реле?
но как в этот момент будут вести себя другие реле?
http://192.168.1.35/?cmd1=on
http://192.168.1.35/?cmd2=on
http://192.168.1.35/?cmd3=on
http://192.168.1.35/?cmd4=on
http://192.168.1.35/?cmd1=off
http://192.168.1.35/?cmd2=off
http://192.168.1.35/?cmd3=off
http://192.168.1.35/?cmd4=off
насколько я понимаю, реле включается по адресу http://192.168.1.35/?cmd1=on
и выключается по адресу http://192.168.1.35/?cmd1=off
Значит мне надо создать 8 страниц для каждого реле?
...
Это если вам лень парсить HTTP-запрос...
нашел кусок кода- кажется мне что-то типа этого надо. парсить http запросы я не умею к сожалению, поскажите что означает восклицательный знак - light2=!light2; это какое-то обратное условие? //LIGHT INTERNET**************** if(strcmp(params, "light") == 0){ ethernet.print("Lamp: "); ethernet.print(!light2); ethernet.print("<br>"); ethernet.print("change: "); ethernet.print("<a href='light'><button>Lamp</button></a>"); light2=!light2; digitalWrite(6, light2);// Если нет команды "GET / " if (strcmp(params, "GET / ") == 0) { //Ваша страница ethernet.println("HTTP/1.1 200 OK"); // // } //Если команда " GET /?cmd1=ххх" else if (strcmp(params, "?cmd1=on") == 0) { digitalWrite(rele1, HIGH); ethernet.println("HTTP/1.0 302 Found"); ethernet.println("Location: /"); } else if (strcmp(params, "?cmd1=off") == 0) { digitalWrite(rele1, LOW); ethernet.println("HTTP/1.0 302 Found"); ethernet.println("Location: /"); }А куда вставлять cmd2? cmd3? cmd4?
else if (strcmp(params, "?cmd1=off") == 0) { digitalWrite(rele1, LOW); ethernet.println("HTTP/1.0 302 Found"); ethernet.println("Location: /"); } else if (strcmp(params, "?cmd2=on") == 0) { digitalWrite(rele2, HIGH); ethernet.println("HTTP/1.0 302 Found"); ethernet.println("Location: /"); } else if (strcmp(params, "?cmd2=off") == 0) { digitalWrite(rele2, LOW); ethernet.println("HTTP/1.0 302 Found"); ethernet.println("Location: /"); }Но это как самый простой и не оптимальный способ.
не думал что это сложная работа. Мне нужно то только контролировать 4 цифровых пина через веб-интерфейс.
думал, что это будут 8 кнопок- вкл и выключить каждый пин.
Оказывается это сложнейшая задача.
Нет ли у вас в закромах скетча для управления 4 пинами?
Тут в ветке все выложено уже. Осталось чуть подумать и собрать все вместе.
вот держи...расковыряешь,увидишь как надписи поменять,можно по-русски писать...датчики свои там тоже легко добавить,думаю разберешься...
#include <SPI.h> #include <Ethernet.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес byte ip[] = { 192, 168, 1, 100 }; // IP адрес (В броузере вводим 192.168.0.2) EthernetServer server(100); int numPins = 4; int pins[] = { 2, 3, 4, 5 }; // Пины для реле 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;charset=UTF-8"); client.println(); client.println("<html>"); client.println("<head>"); client.println("<title>Удаленное управление</title>"); client.println("</head>"); client.println("<body>"); client.println("<hr>"); client.println("<h2><b><p align='center'>Удаленное управление</p></b></h2> "); client.println("<hr>"); client.println("<form method='post'>"); client.print("<div><h2><p align='center'>РЕЛЕ 1 <input type='checkbox' "); if (pinState[0] == 1) client.print("checked"); client.println(" name='r0'></p></h2></div>"); client.print("<div><h2><p align='center'>РЕЛЕ 2 <input type='checkbox' "); if (pinState[1] == 1) client.print("checked"); client.println(" name='r1'></p></h2></div>"); client.print("<div><h2><p align='center'>РЕЛЕ 3 <input type='checkbox' "); if (pinState[2] == 1) client.print("checked"); client.println(" name='r2'></p></h2></div>"); client.print("<div><h2><p align='center'>РЕЛЕ 4 <input type='checkbox' "); if (pinState[3] == 1) client.print("checked"); client.println(" name='r3'></p></h2></div>"); client.println("<p align='center'><input type='submit' value='ПРИМЕНИТЬ'></p>"); client.println("</form>"); client.println("</body>"); client.println("</html>"); client.stop(); } } }