Hi everyone! I’m Maximiliano, and i need some help.
I’ve made a WiFi controlled relay, using a ESP-01 (Like a homemade Sonoff, maybe?)
The information for the project is in this list:
- ESP-01 with WiFi connection
- Blynk server. Blynk Library version : 0.61
- Using tzapu WiFiManager library to save WiFi credentials, Blynk Token and Virtualpins
The issue
Working with the WiFiManager library i’ve managed to save and use the WiFi credentials, the Token and also the selected Virtual Pins (in INT variables), but when i try to use those virtual pins in BLYNK_WRITE() as an argument, the function does nothing.
The funny fact is that i have a synchronised physical button with the app and that button changes the app button state (and the output state) but this app button doesn’t change anything.
I’ve an idea of where is the problem (in the Char to Int conversion), but i don’t know why this is happening.
It works perfect if i choose an constant Virtual pin (like putting BLYNK_WRITE(Vpin) in the code), but i want to configure the argument without codding. Any idea?
/* Librerias a usar */
#include <FS.h> //File System, para almacenar variables en memoria flash
#include <ESP8266WiFi.h> //Header del ESP8266 y el control del WiFi
#include <DNSServer.h> //Header auxiliar para el WiFiManager
#include <ESP8266WebServer.h> //Header para montar un webserver en la red local
#include <WiFiManager.h> //Manejo del WiFi sin modificacionen del codigo
#include <ArduinoJson.h> //Header para modificar archivos JSON
#include <BlynkSimpleEsp8266.h>
//#define BLYNK_PRINT Serial //Comment this out to disable prints and save space
/* Asignacion de pines GPIO */
const int LED1 = 3, LED2 = 1;
const int BT1 = 0, BT2 = 2;
/* Variables globales auxiliares */
const bool ON = HIGH, OFF = LOW;
volatile bool L1State, L2State, BT1State, BT2State, Clear = false;
bool shouldSaveConfig = false;
volatile int relay1 = 0, relay2 = 0, lcdip = 0;
char blynk_token[34] = "";
char www_username[10] = "";
char www_password[10] = "";
char relay1vp[3] = "";
char relay2vp[3] = "";
char lcdvp[3] = "";
WidgetLCD lcd(lcdip);
/* Funciones auxiliares de Blynk */
BLYNK_CONNECTED() {
Blynk.syncVirtual(relay1);
Blynk.syncVirtual(relay2);
}
BLYNK_WRITE(relay1) {
if (param.asInt() == ON) {digitalWrite(LED1, ON); LED1Status = "On";}
else {digitalWrite(LED1, OFF); LED1Status = "Off";}
}
BLYNK_WRITE(relay2) {
if (param.asInt() == ON) {digitalWrite(LED2, ON); LED2Status = "On";}
else {digitalWrite(LED2, OFF); LED2Status = "Off";}
}
void saveConfigCallback();
void ICACHE_RAM_ATTR SyncBT1();
void ICACHE_RAM_ATTR SyncBT2();
void setup()
{
/* Config de Puerto Serial y GPIO */
Serial.begin(115200);
Serial.println();
pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(BT1, INPUT); pinMode(BT2, INPUT);
digitalWrite(LED1, OFF); digitalWrite(LED2, OFF);
attachInterrupt(digitalPinToInterrupt(BT1), SyncBT1, FALLING);
attachInterrupt(digitalPinToInterrupt(BT2), SyncBT2, FALLING);
/* Operacion con el SPIFFS para obtener credenciales WiFi, Token, etc */
if (SPIFFS.begin()) {
if (SPIFFS.exists("/config.json")) {
File configFile = SPIFFS.open("/config.json", "r");
if (configFile) {
size_t size = configFile.size();
std::unique_ptr<char[]> buf(new char[size]);
configFile.readBytes(buf.get(), size);
DynamicJsonBuffer jsonBuffer;
JsonObject& json = jsonBuffer.parseObject(buf.get());
json.printTo(Serial);
if (json.success()) {
strcpy(blynk_token, json["blynk_token"]);
strcpy(www_username, json["www_username"]);
strcpy(www_password, json["www_password"]);
strcpy(relay1vp, json["relay1vp"]);
strcpy(relay2vp, json["relay2vp"]);
strcpy(lcdvp, json["lcdvp"]);
}
}
}
}
/* Config. de parametros especiales del WiFiManager */
WiFiManagerParameter custom_blynk_token("blynk", "Token", blynk_token, 33);
WiFiManagerParameter custom_username("localusername", "Local Username", www_username, 8);
WiFiManagerParameter custom_password("localpassword", "Local password", www_password, 8);
WiFiManagerParameter custom_relay1("relay1vp", "Relay 1 VirtualPin", relay1vp, 1);
WiFiManagerParameter custom_relay2("relay2vp", "Relay 2 VirtualPin", relay2vp, 1);
WiFiManagerParameter custom_lcd("lcdvp", "LCD VirtualPin", lcdvp, 1);
WiFiManager wifiManager; //Instancia para manejo del WiFi
wifiManager.setSaveConfigCallback(saveConfigCallback);
wifiManager.setConfigPortalTimeout(180); //3 minutos de espera de conexion antes del reinicio
wifiManager.addParameter(&custom_blynk_token);
wifiManager.addParameter(&custom_username);
wifiManager.addParameter(&custom_password);
wifiManager.addParameter(&custom_relay1);
wifiManager.addParameter(&custom_relay2);
wifiManager.addParameter(&custom_lcd);
if (!wifiManager.autoConnect("ESP8233", "87654321")) {
delay(3000);
ESP.reset();
delay(5000);
}
strcpy(blynk_token, custom_blynk_token.getValue());
strcpy(www_username, custom_username.getValue());
strcpy(www_password, custom_password.getValue());
strcpy(relay1vp, custom_relay1.getValue());
strcpy(relay2vp, custom_relay2.getValue());
strcpy(lcdvp, custom_lcd.getValue());
/* Rutina auxiliar de almacenamiento de credenciales */
if (shouldSaveConfig) {
DynamicJsonBuffer jsonBuffer;
JsonObject& json = jsonBuffer.createObject();
json["blynk_token"] = blynk_token;
json["www_username"] = www_username;
json["www_password"] = www_password;
json["relay1vp"] = relay1vp;
json["relay2vp"] = relay2vp;
json["lcdvp"] = lcdvp;
File configFile = SPIFFS.open("/config.json", "w");
json.printTo(Serial);
json.printTo(configFile);
configFile.close();
}
relay1 = atoi(relay1vp);
relay2 = atoi(relay2vp);
lcdip = atoi(lcdvp);
Blynk.config(blynk_token); //Configuracion y conexion
Blynk.connect(); //del servicio Blynk
/* Widget de LCD 16x2 virtual, en Blynk */
lcd.clear();
lcd.print(4, 0, "IP Local");
lcd.print(2, 1, WiFi.localIP().toString());
}
void loop(){
Blynk.run(); //Inicializacion del sistema Blynk
if (Clear == true) {
WiFi.disconnect();
delay(3000);
ESP.reset();
delay(5000);
}
}
void saveConfigCallback()
{shouldSaveConfig = true;} //Bandera para guardar nueva informacion
void SyncBT1()
{
delayMicroseconds(100000);
if (digitalRead(BT2) == LOW) Clear = true;
if (digitalRead(LED1) == ON) {L1State = OFF; LED1Status="Off";}
else {L1State = ON; LED1Status="On";}
digitalWrite(LED1, L1State);
Blynk.virtualWrite(relay1, L1State);
}
void SyncBT2()
{
delayMicroseconds(100000);
if (digitalRead(BT1) == LOW) Clear = true;
if (digitalRead(LED2) == ON) {L2State = OFF; LED2Status="Off";}
else {L2State = ON; LED2Status="On";}
digitalWrite(LED2, L2State);
Blynk.virtualWrite(relay2, L2State);
}
PD: Sorry if i’ve made some writing mistakes, i’m not a native english talker. Thanks everyone!