Will try to play a bit around with the two links you send me.
Do you have any suggested link whey they explain how to use multiple switches on the server pagelike up to 8 or more (sw1, sw2,,,,,,,sw8)
I use following source code for output which works, but I want to replace by boolean.
// Used Library
#include "Arduino.h"
#include "PCF8574.h"
#include <ETH.h>
#include <WiFiUdp.h>
#include <WebServer_WT32_ETH01.h>
// Set i2c input address
PCF8574 pcf8574_1(0x22,4,5); // channel 1-8 address: 100010
PCF8574 pcf8574_2(0x21,4,5); // channel 9-16 address: 100001
// Set i2c output address
PCF8574 pcf8574_3(0x24,4,5); // channel 1-8
PCF8574 pcf8574_4(0x25,4,5); // channel 9-16
String relaystate[16]={"relay1state","relay2state","relay3state","relay4state","relay5state","relay6state","relay7state","relay8state",
"relay9state","relay10state","relay11state","relay12state","relay13state","relay14state","relay15state","relay16state",};
String relay1state = "off";// state of relay1
String relay2state = "off";// state of relay2
String relay3state = "off";// state of relay3
String relay4state = "off";// state of relay4
String relay5state = "off";// state of relay5
String relay6state = "off";// state of relay6
String relay7state = "off";// state of relay7
String relay8state = "off";// state of relay8
String relay9state = "off";// state of relay9
String relay10state = "off";// state of relay10
String relay11state = "off";// state of relay11
String relay12state = "off";// state of relay12
String relay13state = "off";// state of relay13
String relay14state = "off";// state of relay14
String relay15state = "off";// state of relay15
String relay16state = "off";// state of relay16
// Ethernet configuration
#define ETH_ADDR 0
#define ETH_POWER_PIN -1
#define ETH_MDC_PIN 23
#define ETH_MDIO_PIN 18
#define ETH_TYPE ETH_PHY_LAN8720
#define ETH_CLK_MODE ETH_CLOCK_GPIO17_OUT
WiFiUDP Udp; //Create UDP object
unsigned int localUdpPort = 4196; //local port
// Set it the IP address of the router
IPAddress local_ip(192, 168, 1, 80);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
IPAddress dns(192, 168, 1, 1);
// WebServer Port
#define DEBUG_ETHERNET_WEBSERVER_PORT Serial
// Debug Level from 0 to 4
#define _ETHERNET_WEBSERVER_LOGLEVEL_ 3
WiFiServer server(80);
// Current time
unsigned long currentTime = millis();
// Previous time
unsigned long previousTime = 0;
// Define timeout time in milliseconds (example: 2000ms = 2s)
const long timeoutTime = 2000;
int flag_read_di=0;
// Variable to store the HTTP request
String header;
TwoWire I2Cone = TwoWire(0);
TwoWire I2Ctwo = TwoWire(1);
// Varible
boolean status = 0;
boolean toggle = true;
unsigned long timeElapsed;
void setup()
{
Serial.begin(9600);
Serial.println();
// Set PCF8574 pinMode to OUTPUT
for(int i=0;i<=7;i++)
{
pcf8574_3.pinMode(i, OUTPUT);
pcf8574_4.pinMode(i, OUTPUT);
}
pcf8574_3.begin();
pcf8574_4.begin();
for(int i=0;i<=7;i++)
{
pcf8574_1.pinMode(i, INPUT);
pcf8574_2.pinMode(i, INPUT);
}
pcf8574_1.begin();
pcf8574_2.begin();
for(int i=0;i<=7;i++)
{
pcf8574_3.digitalWrite(i, HIGH);
pcf8574_4.digitalWrite(i, HIGH);
}
pcf8574_1.pinMode(P0, INPUT);
pcf8574_1.pinMode(P1, INPUT);
pcf8574_1.pinMode(P2, INPUT);
pcf8574_1.pinMode(P3, INPUT);
pcf8574_1.pinMode(P4, INPUT);
pcf8574_1.pinMode(P5, INPUT);
pcf8574_1.pinMode(P6, INPUT);
pcf8574_1.pinMode(P7, INPUT);
pcf8574_2.pinMode(P0, INPUT);
pcf8574_2.pinMode(P1, INPUT);
pcf8574_2.pinMode(P2, INPUT);
pcf8574_2.pinMode(P3, INPUT);
pcf8574_2.pinMode(P4, INPUT);
pcf8574_2.pinMode(P5, INPUT);
pcf8574_2.pinMode(P6, INPUT);
pcf8574_2.pinMode(P7, INPUT);
pcf8574_3.pinMode(P0, OUTPUT);
pcf8574_3.pinMode(P1, OUTPUT);
pcf8574_3.pinMode(P2, OUTPUT);
pcf8574_3.pinMode(P3, OUTPUT);
pcf8574_3.pinMode(P4, OUTPUT);
pcf8574_3.pinMode(P5, OUTPUT);
pcf8574_3.pinMode(P6, OUTPUT);
pcf8574_3.pinMode(P7, OUTPUT);
pcf8574_4.pinMode(P0, OUTPUT);
pcf8574_4.pinMode(P1, OUTPUT);
pcf8574_4.pinMode(P2, OUTPUT);
pcf8574_4.pinMode(P3, OUTPUT);
pcf8574_4.pinMode(P4, OUTPUT);
pcf8574_4.pinMode(P5, OUTPUT);
pcf8574_4.pinMode(P6, OUTPUT);
pcf8574_4.pinMode(P7, OUTPUT);
// write confirmation for pcf8574...
Serial.print("Init pcf8574...");
if (pcf8574_1.begin()){
Serial.println("pcf8574_1_OK");
}else{
Serial.println("pcf8574_1_KO");
}
Serial.print("Init pcf8574...");
if (pcf8574_2.begin()){
Serial.println("pcf8574_2_OK");
}else{
Serial.println("pcf8574_2_KO");
}
Serial.print("Init pcf8574...");
if (pcf8574_3.begin()){
Serial.println("pcf8574_3_OK");
}else{
Serial.println("pcf8574_3_KO");
}
Serial.print("Init pcf8574...");
if (pcf8574_4.begin()){
Serial.println("pcf8574_4_OK");
}else{
Serial.println("pcf8574_4_KO");
}
ETH.begin(ETH_ADDR, ETH_POWER_PIN, ETH_MDC_PIN, ETH_MDIO_PIN, ETH_TYPE, ETH_CLK_MODE); //start with ETH
// write confirmation for static IP, gateway,subnet,dns1,dns2
if (ETH.config(local_ip, gateway, subnet, dns, dns) == false) {
Serial.println("LAN8720 Configuration failed.");
}else{Serial.println("LAN8720 Configuration success.");}
/* while(!((uint32_t)ETH.localIP())) //wait for IP
{
}*/
Serial.println("Connected");
Serial.print("IP Address:");
Serial.println(ETH.localIP());
Udp.begin(localUdpPort); //begin UDP listener
// Connect to Wi-Fi network with SSID and password
// Serial.print("Connecting to ");
// Serial.println(ssid);
while (!Serial);
// Using this if Serial debugging is not necessary or not using Serial port
//while (!Serial && (millis() < 3000));
Serial.print("\nStarting WebServer on " + String(ARDUINO_BOARD));
Serial.println(" with " + String(SHIELD_TYPE));
Serial.println(WEBSERVER_WT32_ETH01_VERSION);
// To be called before ETH.begin()
WT32_ETH01_onEvent();
//bool begin(uint8_t phy_addr=ETH_PHY_ADDR, int power=ETH_PHY_POWER, int mdc=ETH_PHY_MDC, int mdio=ETH_PHY_MDIO,
// eth_phy_type_t type=ETH_PHY_TYPE, eth_clock_mode_t clk_mode=ETH_CLK_MODE);
//ETH.begin(ETH_PHY_ADDR, ETH_PHY_POWER, ETH_PHY_MDC, ETH_PHY_MDIO, ETH_PHY_TYPE, ETH_CLK_MODE);
ETH.begin(ETH_PHY_ADDR, ETH_PHY_POWER);
// Static IP, leave without this line to get IP via DHCP
//bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1 = 0, IPAddress dns2 = 0);
// ETH.config(myIP, myGW, mySN, myDNS);
//WT32_ETH01_waitForConnect();
server.begin();
}
void loop()
{
uint8_t val1 = pcf8574_1.digitalRead(P0);
uint8_t val2 = pcf8574_1.digitalRead(P1);
uint8_t val3 = pcf8574_1.digitalRead(P2);
uint8_t val4 = pcf8574_1.digitalRead(P3);
uint8_t val5 = pcf8574_1.digitalRead(P4);
uint8_t val6 = pcf8574_1.digitalRead(P5);
uint8_t val7 = pcf8574_1.digitalRead(P6);
uint8_t val8 = pcf8574_1.digitalRead(P7);
uint8_t val9 = pcf8574_2.digitalRead(P0);
uint8_t val10 = pcf8574_2.digitalRead(P1);
uint8_t val11 = pcf8574_2.digitalRead(P2);
uint8_t val12 = pcf8574_2.digitalRead(P3);
uint8_t val13 = pcf8574_2.digitalRead(P4);
uint8_t val14 = pcf8574_2.digitalRead(P5);
uint8_t val15 = pcf8574_2.digitalRead(P6);
uint8_t val16 = pcf8574_2.digitalRead(P7);
delay(300);
int packetSize = Udp.parsePacket(); //get package size
if (packetSize) //if have received data
{
char buf[packetSize];
Udp.read(buf, packetSize); //read current data
Serial.println();
Serial.print("Received: ");
Serial.println(buf);
Serial.print("From IP: ");
Serial.println(Udp.remoteIP());
Serial.print("From Port: ");
Serial.println(Udp.remotePort());
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); //ready to send data
Udp.print("Received: ");
Udp.write((const uint8_t*)buf, packetSize); //copy data to sender buffer
Udp.endPacket(); //send data
}
WiFiClient client = server.available(); // Listen for incoming clients
if (client) { // If a new client connects,
Serial.println("New Client."); // print a message out in the serial port
String currentLine = ""; // make a String to hold incoming data from the client
currentTime = millis();
previousTime = currentTime;
while (client.connected() && currentTime - previousTime <= timeoutTime) { // loop while the client's connected
currentTime = millis();
if (client.available()) { // if there's bytes to read from the client,
char c = client.read(); // read a byte, then
Serial.write(c); // print it out the serial monitor
header += c;
if (c == '\n') { // if the byte is a newline character
// if the current line is blank, you got two newline characters in a row.
// that's the end of the client HTTP request, so send a response:
if (currentLine.length() == 0) {
// HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
// and a content-type so the client knows what's coming, then a blank line:
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println("Connection: close");
client.println();
// turns 16 relays on and off
if (header.indexOf("GET /1/on") >= 0) {relay1state = "on";pcf8574_3.digitalWrite(P0, LOW);}
else if (header.indexOf("GET /1/off") >= 0) {relay1state = "off";pcf8574_3.digitalWrite(P0, HIGH);}
else if (header.indexOf("GET /2/on") >= 0) {relay2state = "on";pcf8574_3.digitalWrite(P1, LOW);}
else if (header.indexOf("GET /2/off") >= 0) {relay2state = "off";pcf8574_3.digitalWrite(P1, HIGH);}
else if (header.indexOf("GET /3/on") >= 0) {relay3state = "on";pcf8574_3.digitalWrite(P2, LOW);}
else if (header.indexOf("GET /3/off") >= 0) {relay3state = "off";pcf8574_3.digitalWrite(P2, HIGH);}
else if (header.indexOf("GET /4/on") >= 0) {relay4state = "on";pcf8574_3.digitalWrite(P3, LOW);}
else if (header.indexOf("GET /4/off") >= 0) {relay4state = "off";pcf8574_3.digitalWrite(P3, HIGH);}
else if (header.indexOf("GET /5/on") >= 0) {relay5state = "on";pcf8574_3.digitalWrite(P4, LOW);}
else if (header.indexOf("GET /5/off") >= 0) {relay5state = "off";pcf8574_3.digitalWrite(P4, HIGH);}
else if (header.indexOf("GET /6/on") >= 0) {relay6state = "on";pcf8574_3.digitalWrite(P5, LOW);}
else if (header.indexOf("GET /6/off") >= 0) {relay6state = "off";pcf8574_3.digitalWrite(P5, HIGH);}
else if (header.indexOf("GET /7/on") >= 0) {relay7state = "on";pcf8574_3.digitalWrite(P6, LOW);}
else if (header.indexOf("GET /7/off") >= 0) {relay7state = "off";pcf8574_3.digitalWrite(P6, HIGH);}
else if (header.indexOf("GET /8/on") >= 0) {relay8state = "on";pcf8574_3.digitalWrite(P7, LOW);}
else if (header.indexOf("GET /8/off") >= 0) {relay8state = "off";pcf8574_3.digitalWrite(P7, HIGH);}
else if (header.indexOf("GET /9/on") >= 0) {relay9state = "on";pcf8574_4.digitalWrite(P0, LOW);}
else if (header.indexOf("GET /9/off") >= 0) {relay9state = "off";pcf8574_4.digitalWrite(P0, HIGH);}
else if (header.indexOf("GET /10/on") >= 0) {relay10state = "on";pcf8574_4.digitalWrite(P1, LOW);}
else if (header.indexOf("GET /10/off") >= 0) {relay10state = "off";pcf8574_4.digitalWrite(P1, HIGH);}
else if (header.indexOf("GET /11/on") >= 0) {relay11state = "on";pcf8574_4.digitalWrite(P2, LOW);}
else if (header.indexOf("GET /11/off") >= 0) {relay11state = "off";pcf8574_4.digitalWrite(P2, HIGH);}
else if (header.indexOf("GET /12/on") >= 0) {relay12state = "on";pcf8574_4.digitalWrite(P3, LOW);}
else if (header.indexOf("GET /12/off") >= 0) {relay12state = "off";pcf8574_4.digitalWrite(P3, HIGH);}
else if (header.indexOf("GET /13/on") >= 0) {relay13state = "on";pcf8574_4.digitalWrite(P4, LOW);}
else if (header.indexOf("GET /13/off") >= 0) {relay13state = "off";pcf8574_4.digitalWrite(P4, HIGH);}
else if (header.indexOf("GET /14/on") >= 0) {relay14state = "on";pcf8574_4.digitalWrite(P5, LOW);}
else if (header.indexOf("GET /14/off") >= 0) {relay14state = "off";pcf8574_4.digitalWrite(P5, HIGH);}
else if (header.indexOf("GET /15/on") >= 0) {relay15state = "on";pcf8574_4.digitalWrite(P6, LOW);}
else if (header.indexOf("GET /15/off") >= 0) {relay15state = "off";pcf8574_4.digitalWrite(P6, HIGH);}
else if (header.indexOf("GET /16/on") >= 0) {relay16state = "on";pcf8574_4.digitalWrite(P7, LOW);}
else if (header.indexOf("GET /16/off") >= 0) {relay16state = "off";pcf8574_4.digitalWrite(P7, HIGH);}
else if (header.indexOf("GET /read") >= 0) flag_read_di=1;
else if (header.indexOf("GET /all/on") >= 0)
{
relay1state = "on";// state of relay1
relay2state = "on";// state of relay2
relay3state = "on";// state of relay3
relay4state = "on";// state of relay4
relay5state = "on";// state of relay5
relay6state = "on";// state of relay6
relay7state = "on";// state of relay7
relay8state = "on";// state of relay8
relay9state = "on";// state of relay9
relay10state = "on";// state of relay10
relay11state = "on";// state of relay11
relay12state = "on";// state of relay12
relay13state = "on";// state of relay13
relay14state = "on";// state of relay14
relay15state = "on";// state of relay15
relay16state = "on";// state of relay16
for(int i=0;i<=7;i++)
{
pcf8574_3.digitalWrite(i, LOW);
pcf8574_4.digitalWrite(i, LOW);
}
}
else if (header.indexOf("GET /all/off") >= 0)
{
relay1state = "off";// state of relay1
relay2state = "off";// state of relay2
relay3state = "off";// state of relay3
relay4state = "off";// state of relay4
relay5state = "off";// state of relay5
relay6state = "off";// state of relay6
relay7state = "off";// state of relay7
relay8state = "off";// state of relay8
relay9state = "off";// state of relay9
relay10state = "off";// state of relay10
relay11state = "off";// state of relay11
relay12state = "off";// state of relay12
relay13state = "off";// state of relay13
relay14state = "off";// state of relay14
relay15state = "off";// state of relay15
relay16state = "off";// state of relay16
for(int i=0;i<=7;i++)
{
pcf8574_3.digitalWrite(i, HIGH);
pcf8574_4.digitalWrite(i, HIGH);
}
}
// Display the HTML web page for Outputs
client.println("<!DOCTYPE html><html>");
client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
client.println("<link rel=\"icon\" href=\"data:,\">");
// CSS to style the on/off buttons
// Feel free to change the background-color and font-size attributes to fit your preferences
client.println("<style>html { font-family: Helvetica; display: inline-block; border: 3px solid green;margin: 0px 15px;text-align: center;font-size: 10px;}");
client.println(".button { background-color: #195B00; border-radius: 10px;color: white; padding: 10px 40px;");
client.println("text-decoration: none; font-size: 20px; margin: 2px;text-align: center; cursor: pointer;}");
client.println(".button2 {background-color: #77878A;}</style></head>");
if (flag_read_di==1)
{
client.println(" relay1:" + relay1state + " relay2:" + relay2state + " relay3:" + relay3state + " relay4:" + relay4state + " relay5:" + relay5state + " relay6:" + relay6state + " relay7:" + relay7state + " relay8:" + relay8state + " relay9:" + relay9state + " relay10:" + relay10state + " relay11:" + relay11state + " relay12:" + relay12state + " relay13:" + relay13state + " relay14:" + relay14state + " relay15:" + relay15state + " relay16:" + relay16state);
}
else
{
// Web Page Heading
client.println("<body><h1>Web Server</h1>");
// Display current state, and ON/OFF buttons for relay
//client.println("<p>relay1 - State " + relay1state + "</p>");
// If the relay is off, it displays the ON button
if (relay1state == "off") client.println("<a href=\"/1/on\"><button class=\"button\">01-OFF</button></a>"); else client.println("<a href=\"/1/off\"><button class=\"button\">01--ON </button></a>");
if (relay2state == "off") client.println("<a href=\"/2/on\"><button class=\"button\">02-OFF</button></a>"); else client.println("<a href=\"/2/off\"><button class=\"button\">02--ON </button></a>");
if (relay3state == "off") client.println("<a href=\"/3/on\"><button class=\"button\">03-OFF</button></a>"); else client.println("<a href=\"/3/off\"><button class=\"button\">03--ON </button></a>");
if (relay4state == "off") client.println("<a href=\"/4/on\"><button class=\"button\">04-OFF</button></a>"); else client.println("<a href=\"/4/off\"><button class=\"button\">04--ON </button></a>");
if (relay5state == "off") client.println("<a href=\"/5/on\"><button class=\"button\">05-OFF</button></a>"); else client.println("<a href=\"/5/off\"><button class=\"button\">05--ON </button></a>");
if (relay6state == "off") client.println("<a href=\"/6/on\"><button class=\"button\">06-OFF</button></a>"); else client.println("<a href=\"/6/off\"><button class=\"button\">06--ON </button></a>");
if (relay7state == "off") client.println("<a href=\"/7/on\"><button class=\"button\">07-OFF</button></a>"); else client.println("<a href=\"/7/off\"><button class=\"button\">07--ON </button></a>");
if (relay8state == "off") client.println("<a href=\"/8/on\"><button class=\"button\">08-OFF</button></a>"); else client.println("<a href=\"/8/off\"><button class=\"button\">08--ON </button></a>");
if (relay9state == "off") client.println("<a href=\"/9/on\"><button class=\"button\">09-OFF</button></a>"); else client.println("<a href=\"/9/off\"><button class=\"button\">09--ON </button></a>");
if (relay10state == "off") client.println("<a href=\"/10/on\"><button class=\"button\">10-OFF</button></a>"); else client.println("<a href=\"/10/off\"><button class=\"button\">10--ON</button></a>");
if (relay11state == "off") client.println("<a href=\"/11/on\"><button class=\"button\">11-OFF</button></a>"); else client.println("<a href=\"/11/off\"><button class=\"button\">11--ON</button></a>");
if (relay12state == "off") client.println("<a href=\"/12/on\"><button class=\"button\">12-OFF</button></a>"); else client.println("<a href=\"/12/off\"><button class=\"button\">12--ON</button></a>");
if (relay13state == "off") client.println("<a href=\"/13/on\"><button class=\"button\">13-OFF</button></a>"); else client.println("<a href=\"/13/off\"><button class=\"button\">13--ON</button></a>");
if (relay14state == "off") client.println("<a href=\"/14/on\"><button class=\"button\">14-OFF</button></a>"); else client.println("<a href=\"/14/off\"><button class=\"button\">14--ON</button></a>");
if (relay15state == "off") client.println("<a href=\"/15/on\"><button class=\"button\">15-OFF</button></a>"); else client.println("<a href=\"/15/off\"><button class=\"button\">15--ON</button></a>");
if (relay16state == "off") client.println("<a href=\"/16/on\"><button class=\"button\">16-OFF</button></a>"); else client.println("<a href=\"/16/off\"><button class=\"button\">16--ON</button></a>");
client.println("<a href=\"/all/on\"><button class=\"button\">All--ON</button></a>");
client.println("<a href=\"/all/off\"><button class=\"button\">All-OFF</button></a>");
}
client.println("</body></html>");
// The HTTP response ends with another blank line
client.println();
// Break out of the while loop
break;
} else { // if you got a newline, then clear currentLine
currentLine = "";
}
} else if (c != '\r') { // if you got anything else but a carriage return character,
currentLine += c; // add it to the end of the currentLine
}
}
}
// Clear the header variable
header = "";
// Close the connection
client.stop();
Serial.println("Client disconnected.");
Serial.println("");
flag_read_di=0;
}
ScanKey(); //scan key
}
void ScanKey()
{
for(int i=0;i<=7;i++)
{
if(pcf8574_1.digitalRead(i) == LOW) //key pressed
{
delay(20);
if(pcf8574_1.digitalRead(i) == LOW) //key pressed again
{
pcf8574_3.digitalWrite(i,!pcf8574_3.digitalRead(i)); // toggle relay1 state
while(pcf8574_1.digitalRead(i) == LOW); //wait remove hand
if (pcf8574_3.digitalRead(i) == LOW) relaystate[i+1]="on";else relaystate[i+1]="off";
}
}
}
for(int j=0;j<=7;j++)
{
if(pcf8574_2.digitalRead(j) == LOW) //key pressed
{
delay(20);
if(pcf8574_2.digitalRead(j) == LOW) //key pressed again
{
pcf8574_4.digitalWrite(j,!pcf8574_4.digitalRead(j)); // toggle relay1 state
while(pcf8574_2.digitalRead(j) == LOW); //wait remove hand
if (pcf8574_4.digitalRead(j) == LOW) relaystate[j+8]="on";else relaystate[j+8]="off";
}
}
}
}