W zależności od możliwości mikrokontrolera można zastosować warstwę komunikacyjną łącza szeregowego (Modbus RTU) lub Ethernet (Modbus TCP).
Do tej komunikacji w systemie PROMOTIC można zastosować: PmModbusMr - Driver do komunikacji protokołem Modbus Master.
Taki protokół można zaprogramować do Arduina (będzie Slave) oraz do aplikacji PROMOTIC (będzie Master).
Do tej komunikacji w systemie PROMOTIC można zastosować: PmChar - Driver do komunikacji przy pomocy ASCII/BIN protokołu zdefiniowanego przez użytkownika.
Ponieważ Arduino jest przeznaczone do dalszego rozszerzania, zawiera wejścia oraz wyjścia nazywane pinami. Do tych pinów można przewodnikiem podłączyć obwody, czipy, przekaźniki, pamięci itd. Do pracy z pinami Arduino posiada proste funkcje.
Programowanie wejściowych oraz wyjściowych wartości analogowych jest nieco bardziej skomlikowane aniżeli programowanie wartości cyfrowych. Nazwa wartości "Analogowej" nie jest w tym przypadku tak całkiem dokłedna, ponieważ nie chodzi o wartości analogowe. Jeżeli jest konieczne zastosować wartość analogową w zakresie na przykład 0-5V, wtedy należałoby zastosować zawnętrzny konwerter D/A. Funkcja ta generuje na wybranych pinach sygnał PWM, który jest jakoby cyfrowy "odpowiednik" sygnału analogowego. W rzeczywistości to działa w taki sposób, że szybko zmienia 0 na 5V.
#include <modbus.h>
#include <modbusDevice.h>
#include <modbusRegBank.h>
#include <modbusSlave.h>
modbusDevice regBank; //Setup the brewtrollers register bank. All of the data accumulated will be stored here
modbusSlave slave; //Create the modbus slave protocol handler
void setup()
{
pinMode(2, INPUT); //Declare DI2
pinMode(13, OUTPUT); //Declare LED as output
regBank.setId(1); //Assign the modbus device ID
regBank.add(10002); //Add Digital Input register
regBank.add(13); //Add Digital Output register
regBank.add(30001); //Add Analog Input register
slave._device = ®Bank; //Assign the modbus device object to the protocol handler
slave.setBaud(9600); //Initialize the serial port for coms at 9600 baud
}
void loop()
{
byte DI2 = digitalRead(2); //Digital Input
if(DI2 >= 1)regBank.set(10002,1);
if(DI2 <= 0)regBank.set(10002,0);
int DO13 = regBank.get(13); //Digital output
if(DO13 <= 0 && digitalRead(13) == HIGH) digitalWrite(13,LOW);
if(DO13 >= 1 && digitalRead(13) == LOW) digitalWrite(13,HIGH);
float valueAI0 = analogRead(0); //Analog Input
regBank.set(30001, (word)valueAI0);
slave.run();
}
float val;
char received;
void setup()
{
pinMode(2,INPUT); //Declare DI2
Serial.begin(9600); //Begin serial communication
}
void loop()
{
while(Serial.available() > 0)
{
received = Serial.read();
if(received == 'a')
{
val = analogRead(0);
val = val*(5.0/1024.0);
Serial.println(val);
}
else if(received == 'd')
{
val = digitalRead(2);
Serial.println(val);
}
}
}