Arduino IR отправь ASCII, подожди, отправь, прочитай - PullRequest
0 голосов
/ 11 октября 2019

Мне нужна помощь в создании «простого» кода Arduino для передачи и приема ИК-сигнала.

Я пробовал несколько кодов, доступных в Интернете, но ничего, что не подходит для моего счетчика электроэнергии Logarex. Как: http://tunn.us/arduino/landisgyr.php https://github.com/prophetmaster/landisgyre350

Связь осуществляется по МЭК 62056-21. Я пытаюсь отправить рукопожатие на счетчик электроэнергии 0x2F, 0x3F, 0x21.0x0D, 0x0A. Затем запрос данных 0x06.0x30.0x35.0x30.0x0D, 0x0A. Доход. К сожалению, я не могу получить какую-либо информацию. Было бы легко отправить рукопожатие через ИК-передатчик, затем запросить данные и затем начать получать их на ИК-приемнике? Нужно ли общаться по 300 бод, чтобы пожать руку, затем 9600 в следующей части и получить 9600 в IR RX?

The output should be something like this on an arduino serial monitor.

Baudrate: 300 bps, 7 bits, parity even, 1 stop bit
Send:     /?!<CR><LF>         (wake-up and sign-on)
Receive:  /XXX5YYYYY<CR><LF>  (XXX is the manufacturer ID; YYYYY is the meter ID; 5 is the new baudrate = 9600 bps)
Send:     <ACK>050<CR><LF>    (send ack; reading mode)
Baudrate: 9600 bps, 7 bits, parity even, 1 stop bit
Received: C.1(201236731.0(01:39 25-08-18)
      1.8.1(0004398506*Wh)
      1.8.2(0000000000*Wh)
      1.8.3(0008198809*Wh)
      1.8.4(0000000000*Wh)
      1.8.5(0000000000*Wh)
      1.8(0012597315*Wh)
      2.8(0000000000*Wh)
      !
      D

Спасибо всем за помощь, я новичок и у меня нет опытас ИК.

1 Ответ

0 голосов
/ 11 октября 2019

если вы используете arduino uno, стандартная библиотека не поддерживает 7E1, необходимый для начального запроса. Для этого вы должны написать свой собственный драйвер UART.

вам нужно написать принимающую часть, я делюсь ею с точки зрения предоставления идей.

//Description video : https://www.youtube.com/watch?v=2s4W6sOT0mU
typedef struct uconfig
{ 
  uint32_t  baud;
  uint8_t  _UBRR0H;
  uint8_t  _UBRR0L;
  uint8_t  _UCSR0B;
  uint8_t  _UCSR0C;
} baud_registers;

/*
 * How can i calculate _UBRROH and _UBRR0L. Here is the cpp script.
 * You need to check the atmega328p datasheet to understand
 * 
#include <iostream>
#define BAUDRATE 300
#define _UBRR (((16000000 / (BAUDRATE * 16UL))) - 1)
int main()
{
  int msb= ((_UBRR) & 0xF00);
  int lsb = ((_UBRR) & 0xFF);
  if(msb>256)
  {
      msb= msb>>8;
  }
  std::cout<<"msb: " << msb;
  std::cout<<"\n";
  std::cout<<"lsb : "<<lsb;

}
 * 
 * 
 */
static const uconfig  baud_table[]= {
  {300,0x0D,0x04,0x18,0x24},
};

int uart_init(uint32_t baudRate_u32)
{
  int status=0;
  uint8_t i=0;
  for( i=0; i< sizeof(baud_table)/sizeof(baud_table[0]); i++)
   {
    if(baud_table[i].baud == baudRate_u32)
    {
       break;
    }
   }

   if( i < sizeof(baud_table)/sizeof(baud_table[0])) {
    UBRR0H=baud_table[i]._UBRR0H;
    UBRR0L=baud_table[i]._UBRR0L;
    UCSR0B=baud_table[i]._UCSR0B;
    UCSR0C=baud_table[i]._UCSR0C;
    status=1;

   }
   return status;

}

void USART_transmit( unsigned char data ) {
    while(!(UCSR0A & (1 << UDRE0)));
    UDR0 = data;
}

void setup() {
  while(!uart_init(300));
}

void loop() {
  USART_transmit('a');
  delay(1000);
}

Также, в своей диссертации я работал над чтением счетчиков электроэнергии. Я сделал чтение, используя Arduino Mega.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...