Merkury 203.2T and arduino
- Войдите на сайт для отправки комментариев
Пнд, 08/08/2016 - 14:11
Hello,
i want to read My Merkury meter via arduino with RS485. I have a RS485 shield for arduino. i can send command with php and get response from Merkury. But when i send this command with arduino i can not get anything. My code i as following.
My meter's serial number is 14981791.
Arduino code:
#include <SoftwareSerial.h>
/*-----( Declare Constants and Pin Numbers )-----*/
#define SSerialRX 10 //Serial Receive pin
#define SSerialTX 11 //Serial Transmit pin
#define SSerialTxControl 3 //RS485 Direction control
#define RS485Transmit HIGH
#define RS485Receive LOW
#define Pin13LED 13
byte code1[7] = {0x00,0xE4,0x9A,0x9F,0x63,0x1B,0x06};
/*-----( Declare objects )-----*/
SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX
/*-----( Declare Variables )-----*/
int byteReceived;
byte data[7];
String sent;
void setup() /****** SETUP: RUNS ONCE ******/
{
// Start the built-in serial port, probably to Serial Monitor
Serial.begin(9600);
Serial.println("SerialRemote"); // Can be ignored
pinMode(Pin13LED, OUTPUT);
pinMode(SSerialTxControl, OUTPUT);
digitalWrite(SSerialTxControl, RS485Receive); // Init Transceiver
// Start the software serial port, to another device
RS485Serial.begin(9600); // set the data rate
}//--(end setup )---
void loop()
{
RS485Serial.write(code1,sizeof(code1));
delay(50);
while (RS485Serial.available())
{
//Serial.println( RS485Serial.readString());
byteReceived=RS485Serial.read();
Serial.print(byteReceived,HEX);
}
delay(2000);
}
My php code:
<?php
exec('mode COM5: baud=96 data=8 stop=1 parity=n xon=off to=on');
// Несмотря на настройки, порт правильно не откравается, перед запуском скрипта надо запустить родной софт
// причины такого поведения пока не выяснены
$f = fopen("COM5","r+");
$i=0;
$cmd = array(0x00,0xE4,0x9A,0x9F,0x63,0x1B,0x06); // Команда "Мгновенные значения"
$c="";
for($i=0; $i < count($cmd); $i++){$c .= chr($cmd[$i]);} // Сформировать строку символов для посылки в COM-порт
fwrite($f,$c);
$result=fread($f,12);
// Результат получаем в шестнадцатиричном виде, но его написание соответствует десятичному значению.
// Например 0x22 0x87 = 228,7 вольт. Переводим результат в человеческий вид.
$Uv = ((ord($result[5])>>4)*100)+((ord($result[5])&0x0f)*10)+(ord($result[6])>>4)+((ord($result[6])&0x0f)/10);
$Ia = ((ord($result[7])>>4)*10)+(ord($result[7])&0x0f)+((ord($result[8])>>4)/10)+((ord($result[8])&0x0f)/100);
$Pv = ((ord($result[9])&0x0f)*10)+(ord($result[10])>>4)+((ord($result[10])&0x0f)/10)+((ord($result[11])>>4)/100)+((ord($result[11])&0x0f)/1000);
// Значения Uv, Ia, Pv можно писать в базу...
echo "<br>Напряжение сети: ".$Uv ." Uv";
echo "<br>Сила така : ".$Ia ." Ia";
echo "<br>Потребляемая мощьность : ".$Pv." P kVt";
fclose($f);
?>
Пнд, 08/08/2016 - 16:29
#1
Great! Please re-publish your code with respect to this forum rules and practice - http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
By the way, please fix the misspelling in the third line from the bottom. You typed unnecessary "ь" in the word "мощность".