Como obtener el numero llamante con Arduino


CLI, también conocido como Identificador de llamadas y entrega de números de llamada (CND), es un servicio ofrecido por el proveedor de servicios telefónicos a los clientes para obtener el número de parte que llama y la fecha / hora de la llamada. La activación del servicio y el formato de información de la CLI son diferentes de un operador de red telefónica a otro.

Para decodificar la modulación FSK del número llamante (Caller ID) de forma sencilla con Arduino, la forma más práctica es usar un módulo decodificador dedicado como el HT9032D que soporta la decodificación FSK Bell 202, que es el estándar usado para enviar la información del número llamante en sistemas analógicos telefónicos. Este módulo se conecta entre la línea telefónica (RJ11) y el Arduino, que recibe los datos ya demodulados en forma digital serial para procesarlos y mostrar el número en una pantalla LCD o enviar la información por puerto serie.

Hardware mínimo

  • Arduino (cualquier modelo básico como Arduino Uno o Nano es suficiente).
  • Módulo demodulador FSK Bell 202, típicamente el HT9032D:
    • Este módulo convierte la señal FSK analógica de la línea telefónica en una señal digital serial que el Arduino puede leer.
  • Aislamiento y acoplamiento a línea telefónica:
    • Un adaptador o un transformador de audio para aislar eléctricamente la línea telefónica del Arduino y proteger el equipo.
    • Resistencias y condensadores para el acoplamiento y filtrado según el esquema del módulo HT9032D.
  • Fuente de alimentación estable para Arduino y el módulo.

Opcionales (pero recomendados)

  • Pantalla LCD o display serial para mostrar el número llamante.
  • Cables y conectores RJ11 para conectar la línea telefónica al módulo demodulador.

Resumen de los componentes:

ComponenteFunción
Arduino Uno/NanoProcesa la señal digital decodificada
Módulo HT9032DDemodula la señal FSK analógica
Aislamiento (transformador)Protección y acoplamiento a la línea telefónica
Cables RJ11Conexión con línea telefónica

Este conjunto es el hardware mínimo básico para un sistema funcional de decodificación de Caller ID FSK con Arduino sin desarrollar desde cero la parte de demodulación FSK, lo que implicaría más componentes analógicos y circuitos complejos.

El HT9032D es un circuito integrado específicamente diseñado para la decodificación de señales FSK Bell 202, que es el esquema de modulación utilizado en las señales de Caller ID en líneas telefónicas analógicas. Funciones principales del HT9032D:

  • Demodula la señal FSK recibida desde la línea telefónica, convirtiendo las variaciones de frecuencia en datos digitales seriales.
  • Soporta la decodificación del protocolo estándar Bell 202 para Caller ID.
  • Proporciona una salida digital compatible con microcontroladores como Arduino para facilitar la lectura de los datos.
  • Incluye control y filtrado interno para separar la información útil relacionada con el número llamante (MDMF).

Desde la hoja de características del fabricante Holtek podemos ver un ejemplo típico de aplicación:

Vemos en el circuito como la señal de la línea telefònica en lugar de usar un transformador usa dos condensadores de 0.2microFaradios cuyos extremos van acoplados a un puente de diodos y su salida mediante un divisor de tensión es la que usaremos en el microcontrolador como RING-SENSE. Además de la línea telefónica también directamente van sendas resistencias de 200k y condensadores de 0.01microFaradios hacia los pines TIP y RING del. Respecto a la parte superior derecha, es solo opcional y es la parte de alimentación de 5V DC pues HT1050 es simplemente un regulador de 5v del propio fabricante.

Ojo porque el esquema entregado por el fabricante anterior presenta varias imprecisiones respecto al terminal X2 y las conexiones del microcontrolador, por lo que es mejor usar el siguiente esquema:

Es interesante destacar como la señal de la línea telefònica en lugar de usar un transformador usa dos condensadores de 0.2microFaradios cuyos extremos van acoplados a un puente de diodos y su salida mediante un divisor de tensión es la que usaremos en el microcontrolador como RING-SENSE.

Asimismo de la línea telefónica directamente también mediante sendas resistencias de 200k y condensadores de 0.01microFaradios son las señales de TIP y RING que van conectados directamente al chip.

El circuito se complementa con un circuito resonante conectados a los terminales X1 y X2 (ojo porque en el esquema del fabricante han obviado el terminal X2). Este circuito esta conectado al chip por un cristal del cuarzo de 3.58Mhz, una resistencia de 10M en paralelo y dos pequeños condensadores de 33pF conectados a masa. Por cierto, la señal PDWN se obtiene del chip derivándola también a masa con una resistencia de 22k

Por ultimo la salida de DATA del chip corresponde a la salida DOUT que usaremos en el microcontrolador.

En la imagen podemos ver el circuito montado, aunque si lo deseamos dado el numero reducido de componentes ( 7 resistencia s y 7 condensadores , el puente, el cristal y el chip HT9032D) también podemos montar en una placa de prototipos.

Este es el detalle de los componentes:

  • C1, C3 : 0.01μF / 400V Mylar Capacitor
  • C2 : 0.1μF / 50V Mylar Capacitor
  • C4, C5 : 33pF Ceramic Capacitor
  • C6, C7 : 0.22μF / 400V Mylar Capacitor
  • D1 : 2W10 Bridge rectifier
  • R1, R2 : 200KΩ
  • R3 : 22KΩ
  • R4 : 10MΩ
  • R5 : 470KΩ
  • R6 : 18KΩ
  • R7 : 15KΩ
  • U1 : HT9032D (DIP-8)
  • Y1 : 3.58MHz (HC49) Crystal
  • J1 : Molex 52018-6616 or equivalent RJ11 / 6P6C PCB socket
  • J2 : 5-pin 2.54mm Pin header

Como vemos pues en resumen , estas son las fases para obtener el numero llamante:

  • Utilizar un módulo HT9032D (o similar) para demodular la señal FSK de la línea telefónica.
  • Conectar el pin de salida digital (DATA OUT) del módulo HT9032D a una entrada RX del Arduino.
  • El Arduino lee la señal digital, que sigue el protocolo Bell 202 (1200 baud, mark 1200Hz, space 2200Hz).
  • Procesar la trama de datos MDMF (Multiple Data Message Format) para extraer el número llamante, fecha y hora.
  • Opcionalmente mostrar esos datos en un display LCD o enviarlos a un ordenador.

Ventajas de esta configuración:

  • No se requiere implementar desde cero la demodulación FSK (que es compleja).
  • El HT9032D está específicamente diseñado para este propósito.
  • Hay ejemplos de códigos para Arduino que leen los datos y los decodifican fácilmente.

Ejemplo de uso

Se pueden encontrar esquemas y código Arduino en proyectos como «Arduino Telephone Caller ID Unit» con HT9032D, donde se conecta la línea telefónica al módulo y éste al Arduino, y el código lee la información serial codificada en FSK ya demodulada por el módulo.

Esta solución es sencilla para un usuario Arduino que desea mostrar el número llamante sin tener que desarrollar un demodulador FSK desde cero, que sería bastante más complejo.

Circuito auxiliar

Este seria el montaje final:

Por tanto, para un método sencillo de decodificar la modulación FSK del número llamante con Arduino, se recomienda usar un módulo HT9032D con Arduino para recibir datos seriales decodificados y procesar la trama Caller ID. Para decodificar FSK Caller ID con Arduino, el hardware mínimo que se recomienda es el siguiente:

Aplicación típica

En proyectos con Arduino para decodificar el número llamante, el HT9032D se conecta directamente a la línea telefónica (con el debido aislamiento), y su salida digital se conecta a una entrada del Arduino. El Arduino luego interpreta los datos seriales para extraer y mostrar el número.

Codigo arduino con comentarios

/*****************************************************************************
 Copyright 2021 Dilshan R Jayakody.
 
*/

#include <SoftwareSerial.h>
#include <LiquidCrystal.h>
#include <EEPROM.h>

// Crear interfaz serial para callerID en el pin 10 (RX) y 11 (TX).
#define CALLER_ID_RX  10
#define CaLLER_ID_TX  11

#define LCD_RS      2
#define LCD_EN      3
#define LCD_DATA4   4
#define LCD_DATA5   5
#define LCD_DATA6   6
#define LCD_DATA7   7

#define LCD_BACKLED         12
#define LCD_CALL_ALERT_LED  13

#define RING_DET_PIN  8
#define CLI_PWDN_PIN  9

#define MDMF_HEADER   0x80
#define MDMF_PARAM_TIME   0x01
#define MDMF_PARAM_CID    0x02
#define MDMF_PARAM_NAME   0x07 

#define EEPROM_NUM_OFFSET   1
#define EEPROM_TIME_OFFSET  20

enum CID_STATE {CID_IDLE, CID_SYNC, CID_PACKET, CID_MESSAGE, CID_END};
enum CID_MSG_STATE {CIDMSG_HEADER, CIDMSG_LEN, CIDMSG_DATA};

SoftwareSerial callerID(CALLER_ID_RX, CaLLER_ID_TX);
LiquidCrystal lcd(LCD_RS, LCD_EN, LCD_DATA4, LCD_DATA5, LCD_DATA6, LCD_DATA7);

enum CID_STATE cidState;
enum CID_MSG_STATE cidMsg;

unsigned char tempCount, cidData, packetLen, currLen;
unsigned char msgType, msgLen, msgCurrPos;
unsigned long delayStart, watchdogDelay, recallTimeout;
unsigned char lineIdleCounter, watchdogSec;
unsigned char buttonState, tempInfoPos, recall;

char msgData[16];

char tBufferNumber[16];
char tBufferDateTime[9];

void programLastNumber()
{
  unsigned char memPos;

  // Escribir la última información del identificador de llamada en el buffer temporal.
  // Este buffer temporal se usa para evitar problemas de sincronización en el flujo serial (debido a operaciones lentas de escritura en EEPROM). 
  for(memPos = 0; memPos < 16; memPos++)
  {
    tBufferNumber[memPos] = msgData[memPos];
  }
}

void programLastCallTime()
{
  unsigned char memPos;

  // Escribir fecha/hora relacionada con la última llamada en el buffer temporal

En resumen lo ideal para obtener el numero llamante es usar un circuito especializado para Caller ID FSK, evitando tener que hacer una demodulación por software compleja. Eso simplifica el diseño y reduce componentes externos. Además está ampliamente probado y documentado en proyectos de Arduino y telefonía analógica.

Por lo tanto, el HT9032D es el chip indicado para soportar la decodificación FSK Bell 202 del número llamante (Caller ID) en proyectos Arduino con línea telefónica analógica.

Fuente: https://www.instructables.com/Arduino-Telephone-Caller-ID-Unit/

Hablemos del nuevo pzem-004t-100a-d-p(v1.0) y su uso practico


Amigos lectores , probablemente recordareis el famoso modulo de medida electrica PZEM004. Ciertamente la versión PZEM-004T V3.0 o versión 3.0 era la versión actualizada para reemplazar la antigua PZEM004T V1.0 dado que la versión anterior se ha agotado desde hace bastante tiempo en la mayor parte de las tiendas en línea y ya no se producen ( de hecho se necesitan librerías especiales para poder usarlo). La versión actualizada de PZEM004T sigue siendo interesante para proyectos, donde necesitamos medir el voltaje, la corriente, la potencia, la energía, la frecuencia, el factor de potencia (la frecuencia y el PF se agregan adicionales en la nueva versión) utilizando Arduino / ESP8266 -ESP32/ /Raspberry Pi como plataforma de código abierto.

Ahora bien, si bien PZEM-004T V3.0 o versión 3.0 sigue siendo una versión funcional por el momento, desde hace un año aproximadamente, tenemos disponible una nueva versión: la versión PZEM-004T-100A-D-P (v1.0). Esta nueva versión ser caracteriza por su mayor precisión y respuesta rápida, con una versión mejorada de pulso de PIN que facilita la integración en PCB y la medición de potencia con menor error de calibración.

Utiliza una interfaz de comunicación UART a TTL con una velocidad de baudios de 9600, y emplea el protocolo Modbus-RTU para la capa de aplicación, soportando funciones como lectura de registros, escritura de registros, calibración y limpieza de potencia cero. La comprobación CRC se realiza en un formato de 16 bits con un polinomio específico.

En cuanto a los parámetros del producto, el modelo Pzem-004t-100A-d-p v1.0 (como el antiguo PZEM-004T V3.0) permite medir corrientes de hasta 100A y voltajes entre 80 y 260V, con una potencia activa máxima de 2.3KW y un factor de potencia de hasta 1.00. La frecuencia operativa va de 45Hz a 65Hz, y cuenta con una función de alarma para exceso de potencia. La comunicación se realiza a través de una interfaz TTL, y el dispositivo opera en un rango de temperatura de -20℃ a +60℃.

Este es el aspecto del nuevo modelo donde como vemos se puede observar que el diseño se ha cambiado para poder soldar el modulo en una placa o incluso enchufar en una placa proto board prescindiendo de conectores.

Asimismo tenemos un nuevo pin: el pin CF de salida de pulsos, por lo que también han cambiado el diseño incluyendo un nuevo optoacoplador en la propia placa

El pin CF (Frequency Output) en el PZEM-004T-100A-D-P (v1.0) se utiliza para proporcionar una salida de frecuencia proporcional a la potencia activa medida. Esta señal de frecuencia puede ser utilizada para monitorear y registrar el consumo de energía en tiempo real, y mas adelante en el código arduino veremos cual es su utilidad.

Como en versiones anteriores, la interfaz TTL de este módulo es una interfaz pasiva y necesita una fuente de alimentación externa de 5V, es decir, los cuatro puertos (5V, RX, TX y GND) debe estar conectado durante la comunicación; de lo contrario, la comunicación falla.

Por ultimo la temperatura de funcionamiento del modulo va entre -20 ℃ ~ + 60 ℃.

Conexiones con un ESP32

Las conexiones no han cambiado respecto a la configuraciones antiguas a excepción de que tenemos un hilo mas( el pin CF) .Para conectar el PZEM-004T-100A-D-P (v1.0) al ESP32 WROOM 32 usando los GPIO 16, 17 y 4, sigue estos pasos:

Conexiones de alimentación:

  • Conecta el pin VCC del PZEM-004T al pin de 5V del ESP32.
  • Conecta el pin GND del PZEM-004T al pin GND del ESP32.

Conexiones de comunicación:

  • Conecta el pin RX del PZEM-004T al pin GPIO 16 (TX2) del ESP32.
  • Conecta el pin TX del PZEM-004T al pin GPIO 17 (RX2) del ESP32.
  • Conecta el pin CF del PZEM-004T al pin GPIO 4 del ESP32.

Conexión de la entrada de CA:

  • Conecta los terminales de entrada de CA del PZEM-004T a la fuente de alimentación de CA que deseas medir. Asegúrate de seguir las precauciones de seguridad al trabajar con corriente alterna.
  • Conexión de la bobina del sensor de corriente:Pasa el cable de la carga a través del agujero de la bobina del sensor de corriente (CT) del PZEM-004T. Esto permitirá medir la corriente que pasa a través del cable.

A continuación podemos ver el esquema del montaje final:

Ejemplo de código ARduino probado con la nueva versión del PZEM004

El siguinte nuevo código Arduino con el pzem004 le permite medir el voltaje de CA, la corriente de CA, la potencia, la energía, la frecuencia y el factor de potencia en la interfaz serie con el microcontrolador Arduino. Ademas tambien usaremos leos pulsos CF .

La biblioteca de PZEM-004t V30 funciona tanto en serie de hardware como en serie de software con este nuevo modulo. El resultado de todos los parámetros se imprime en el monitor serie de Arduino IDE. Este código de biblioteca se ha usado con un ESp32 pero debería funcionar también con arduino uno, arduino mega y nano board.

CODIGO ARDUINO:

#include <PZEM004Tv30.h>
#include <HardwareSerial.h>

// Definir los pines de conexión
#define RX_PIN 17
#define TX_PIN 16
#define CF_PIN 5

// Crear una instancia del objeto HardwareSerial
HardwareSerial PZEMSerial(2);

// Crear una instancia del objeto PZEM
PZEM004Tv30 pzem(PZEMSerial, RX_PIN, TX_PIN);

// Variables para contar los pulsos del pin CF
volatile unsigned long pulseCount = 0;
unsigned long lastPulseTime = 0;

void IRAM_ATTR onPulse() {
  pulseCount++;
  lastPulseTime = millis();
}

void setup() {
  Serial.begin(115200);
  Serial.println("Iniciando PZEM004T con ESP32");

  // Iniciar la comunicación serial con el PZEM
  PZEMSerial.begin(9600, SERIAL_8N1, RX_PIN, TX_PIN);

  // Configurar el pin CF como entrada y adjuntar la interrupción
  pinMode(CF_PIN, INPUT);
  attachInterrupt(digitalPinToInterrupt(CF_PIN), onPulse, RISING);
}

void loop() {
  // Leer las variables eléctricas
  float voltage = pzem.voltage();
  float current = pzem.current();
  float power = pzem.power();
  float energy = pzem.energy();
  float frequency = pzem.frequency();
  float pf = pzem.pf();

  // Mostrar las variables en el monitor serie
  Serial.print("Voltaje: "); Serial.print(voltage); Serial.println(" V");
  Serial.print("Corriente: "); Serial.print(current); Serial.println(" A");
  Serial.print("Potencia: "); Serial.print(power); Serial.println(" W");
  Serial.print("Energía: "); Serial.print(energy); Serial.println(" Wh");
  Serial.print("Frecuencia: "); Serial.print(frequency); Serial.println(" Hz");
  Serial.print("Factor de Potencia: "); Serial.println(pf);

  // Mostrar el conteo de pulsos del pin CF
  Serial.print("Pulsos CF: "); Serial.println(pulseCount);

  // Esperar un segundo antes de la siguiente lectura
  delay(1000);
}

Este código Arduino configura un ESP32 para comunicarse con un módulo PZEM-004T-100A-D-P (v1.0) a través de los pines RX (17) y TX (16), y utiliza el pin CF (5) para contar pulsos de frecuencia. En el setup, se inicializa la comunicación serial y se configura una interrupción en el pin CF.

El pin CF (Frequency Output) del PZEM-004T-100A-D-P (v1.0) se utiliza para proporcionar una señal de frecuencia que es proporcional a la potencia activa medida por el módulo. Esta señal de frecuencia puede ser utilizada para monitorear y registrar el consumo de energía en tiempo real.

En el código Arduino, el pin CF está conectado al GPIO 5 del ESP32 y se configura una interrupción para contar los pulsos generados por el pin CF. Cada pulso representa una cantidad específica de energía consumida, y al contar estos pulsos, se puede calcular el consumo total de energía.

Aquí un resumen de cómo se usa el pin CF en el código:

  1. Configuración del pin CF: En el setup, se configura el pin CF como entrada y se adjunta una interrupción para contar los pulsos.
  2. Interrupción: La función onPulse se llama cada vez que se detecta un pulso en el pin CF, incrementando el contador de pulsos.
  3. Lectura de pulsos: En el loop, se muestra el conteo de pulsos en el monitor serie, lo que permite monitorear el consumo de energía en tiempo real.

Por ultimo en el loop, se leen y muestran en el monitor serie las variables eléctricas (voltaje, corriente, potencia, energía, frecuencia y factor de potencia) y el conteo de pulsos del pin CF, con un retraso de un segundo entre lectura.

A continuación para terminal un ejemplo de salida del monitor serie usando el montaje explicado:

Espero amigo lector que si adquiera un modulo de estos, sepa darle utilidad.