Welcome, Guest
Username: Password: Remember me

TOPIC: WIFI switch with the ESP8266

WIFI switch with the ESP8266 6 months 2 weeks ago #3763

  • swisscore
  • swisscore's Avatar
  • Offline
  • New Member
  • Posts: 16
  • Karma: 0
Or here is another example with a relay :
/*

 It connects to an MQTT server then:
  - on 0 switches off relay
  - on 1 switches on relay
  - on 2 switches the state of the relay

  - sends 0 on off relay
  - sends 1 on on relay

 It will reconnect to the server if the connection is lost using a blocking
 reconnect function. See the 'mqtt_reconnect_nonblocking' example for how to
 achieve the same result without blocking the main loop.

 The current state is stored in EEPROM and restored on bootup

*/

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Bounce2.h>
#include <EEPROM.h>


const char* ssid = "YourSSID";
const char* password = "YourPASS";
const char* mqtt_server = "YourMQTTBroker'sIP";

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;

const char* outTopic = "Sonoff1out";
const char* inTopic = "Sonoff1in";

int relay_pin = 12;
int button_pin = 0;
bool relayState = LOW;

// Instantiate a Bounce object :
Bounce debouncer = Bounce(); 


void setup_wifi() {

  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    extButton();
    for(int i = 0; i<500; i++){
      extButton();
      delay(1);
    }
    Serial.print(".");
  }
  digitalWrite(13, LOW);
  delay(500);
  digitalWrite(13, HIGH);
  delay(500);
  digitalWrite(13, LOW);
  delay(500);
  digitalWrite(13, HIGH);
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();

  // Switch on the LED if an 1 was received as first character
  if ((char)payload[0] == '0') {
    digitalWrite(relay_pin, LOW);   // Turn the LED on (Note that LOW is the voltage level
    Serial.println("relay_pin -> LOW");
    relayState = LOW;
    EEPROM.write(0, relayState);    // Write state to EEPROM
    EEPROM.commit();
  } else if ((char)payload[0] == '1') {
    digitalWrite(relay_pin, HIGH);  // Turn the LED off by making the voltage HIGH
    Serial.println("relay_pin -> HIGH");
    relayState = HIGH;
    EEPROM.write(0, relayState);    // Write state to EEPROM
    EEPROM.commit();
  } else if ((char)payload[0] == '2') {
    relayState = !relayState;
    digitalWrite(relay_pin, relayState);  // Turn the LED off by making the voltage HIGH
    Serial.print("relay_pin -> switched to ");
    Serial.println(relayState); 
    EEPROM.write(0, relayState);    // Write state to EEPROM
    EEPROM.commit();
  }
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect("ESP8266Client")) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.publish(outTopic, "Sonoff1 booted");
      // ... and resubscribe
      client.subscribe(inTopic);
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      for(int i = 0; i<5000; i++){
        extButton();
        delay(1);
      }
    }
  }
}

void extButton() {
  debouncer.update();
   
   // Call code if Bounce fell (transition from HIGH to LOW) :
   if ( debouncer.fell() ) {
     Serial.println("Debouncer fell");
     // Toggle relay state :
     relayState = !relayState;
     digitalWrite(relay_pin,relayState);
     EEPROM.write(0, relayState);    // Write state to EEPROM
     if (relayState == 1){
      client.publish(outTopic, "1");
     }
     else if (relayState == 0){
      client.publish(outTopic, "0");
     }
   }
}

void setup() {
  EEPROM.begin(512);              // Begin eeprom to store on/off state
  pinMode(relay_pin, OUTPUT);     // Initialize the relay pin as an output
  pinMode(button_pin, INPUT);     // Initialize the relay pin as an output
  pinMode(13, OUTPUT);
  relayState = EEPROM.read(0);
  digitalWrite(relay_pin,relayState);
  
  debouncer.attach(button_pin);   // Use the bounce2 library to debounce the built in button
  debouncer.interval(50);         // Input must be low for 50 ms
  
  digitalWrite(13, LOW);          // Blink to indicate setup
  delay(500);
  digitalWrite(13, HIGH);
  delay(500);
  
  Serial.begin(115200);
  setup_wifi();                   // Connect to wifi 
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
}

void loop() {

  if (!client.connected()) {
    reconnect();
  }
  client.loop();
  extButton();
}
The administrator has disabled public write access.

WIFI switch with the ESP8266 6 months 2 weeks ago #3764

  • jonarotz
  • jonarotz's Avatar
  • Offline
  • New Member
  • Posts: 18
  • Karma: 0
I think I can stumble my way through this code, but does it still work using the EasyIOT cloud? Have you tested it? I would but I am not home at the moment.
The administrator has disabled public write access.

WIFI switch with the ESP8266 6 months 2 weeks ago #3765

  • EasyIoT
  • EasyIoT's Avatar
  • Offline
  • Administrator
  • Posts: 833
  • Thank you received: 258
  • Karma: 24
I see that there are a lot of questions regarding ESP8266 switch and how to increase number of DO pins. It is true, that example is complicated. It is plug and play, with AP configuration interface, stores values in EEPRM and local switch button.
I will prepare tutorial with just MQTT switch and more DO outputs. If functions are limited just to MQTT switch code is really simple.
Last Edit: 6 months 2 weeks ago by EasyIoT.
The administrator has disabled public write access.

WIFI switch with the ESP8266 6 months 2 weeks ago #3766

  • jonarotz
  • jonarotz's Avatar
  • Offline
  • New Member
  • Posts: 18
  • Karma: 0
EasyIoT wrote:
I see that there are a lot of questions regarding ESP8266 switch and how to increase number of DO pins. It is true, that example is complicated. It is plug and play, with AP configuration interface, stores values in EEPRM and local switch button.
I will prepare tutorial with just MQTT switch and more DO outputs. If functions are limited just to MQTT switch code is really simple.

This would be great!!!
The administrator has disabled public write access.

WIFI switch with the ESP8266 6 months 2 weeks ago #3767

  • EasyIoT
  • EasyIoT's Avatar
  • Offline
  • Administrator
  • Posts: 833
  • Thank you received: 258
  • Karma: 24
jonarotz wrote:
EasyIoT wrote:
I see that there are a lot of questions regarding ESP8266 switch and how to increase number of DO pins. It is true, that example is complicated. It is plug and play, with AP configuration interface, stores values in EEPRM and local switch button.
I will prepare tutorial with just MQTT switch and more DO outputs. If functions are limited just to MQTT switch code is really simple.

This would be great!!!

Here is example with more relays and single ESP8266:
iot-playground.com/blog/2-uncategorised/...ected-4-relay-switch
The administrator has disabled public write access.

WIFI switch with the ESP8266 6 months 2 weeks ago #3768

  • jonarotz
  • jonarotz's Avatar
  • Offline
  • New Member
  • Posts: 18
  • Karma: 0
[/quote]
Here is example with more relays and single ESP8266:
iot-playground.com/blog/2-uncategorised/...ected-4-relay-switch[/quote]

THANK YOU!!!!!!
The administrator has disabled public write access.
Time to create page: 0.193 seconds
Powered by Kunena Forum