Dobrý den je tu někdo kdo by nám pomol rozchodit arduino UNO a HMI panel po rs485 modbus RTU
http://arduino-shop.cz/arduino/985-prevodnik-ttl-na-rs-485-1427700037.html
Zde mame k nahlédnutí kod:
#include <modbus.h>
#include <modbusDevice.h>
#include <modbusRegBank.h>
#include <modbusSlave.h>
//deklarování pinů relé karty
int rele1 = 4;
int rele2 = 5;
int rele3 = 6;
int rele4 = 7;
int rele5 = 8;
int rele6 = 9;
int rele7 = 10;
int rele8 = 11;
int ECHO = 12; // Echo pin z HC-SC04 na pinu 2
int TRIG = 13; // Trig pin z HC-SC04 na pin 3
//Setup the brewtrollers register bank
//All of the data accumulated will be stored here
modbusDevice regBank;
//Create the modbus slave protocol handler
modbusSlave slave;
void setup(){
Serial.begin(9600);
//Assign the modbus device ID.
regBank.setId(1);
regBank.add(1);
regBank.add(2);
regBank.add(3);
regBank.add(4);
regBank.add(5);
regBank.add(6);
regBank.add(7);
regBank.add(8);
regBank.add(30001); //regist pro teplotni senzor A0
regBank.add(30002); //regist pro teplotni senzor A1
regBank.add(40020); //registr pro data z ultrazvuku
slave._device = ®Bank;
//inicializace sériového portu s rychlostí 9600
slave.setBaud(9600);
pinMode(rele1, OUTPUT);
pinMode(rele2, OUTPUT);
pinMode(rele3, OUTPUT);
pinMode(rele4, OUTPUT);
pinMode(rele5, OUTPUT);
pinMode(rele6, OUTPUT);
pinMode(rele7, OUTPUT);
pinMode(rele8, OUTPUT);
//Nastaví pin 12 jako vstupní
pinMode(ECHO, INPUT);
//Nastaví pin 13 jako výstupní
pinMode(TRIG, OUTPUT);
}
void loop(){
unsigned long cas = millis();
while(millis() - cas < 100){
//zapnutí a vypnutí relé
digitalWrite(rele1, regBank.get(1));
digitalWrite(rele2, regBank.get(2));
digitalWrite(rele3, regBank.get(3));
digitalWrite(rele4, regBank.get(4));
digitalWrite(rele5, regBank.get(5));
digitalWrite(rele6, regBank.get(6));
digitalWrite(rele7, regBank.get(7));
digitalWrite(rele8, regBank.get(8));
slave.run();
}
//HCSR-04
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
// Spočítá vzdálenost
float distance = pulseIn(ECHO, HIGH);
distance= distance*0.017315f;
int vzdalenost = (distance * 100) + 0.5;
if(vzdalenost > 40000) vzdalenost = 40000;
regBank.set(40020, (word) vzdalenost); //vzdálenost od 0 do 1000, 1mm = 1, 1000mm = 1000
// Spocita teplotu z cidla A0
int sensorValue = analogRead(A0);
float volt = (sensorValue/1020.0) * 5.0; //Volts
float tempC = (volt -0.5) * 10000; //Celcius
regBank.set(30001, (word) tempC);
// Spocita teplotu z cidla A1
int sensorValue1 = analogRead(A1);
float volt1 = (sensorValue1/1020.0) * 5.0; //Volts
float tempC1 = (volt1 -0.5) * 10000; //Celcius
regBank.set(30002, (word) tempC1);
slave.run();
}