Problema con señal de arranque en 8266

¿No podrías poner una fotorresistencia LDR?

Las hay con algunas decenas o centenas de ohms a plena luz y 1 megaohm o más en la oscuridad.

La conectas a GND y al pin (que ya tiene pullup).
Así cuando enciende la lámpara e ilumina la LDR, cae la resistencia de la misma y daría el LOW que necesitas. Se apaga la lámpara, la resistencia de la LDR aumenta y la pullup fija el HIGH.

Lo malo es que son algo lentas, tal vez le tome varios segundos algunas décimas de segundo llegar a generar el LOW, no se si es algo crítico.
Lo bueno que casi que te evitas instalaciones complicadas por las limitaciones que tienes, solo necesitas ubicarla en un punto que reciba buena luz de la lámpara.

Edito: eran décimas

Hola PeterKantTropus: me gusta. No había pensado en usar la gpio0 para habilitar la señal de la bombilla al GPIO2. Gracias, haré pruebas.

Hola gatul. Tampoco había pensado en una ldr, pero me has matado en el tiempo de respuesta. no lo he medido, pero a veces la bombilla hace 2 o 3 pulsos por segundo. De hecho, lo primero que tengo que hacer es guardar los tiempos entre apagados y encendidos con un mega. Espero que no sean una barbaridad en unas 20 o 30 horas.

Gracias a los 2 y saludos

Ahí modifiqué algo que había puesto erróneamente, típicamente las LDR tienen un tiempo de respuesta de 0.1 seg. De todos modos sería lenta para tu proyecto.

Bien, la cosa es que te has explicado mal desde el comienzo creo yo.
Hubieras comenzado diciendo: tengo una bombilla (lámpara) que se quema y parra simularlo uso un swith o pulsador y deseo detectar esos momentos usando un ESP01

La mayoría de las cosas si estan claras pero el sentido u objetivo no lo estaba hasta hace poco. Siempre es importante precisarlo para que todos nos enfoquemos y no estemos 15 post después entendiendo de qué se trata.

Las lámparas se queman por ser de mala calidad (alto %) o trabajar en condiciones no aptas (temperatura), se me ocurre preguntarte si puedes hacer algo por esa lámpara o como dices solo tienes dos hilos y debes tolerar lo que pase cuando se le ocurra pasar y punto.

Si puedes hacer algo que tal de hacer que la lámpara trabaje mas segura? Que la quema para comenzar? Eso no será facil de determinar si se debe a su fabricación. Si tuvieras alcance a la lámpara que tal modificar con un ATtiny85 usando PWM y un MOSFET para que lo haga como dije mas segura. Tal vez el problema solo sea su arranque y uno mas suave cambiaría su vida útil. Es para considerarlo no?
Pero creo que nada de esto es posible. Solo he divagado un poco.

surbyte:
...Pero creo que nada de esto es posible. Solo he divagado un poco.

Y si...
El necesita emparchar una pinchadura y tu le sugieres rediseñar el neumático. :grin:

¡Es una broma!

Me has pillao surbyte. No entiendo de que hablas.
Mi primera frase fue: Tengo que controlar cuando se enciende (o se apaga) una bombilla de 12V y enviarlo a telegram

Días después explique que cuando esa bombilla se funde, o se quita, la máquina se para. Nunca he dicho que quiera controlar cuando la bombilla se quema.
Te explico el funcionamiento (lo que se, claro) de la bombilla, aunque creo que mas o menos lo he explicado
La máquina es totalmente automática. Recoge de un silo una piezas metálicas, las transforma y las manda a un contenedor. Cuando se atasca el silo, pega 1 pulso y se para la máquina. Cuando se llena el contenedor se enciende fija y se para la máquina. Y si lleva varios segundos sin piezas a la entrada da 2 o 3 pulsos cada 2 o 3 segundos pero sigue funcionando. Esto último tengo que estudiarlo todavía

He explicado que quiero controlar con un mega el conteo de pulsos durante 20 o 30 horas.
¿El resultado de todo esto? avisar por telegram de lo que ocurre. Y no, no puedo controlar cuando se funde o no la bombilla. No tengo idea como lo controla la gente que trabaja allí, solo quieren que haya un aviso cuando la luz se enciende y, a ser posible, el motivo del aviso, digamos pulsos.
Espero, que cuando se funda o se quite la bombilla, haya algún pulso o algo en la linea de 12V o en otro lugar al cual tenga acceso. Pero no tengo idea. Todavía

Gracias surbyte y saludos

Edit: gatul, creo es es peor: necesito arreglar un pinchazo y surbyte me propone cambiar el aceite de la bici para solucionarlo. Saludos a los 2. :smiley:

Hola.
Requiero mas ayuda/consejos para hacer funcionar este proyecto.
He cogido un mega y con el divisor de tensión 100k/47k he mirado como recibiría un pin (en este caso el 10 puesto que los analógicos no detectan nada) los "datos" de la bombilla, Estuve allí mas de 15 horas y al final un trabajador se apiadó de mi y hizo saltar los pulsos manualmente. Por lo que veo se trata de un relé por los rebotes que tiene

// detectar 1 pulso: silo atascado
 HIGH : 32316
 LOW milis transcurridos: 20 = 0 segs: 32337 
 HIGH milis transcurridos: 21 = 0 segs: 32358 
 LOW milis transcurridos: 19 = 0 segs: 32378 // 1 pulso de 60

 // vamos a por los 2 pulsos: no hay piezas
 HIGH  42516
 LOW milis transcurridos: 19 = 0 segs: 42536
 HIGH milis transcurridos: 20 = 0 segs: 42557
 LOW milis transcurridos: 19 = 0 segs: 42577 // 1 pulso de 60
        
 HIGH milis transcurridos: 183 = 0 segs: 42762  //entre pulsos
        
 LOW milis transcurridos: 19 = 0 segs: 42782
 HIGH milis transcurridos: 20 = 0 segs: 42802
 LOW milis transcurridos: 20 = 0 segs: 42823
 HIGH milis transcurridos: 20 = 0 segs: 42844
 LOW milis transcurridos: 16 = 0 segs: 42866  // segundo pulso de 95

El fijo (contenedor lleno) no lo he detectado todavía puesto que no pueden simularlo., pero entiendo que es luz fija.

He pensado en poner un condensador de 47uf detrás de 1 diodo para saltarme los rebotes. Tengo que probarlo todavía.

Espero consejos sobre como eliminar estos rebotes. ¿Os parece bien el sistema diodo/condensador? entiendo que se descarga por la resistencia del divisor (33K)

Saludos y gracias

mega.jpg

mega.jpg

Hola de nuevo.
Ya tengo la placa de pruebas instalada. La inversión de la señal de la bombilla la he hecho con un simple transistor y de momento funciona.
Para hacer la lectura desde el ESP01S he hecho esta función, a la que accede desde el loop cuando hay un cambio de estado a LOW en el pin 01. He cambiado de pin para comprobar con el único led del ESP01S si hay conexión a telegram.

int ver()
{
  // ver duración de high y low
  // encender : máximo 60 = 40 real
  // apagar: 60+95=155 = 93 real (sumados los 2 pulsos)
  // devuelve: -1=nada
  //		0=fija
 //             1= 1 pulso
 //             2= 2 pulsos
 
  unsigned long duracion=millis(),low=0,high=0,acumula_encen=0;

  for(;;){
      pulso = digitalRead(CENTRAL);
      //Serial.print(pulso==HIGH ? "HIGH " : "LOW ");
      if(pulso==HIGH){ //apagada
        if(low){ 
          acumula_encen+=(millis()-low); // aculumar encendido
          low=0;
          }
        if(high==0) high=millis();
        if(millis()-high>250){
          Serial.println(">250");
          break; // si la bombilla está mas de 250 apagada: finalizado
          }
        
        }
      else { // encendida
          if(low==0) low=millis();
          high=0;
          if(millis()-low>350){
            acumula_encen=millis()-low;
            Serial.println(">350"); // si la bombilla está mas de 350 encendida: alarma fija
            break;
          }
        }
        
       if(millis()-duracion>650){ // duracion total >600: 60+95+185=340 + 250 espera serian 590
          Serial.println(">650");   
          break; // maximo
       }
      }

  Serial.print("FINAL: ");
  Serial.print(acumula_encen); // ver acumulado
  Serial.print("    high= ");
  Serial.println(high);
  Serial.println(millis());
  
  ANTES=pulso; //poner nuevo estado
  
  if(acumula_encen<60){ //solo un pulso
        Serial.println("1 P U L S O");      
        return 1;
        }
  if(acumula_encen<155){ // 2 pulsos
        Serial.println("2 P U L S O S"); 
        return 2;
        }

  if(acumula_encen>155){
	Serial.println("F I J A"); 
        // en espera a que se apague la luz
        /*while(test==HIGH){
		pulso=digitalRead(CENTRAL);
		delay(250);
		}*/  //la espera será después del envío del mensaje (loop)
	return 0;
	}
		
return -1;  
}

Pero tengo un problema que no se si podré solucionar.
Cada 10 minutos compruebo si el ESP está conectado a telegram y recibo los mensajes pendientes. En este caso solo puedo recibir 'test' para comprobar si el esp no está colgado y "ENVIOFF / ENVION" para activar y desactivar los envíos. La comprobación suele durar algo mas de 2 segundos (cosa de CTBot). Si durante ese periodo de tiempo hay 1 pulso de la bombilla lo pierdo. Si es luz fija la puedo procesar cuando vuelva del test de conexión y como es la mas importante, la procesaría unos 2 segundos mas tarde con lo que no habría problema.
Los otros 2 estados (1 pulso y 2 pulsos) tardaría unos 3 o 4 minutos en procesarlos, tiempo en que creo que se repite el error, pero no lo he llegado a cronometrar.
La solución pasaría por interrupciones, pero en eso no tengo experiencia.
Os dejo la función de control de pulsos (y sus rebotes) y el diagrama del inversor.

Saludos y gracias

mega.jpg

mega.jpg

Hola de nuevo.
Sigo comentando los avances (y retrocesos) de este invento.
Sigo teniendo una protoboard montada en la máquina y parece ser que va funcionando aunque falla algunas veces.
Uno de los fallos es una falsa alarma con la bombilla fija. Según el envío de telegram, la bombilla está encendida fija mas de 600 milis, cuando es falso. Algo le pasa a ese cable de 12V....
He puesto una rutina para que detecte el tiempo total de la bombilla encendida y lo acabo de poner en pruebas, pero me huele a problemas con el transistor (pn2222) o la resistencia pullup o algún pico en el cable ¿alguna idea? estoy todavía a la espera del opto y del alimentador definitivo de 3,3V

Saludos

Luego leeré tus mensajes a ver que puedo aportar/sugerir.

Editaré este mismo post.

Bueno, por fin creo que lo tengo.
Después de analizar las diferentes señales de la lampara, he conseguido recrear todos los pasos.
Aún con un transistor a GND, el ESP01 no arrancaba algunas veces. Le puse una resistencia de 1K y de momento no ha fallado ninguna vez al arranque, pero en cambio me ha complicado un poco mas los rebotes del relé que enciende la bombilla. En los últimos análisis recibidos, al no poder tener allí un monitor serie. Al encender la bombilla 1 pulso, ha habido veces que han habido 12 pulsos para completar un total de 65 milisegundos de bombilla encendida. En los 2 pulsos han habido hasta 30 pulsos para 159 milisegundos con un parón intermedio de entre 150 y 189 milisegundos.
El día que se funda la bombilla veremos que pasa puesto que el mensaje a telegram contiene toda la información de pulsos y tiempos.
Os dejo aquí el esquema final.

Muchas gracias por vuestra ayuda.

esp.jpg

esp.jpg

No se si quieres o no eleminar los rebotes pero mira esto en el caso de querer eliminarlos

Con Bounce2 simplemente le pones 200mseg y tienes el rebote contemplado.
Pero tal vez tu interes sea el de saber cuantas veces lo hace.

Hola surbyte. Si te soy sincero yo tampoco lo se.
Probé poniendo un condensador y no fui capaz de averiguar que pulso me llegaba. Estamos hablando de un total de entre 60 milisegundos a un máximo inferior a 250 milisegundos.
Con rebotes he ido ajustando y, de momento, parece que lo he conseguido. Post atrás puse una función que he tenido afinar un poco mas, pero la idea me ha funcionado tenga los rebotes que tenga. En este caso se cumple el famoso refrán: si no puedes con tu enemigo.... únete a él :smiley:

Saludos y gracias

Un capacitor va a atenuar los rebotes. A mi no me gusta como solución salvo que sea algo estrictamente eléctrico, prefiero en este caso hacerlo por software, es mas simple.

Tu problema hizo que me obligara a resolver un problema que tengo con mi Visual Studio Code y PlatformIO. Asi que he podido compilar esto y te aseguro que funciona.
Es básico pero pruebalo con tu IDE si es lo que usas.

#include <Arduino.h>
/* 
 DESCRIPTION
 ====================
 Pressing a physical button switches a LED on or off.
 Simple example of the Button class from the Bounce library.
 The Button class matches an electrical state to a physical action 
 with <Button>.setPressedState(LOW or HIGH).
 Set BUTTON_PIN to the pin attached to the button.
 Set LED_PIN to the pin attached to a LED.
 
 */

 // WE WILL attach() THE BUTTON TO THE FOLLOWING PIN IN setup()
#define BUTTON_PIN 2  // GPIO2

// DEFINE THE PIN FOR THE LED :
// 1) SOME BOARDS HAVE A DEFAULT LED (LED_BUILTIN)
//#define LED_PIN LED_BUILTIN
// 2) OTHERWISE SET YOUR OWN PIN
#define LED_PIN   0   // GPIO0
 
// Include the Bounce2 library found here :
// https://github.com/thomasfredericks/Bounce2
#include <Bounce2.h>

// INSTANTIATE A Button OBJECT
Button button = Button();



// SET A VARIABLE TO STORE THE LED STATE
int ledState = LOW;

void setup() {

  // BUTTON SETUP 
  
  // SELECT ONE OF THE FOLLOWING :
  // 1) IF YOUR BUTTON HAS AN INTERNAL PULL-UP
  // button.attach( BUTTON_PIN ,  INPUT_PULLUP ); // USE INTERNAL PULL-UP
  // 2) IF YOUR BUTTON USES AN EXTERNAL PULL-UP
  button.attach( BUTTON_PIN, INPUT ); // USE EXTERNAL PULL-UP

  // DEBOUNCE INTERVAL IN MILLISECONDS
  button.interval(200); 

  // INDICATE THAT THE LOW STATE CORRESPONDS TO PHYSICALLY PRESSING THE BUTTON
  button.setPressedState(LOW); 
  
  // LED SETUP
  pinMode(LED_PIN,OUTPUT);
  digitalWrite(LED_PIN,ledState);

}

void loop() {
  // UPDATE THE BUTTON
  // YOU MUST CALL THIS EVERY LOOP
  button.update();

  // <Button>.pressed() RETURNS true IF THE STATE CHANGED
  // AND THE CURRENT STATE MATCHES <Button>.setPressedState(<HIGH or LOW>);
  if ( button.pressed() ) {
    
    // TOGGLE THE LED STATE : 
    ledState = !ledState; // SET ledState TO THE OPPOSITE OF ledState
    digitalWrite(LED_PIN,ledState); // WRITE THE NEW ledState

  }
}

Observa que tengo 200mseg como tiempo para evitar rebotes. Solo hace el cambio en el LED (en este caso) si cambia el estado.

El mismo puede adaptarse para tu tarea y Telegram

200 mseg? eso es un mundo. Te explico.
la bombilla se enciende 1 pulso de duración aprox de 60mseg. Pero puede ser mayor o menor. Pero la duración contando rebotes puede llegar a 90mseg. Cuando la bombilla se enciende 2 pulsos, se enciende el primero como el anterior y el segundo un poco mas largo con un intervalo apagada de entre 150 y 185 mseg.
Ninguno de los tiempos recibidos en los últimos 15 días es un tiempo exacto, por lo cual me aprovecho de los rebotes para ver si el pulso encendido es mayor de 100 o menor además de mirar si hay un intervalo largo por el medio de mas de 100 mseg.

De todas formas analizaré el código para ver si veo algo que me vaya bien aplicar, pero de momento no creo que pueda huir de los rebotes.

Saludos y gracias

@bosoft el tiempo de debouncer lo puedes cambiar, fijate en esta línea

 // DEBOUNCE INTERVAL IN MILLISECONDS
  button.interval(200);

Saludos

Si si, lo se, pero .... ¿que tiempo pongo si no tengo idea del tiempo?
He explicado que el primer pulso puede estar encendido 60mseg pero puede durar 100. ¿como se si es correcto?
Pero el segundo pulso, si lo hay, puede estar hasta 150 mseg encendida pero puede durar hasta 250 incluido un apagado de hasta 185 por el medio. Y digo bien hasta. A veces es mucho menos.

De verdad, es un lio hacerlo con DEBOUNCE o yo no le pillo como. En los primeros post copié el texto que pillé con un mega 2560 cuando me ayudaron a hacer saltar los pulsos. Entonces me pareció simple y fácil. Hasta hace 3 días tuve problemas con algunas señales para saber lo que era. Por cierto con es ESP01S se pone peor el asunto con rebotes de 0 mseg. La solución fue mandarme por telegram todas las señales y analizarlas paso a paso. Lo que hago es sumar los pulsos encendidos y quedarme con los pulsos largos de apagados. En esos datos veo las diferencias. Si sumo rebotes incluidos es un caos.

La maquinita es antigua y analógica con lo cual la precisión es nula. Y creo que es un relé el que enciende la bombilla, pero nadie ha sabido decírmelo con certeza.

Saludos y gracias

Yo creo que todo lo que ves son rebotes porque no tiene sentido hacer parpadear una lámpara solo 60 ó 180 ms, más aún siendo una lámpara a filamento y una maquina vieja.
Además para ser una señalización para “humanos” es muy poco tiempo (calcula que el filamento no llegaría brillar o apagarse lo suficiente en tan poco tiempo) e incluso para que actúe un contactor me parece un pulso muy corto.
Se me ocurre que pulsos menores a 300 o 400 ms solo son ruido, aunque claramente puedo estar totalmente equivocado. :wink:

Si es una lámpara de filamento dejar que eso ocurra justamente es lo que la quema.
ALgo mas inteligente sería evitar que eso pase y que permanezca prendida o apagada.
Pero no nos metamos en esa cuestión porque es el lado viejo de la máquina y se que no quieres modificar nada ahi.
Tienes varias opciones:

  1. porque no pones un debounce de digamos 25 o 50 mseg y cuentas pulsos de longitudes conocidas? O sea menos pulsos.
  2. contemos todos los pulsos y sus duraciones, y cuando todo termine envia un solo mensaje con el loggeo pero no 50 msegs por telegram.

Qué prefieres?

Es por eso gatul por lo que quieren el mensaje. La tercera opción la bombilla se queda fija y con esa no hay problema. Cuando son pulsos se enteran cuando ven los atascos y por eso quieren informarse de que algo falla.

Eso es lo que hago, surbyte, contar pulsos y sumar tiempos y me espero hasta que hay un apagado superior a 500 mseg continuo (sin rebotes). Si hay un encendido superior a 1 seg, continuo la cosa está clara. Además, como ya he dicho, hay pulsos de 0 mseg y cada vez el conteo me sale diferente. He hecho una valoración calculándolo todo por rebotes, pulsos encendida, tiempos encendida, tiempos apagados y pulsos apagada y de ahí extraigo lo que creo que es. Lleva varios días y parece que le he pillado,
Y que mas quisiera yo que cambiar la bombilla por algo, pero es quitarla y se para la maquinita y no me preguntéis como lo sabe. Estoy esperando que se funda a ver que me manda.

Saludos, gracias a los 2 y espero que el año nuevo sea diferente a este. No me atrevo a decir “mejor”