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

2

Primero mis felicitaciones por este maravilloso sitio. Espero encontrar una respuesta a mi problema. He comprobado para encontrar respuestas, pero no pude encontrarlo.

Mi experiencia es algo técnica, solo con un conocimiento eléctrico menor.

El objetivo de mi proyecto es leer la señal en serie que es suministrada por el puerto P1 de un Medidor inteligente (tipo ISKRA MT382-D2A52-M2K0agnZ) con una Arduino MEGA 2560 @ 9600 Baud rate.

Muchos antes de mí 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. (Asesoramiento general en Internet sobre este tema: use 7404 inversores hexadecimales y transistores para invertir la señal P1)

Actualmente estoy usando los siguientes componentes y esquema:

  • Arduino Mega 2560
  • transistor NPN 2N2369A
  • resistencia 2x 1k

El2N2369Aestáhaciendoalgo,porquelasalidaenseriedelArduinoconelesquemadearribaeslasiguiente:

0-0:96.luegobasura0-0:96.luegolabasura0-0:96.luegolabasura

El0-0:96.Lapartequeescupecada10segundosseparecealoquedeberíaleer:

/ISk52ME382-10030-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...

CuandoconectoelTXdesdeelP1(medidorinteligente)directamentealpuertoRX0delArduino,seproducelosiguiente:

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

queesbasuraabsoluta.Porlotanto,creoqueestoycercadelNPN,peronopuedollegaralúltimopaso.

¿Alguienestádispuestoaaconsejarmequéestoyhaciendomal?

  • elecciónequivocadaNPN?resistenciasequivocadas?

Deantemanomigratitudacualquieraqueestédispuestoaayudar.

Saludoscordiales,

Vernon

!!ACTUALIZACIÓNDESEGUIMIENTO!

Siguiendoconmipreguntaanterior,hehechounpocomásdepruebas.

HeprobadounSketchdesdeInternetutilizandoAltSoftSerialwithDigitalpin48enelMegacomounasoluciónRXdesoftware,peroconresultadosperfectos:

Resultar

*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()

!*

ArduinoSketchutilizado: enlace

Al conectar el Smart Meter TX al pin D48 sin NPN, la salida vuelve a estar limpia: * + 9 = V {$ 46 {/ # ++ 9 = V {

vkZJV% V {

4r +} IYYvvVVV

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

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

¿Alguna idea? ¡Muchas gracias de antemano! Vernon

    
pregunta Vernon

2 respuestas

1

Parece que puedes tener tus bits / paridad configurados incorrectamente.

Asegúrate de que el inicio de tu serie se vea como ...

Serial1.begin( 9600, SERIAL_7E1 );

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

    
respondido por el bigjosh
0

Creo que acabo de encontrar una solución.

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

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

En cualquier caso ....

Funciona!

SKETCH de trabajo

char x;

configuración vacía () {

// inicialice la comunicación en serie a 9600 bits por segundo:

Serial.begin (9600);

Serial1.begin (9600);

// por defecto es de 7 bits, paridad par, 1 bit de parada

// Borrar paridad, detener bits, longitud de palabra

UCSR1C = UCSR1C & B11000001;

UCSR1B = UCSR1B & 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;

Serial1.flush ();

}

bucle vacío () {

si (Serial1.available () > 0) {

x = Serial1.read ();

Serial.print (x);

}

}

Muchas gracias a todos,

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

Saludos cordiales,

Vernon

    
respondido por el Vernon

Lea otras preguntas en las etiquetas