so sieht die gesamte Aufbau aus
zuerst wollte ich mit nur 2 Controllion's testen.
Die beiden Controllino befinden sich im gleichen Netzwerk (switch)
Blau: GND
Gelb: RS485 -
Orange: RS485 +
//Master
#include <Wire.h>
void setup()
{
Wire.begin(); // join i2c bus
}
void loop()
{
//get data of a analogIn from a slave
requestFromSlave(4);
//turn led 13 on at the master and the slave
digitalWrite(13,HIGH);
slavePinOn(4,13);
delay(500);
//turn led 13 off at the master and the slave
digitalWrite(13,LOW);
slavePinOff(4,13);
delay(500);
}
void requestFromSlave(int slave){
Wire.requestFrom(slave, 2); //request 2 bytes.
while(Wire.available()>1)
{
int pin = Wire.receive(); //in this example the master will receive a pin and a value for an analogWrite
int value = Wire.receive();
analogWrite(pin,value);
}
}
void slavePinOn(int slaveID, int pin){
Wire.beginTransmission(slaveID);
Wire.send('a');
Wire.send(pin);
Wire.send(1);
Wire.endTransmission();
delayMicroseconds(10);
}
void slavePinOff(int slaveID, int pin){
Wire.beginTransmission(slaveID);
Wire.send('b');
Wire.send(pin);
Wire.send(0);
Wire.endTransmission();
delayMicroseconds(10);
}
//Slave
#include <Wire.h>
byte analogValue=0;
void setup()
{
Wire.begin(4); // join i2c bus with address #4
Wire.onRequest(requestEvent); // register event
Wire.onReceive(receiveEvent);
for(int i=2; i<=13; i++){ //set some pins as output
pinMode(i,OUTPUT);
}
}
void loop()
{
//prepare a analog value
int tempValue = analogRead(0);
analogValue = map(tempValue, 0, 1023, 0, 255);
}
void receiveEvent(int howMany)
{
while(Wire.available() < 2); // Wait for 2 bytes to become available
char caseState = Wire.receive();
switch (caseState){
case 'a':{
int pin = Wire.receive();
int ledValue =Wire.receive();
pinOn(pin);
}
break;
case 'b':{
int pin = Wire.receive();
int ledValue =Wire.receive();
pinOff(pin);
}
break;
}
}
void requestEvent()//When data is requested by the master send a bytearray back.
{
byte data[2];
data[0] = 11;//the pin on the master
data[1] = analogValue;//the value
Wire.send(data,2);
}
void pinOn(int pin){//function to turn pin on
digitalWrite(pin,HIGH);
}
void pinOff(int pin){//function to turn pin off
digitalWrite(pin,LOW);
}