Problema con 16 Channel Analog Multiplexer

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);
}

Su publicacion se MUEVE a su ubicacion actual ya que es mas adecuada.

Te falta comentar esta línea en el loop()

Publica nuevo lux cada 1 segundos

No edites tus posteos luego que alguien te hace comentarios (tienes el mismo horario que la respuesta de @anon90500195) porque luego no se observan los problemas. Solamente edita cuando no uses etiquetas o el moderador te lo pide.

De ningún modo el problema puede estar en el establecimiento del canal multiplexado.
Los erroes en los Wemos/ESP se deben a otras cosas. Generalmente librerías o errores mas dificiles de ver.

EDITO: El error señalado por @anon90500195 sigue estando pero al comentarlo el inconveniente señalado por el OP se mantiene.

Yo hecho un pequeño cambio al código. Eliminando Resetea() x ESP.restart()

#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");
      ESP.restart();
    }
  }
}

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 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);
}

Muchas gracias, probaré lo que indicas.

He cambiado el multiplexor y el problema continua, he cambiado tambien los pines en el WEMOS pero nada.....

Lo unico que veo por si me podeis ayudar es que si comento estas lineas:

Evidentemente no leo la salida del multiplexor pero ya no me devuelve la excepción y el sketch se ejecuta (por eso pensaba que el error fuese de ahí)

No se, la verdad es que estoy un poco perdido, mañana recibo otra placa WEMOS y probaré.

Muchas gracias por la ayuda

@anon90500195 gracias..... Si, lo se..... la verdad es que haciendo pruebas había estado comentando código y se me olvidó dejar esa linea como comentario...... a la primera que compilé me di cuenta

Bien entonces analicemos los pines que has elegido porque tal vez el problema este ahi.
Esta es la tabla que recomiendan respetar con los GPIO

Label GPIO Input Output Notes
D0 GPIO16 no interrupt no PWM or I2C support HIGH at boot
used to wake up from deep sleep
D1 GPIO5 OK OK often used as SCL (I2C)
D2 GPIO4 OK OK often used as SDA (I2C)
D3 GPIO0 pulled up OK connected to FLASH button, boot fails if pulled LOW
D4 GPIO2 pulled up OK HIGH at boot
connected to on-board LED, boot fails if pulled LOW
D5 GPIO14 OK OK SPI (SCLK)
D6 GPIO12 OK OK SPI (MISO)
D7 GPIO13 OK OK SPI (MOSI)
D8 GPIO15 pulled to GND OK SPI (CS)
Boot fails if pulled HIGH
RX GPIO3 OK RX pin HIGH at boot
TX GPIO1 TX pin OK HIGH at boot
debug output at boot, boot fails if pulled LOW

Como veras D4 y D8 tienen restricciones.

  • GPIO1: TX pin is high at BOOT, boot failure if pulled LOW
  • GPIO2: D4 pin is high on BOOT, boot failure if pulled LOW

OK, gracias @Surbyte , miraré de nuevo que pines usar.

De todas maneras no entiendo como se puede fastidiar de un día para otro..... Originalmente estaban así y fué compilar para cambiar los umbrales y empezó a darme la exception.

Aun n o me ha llegado la placa nueva, pero cambiaré los pines evitando el D4 y el D8 para ver si se soluciona el problema

Lo que no tienes en cuenta es que a veces se actualizan las cosas y el fastidio como dices se debe a eso, por esa razon debes verificar el estado de los core para el Wemos.
Tambien verifica la librería.
Siempre que hagas un programa coloca en tus comentarios las versiones con las que estas trabajando, las cosas son mas dinámicas de las que supones.
Cosas que funcionaban luego solo unos meses dejan de hacerlo por esto que te comento.
No eres el primero que ayudamos con este problema. Claro que estoy suponiendo.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.