Buenas tardes.
De nuevo acudo aquí a ver si alguien puede ayudarme a resolver este problema.
Tengo instalado un sketch en un WEMOS D1. Este programa lo unico que hace es leer dos LDRs y libera un electroiman si la lectura coincide con los umbrales que hay puestos.
El WEMOS se conecta a una wifi y a través de Node-Red se pueden visualizar los valores desde un ordenador en la sala de Game Master.
Hoy he realizado una modificación (los umbrales) y el sketch empieza a dar este error:
exception (0):
epc1=0x4020109a epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000
Utilizo un multiplexor de 16 canales para la lectura de los LDRs y creo que el problema está ahí, no se si me ha podido "fastidiar" el multiplexor.
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
//const int LDR1Pin = 16; //GPIO16 - D0
//const int LDR2Pin = 5; //GPIO5 - D1
const int ledPin = 0; //GPIO0 - D3
const int ledPin2 = 15; //GPIO15 - D8
const int threshold = 100; // Valor máximo para abrir cajón
const byte lockPin=4; //GPIO04 - D2 A este pin se le enviará un pulso ALTO cuando se ingrese la solución correcta para abrir cajón
const long A = 1000; //Resistencia en oscuridad en KΩ
const int B = 15; //Resistencia a la luz (10 Lux) en KΩ
const int Rc = 10; //Resistencia calibracion en KΩ
//Multiplexor
const int muxSIG = A0;
const int muxS0 = 2;
const int muxS1 = 14;
const int muxS2 = 13;
const int muxS3 = 12;
int SetMuxChannel(byte channel)
{
digitalWrite(muxS0, bitRead(channel, 0));
digitalWrite(muxS1, bitRead(channel, 1));
digitalWrite(muxS2, bitRead(channel, 2));
digitalWrite(muxS3, bitRead(channel, 3));
}
// Modifica estos valores para tu red.
const char* ssid = "Livebox6-CBDD";
const char* password = "3T6nCTfHk59S";
const char* mqtt_server = "broker.mqtt-dashboard.com";
WiFiClient espClient;
PubSubClient client(espClient);
int value = 0;
boolean puertaCerrada=true;
int V_1;
int V_2;
int ilum;
boolean juegoResuelto=false;
// Timers auxiliar variables
long now = millis();
long lastMeasure = 0;
void setup_wifi() {
delay(10);
// Arrancamos la conexión via WIFI a la red
Serial.println();
Serial.print("Conectando a... ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi conectada");
Serial.print("Dirección IP: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Llega mensaje [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
char receivedChar = (char)payload[i];
Serial.print(receivedChar);
ctrlMensajes(topic, receivedChar);
}
Serial.println();
}
void ctrlMensajes(String topic, byte receivedChar){
if (topic == "demonios/desbloquear"){
if(receivedChar == '1'){
Serial.println("CONTROL WIFI RESUELVE");
desbloquea();
}
}
if (topic == "demonios/reset"){
if(receivedChar == '1'){
Serial.println("CONTROL WIFI RESET");
Resetea();
}
}
}
void reconnect() {
// Bucle hasta reconectar
while (!client.connected()) {
Serial.print("Esperando conexión MQTT...");
// Crea un client ID aleatorio
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
// Esperando conectar
if (client.connect(clientId.c_str())) {
Serial.println("conectado");
// Una vez conectado, publica...
// ... y subscribe
client.subscribe("demonios/desbloquear");
//client.subscribe("peso/control");
client.subscribe("demonios/reset");
} else {
Serial.print("fallo, rc=");
Serial.print(client.state());
Serial.println(" intentalo de nuevo en 5 segundos");
delay(5000);
}
}
}
void(* Resetea) (void) = 0;
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
pinMode(muxS0, OUTPUT);
pinMode(muxS1, OUTPUT);
pinMode(muxS2, OUTPUT);
pinMode(muxS3, OUTPUT);
pinMode(ledPin, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(lockPin, OUTPUT); // Pone el lockPin como salida
digitalWrite(lockPin, HIGH);
digitalWrite(ledPin, LOW);
digitalWrite(ledPin2, LOW);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
SetMuxChannel(2); // LDR Derecha ABAD
byte muxValue1 = analogRead(muxSIG);
SetMuxChannel(13); // LDR Izquierda ABAD
byte muxValue2 = analogRead(muxSIG);
Serial.print("Lectura analógica derecha: ");
Serial.println(muxValue1);
Serial.print("Lectura analógica izquierda: ");
Serial.println(muxValue2);
delay(1000);
now = millis();
Publica nuevo lux cada 1 segundos
if (now - lastMeasure > 1000) {
lastMeasure = now;
char intluz1[3];
dtostrf(muxValue1, 3, 0, intluz1);
client.publish("demonios/luzderecha", intluz1);
char intluz2[3];
dtostrf(muxValue2, 3, 0, intluz2);
client.publish("demonios/luzizquierda", intluz2);
}
if (((muxValue1 > 150) && (muxValue2 > 100)) && (juegoResuelto==false)) {
Serial.println("JUEGO RESUELTO");
desbloquea();
}
}
void desbloquea() {
juegoResuelto=true;
digitalWrite(lockPin, LOW);
digitalWrite(ledPin, HIGH);
digitalWrite(ledPin2, HIGH);
delay(50);
digitalWrite(lockPin, HIGH);
}