Помогите доделать 3 кнопки включения реле в скетче. Mega 2560

dinovasya
Offline
Зарегистрирован: 03.10.2013

Имею Ардуино Мега 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);                      
        }
 
                            }
 

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Вместо строк 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);
    }

Но это по-тупому. То, что быстро пришло в голову. Можно оптимизировать.

dinovasya
Offline
Зарегистрирован: 03.10.2013

Ну я так первым делом попробовал.

Всегда так для начала делаю, а потом додумываю.

Но в данном случае это не сработало:

по адресу 192.168.1.35 долго долго грузится страница и открывается только это:

 

200 OK

A

 

адрес стаёт таким: http://192.168.1.35/?cmd1=on

 

buka
buka аватар
Offline
Зарегистрирован: 07.06.2012
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: /");
}

И сделайте выбор либо вывод основной страницы, либо если идет команда то страница не выводится.

dinovasya
Offline
Зарегистрирован: 03.10.2013

Вот таким образом включает и выключает все реле одновременно.

Не пойму как их разделить.

 



#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);                      
        }
 
                            }
 

 

dinovasya
Offline
Зарегистрирован: 03.10.2013

таким образом тоже работает.только внизу отображается 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);                      
        }
 
                            }
 

 

dinovasya
Offline
Зарегистрирован: 03.10.2013

насколько я понимаю, реле включается по адресу 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

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

dinovasya пишет:

насколько я понимаю, реле включается по адресу http://192.168.1.35/?cmd1=on

и выключается по адресу http://192.168.1.35/?cmd1=off

 

Значит мне надо создать 8 страниц для каждого реле?

...

Это если вам лень парсить HTTP-запрос...

dinovasya
Offline
Зарегистрирован: 03.10.2013
нашел кусок кода- кажется мне что-то типа этого надо. парсить 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);
buka
buka аватар
Offline
Зарегистрирован: 07.06.2012
// Если нет команды  "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: /");
}

 

dinovasya
Offline
Зарегистрирован: 03.10.2013

А куда вставлять cmd2? cmd3? cmd4?

buka
buka аватар
Offline
Зарегистрирован: 07.06.2012
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: /");
}

 

buka
buka аватар
Offline
Зарегистрирован: 07.06.2012

Но это как самый простой и не оптимальный способ.

 

dinovasya
Offline
Зарегистрирован: 03.10.2013

не думал что это сложная работа. Мне нужно то только контролировать 4 цифровых пина через веб-интерфейс.

думал, что это будут 8 кнопок- вкл и выключить каждый пин. 

Оказывается это сложнейшая задача.

Нет ли у вас в закромах скетча для управления 4 пинами?

buka
buka аватар
Offline
Зарегистрирован: 07.06.2012

Тут в ветке все выложено уже. Осталось чуть подумать и собрать все вместе.

pastry777
Offline
Зарегистрирован: 16.01.2014

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

#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(); 
    }
  }
}