Intentando leer la comunicación en serie del medidor inteligente con Arduino

Primero mis felicitaciones por este maravilloso sitio. Espero encontrar una respuesta a mi problema. Revisé para encontrar respuestas, sin embargo, no pude encontrarlas.

Mi experiencia es algo técnica, solo con conocimientos eléctricos menores.

El objetivo de mi proyecto es leer la señal serial suministrada por el puerto P1 de un Smart Meter (ISKRA tipo MT382-D2A52-M2K0agnZ) con un Arduino MEGA 2560 @ 9600 Baud rate.

Muchos antes que yo han tenido éxito, sin embargo, parece que no lo consigo.

Antes de que Arduino pueda "leer" la señal del puerto P1, la señal debe invertirse. (Consejo general en Internet sobre este tema: use inversores y transistores hexagonales 7404 para invertir la señal P1)

Actualmente estoy usando los siguientes componentes y esquemas:

  • Arduino Mega 2560
  • Transistor NPN 2N2369A
  • Resistencia 2x 1k

ingrese la descripción de la imagen aquí

El 2N2369A está haciendo algo, porque la salida serial del Arduino con el esquema de arriba es la siguiente:

0-0:96.luego basura 0-0:96.luego basura 0-0:96.luego basura

El 0-0:96. parte que escupe cada 10 segundos se parece un poco a lo que debería decir:

/ISk52ME382-1003
0-0:96.1.1(4B414C37303035313039) 
1-0:1.8.1(00180.912*kWh) 
1-0:1.8.2(00001.416*kWh) 
1-0:2.8.1(00000.000*kWh)
1-0:2.8.2(00000.000*kWh)
0-0:96.14.0(0001)

etc..

Cuando conecto el TX del P1 (medidor inteligente) directamente al puerto RX0 del Arduino, se produce lo siguiente:

(V
eÔR]d�“ZòövRÖå½Vû‹�“£�´ò«}—“IYÙ–ö–ö–V–Ö’’Ö™Ÿ™�™�™—f'ff+9½Rû‹�´dë^Ÿ“••“£(V
eÔR]d�“ZòövRÖå½Vû‹�“£�´ò«}—“IYÙ–ö–ö–V–Ö’’Ö™Ÿ™�™�™—f'ff+9½Rû‹�´dë^Ÿ“••“£(V
eÔR]d�“ZòövRÖå½Vû‹�“£�´ò«}—“IYÙ–ö–ö–V–Ö’’Ö™Ÿ™�™�™—f'ff+9½Rû‹�´dë^Ÿ“••“£¯ÉSë5\²MÔ3¸²-±00´�

que es basura absoluta. Por lo tanto, creo que estoy cerca de la NPN, sin embargo, no puedo llegar al último paso.

¿Hay alguien dispuesto a aconsejarme lo que estoy haciendo mal?

  • elección incorrecta NPN? resistencias incorrectas?

De antemano mi agradecimiento a quien quiera ayudar.

Atentamente,

Vernon

!! SEGUIMIENTO ACTUALIZACIÓN!!!

Siguiendo con mi pregunta anterior, he hecho un poco más de prueba.

Probé un Sketch de Internet usando AltSoftSerial con pin digital 48 en Mega como una solución de software RX, sin embargo, con resultados perfectos:

Resultado:

*0-0:96.1.1(5A424556303035313739303939343133)

1-0:1.8.1(06558.109*kWh)

1-0:1.8.2(05439.071*kWh)

1-0:2.8.1(00000.002*kWh)

1-0:2.8.2(00000.000*kWh)

0-0:96.14.0(0002)

1-0:1.7.0(0000.80*kW)

1-0:2.7.0(0000.00*kW)

0-0:17.0.0(0999.00*kW)

0-0:96.3.10(1)

0-0:96.13.1()

0-0:96.13.0()

!*

Arduino Sketch utilizado: http://domoticx.com/p1-poort-slimme-meter-uitlezen-hardware/

Conectando el Smart Meter TX al pin D48 sin NPN, la salida vuelve a ser basura: *+9=V{$46{/#++9=V{

vkZJV%V{

4r+}IYYvvVVV

f'ff+9=R{4dk^4rV+*

Estoy muy cerca, sin embargo, me siento como un idiota al no poder obtener el puerto serie RX0 normal para escupir los mismos datos que la opción AltSoftSerial.

¿Alguien tiene ideas? ¡Muchas gracias de antemano! Vernon

Respuestas (2)

Parece que podría tener sus bits/paridad configurados incorrectamente.

Asegúrese de que su inicialización en serie se vea como...

Serial1.begin( 9600, SERIAL_7E1 );

...ya que estos parecen ser los ajustes que usa el medidor.

Estoy impresionado por una respuesta tan rápida. Muchas gracias. He probado tu sugerencia, pero los mismos resultados.

Creo que acabo de encontrar una solución.

El problema con Arduino Mega es que RX0 también se usa para la comunicación (USB) entre computadoras.

Encontré un boceto (ver más abajo) que no entiendo (todavía) y requiero más estudio. Utiliza RX1 (pin19) en lugar de RX0, probablemente por la razón explicada anteriormente.

En todo caso....

¡Funciona!

BOCETO de trabajo

carácter x;

configuración vacía () {

// inicializa la comunicación serial a 9600 bits por segundo:

Serial.begin(9600);

Serie1.begin(9600);

// predeterminado a 7 bits, incluso paridad, 1 bit de parada

//borrar paridad, bits de parada, longitud de palabra

UCSR1C = UCSR1C y B11000001;

UCSR1B = UCSR1B y B11111011;

//Establecer la longitud de la palabra en 7 bits

UCSR1C = UCSR1C | B00000100;

UCSR1B = UCSR1B | B11111000;

//Paridad par

UCSR1C = UCSR1C | B00100000;

//1 bit de parada

UCSR1C = UCSR1C | B00001000;

Serie1.vaciar();

}

bucle vacío () {

si (Serial1.disponible() > 0) {

x = Serie1.leer();

Serie.imprimir(x);

}

}

Muchas gracias a todos,

Ahora puedo continuar con mi proyecto. Si alguien tiene tiempo y puede explicar el boceto, siéntase bienvenido ya que cualquier consejo es valioso.

Atentamente,

Vernon