Chat freely about anything...

User avatar
By bircastri
#82856 HI all, I'm building a new firmware of sonoff 4ch pro device.

So this is the code:

Code: Select all// Load Wi-Fi library
#include <ESP8266WiFi.h>
#include <Wire.h>



const int relayD1 = 12;
const int relayD2 = 4;
const int relayD3 = 5;
const int relayD4 = 15;

//led segnale wifi
int gpio_13_led = 13;

// Set web server port number to 80
WiFiServer server(80);

// Variable to store the HTTP request
String header;

int conta =0;

// Assign output variables to GPIO pins
#define ESP8266_LED 3
//const int relay2Pin = D8; // FOR GREEN LED
const int output4 = 4;

//STATO RELE
int SPENTO = 0;
int ACCESO = 1;

void setup() {
  //il pin 6,7,11 non va toccato
 


  Serial.begin(115200);
  pinMode(gpio_13_led, OUTPUT);
  delay(200); 
  digitalWrite(gpio_13_led, ACCESO);
  delay(200); 
  delay(2000); 
 
  ConnectWiFi();
 
  delay(2000); 
 
  pinMode(relayD1, OUTPUT);
  pinMode(relayD2, OUTPUT);
  pinMode(relayD3, OUTPUT); 
  pinMode(relayD4, OUTPUT);
  //pinMode(relayD8, OUTPUT);

  digitalWrite(relayD1, SPENTO);
  delay(100);
  digitalWrite(relayD2, SPENTO);
  delay(100);
  digitalWrite(relayD3, SPENTO);
  delay(100);
  digitalWrite(relayD4, SPENTO);
  delay(100);

  Serial.println("Setup PIN terminato");
  delay(200);

  digitalWrite(gpio_13_led, SPENTO);
  delay(200); 
  delay(1000);
 
  Serial.println(WiFi.localIP());
  server.begin();
}

void loop(){
  delay(100);
  if (WiFi.status() != WL_CONNECTED){
     Serial.println("riconnessione in corso");
      digitalWrite(gpio_13_led, ACCESO);
      delay(200); 
      ConnectWiFi();
      delay(1000);
  }
  digitalWrite(gpio_13_led, SPENTO);
  delay(200); 
  WiFiClient client = server.available();   // Listen for incoming clients
 if (client) { 
    sendPageHtml(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
    while (client.connected()) {            // loop while the client's connected
      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) {

            closeConnection(client);
           

            String readString = getValue(header, ' ', 1);
            Serial.println("+++++++++++++++");
            Serial.println(readString);
            Serial.println("+++++++++++++++");
           
            /*if (header.indexOf("ON") >= 0) {
              String _PIN = readString.substring(4);
              int pinOn = _PIN.toInt();
              digitalWrite(pinOn, LOW);
              //Serial.println("LUCE ACCESA PIN " +pinOn);
           
            } else if (header.indexOf("OFF") >= 0) {
              String _PIN = readString.substring(5);
              int pinOn = _PIN.toInt();
              digitalWrite(pinOn, HIGH);
              //Serial.print("LUCE SPENTA "+pinOn);
         
            }else*/
            if (header.indexOf("RELE") >= 0) {
              //RECUPERO LA CORRENTE PASSATA DAL PIN
             String _PIN = readString.substring(6);
             int pinOn = getPinToMove(_PIN.toInt());
             digitalWrite(pinOn, ACCESO);
             //Serial.println("RELE ACCESA "+pinOn);
             //ATTENDO DUE SECONDI, POI SPENGO IL PIN
             delay(250);   
             digitalWrite(pinOn, SPENTO);
            delay(50);
            }
           
           
           
            // 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("");
  }
}

void sendPageHtml(WiFiClient client)
{
 
 
  client.println();
}


void closeConnection(WiFiClient client){
  client.println("HTTP/1.1 200 OK");
  client.println("Content-type:text/html");
  client.println("Connection: close");
  client.println(); 
}


bool ConnectWiFi() {
  // Serial.println("testo lcd" +testo);
  WiFi.begin(ssid, password);
  IPAddress ip(192,168,110,202);   
  IPAddress subnet(255,255,255,0); 
  IPAddress gateway(192,168,110,5);   
  WiFi.config(ip, gateway, subnet);
  digitalWrite(gpio_13_led, SPENTO);
  delay(10000);
 
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println(WiFi.status());
   digitalWrite(gpio_13_led, SPENTO);
    delay(50);
    Serial.println(WL_CONNECTED);
    WiFi.disconnect();
    delay(5000);
    WiFi.begin(ssid, password);
    WiFi.config(ip, gateway, subnet);
   digitalWrite(gpio_13_led, ACCESO);
    delay(50);
    delay(10000);
  }
  Serial.println("");
  Serial.print ("WiFi connected ");
  return true;
}

String getValue(String data, char separator, int index)
  {
    int found = 0;
    int strIndex[] = {0, -1};
    int maxIndex = data.length()-1;
 
    for(int i=0; i<=maxIndex && found<=index; i++){
      if(data.charAt(i)==separator || i==maxIndex){
          found++;
          strIndex[0] = strIndex[1]+1;
          strIndex[1] = (i == maxIndex) ? i+1 : i;
      }
    }
 
    return found>index ? data.substring(strIndex[0], strIndex[1]) : "";
  }//fine metodo getvalue

  int getPinToMove(int idPin)
  {
    switch (idPin) {
      case 1: return 12;
      case 2: return 5;
      case 3: return 4;
      case 4: return 15;
        // Qui sai che x è > 0 && < 4
        break;
  }
}


This code works, but I can't to blink the LED in ConnectWifi method. There an error on my code ?
User avatar
By rudy
#82860 I added some print statements to your code. The following output is what happened when I turned my router off and then back on again. Is this not what you expected?

led, OFF
led, OFF
led, OFF
led, OFF
led, OFF
led, OFF
led, OFF
led, OFF
led, OFF
led, OFF
led, OFF
led, OFF
led, OFF
reconnection in progress
led, ON
ConnectWiFi
led, OFF
1
led, OFF
3
led, ON
1
led, OFF
3
led, ON
1
led, OFF
3
led, ON
1
led, OFF
3
led, ON
1
led, OFF
3
led, ON
1
led, OFF
3
led, ON
1
led, OFF
3
led, ON

WiFi connected led, OFF
led, OFF
led, OFF
led, OFF
led, OFF
led, OFF
led, OFF
led, OFF
led, OFF
led, OFF
led, OFF

I translated some of the text. This is the the changed code. I changed the pin
gpio_13_led = 15 because I have a led on 15 on my boards. I commented out the relay initializations in setup.

Code: Select all// Load Wi-Fi library
#include <ESP8266WiFi.h>
#include <Wire.h>

// Assign output variables to GPIO pins
const int relayD1 = 12;
const int relayD2 = 4;
const int relayD3 = 5;
const int relayD4 = 15;
const int gpio_13_led = 15;  //led segnale wifi

const char* ssid = "ssssssss";
const char* password = "1111111111";

WiFiServer server(80);     // Set web server port number to 80

String header;    // Variable to store the HTTP request

int conta = 0;

//STATO RELE
int OFF = 0;
int ON = 1;

//===========================================
void setup() {

  Serial.begin(115200);
Serial.println("start");
  Serial.println("start");
  pinMode(gpio_13_led, OUTPUT);
  delay(200);
Serial.println("led, ON");
  digitalWrite(gpio_13_led, ON);
  delay(200);
  delay(2000);

  ConnectWiFi();

  delay(2000);
/*
  pinMode(relayD1, OUTPUT);
  pinMode(relayD2, OUTPUT);
  pinMode(relayD3, OUTPUT);
  pinMode(relayD4, OUTPUT);

  digitalWrite(relayD1, OFF);
  delay(100);
  digitalWrite(relayD2, OFF);
  delay(100);
  digitalWrite(relayD3, OFF);
  delay(100);
  digitalWrite(relayD4, OFF);
  delay(100);

  Serial.println("Setup PIN terminato");
  delay(200);
*/
   Serial.println("led, OFF");
  digitalWrite(gpio_13_led, OFF);
  delay(200);
  delay(1000);

  Serial.println(WiFi.localIP());
  server.begin();
}

//===========================================
void loop() {
  delay(100);
  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("reconnection in progress");
   Serial.println("led, ON");
    digitalWrite(gpio_13_led, ON);
    delay(200);
    ConnectWiFi();
    delay(1000);
  }
Serial.println("led, OFF");
  digitalWrite(gpio_13_led, OFF);
  delay(200);
  WiFiClient client = server.available();   // Listen for incoming clients
  if (client) {
    sendPageHtml(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
    while (client.connected()) {            // loop while the client's connected
      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) {

            closeConnection(client);


            String readString = getValue(header, ' ', 1);
            Serial.println("+++++++++++++++");
            Serial.println(readString);
            Serial.println("+++++++++++++++");

            /*if (header.indexOf("ON") >= 0) {
              String _PIN = readString.substring(4);
              int pinOn = _PIN.toInt();
              digitalWrite(pinOn, LOW);
              //Serial.println("LUCE ACCESA PIN " +pinOn);

              } else if (header.indexOf("OFF") >= 0) {
              String _PIN = readString.substring(5);
              int pinOn = _PIN.toInt();
              digitalWrite(pinOn, HIGH);
              //Serial.print("LUCE SPENTA "+pinOn);

              }else*/
            if (header.indexOf("RELE") >= 0) {
              //RECUPERO LA CORRENTE PASSATA DAL PIN
              String _PIN = readString.substring(6);
              int pinOn = getPinToMove(_PIN.toInt());
              digitalWrite(pinOn, ON);
              //Serial.println("RELE ACCESA "+pinOn);
              //ATTENDO DUE SECONDI, POI SPENGO IL PIN
              delay(250);
              digitalWrite(pinOn, OFF);
              delay(50);
            }



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

//------------------------------------------
void sendPageHtml(WiFiClient client) {
  client.println();
}


//------------------------------------------
void closeConnection(WiFiClient client) {
  client.println("HTTP/1.1 200 OK");
  client.println("Content-type:text/html");
  client.println("Connection: close");
  client.println();
}


//------------------------------------------
bool ConnectWiFi() {
 Serial.println("ConnectWiFi");
  WiFi.begin(ssid, password);
  IPAddress ip(192, 168, 100, 170);
  IPAddress subnet(255, 255, 255, 0);
  IPAddress gateway(192, 168, 100, 255);
  WiFi.config(ip, gateway, subnet);
   Serial.println("led, OFF");
  digitalWrite(gpio_13_led, OFF);
  delay(10000);

  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println(WiFi.status());
 Serial.println("led, OFF");
    digitalWrite(gpio_13_led, OFF);
    delay(50);
    Serial.println(WL_CONNECTED);
    WiFi.disconnect();
    delay(5000);
    WiFi.begin(ssid, password);
    WiFi.config(ip, gateway, subnet);
   Serial.println("led, ON");
    digitalWrite(gpio_13_led, ON);
    delay(50);
    delay(10000);
  }
  Serial.println("");
  Serial.print ("WiFi connected ");
  return true;
}

//------------------------------------------
String getValue(String data, char separator, int index)
{
  int found = 0;
  int strIndex[] = {0, -1};
  int maxIndex = data.length() - 1;

  for (int i = 0; i <= maxIndex && found <= index; i++) {
    if (data.charAt(i) == separator || i == maxIndex) {
      found++;
      strIndex[0] = strIndex[1] + 1;
      strIndex[1] = (i == maxIndex) ? i + 1 : i;
    }
  }

  return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}//fine metodo getvalue

//------------------------------------------
int getPinToMove(int idPin)
{
  switch (idPin) {
    case 1: return 12;
    case 2: return 5;
    case 3: return 4;
    case 4: return 15;
      // Qui sai che x è > 0 && < 4
      break;
  }
}
User avatar
By bircastri
#82861 No your code is correct but I can't see the LED to blink.

I can see this;

Code: Select allled, OFF
3
led, ON
1
led, OFF
3
led, ON
1
led, OFF
3
led, ON
1
led, OFF
3
led, ON
1
led, OFF
3
led, ON
1
led, OFF
3
led, ON


but I can't see the physic LED turn on turn off.

I can see only when the shield is connect at ROUTER, the led turn on, if the shiedl lose the connection, the led turn off. But I can't see it to blink
User avatar
By rudy
#82864 Try a different port pin, even if it is a relay. Because the code did turn on the LED for me.