веб-сервер для управления 8 реле

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

Ответить
Аватара пользователя
woow
Сообщения: 821
Зарегистрирован: Пн июл 04, 2016 8:46 am
Откуда: Mazeikiai
Благодарил (а): 125 раз
Поблагодарили: 46 раз

веб-сервер для управления 8 реле

Сообщение woow » Пн апр 01, 2019 12:11 am

если кому нужен веб-сервер на Arduino NANO (непринципиально) для управления 8 реле. Выкладываю на панель. Работает на сетевой как W5100, так и на ENC28j60. Надо только соответственно выбрать в скече библиотеку.
Можно расширить до 16 реле.
При подаче команды http://192.168.1.61/ генерирует ответ состояния всех выходов:
{"Relay_0":0 ,"Relay_1":0 ,"Relay_2":0 ,"Relay_3":0 ,"Relay_4":0 ,"Relay_5":0 ,"Relay_6":0 ,"Relay_7":0 }
При подаче команды http://192.168.1.61/sw_on=1 rele 1 на PIN 3 включится и ответ получим такой:
{"Relay_0":0 ,"Relay_1":1 ,"Relay_2":0 ,"Relay_3":0 ,"Relay_4":0 ,"Relay_5":0 ,"Relay_6":0 ,"Relay_7":0 }
т.е. если разобрать команду http://192.168.1.61/sw_on=1 то будет:
http://192.168.1.61/- адрес
sw_on - включить
sw_off - выключить
=1 - номер реле (0,1,2,3,4,5,6,7).
Как заставить МДМ читать ответ и менять свойства объекта, пока не разобрался, ко этот скеч можно использовать, если не так важно знать состояние реле.
СпойлерПоказать

Код: Выделить всё

/*
Ethernet shield nano or Ethernet ENC28j60 
To turn on the relay, just enter the link in the browser 
http://192.168.1.61/sw_on=1 "1" is the relay number. 
To turn off the relay 
http://192.168.1.61/sw_off=1 
In response we get a JSON relay state {"sw_0":0 ,"sw_1":0 }. 

*/

//#include <UIPEthernet.h> // Used for Ethernet ENC28j60 

//**********************//
#include <WebServer.h>  // Used only with W5100 or W5500
#include <Ethernet.h>  //
#include <SPI.h>       //
//*********************//

#define PIN_RELAY_0 2
#define PIN_RELAY_1 3
#define PIN_RELAY_2 4
#define PIN_RELAY_3 5
#define PIN_RELAY_4 6
#define PIN_RELAY_5 7
#define PIN_RELAY_6 8
#define PIN_RELAY_7 9

// **** ETHERNET SETTING ****
// Ethernet MAC address - must be unique on your network
byte mac[] = { 0x41, 0x44, 0x41, 0x43, 0x48, 0x41 };
//Ethernet interface IP address (unique in your network)
IPAddress ip(192, 168, 1, 61);                        
//ethernet interface IP port (80 = http)
EthernetServer server(80);
EthernetClient client;
String str = "";

void setup() {
  Serial.begin(115200);
  Serial.print("START");

  pinMode(PIN_RELAY_0, OUTPUT);
  pinMode(PIN_RELAY_1, OUTPUT);
  pinMode(PIN_RELAY_2, OUTPUT);
  pinMode(PIN_RELAY_3, OUTPUT);
  pinMode(PIN_RELAY_4, OUTPUT);
  pinMode(PIN_RELAY_5, OUTPUT);
  pinMode(PIN_RELAY_6, OUTPUT);
  pinMode(PIN_RELAY_7, OUTPUT);

  SW(0, LOW);
  SW(1, LOW);
  SW(2, LOW);
  SW(3, LOW);
  SW(4, LOW);
  SW(5, LOW);
  SW(6, LOW);
  SW(7, LOW);
  
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();

  Serial.print("IP Address: ");
  Serial.println(Ethernet.localIP());
  Serial.println();
}

void loop() {
  client = server.available();

  if( client ){
    Serial.println("BEGIN-------------->\n");

    boolean currentLineIsBlank = true;
    String line = "";
    bool firstLine = true;
    
    while (client.connected()){
      
      if (client.available()) {
        char c = client.read();
        Serial.print(c);

        if (c == '\n' && currentLineIsBlank) {
          String html = "{";
          for(int i=0; i<8; i++){
            if( SW_state(i) ){
              html += "\"Relay_"+String(i)+"\":1 "; //html += "\"sw_"+String(i)+"\":1 ";
            }else{
              html += "\"Relay_"+String(i)+"\":0 "; //html += "\"sw_"+String(i)+"\":0 ";
            }

            if( i<7 ) html += ",";
          }
          html += "}";
          
          client.println(html);
          break;
        }

        if (c == '\n') {
          
          currentLineIsBlank = true;
          if( firstLine ) {
            firstLine = false;
            Serial.println("-------------------------------" + line);
                 if( line.indexOf( "sw_on=0" ) >= 0 ){SW(0, HIGH);}                 
            else if( line.indexOf( "sw_off=0" ) >= 0 ){SW(0, LOW);}                 
            else if( line.indexOf( "sw_on=1" ) >= 0 ){SW(1, HIGH);}            
            else if( line.indexOf( "sw_off=1" ) >= 0 ){SW(1, LOW);}
            else if( line.indexOf( "sw_on=2" ) >= 0 ){SW(2, HIGH);}            
            else if( line.indexOf( "sw_off=2" ) >= 0 ){SW(2, LOW);}
            else if( line.indexOf( "sw_on=3" ) >= 0 ){SW(3, HIGH);}            
            else if( line.indexOf( "sw_off=3" ) >= 0 ){SW(3, LOW);}
            else if( line.indexOf( "sw_on=4" ) >= 0 ){SW(4, HIGH);}            
            else if( line.indexOf( "sw_off=4" ) >= 0 ){SW(4, LOW);}
            else if( line.indexOf( "sw_on=5" ) >= 0 ){SW(5, HIGH);}            
            else if( line.indexOf( "sw_off=5" ) >= 0 ){SW(5, LOW);}
            else if( line.indexOf( "sw_on=6" ) >= 0 ){SW(6, HIGH);}            
            else if( line.indexOf( "sw_off=6" ) >= 0 ){SW(6, LOW);}
            else if( line.indexOf( "sw_on=7" ) >= 0 ){SW(7, HIGH);}            
            else if( line.indexOf( "sw_off=7" ) >= 0 ){SW(7, LOW);}                        
          }
        }else if (c != '\r') {
          currentLineIsBlank = false;
          if( firstLine ) {
            line = line + c;
          }
        }
      }
    }

    delay(10);

    client.stop();
    Serial.println("END-------------->\n");
  }
}

bool SW_state(byte num){
  bool val;
  switch(num){
    case 0: val = digitalRead(PIN_RELAY_0); break;    
    case 1: val = digitalRead(PIN_RELAY_1); break;
    case 2: val = digitalRead(PIN_RELAY_2); break;
    case 3: val = digitalRead(PIN_RELAY_3); break;
    case 4: val = digitalRead(PIN_RELAY_4); break;
    case 5: val = digitalRead(PIN_RELAY_5); break;
    case 6: val = digitalRead(PIN_RELAY_6); break;
    case 7: val = digitalRead(PIN_RELAY_7); break;
  }
  return !val;
}
void SW(byte num, bool val){
  val = !val;
  switch(num){
    case 0: digitalWrite(PIN_RELAY_0, val); break;
    case 1: digitalWrite(PIN_RELAY_1, val); break;
    case 2: digitalWrite(PIN_RELAY_2, val); break;
    case 3: digitalWrite(PIN_RELAY_3, val); break;
    case 4: digitalWrite(PIN_RELAY_4, val); break;
    case 5: digitalWrite(PIN_RELAY_5, val); break;
    case 6: digitalWrite(PIN_RELAY_6, val); break;
    case 7: digitalWrite(PIN_RELAY_7, val); break;
  }
}

За это сообщение автора woow поблагодарил:
Oleg_Ltd (Вт май 07, 2019 2:20 pm)
Рейтинг: 1.16%
Raspberry Pi 3B+
Аватара пользователя
Oleg_Ltd
Сообщения: 15
Зарегистрирован: Пт янв 26, 2018 8:39 pm
Откуда: Минск РБ
Благодарил (а): 7 раз
Поблагодарили: 0
Контактная информация:

Re: веб-сервер для управления 8 реле

Сообщение Oleg_Ltd » Вт май 07, 2019 2:20 pm

Спасибо! Хорошее проводное решение, давно искал, вот бы еще входы были!
Аватара пользователя
woow
Сообщения: 821
Зарегистрирован: Пн июл 04, 2016 8:46 am
Откуда: Mazeikiai
Благодарил (а): 125 раз
Поблагодарили: 46 раз

Re: веб-сервер для управления 8 реле

Сообщение woow » Вт май 07, 2019 2:58 pm

Есть ещё другой (MQTT) с 8 реле с локальными кнопками и на 16 реле без кнопок, ума не хватает как аналоговую 16 кнопочную клавиатуру заставить работать одноразовыми импульсами.
Raspberry Pi 3B+
Ответить