RS 485
Modes de transmission
| Les données circulent dans un seul sens (émetteur vers récepteur) | |
| Les données circulent dans les 2 sens mais pas simultanément : bande passante utilisée en intégralité. | 
UART - > RS485
Les broches
| Broche | Utilisation | 
|---|---|
| Vcc | 5V | 
| A | entrée de récepteur non inverseuse sortie de pilote non inverseuse  | 
| B | inversion de l'entrée du récepteur inversion de l'entrée du pilote  | 
| GND | GND (0V) | 
| RO | Sortie du récepteur (RX) | 
| RE | Activation du récepteur (LOW Activé) | 
| DE | Activation de l’émetteur(HIGH Activé) | 
| DI | Entrée émetteur(TX) | 
Le branchement
| Emeteur | Récepteur | ||
|---|---|---|---|
| MAX485 | Arduino | MAX485 | Arduino | 
| Vcc | 5V | Vcc | 5V | 
| GND | GND | GND | GND | 
| RO | - | RO | RX | 
| RE | 5V | RE | GND | 
| DE | 5V | DE | GND | 
| DI | TX | DI | - | 
| Programmes | |||
| Emeteur, en entrée A0 potentiomètre | Récepteur, en sortie D9 un servomoteur | ||
void setup() 
{ 
  Serial.begin(9600);
} 
 
void loop() 
{ 
  int data= analogRead(0); 
  byte angle= map(data, 0, 1023, 0, 180);   
  Serial.write(angle); 
  delay(50);                           
} | #include  | ||
| Emeteur | Récepteur | ||
|---|---|---|---|
| MAX485 | Arduino | MAX485 | Arduino | 
| Vcc | 5V | Vcc | 5V | 
| GND | GND | GND | GND | 
| RO | RX | RO | RX | 
| RE | GPIO2 | RE | GPIO2 | 
| DE | GPIO2 | DE | GPIO2 | 
| DI | TX | DI | TX | 
| Programmes | |||
| En entrée A0 potentiomètre | En entrée A0 potentiomètre | ||
const int ledPin =  13;  // Built-in LED
const int EnTxPin =  2;  // HIGH:Transmitter, LOW:Receiver
void setup() 
{ 
  Serial.begin(9600);
  Serial.setTimeout(100);  
  pinMode(ledPin, OUTPUT);
  pinMode(EnTxPin, OUTPUT);
  digitalWrite(ledPin, LOW); 
  digitalWrite(EnTxPin, HIGH); 
} 
 
void loop() 
{   
  int rdata = analogRead(0); //data from potentiometer 
  int angle= map(rdata, 0, 1023, 0, 180); 
  
  //transmitter data packet
  Serial.print("I"); //initiate data packet
  Serial.print("S"); //code pour servo
  Serial.print(angle); //servo angle data
  Serial.print("F"); //finish data packet
  delay(50); 
  //receiver data packet
  Serial.print("I"); //initiate data packet
  Serial.print("L"); //code for sensor
  Serial.print("F"); //finish data packet
  Serial.flush();    
  
  digitalWrite(EnTxPin, LOW); //RS485 as receiver
  if(Serial.find("i"))
  {
      int data=Serial.parseInt(); 
      if(Serial.read()=='f') //finish reading
       {
         onLED(data);            
      }
      
  }
  digitalWrite(EnTxPin, HIGH); //RS485 as transmitter
  
} 
void onLED(int data)
{
  if(data>500)
     digitalWrite(ledPin, HIGH); 
  else
     digitalWrite(ledPin, LOW); 
} | 
#include <Servo.h>
Servo myservo; 
const int EnTxPin = 2;
void setup () {
  Serial.begin (9600);
  myservo.attach (9); 
  pinMode(EnTxPin, OUTPUT );
  digitalWrite (EnTxPin, LOW );
}
void loop (){
  if ( Serial.available ()){
    if ( Serial.read () == 'I' ){
      char function = Serial.read ();
      if (function == 'S' ){
        int angle = Serial.parseInt ();
        if ( Serial.read () == 'F' ){
          if (angle <= 180) {
            myservo.write (angle);
          }
        }
      }
      else if (function == 'L' ){
        if ( Serial.read () == 'F' ){
          int val = analogRead (0);
          digitalWrite (EnTxPin, HIGH ); //enable to transmit
          Serial.print ( "i" ); 
          Serial.print (val); 
          Serial.println ( "f" ); 
          Serial.flush (); 
          digitalWrite (EnTxPin, LOW ); //enable to receive
        }
      }
    }
  }
  delay (10);
}
 | ||
ESP-01->RS485

/* Un exemple de programme de connexion au complexe cloud DispSky avec transfert de données vers l'interface RS485 Si vous avez des questions sur le fonctionnement du programme et sur l'ensemble du complexe dans son ensemble, vous pouvez contacter le service d'assistance technique : http://dispsky.ru/podderzhka/tehpodderzhka/ */ #include#define HEART_BEAT_TIME 30 #define TIMER_SEND 50 #define BUFFER_LEN 300 const char* ssid = "SSID"; const char* password ="PASSWORD"; //IPAddress serverDispSky { 192, 168, 34, 221 }; char serverDispSky [] = "s1.dispsky.ru"; //Adresse du serveur DispSky const int port = 5010; //Port du serveur DispSky char* heartbeat = "ARDUINO_0002"; //Le code de connexion, vous devez créer votre propre code unique et spécifier le même dans votre compte DispSky uint8_t bufferIn[BUFFER_LEN], bufferOut[BUFFER_LEN]; int lenBufIn, lenBufOut, m_lenBufIn; unsigned long timerHeartBeat, timerIn, timerOut; byte bufferFlagIn, bufferFlagOut; WiFiClient DispSkyClient; void setup() { WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); Serial.begin(115200, SERIAL_8N1); if(DispSkyClient.connect(serverDispSky, port)) DispSkyClient.write(heartbeat, 12); pinMode(2, OUTPUT); //Lors de l'utilisation de GPIO 2 digitalWrite(2, LOW); //pinMode(0, OUTPUT); //Lors de l'utilisation de GPIO 0 //digitalWrite(0, LOW); } void loop() { bridge(); } void bridge() { lenBufIn = DispSkyClient.available(); if (millis() - timerHeartBeat > (unsigned long) HEART_BEAT_TIME * 1000 ) { timerHeartBeat = millis(); DispSkyClient.stop(); DispSkyClient.connect(serverDispSky, port); DispSkyClient.write(heartbeat, 12); } if (lenBufIn > 0) { timerHeartBeat = millis(); timerIn = millis(); bufferFlagIn = true; DispSkyClient.read(bufferIn, lenBufIn); m_lenBufIn = lenBufIn; } if (bufferFlagIn && millis() - timerIn > TIMER_SEND) { bufferFlagIn = false; digitalWrite(2, HIGH); //Lors de l'utilisation de GPIO 2 //digitalWrite(0, HIGH); //Lors de l'utilisation de GPIO 0 Serial.write(bufferIn, m_lenBufIn); delay(5); digitalWrite(2, LOW); //Lors de l'utilisation de GPIO 2 //digitalWrite(0, LOW); //Lors de l'utilisation de GPIO 0 } if (Serial.available() > 0) { bufferFlagOut = true; timerOut = millis(); while (Serial.available()) { bufferOut[lenBufOut] = Serial.read(); lenBufOut++; if (lenBufOut >= BUFFER_LEN - 1) lenBufOut = 0; } } if (bufferFlagOut && millis() - timerOut > TIMER_SEND) { bufferFlagOut = false; DispSkyClient.write(bufferOut, lenBufOut); lenBufOut = 0; } }