Remontée d'état Wemos D1 mini + relay shield + button shield
Publié : 28 mai 2019, 15:10
Bonjour,
Je ne sais pas si je poste au bon endroit, bref je me lance...
Je dispose d'une Wemos D1 mini, d'un relay shield et d'un button shield sur un tripleur.
Le but des opérations ? Domotiser un interrupteur de plafonnier, avec un contrôle dans domoticz (dummy device) ET un contrôle physique (button shield).
Je me suis basé sur ce sketch : viewtopic.php?t=3530
Je l'ai modifié pour gérer le bouton :
code :
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
//Function declarations:
void handleRoot();
void handleOn();
void handleOff();
void handleToggle();
void handleNotFound();
const unsigned int inputPin = D3; // pushbutton connected to digital pin D3
int val = 0; // variable to store the read value
//WIFI SETTINGS:
const char* ssid = "ssid";
const char* pass = "psk";
//init http server on port 80:
ESP8266WebServer server(80);
//hardware stuff:
const unsigned int relayPin = D1;
//const unsigned int relayPin = BUILTIN_LED;
bool lightState=false; // True=on , false=off
void setup() {
Serial.begin(115200);
WiFi.hostname("Relais_01");
WiFi.mode(WIFI_STA); //neccesary?
WiFi.begin(ssid,pass);
pinMode(relayPin,OUTPUT);
pinMode(inputPin, INPUT); // set pin as input
digitalWrite(relayPin,HIGH);
Serial.println("Relay => OFF !");
digitalWrite(inputPin,LOW);
//Let WiFi become stable
delay(500);
Serial.print("Waiting for WiFi connected : ");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("WiFi up!");
Serial.print(" IPv4: ");
Serial.println(WiFi.localIP());
if (MDNS.begin("Relais_80")) {
Serial.println("MDNS responder started");
}
//Connect callbacks on http requests
server.on("/relay", handleRoot);
server.on("/relay/on", handleOn);
server.on("/relay/off", handleOff);
server.on("/relay/toggle", handleToggle);
server.onNotFound(handleRoot);
server.begin();
Serial.println("HTTP server started");
}
void loop() {
server.handleClient();
yield();
val = digitalRead(inputPin); // read the input pin
handleToggle();
}
//http server:
// Differents callbacks appelés par Webserver suivant requête
void handleRoot() {
Serial.println("client request on /relay");
//server.send(200, "text/plain", "hello from esp8266!");
server.sendContent("HTTP/1.1 200 OK\r\n"); //send new p\r\nage
server.sendContent("Content-Type: text/html\r\n");
server.sendContent("\r\n");
server.sendContent("<HTML>\r\n");
server.sendContent("<HEAD>\r\n");
server.sendContent("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">"); //zoom to width of window
server.sendContent("<meta name='apple-mobile-web-app-capable' content='yes' />\r\n");
server.sendContent("<meta name='apple-mobile-web-app-status-bar-style' content='black-translucent' />\r\n");
server.sendContent("<link rel='stylesheet' type='text/css' href='https://moore.dk/doorcss.css' />\r\n"); //External CSS
server.sendContent("<TITLE>relais on/off</TITLE>\r\n");
server.sendContent("</HEAD>\r\n");
server.sendContent("<BODY>\r\n");
if(lightState)
server.sendContent("<H1>Relais est ON.</H1>\r\n");
else
server.sendContent("<H1>Relais est OFF.</H1>\r\n");
server.sendContent("<hr />\r\n");
// server.sendContent("<H2>vBatt: ");
// server.sendContent(String(vBatt));
// server.sendContent("</H2>\r\n");
server.sendContent("<br />\r\n");
server.sendContent("<br />\r\n");
server.sendContent("<a class=\"red\" align=left href=\"/relay/off\"\">Forcer OFF</a>");
server.sendContent("<a align=right href=\"/relay/on\"\">Forcer ON</a>\r\n");
server.sendContent("<br />\r\n");
server.sendContent("<br />\r\n");
server.sendContent("<hr />\r\n");
server.sendContent("<br />\r\n");
if(lightState)
server.sendContent("<a class=\"red\" href=\"/relay/toggle\"\">Commuter sur OFF !</a>\r\n");
else
server.sendContent("<a href=\"/relay/toggle\"\">Commuter sur ON!</a>\r\n");
server.sendContent("<br />\r\n");
server.sendContent("</BODY>\r\n");
server.sendContent("</HTML>\r\n");
}
void handleOff(){
Serial.println("client request on /relay/off");
lightState=false;
setstate();
}
void handleOn(){
Serial.println("client request on /relay/on");
lightState=true;
setstate();
}
void handleToggle(){
if (val== LOW) {
delay(250);
Serial.println("client request on /relay/toggle");
lightState=!lightState;
setstate();
}
}
void setstate(){
if(lightState)
{
digitalWrite(relayPin,HIGH);
Serial.println("relay on..");
} else {
digitalWrite(relayPin,LOW);
Serial.println("relay off..");
}
//reply to client with redirect to root, to update status of light in browser
server.sendContent("HTTP/1.1 303 See Other\r\n");
server.sendContent("Location: /relay\r\n");
server.sendContent("\r\n"); //EOT
}
Tout fonctionne, l'interface web, Siri, etc... Là où ça coince c'est quand j'appuie sur le bouton. Le relais change bien d'état mais le "dummy device" ne se met pas à jour. En clair je souhaite que domoticz et mon bouton soient "connectés".
Ma première question : est-ce réalisable simplement (comme vous avez pu voir je suis newbie en programmation...)?
Ensuite, il y a la fonction "void setstate()" y aurait pas quelquechose à faire avec ça ?
Voilà, merci pour votre aide...
Je ne sais pas si je poste au bon endroit, bref je me lance...
Je dispose d'une Wemos D1 mini, d'un relay shield et d'un button shield sur un tripleur.
Le but des opérations ? Domotiser un interrupteur de plafonnier, avec un contrôle dans domoticz (dummy device) ET un contrôle physique (button shield).
Je me suis basé sur ce sketch : viewtopic.php?t=3530
Je l'ai modifié pour gérer le bouton :
code :
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
//Function declarations:
void handleRoot();
void handleOn();
void handleOff();
void handleToggle();
void handleNotFound();
const unsigned int inputPin = D3; // pushbutton connected to digital pin D3
int val = 0; // variable to store the read value
//WIFI SETTINGS:
const char* ssid = "ssid";
const char* pass = "psk";
//init http server on port 80:
ESP8266WebServer server(80);
//hardware stuff:
const unsigned int relayPin = D1;
//const unsigned int relayPin = BUILTIN_LED;
bool lightState=false; // True=on , false=off
void setup() {
Serial.begin(115200);
WiFi.hostname("Relais_01");
WiFi.mode(WIFI_STA); //neccesary?
WiFi.begin(ssid,pass);
pinMode(relayPin,OUTPUT);
pinMode(inputPin, INPUT); // set pin as input
digitalWrite(relayPin,HIGH);
Serial.println("Relay => OFF !");
digitalWrite(inputPin,LOW);
//Let WiFi become stable
delay(500);
Serial.print("Waiting for WiFi connected : ");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("WiFi up!");
Serial.print(" IPv4: ");
Serial.println(WiFi.localIP());
if (MDNS.begin("Relais_80")) {
Serial.println("MDNS responder started");
}
//Connect callbacks on http requests
server.on("/relay", handleRoot);
server.on("/relay/on", handleOn);
server.on("/relay/off", handleOff);
server.on("/relay/toggle", handleToggle);
server.onNotFound(handleRoot);
server.begin();
Serial.println("HTTP server started");
}
void loop() {
server.handleClient();
yield();
val = digitalRead(inputPin); // read the input pin
handleToggle();
}
//http server:
// Differents callbacks appelés par Webserver suivant requête
void handleRoot() {
Serial.println("client request on /relay");
//server.send(200, "text/plain", "hello from esp8266!");
server.sendContent("HTTP/1.1 200 OK\r\n"); //send new p\r\nage
server.sendContent("Content-Type: text/html\r\n");
server.sendContent("\r\n");
server.sendContent("<HTML>\r\n");
server.sendContent("<HEAD>\r\n");
server.sendContent("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">"); //zoom to width of window
server.sendContent("<meta name='apple-mobile-web-app-capable' content='yes' />\r\n");
server.sendContent("<meta name='apple-mobile-web-app-status-bar-style' content='black-translucent' />\r\n");
server.sendContent("<link rel='stylesheet' type='text/css' href='https://moore.dk/doorcss.css' />\r\n"); //External CSS
server.sendContent("<TITLE>relais on/off</TITLE>\r\n");
server.sendContent("</HEAD>\r\n");
server.sendContent("<BODY>\r\n");
if(lightState)
server.sendContent("<H1>Relais est ON.</H1>\r\n");
else
server.sendContent("<H1>Relais est OFF.</H1>\r\n");
server.sendContent("<hr />\r\n");
// server.sendContent("<H2>vBatt: ");
// server.sendContent(String(vBatt));
// server.sendContent("</H2>\r\n");
server.sendContent("<br />\r\n");
server.sendContent("<br />\r\n");
server.sendContent("<a class=\"red\" align=left href=\"/relay/off\"\">Forcer OFF</a>");
server.sendContent("<a align=right href=\"/relay/on\"\">Forcer ON</a>\r\n");
server.sendContent("<br />\r\n");
server.sendContent("<br />\r\n");
server.sendContent("<hr />\r\n");
server.sendContent("<br />\r\n");
if(lightState)
server.sendContent("<a class=\"red\" href=\"/relay/toggle\"\">Commuter sur OFF !</a>\r\n");
else
server.sendContent("<a href=\"/relay/toggle\"\">Commuter sur ON!</a>\r\n");
server.sendContent("<br />\r\n");
server.sendContent("</BODY>\r\n");
server.sendContent("</HTML>\r\n");
}
void handleOff(){
Serial.println("client request on /relay/off");
lightState=false;
setstate();
}
void handleOn(){
Serial.println("client request on /relay/on");
lightState=true;
setstate();
}
void handleToggle(){
if (val== LOW) {
delay(250);
Serial.println("client request on /relay/toggle");
lightState=!lightState;
setstate();
}
}
void setstate(){
if(lightState)
{
digitalWrite(relayPin,HIGH);
Serial.println("relay on..");
} else {
digitalWrite(relayPin,LOW);
Serial.println("relay off..");
}
//reply to client with redirect to root, to update status of light in browser
server.sendContent("HTTP/1.1 303 See Other\r\n");
server.sendContent("Location: /relay\r\n");
server.sendContent("\r\n"); //EOT
}
Tout fonctionne, l'interface web, Siri, etc... Là où ça coince c'est quand j'appuie sur le bouton. Le relais change bien d'état mais le "dummy device" ne se met pas à jour. En clair je souhaite que domoticz et mon bouton soient "connectés".
Ma première question : est-ce réalisable simplement (comme vous avez pu voir je suis newbie en programmation...)?
Ensuite, il y a la fonction "void setstate()" y aurait pas quelquechose à faire avec ça ?
Voilà, merci pour votre aide...