Depurar codigo con fallos de blynk esp32

Hola buenos días vengo desarrollando un sistema de llamada de usuario que me llama cuando tiene un problema en una maquina.
He desarrollado un software que cuando pulsas un botón envía una señal a blynk iot
y esta manda una notificación.
También registro varias señales de temperatura y activación de varios puntos de la maquina .Me gustaría saber que os parece a vosotros este código si necesitáis mas información os la facilitare el caso es que estoy inmerso en el proyecto y tengo varios dispositivos distribuidos. A veces el problema es que se queda la señal de llamada activa y no soy capaz de desactivarla con el botón de final de llamada hasta que no le doy a activar y desactivar de nuevo entonces si actúa.
Creo que uno de los de los problemas puede venir del programa.
Me gustaría que me ayudarais ya que estoy un poco agobiado con las fallas y el caso es que no se por donde tirar ya he probado a poner un reinicio cada 4h pero tampoco y creo que puede ser contraproducente.
Otro fallo a veces es que se activa la señal de llamada sola, tengo puestas unas resistencia se 4k7 en cada una de las inputs ya que no fio mucho de las resistencia de esp 32 por cierto el esp es un wroom 32u también tengo un condensador el la entrada de 3,3v a gnd de 100uf 16v y el caso es que no falla siempre solo cada tiempo y no es cíclico,
ya que no se de donde puede ser, lo que mas me urge es el problema de que no se desactiva la llamada al darle a fin de llamada y eso es problema de software a ver que veis gracias por vuestra ayuda.
un saludo espero no haberlo hecho muy tocho lo siento.


//23 luz boton
//14 aceite bajo
//35 analogica entrada temperatura 10k a ,masa y potenciometro de 100k puesto a 21k
//4 baliza roja
//12 llamada operario
//32 conteo caja
//33 final de averia

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define BLYNK_TEMPLATE_ID "cgxbhgdbhg"
#define BLYNK_DEVICE_NAME "rodadura"
#define BLYNK_FIRMWARE_VERSION        "0.1.0"
#define BLYNK_PRINT Serial
#include <Preferences.h>
//#define BLYNK_DEBUG
#define APP_DEBUG
#define USE_ESP32_DEV_MODULE
#include "BlynkEdgent.h"
#include <Arduino.h>
#include <WiFi.h>
#define OLED_RESET     -1 // Reset pin
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

char ssidi[] = "gfhfsdgdfg";
char passa[] = "dghdghg";
unsigned long h;//-----------------------
int j = 0;//
int l = 0;//variables desde pantalla
int n = 0;//-----------------------------
int r = 0;//variable baliza roja para que no sea pulsado mas de uan vez
int k = 0;// asegura de que no se llame a final de averia si esta en llamada operario
int o = 0;// asegura de que no se llame a final de averia si esta en llamada operario
int q = 0;//nivel minimo de aceite variable para que no sea activado continuamente
int w ;//variable contador de cajas parcial V1
int x = 0;
int z ;//variable contador de cajas total V8
int luzboton = 23;
int aceitedepo = 14;
int cero=13;
unsigned long tiempo_guardado  ;
unsigned long tiempo_guardado1  ;
int llamadaoperario;
int finalaveria;
int bl ;//   BALIZA ROJA 
float temp = 35; //etiqueta para lectura anal�gica PARA SENSOR DE TEMPERAURA
int y = 0;
long rssi;
Preferences preference;

BLYNK_WRITE(V6) { //SENSOR MINIMO ACEITE DEL DEPOSITO esta asociada a la aplicacion atraves de V0 y V0 es correo
  int pinValue = param.asInt();//asocia pinValue a un entero en este caso es V0 que es pin 5 de wemos que D1
  digitalWrite(aceitedepo, pinValue);//V0 es correo
}
//-------------------------------------boleanos para los leds de la aplicacion.

BlynkTimer timer;
WidgetLED led3(V2);//ESTE ES EL LED DE LA BALIZA ROJA ES UN BOLEANO QUE VIGILA LA SEÑAL PARA CAMBIAR DE ESSTADO

boolean btnState = false;
void ledblynk()
{

  boolean isPressed = (digitalRead(4) == HIGH);

  if (isPressed != btnState) {
    if (isPressed) {
      led3.on();
      r = 1;
    } else {
      led3.off();
      r = 0;
    }
    btnState = isPressed;
  }
}
WidgetLED led4(V3);//ESTE ES EL LED DE LLAMADA DE OPERARIO ES UN BOLEANO QUE VIGILA LA SEÑAL PARA CAMBIAR DE ESSTADO

boolean btnState1 = false;
void ledblynk1()
{

  boolean isPressed = (digitalRead(12) == HIGH);

  if (isPressed != btnState1) {
    if (isPressed) {
      led4.on();
      k = 1;
    }
    btnState1 = isPressed;
  }
}
WidgetLED led5(V6);//ESTE ES EL LED DE NIVEL MINIMO DE DEPOSITO ES UN BOLEANO QUE VIGILA LA SEÑAL PARA CAMBIAR DE ESSTADO

boolean btnState2 = false;
void ledblynk2()
{

  boolean isPressed = (digitalRead(14) == HIGH);

  if (isPressed != btnState2) {
    if (isPressed) {
      led5.off();
      unsigned long tiempo = millis();
      tiempo_guardado = tiempo;
    } else {
      led5.on();
      q = 0;
    }
    btnState2 = isPressed;
  }
}

WidgetLED led6(V5);//ESTE ES EL LED de conteo de las cajas rodadas

boolean btnState3 = false;
void ledblynk3()
{
  unsigned long tiempo = millis();
  boolean isPressed = (digitalRead(32) == LOW);

  if (isPressed != btnState3) {
    if (isPressed) {
      led6.off();
    } else {
      led6.on();
      tiempo_guardado1 = tiempo;
      x = 1;
      delay(100);
    }
    btnState3 = isPressed;
  }
}
void temperatura()
{
  //++++++++++++++++++++++++++++++++++analogica de temperatura
  int pot;
  pot = analogRead(temp);
  y = map(pot, 0, 4095, 0, 100); //funci�n map para escalado
  Blynk.virtualWrite(V0, y);
  Serial.println(y);
  if ( y >= 80)
  {
    Serial.println("temperatura alta");
    Blynk.logEvent("tempalta");
  }
}
///-------------------------------llamada operario
void operario()
{
   unsigned long tiempo = millis();
  llamadaoperario = digitalRead(12);//  12 LLAMADA OPERARIO ES U positivo LA SEÑAL ES DE ENTRADA
  if ( (llamadaoperario == HIGH) && ( k == 1) && (o == 0))
  {
    digitalWrite(luzboton, HIGH);
    Serial.println("se ha pulsado boton de llamada");
    Blynk.logEvent("llamaope");
    ledblynk1();
    o = 1;
  }
}
//---------------funcion final de averia
void finalave()
{
  finalaveria = digitalRead(33);
  if  ((finalaveria == HIGH) && (o == 1))
  {

    led4.off();
    Blynk.virtualWrite(V7, 33);
    Serial.println("se ha terminado la averia");
    Blynk.logEvent("finalaveria");
    o = 0;
    digitalWrite(luzboton, LOW);
  }
}
//----------------BALIZA ROJA
void baliza()
{
  bl = digitalRead(4);
  if ( (bl == HIGH) && (r == 0))
  {
    Serial.println("baliza roja encendida");
    Blynk.logEvent("balizaroja");
    ledblynk();
  }
}

//-------------------resear contador  parcial  pin 13
void contadorcero()
{
  int ceroo= digitalRead(cero);
  if (ceroo==HIGH ) {
    w = 0;
    preference.remove("parcial");
    Blynk.virtualWrite(V1, w);
    Serial.println("parcial a cero");
  }
}
void conteo()
{
  //----------cuenta caja cada vez que se rueda 5 minutos seguidos para llevar preventivos en cuenta

  unsigned long tiempo = millis();
  int cuenta = digitalRead(32);//conteo cajas
  if ((cuenta == 1) && (tiempo - tiempo_guardado1 >= 300000) && (btnState3 == LOW) && (x == 1)) {

    preference.putUInt("parcial", w);
    w++;
    Blynk.virtualWrite(V1, w);
    preference.putUInt("fijo", z);
    z++;
    Blynk.virtualWrite(V8, z);
    x = 0;
    Serial.println("caja rodada ");

  }
}
//----------------------señal minimo de aceite
void aceite()
{
  unsigned long tiempo = millis();
  if ((tiempo - tiempo_guardado >= 10000) && (btnState2 == 1) && (q == 0)) //envia a los 10 segundos de falta de aceite
  {
    q = 1;
    Serial.println("bajo  nivel de aceite");
    Blynk.logEvent("minimoaceite");
    ledblynk2();
  }
}
void rssimi()
{
  rssi = WiFi.RSSI();
  Blynk.virtualWrite(V9, rssi); 
  Serial.println(rssi);
}  
void setup()
{
  Serial.begin(115200);
    
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); 
  }
  preference.begin("my-app", false);
  w = preference.getUInt("parcial", 0);
  z = preference.getUInt("fijo", 0);
  WiFi.begin(ssidi, passa);
  timer.setInterval(8209L, temperatura);
  timer.setInterval(8783L, ledblynk);//baliza roja
  timer.setInterval(7529L, aceite);
  timer.setInterval(5839L, ledblynk2);//nivel aceite
  timer.setInterval(6367L, contadorcero);
  timer.setInterval(3037L, conteo);
  timer.setInterval(2477L, ledblynk3);//conteo de cajas
  timer.setInterval(2111L, pantalla);
  timer.setInterval(1597L, baliza);
  timer.setInterval(919L, ledblynk1);//led lamada operario cada 900ms   
  timer.setInterval(619L, operario);
  timer.setInterval(439L, finalave);// se vigila cada 439ms
  timer.setInterval(5209L, rssimi);


  BlynkEdgent.begin();
  pinMode(luzboton, OUTPUT);
  pinMode(14, INPUT);
  pinMode(12, INPUT);
  pinMode(32, INPUT);
  pinMode(33, INPUT);
  pinMode(4, INPUT);
  pinMode(cero, INPUT);
  pinMode(2, OUTPUT);
 
}
void loop() {
  BlynkEdgent.run();
  timer.run();
  unsigned long reinicio=millis();
  if(reinicio == 3600000){
     Serial.println("restaurando");
    ESP.restart();
    
  }
}
//-----------------------señales de pantalla
void pantalla()
{
  h = digitalRead(14); // SENSOR DE ACEITE ES POSITIVO LA SEÑAL DE ENTRADA
  j = digitalRead(12); //  LLAMADA OPERARIO ES un positivo LA SEÑAL ES DE ENTRADA
  l = digitalRead(4); //   BALIZA ROJA ACTIVA  LA SEÑAL DE ENTRADA ES positivo
  n = digitalRead(33); // final averia ES positivo LA SEÑAL DE ENTRADA
  //-----------------------------------DIBIJO DE CUADROS Y SEÑALES DE ENTRADA Y SALIDA
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,6);
  display.println("LLAMADA OPERARIO");

      display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,16);
  display.println("NUMERO RODAJES");

        display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,36);
  display.println("BALIZA ROJA");

        display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,46);
  display.println("FINAL AVERIA");

   
      display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,26);
  display.println("SENSOR ACEITE");

       display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,56);
  display.println("TEMPERATURA ACIT");
  if (h == 0) {
   display.setCursor(120, 26);
  display.println("1");
  }
  if (h != 0) {
   display.setCursor(120, 26);
  display.println("0");
  }

  display.setCursor(114, 16);
  display.println(w);

  if (j == 0) {               //llamada operario
     display.setCursor(120, 6);
  display.println("0");
  }
  if (j != 0) {
     display.setCursor(120, 6);
  display.println("1");
  }
  if (l != 0) {
    display.setCursor(120, 36);
  display.println("1");
  }
  if (l == 0) {
    display.setCursor(120, 36);
  display.println("0");
  }
  if (n != 0) {
   display.setCursor(120, 46);
  display.println("1");
  }
  if (n == 0) {
  display.setCursor(120, 46);
  display.println("0");
  }
    display.setCursor(114, 56);
  display.println(y);
 display.display();

}```

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

1 Like

Moderador:
Por favor, lee las Normas del foro
Si posteas en el foro en inglés usa idioma inglés para expresarte, eso incluye los comentarios de tu código. Si un código tiene comentarios en español también moverán tu hilo a esta sección en Español.
Si escribes en español debes usar el foro Arduino en español

Ese código es para Blynk y no tenemos la app o acceso a una compartida. Imposible o muy dificil de seguir en estas condiciones.

Perdona juraría que lo había compartido en el foro español lo siento la próxima vez tendré mas cuidado ya que busque foro en español y me salió esta pagina un saludo y gracias aunque no podáis haberme ayudado espero no haber molestado.