Surely it is not a perfectly written code, but it is the result of copy&paste and help from other users of this community. However, the initial idea was to use a Sonoff Basic (R2 version) to open and close the door of my house.
On the new version of the Sonoff Basic (R2), they removed the GPIO14 but there is a pitch with the GPIO2. The GPIO1 and GPIO3 remain (RX and TX). By doing a lot of tests, I discovered that by connecting the magnetic switch (normally closed to GND) on the GPIO1 or GPIO2, to a possible reset of the device (or in the absence of current and restarting of it), the Sonoff went into flash mode (I think), however it did not restart. The only method from newbie (by doing some tests) was to use the GPIO3 as a magnetic contact, and insert the DHT probe on the GPIO2.
In the project (as a beginner) I noticed that the tripWire turns off the led widget a few seconds before, but not always (I still haven’t understood the operation of the various tripWire very well, maybe you can fix it by adding a delete/reset of the timer or other, but for now I like it so good).
So obviously mine is just an idea to be able to use a SONOFF BASIC R2 to open a gate or a door that are already controlled by wall buttons.
I also did a more complex program to open a gate and even stop it with a second relay, but I don’t put it because I’m ashamed of the code even more than this
Tips are obviously welcome!
#define BLYNK_PRINT Serial // Comment this out to disable prints and save space
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <DHT.h>
#include <DHT_U.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#define DHTPIN2 2
#define DHTTYPE DHT11
DHT dht2(DHTPIN2, DHTTYPE);
char auth[] = "xxx";
char ssid[] = "xxx";
char pass[] = "xxx";
int runDays; //only for widget counting UP TIME
int runHours;
int secsRemaining;
int runMinutes;
int runSeconds;
char buf[21];
unsigned long allSeconds;
int relay1 = 12; //relay sonoff basic active HIGH
int ledboard = 13; //led sonoff basic active LOW
int pulsante = 0; //on board switch
int switch1 = 3; //GPIO3 for an external magnetic switch
int relayState = HIGH;
int inMovimento = LOW;
boolean ledState = LOW;
int fast_timer_id;
int slow_timer_id;
BlynkTimer timer;
BlynkTimer tripWire;
WidgetLED led1(V2); //widget led IN MOVIMENTO
WidgetLED led3(V3); //widget led APERTO (OPEN DOOR with external magnetic contact on GPIO3)
WidgetLED ledb(V4); //widget led ONLINE DEVICE BLINKING
void setup() {
Serial.begin(9600);
Blynk.begin(auth, ssid, pass);
while (Blynk.connect() == false) {
// Wait until connected
}
dht2.begin();
ArduinoOTA.onError([](ota_error_t error) { ESP.restart(); });
ArduinoOTA.setHostname("Sonoff-Portone");
ArduinoOTA.begin();
timer.setInterval(30000L, sendDHT); // Temperature sensor DHT "polling" interval.
timer.setInterval(1005L, blinkLedB); // Blinking led widget
timer.setInterval(100L, pulsanteread); // Read the state of internal switch of sonoff
timer.setInterval(201L, switchread); // Read the state of external magnetic switch
timer.setInterval(1000L, UpTime); // Write on widget the UP TIME
pinMode(relay1, OUTPUT);
pinMode(ledboard, OUTPUT);
pinMode(pulsante, INPUT_PULLUP);
pinMode(switch1, INPUT_PULLUP);
inMovimento = LOW;
ledStop = LOW;
led1.off();
led3.off();
digitalWrite(relay1, LOW);
digitalWrite(ledboard, ledState);
Blynk.setProperty(V1, "color", "#FFFFFF"); //change color and label of app BOTTON for open and close door
Blynk.setProperty(V1, "onLabel", "APRI/CHIUDI");
Blynk.setProperty(V1, "offLabel", "APRI/CHIUDI");
fast_timer_id = timer.setInterval(100L, fInMovimento); //timer for blink the internal led differently, fast if the door is opening or closing, slowly when waiting for a command
timer.disable(fast_timer_id);
slow_timer_id = timer.setInterval(1000L, fInMovimento);
}
void UpTime() {
allSeconds = millis() / 1000;
runDays = allSeconds / 86400;
secsRemaining = allSeconds % 86400;
runHours = secsRemaining / 3600;
secsRemaining = allSeconds % 3600;
runMinutes = secsRemaining / 60;
runSeconds = secsRemaining % 60;
sprintf(buf, "%02dday %02d:%02d:%02d", runDays, runHours, runMinutes, runSeconds);
Blynk.virtualWrite(V14, buf); // Send UpTime seconds to App
}
BLYNK_CONNECTED() { // For write in widget the version of blynk/core, mac address, IP of device
Blynk.virtualWrite(V10, BLYNK_VERSION);
Blynk.virtualWrite(V11, ESP.getCoreVersion());
Blynk.virtualWrite(V12, WiFi.macAddress());
Blynk.virtualWrite(V13, WiFi.localIP().toString());
}
BLYNK_WRITE(V1) { //switch widget for open/close door
int read1 = param.asInt();
if (read1 == HIGH && inMovimento == LOW) {
digitalWrite(relay1, HIGH);
led1.on();
inMovimento = HIGH;
Blynk.setProperty(V1, "color", "#D3435C");
Blynk.setProperty(V1, "onLabel", "IN MOVIM");
Blynk.setProperty(V1, "offLabel", "IN MOVIM");
tripWire.setTimeout(700L, tripDeactivateOPEN);
tripWire.setTimeout(19000L, tripnonmovimento); // The time in ms of opening/closing the door completely
}
}
void tripDeactivateOPEN() {
digitalWrite(relay1, LOW);
}
void tripnonmovimento() {
led1.off();
inMovimento = LOW;
Blynk.setProperty(V1, "color", "#FFFFFF");
Blynk.setProperty(V1, "onLabel", "APRI/CHIUDI");
Blynk.setProperty(V1, "offLabel", "APRI/CHIUDI");
}
void sendDHT(){ //DHT reading
float h2 = dht2.readHumidity();
float t2 = dht2.readTemperature();
if (isnan(h2) || isnan(t2)) {
return;
}
Blynk.virtualWrite(V21, h2);
Blynk.virtualWrite(V20, t2);
}
void pulsanteread() { // Internal switch reading
if (digitalRead(pulsante) == LOW) {
digitalWrite(relay1, HIGH);
led1.on();
inMovimento = HIGH;
Blynk.setProperty(V1, "color", "#D3435C");
Blynk.setProperty(V1, "onLabel", "IN MOVIM");
Blynk.setProperty(V1, "offLabel", "IN MOVIM");
tripWire.setTimeout(700L, tripDeactivateOPEN);
tripWire.setTimeout(19000L, tripnonmovimento);
}
}
void switchread() { // Read magnetic switch for display on widget app the state of the door
if (digitalRead(switch1) == LOW) {
led3.off();
} else {
led3.on();
}
}
void fInMovimento(void) { // Blinking of internal led out of loop()
if ((inMovimento && timer.isEnabled(slow_timer_id)) ||
(!inMovimento && timer.isEnabled(fast_timer_id))) {
timer.toggle(slow_timer_id);
timer.toggle(fast_timer_id);
}
ledState = !ledState;
digitalWrite(ledboard, ledState);
}
void blinkLedB() // Blinking of a widget led on app for online status
{
if (ledb.getValue()) {
ledb.off();
} else {
ledb.on();
}
}
void loop()
{
Blynk.run();
timer.run();
tripWire.run();
ArduinoOTA.handle();
}
The app layout with OPEN/CLOSE DOOR and IN MOVEMENT / OPEN / ONLINE LED WIDGET
The unnecessary widget for UPTIME and IP
The modified Sonoff with the added DHT probe and the wires for external magnetic contact
The sonoff in position (I’m waiting for magnetic contact)
I received many suggestions in this community, thanks to everyone!!