RS485

Utilisation du protocole de communication RS 485, supporte un mode half duplex ou full duplex, avec jusqu'à 32 émetteurs et 32 récepteurs sur une même ligne, et tout ça avec une porté supérieure a 1200m

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

BrocheUtilisation
Vcc5V
Aentrée de récepteur non inverseuse
sortie de pilote non inverseuse
Binversion de l'entrée du récepteur
inversion de l'entrée du pilote
GNDGND (0V)
ROSortie du récepteur (RX)
REActivation du récepteur (LOW Activé)
DEActivation de l’émetteur(HIGH Activé)
DIEntrée émetteur(TX)

Le branchement

Simplex
EmeteurRécepteur
MAX485ArduinoMAX485Arduino
Vcc5VVcc5V
GNDGNDGNDGND
RO-RORX
RE5VREGND
DE5VDEGND
DITXDI-
Programmes
Emeteur, en entrée A0 potentiomètreRé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  
 
Servo myservo;  
 
void setup() 
{ 
  Serial.begin(9600);  
  myservo.attach(9);  
} 
 
void loop() 
{ 
  
  if (Serial.available()) {
    int angle = Serial.read(); 
    if(angle<=180) 
    {
      myservo.write(angle);
    }
  }
}
Half Duplex
EmeteurRécepteur
MAX485ArduinoMAX485Arduino
Vcc5VVcc5V
GNDGNDGNDGND
RORXRORX
REGPIO2REGPIO2
DEGPIO2DEGPIO2
DITXDITX
Programmes
En entrée A0 potentiomètreEn 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;
		}
	}