RS485 Kommunikation - Taster und Potentiometer

Hallo, ich habe bereits vieles über RS485 Kommunikation gelesen, allerdings habe ich damit Verbindungsprobleme.

Ich muss auch erwähnen das ich Anfänger bin.

Mein Projekt in Kurzfassung:
einen Master:
Der Master ist die Steuereinheit
Dieser besitzt ein I2C 16x4 Display, L298N Motortreiber, I2C MCP4725 DAC und einen Sensor.

einen Slave:
der Slave ist die Fernbedienung, darauf sind Schalter und Taster verbaut. auch eine Baragraph LED Anzeige und ein Potentiometer.

Ich kann momentan die Schalter und Taster am Slave abfragen und per Variable über RS485 Software Serial an den Master senden, dieser kann mir dann die passenden Ausgänge schalten.
Mit dem Potentiometer an A0 am Slave möchte ich nun den DAC am Master ansteuern.

Den Potentiometerwert habe ich mit Serial.println auf den Seriellen Monitor ausgegeben.
Wenn das Potentiometer soweit funktioniert das dessen Wert übertragen wird, werde ich es auch schaffen diese Werte am DAC zu verarbeiten und am Master Sensorwerte auf den Slave für die Baragraph Anzeige zu übertragen.

Ich habe nicht verstanden wie ich nun zu meinen Tasterbefehlen nun auch die Werte für das Potentiometer über den RS485 übertragen kann.

Für die Schalter und Taster Befehle sende ich einfach eine Variable über RS485.
Besonderheiten meiner eingesetzten RS485 Module, ich muss mir keinen Pin auf senden oder Empfangen umschalten.

Wie kann ich nun die Potentiometer Werte übertragen?
Muss ich am Slave ein Array bilden das ich an den Slave sende und dieses dort auswerten?

Soll ich mich dabei an folgendem Beispiel halten?
String trennen

Anfänger: string zusammensetzen und wieder zerlegen

Welches der beiden infrage kommenden Befehle würded ihr mir empfehlen, oder ganz etwas anderes?
1.) strtok() + atoi()
2.) sscanf()

Würde mir bitte jemand ein Beispiel stricken?

Bei anderen laufenden Projekten möchte ich mehrere Temperaturfühler Werte übertragen die einen Master und mehrere Slaves enthalten.

RSR485 Kommunikation:
https://arduino-info.wikispaces.com/SoftwareSerialRS485Example
das wiederum auf
http://www.gammon.com.au/forum/?id=11428
basiert

Serielle Kommunikation

Sketches in abgespeckter Form zum testen der RS485 Kommunikation:

Arduino Master:

/* YourDuino SoftwareSerialExample1
   - Connect to another Arduino running "YD_SoftwareSerialExampleRS485_1Remote"
   - Connect this unit Pins 10, 11, Gnd
   - Pin 3 used for RS485 direction control
   - To other unit Pins 11,10, Gnd  (Cross over)
   - Open Serial Monitor, type in top window. 
   - Should see same characters echoed back from remote Arduino

   Questions: terry@yourduino.com 
*/

/*-----( Import needed libraries )-----*/
#include <SoftwareSerial.h>
/*-----( Declare Constants and Pin Numbers )-----*/
#define SSerialRX        5  //Serial Receive pin
#define SSerialTX        6  //Serial Transmit pin

#define SSerialTxControl 3   //RS485 Direction control

#define RS485Transmit    HIGH
#define RS485Receive     LOW

#define Pin13LED         13

/*-----( Declare objects )-----*/
SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX

/*-----( Declare Variables )-----*/
int byteReceived;
int byteSend;
int analogwert;

void setup()   /****** SETUP: RUNS ONCE ******/
{
  // Start the built-in serial port, probably to Serial Monitor
  Serial.begin(9600);
  Serial.println("YourDuino.com SoftwareSerial remote loop example");
  Serial.println("Use Serial Monitor, type in upper window, ENTER");
  
  pinMode(Pin13LED, OUTPUT);   
  pinMode(SSerialTxControl, OUTPUT);    
  
  digitalWrite(SSerialTxControl, RS485Receive);  // Init Transceiver   
  
  // Start the software serial port, to another device
  RS485Serial.begin(4800);   // set the data rate 

}//--(end setup )---


void loop()   /****** LOOP: RUNS CONSTANTLY ******/
{
  digitalWrite(Pin13LED, HIGH);  // Show activity
  if (Serial.available())
  {
    byteReceived = Serial.read();
    //byteReceived = ("HelloWorld"); //Testversuch
    digitalWrite(SSerialTxControl, RS485Transmit);  // Enable RS485 Transmit   
    RS485Serial.write(byteReceived);          // Send byte to Remote Arduino
    
    digitalWrite(Pin13LED, LOW);  // Show activity    
    delay(10);
    digitalWrite(SSerialTxControl, RS485Receive);  // Disable RS485 Transmit       
  }
  
  if (RS485Serial.available())  //Look for data from other Arduino
   {
    digitalWrite(Pin13LED, HIGH);  // Show activity
    byteReceived = RS485Serial.read();    // Read received byte
    Serial.write(byteReceived);        // Show on Serial Monitor
    delay(10);
    digitalWrite(Pin13LED, LOW);  // Show activity   

   
   
   
   }  

//RS485Serial.write ("HelloWorld");
//byteSend = ("HalloWelt");
//byteReceived = ("ueberdruckStart");
//analogwert = analogRead(A0);
//RS485Serial.write(analogwert);
//Serial.write(byteReceived);
//Serial.println(byteReceived);
//delay(100);


//Serial.println ("HI");
//***
//if (byteReceived  == ("7"))
if (byteReceived  == '8')
{
  Serial.println ("EINE_ACHT_EMPFANGEN");
}

else if (byteReceived  == '9')
{
  Serial.println ("EINE_NEUN_EMPFANGEN");
}
else
{

}
//***


}//--(end main loop )---

/*-----( Declare User-written Functions )-----*/


//NONE
//*********( THE END )***********

Arduino Slave:

/* YourDuino SoftwareSerialExample1Remote
   - Used with YD_SoftwareSerialExampleRS485_1 on another Arduino
   - Remote: Receive data, loop it back...
   - Connect this unit Pins 10, 11, Gnd
   - To other unit Pins 11,10, Gnd  (Cross over)
   - Pin 3 used for RS485 direction control   
   - Pin 13 LED blinks when data is received  
   
   Questions: terry@yourduino.com 
*/

/*-----( Import needed libraries )-----*/
#include <SoftwareSerial.h>
/*-----( Declare Constants and Pin Numbers )-----*/
#define SSerialRX        5  //Serial Receive pin
#define SSerialTX        6  //Serial Transmit pin

#define SSerialTxControl 3   //RS485 Direction control
#define RS485Transmit    HIGH
#define RS485Receive     LOW

#define Pin13LED         13

/*-----( Declare objects )-----*/
SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX

/*-----( Declare Variables )-----*/
int byteReceived;
int byteSend;
int analogwert;

int Pin7 = 7;
int Pin8 = 8;

int Pin7State;
int Pin8State;



void setup()   /****** SETUP: RUNS ONCE ******/
{
  
pinMode (Pin7, INPUT_PULLUP);
pinMode (Pin8, INPUT_PULLUP);

  
  // 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(4800);   // set the data rate 
}//--(end setup )---





void loop()   /****** LOOP: RUNS CONSTANTLY ******/
{
  //Copy input data to output  
  if (RS485Serial.available()) 
  {
    byteSend = RS485Serial.read();   // Read the byte 
    
    digitalWrite(Pin13LED, HIGH);  // Show activity
    delay(10);              
    digitalWrite(Pin13LED, LOW);   
    
    digitalWrite(SSerialTxControl, RS485Transmit);  // Enable RS485 Transmit    
   // RS485Serial.write(byteSend); // Send the byte back
    //RS485Serial.write("Hello you"); //Test
//    RS485Serial.write = (analogRead(A0)); //Test
analogwert = analogRead(A0);
    RS485Serial.write (analogwert); //Test
    Serial.print (analogwert);
    delay(10);   
    digitalWrite(SSerialTxControl, RS485Receive);  // Disable RS485 Transmit      
//    delay(100);
  }// End If RS485SerialAvailable
  
  
  
  
//Serial.println ("Hallo");
   
Pin7State = digitalRead (Pin7);
Pin8State = digitalRead (Pin8);
   
    if (Pin7State == LOW)
  {
    Serial.println ("Pin7LOW");
  RS485Serial.write ("8");
  delay (200);
  }
  
  
     if (Pin8State == LOW)
  {
    Serial.println ("Pin8LOW");
  RS485Serial.write ("9");
  delay(200);
  }
  
  
  
}//--(end main loop )---

/*-----( Declare User-written Functions )-----*/
//NONE

//*********( THE END )***********

Ich hoffe Ihr könnt mir bitte helfen.

Möchtest Du eine half-duplex oder full-duplex Verbindung? Bei full-duplex können beide Stationen gleichzeitig senden und empfangen, bei half-duplex müssen sie sich absprechen, wer senden darf.

Möchtest Du auch noch mit einem PC kommunizieren? Das geht über den Serial Port, so daß für die RS-485 Verbindung ein anderer Port (Serial1 oder SoftwareSerial) verwendet werden muß.

Hallo,

ohne Richtungskontrolle funktioniert das nicht. Möglicherweise, Glaskugelmode ON, ist TX mit Send-Enable verbunden. Ansonsten wäre ja jede Seite sturr auf senden oder sturr auf empfangen eingestellt, nichts würde funktionieren. Glaskugelmode OFF.

Momentan sendet dein Slave sturr Daten an den Master. Da kann noch nichts schief gehen. Sobald du mehrere Slaves hast, muss der Master die Kontrolle über die gesamte Kommunikation übernehmen. Zudem benötigst du ein klares Protokoll. Was ich dir anbieten kann ist hier hinterlegt. Beitrag #25. http://forum.arduino.cc/index.php?topic=542997.0

Hallo DrDiettrich und Doc_Arduino!

Mein Aufbau ist momentan natürlich viel umfangreicher als wie die abgespeckten Sketches die ich hochgeladen habe.
Es würde nur sehr unübersichtlich werden wenn ich wirklich alles hochladen würde.

Ich kann so wie mein Aufbau besteht in beide Richtungen senden ohne dass ich dafür einen eigenen Pin an den RS485 Bausteinen auf HIGH oder LOW setze.
An Hardware Serial verwende ich erst mal nur den Seriellen Monitor, ich werde aber noch Bluetooth Module und Pegelwandler anschließen dass ich die Programmierung auch drahtlos durchführen kann.

Zur Überwachung der übertragenen RS485 Daten habe ich auch noch einen RS485 USB Adapter in Verwendung, damit ich nicht alles auf dem Seriellen Monitor ausgeben muss.

Ich denke das ist jetzt alles nur Nebensache wie ich das ganze aufgebaut habe und was alles programmiert ist.
Ich weiß das eine richtige Vollduplex Verbindung mit 2x RX und 2x TX aufgebaut werden müsste. Im Grunde ist mir Halbduplex vollkommen ausreichend, da ich den BUS nicht beabsichtige vollständig in eine Richtung auszulasten und damit alles blockieren würde.

Doc_Arduino, da vermutest du wohl richtig, dass meine Module intern automatisch Senden und Empfangen aushandeln.

RS485 Module mit automatischer Sende und Empfangsumschaltung

Zitat:
To achieve the RS485 signal automatic flow control, send and receive direction automatically switch, use this module with your operation as simple as the serial port
Baud rate: 110 ~ 256000bps

Ich werde mir deinen genannten Beitrag durchlesen und hoffen dass ich es verstehen werde.

LG Hans