Dimmer programable. Cap 2.: Detector de cruces por 0

Continuamos con el proyecto del Dimmer programable que me permita utilizar todos los excedentes de mis placas fotovoltaicas.

En el capítulo de hoy vamos a analizar 3 soluciones distintas para detectar los cruces por 0 de la señal de alterna. Vemos su esquema, analizamos su funcionamiento, montamos el circuito y lo comprobamos con el osciloscopio.

Teoría y práctica en 20 minutos.

Tanto si necesitas uno, como si eres curioso y te gusta saber cómo funcionan las cosas, no te lo pierdas.

Enlaces de compra a los materiales del vídeo:

PC815

ESP-Wroom-32

Protoboard

Osciloscopio

Aquí el código que hemos probado en el vídeo:

#include <Arduino.h>

const int pinEntrada = 34;                // Pin GPIO34

volatile int contadorPulsos = 0;          // cuenta las veces que cambia el pin de entrada

const int antiruido = 4;                 // Milisegundos que esperamos antes de dar la entrada como válida
unsigned long tiempo_entrada = 0;         // Filtro para ruido en la entrada
unsigned long ultimo_tiempo_entrada = 0;  // Filtro para ruido en la entrada

unsigned long ultimoTiempo = 0;           // para contar segundos en el bucle principal

// Interrupción externa. Se lanza cada vez que se detecta una señal de subida en el pin de entrada
void IRAM_ATTR contador() {
    tiempo_entrada = millis();            // Comprobamos si la señal ha llegado antes que el tiempo filtrado
    if (tiempo_entrada - ultimo_tiempo_entrada > antiruido)
    {
      contadorPulsos++;                   // Detectado pulso de entrada, incrementamos contador y reseteamos tiempo
      ultimo_tiempo_entrada = tiempo_entrada;
    }
}

// Configuración
void setup() {
  pinMode(pinEntrada, INPUT);      // Definimos el pin de entrada
  // Asignamos la función "contador" a la interrupción por un flanco de subida en la entrada
  attachInterrupt(digitalPinToInterrupt(pinEntrada), contador, RISING);
  Serial.begin(115200);            // Activamos puerto serie
}

void loop() {
  unsigned long tiempoActual = millis();
  if (tiempoActual - ultimoTiempo >= 1000) { // Contar pulsos por segundo
    ultimoTiempo = tiempoActual;             // Guardamos tiempo actual para saber cuándo pasa un segundo 
    Serial.print("Pulsos por segundo: ");    // Imprimimos los pulsos por segundo
    Serial.println(contadorPulsos);
    contadorPulsos = 0;                      // y ponemos el contador a 0
  }
}
Scroll al inicio