Um Arduino controlando outro – comunicação entre Arduinos

Neste vídeo vamos fazer um Arduino enviar e receber dados de outro arduino.

Apresentação: Júlio Vansan Gonçalves

Materiais:

  • Arduino Nano ou Uno
  • Protoboard
  • Kit jumpers
  • Botões
  • Leds
  • Resistores
  • Encoder Rotativo
  • 2x módulo conversor RS485

Códigos usados no vídeo

Envia V1:

const int bt1=5;
const int bt2=6;
const int bt3=7;
const int bt4=8;

const int luz1=A1;
const int luz2=A2;
const int luz3=A3;
const int luz4=A4;
const int luz5=9;

int estadoLuz1=LOW;
int estadoLuz2=LOW;
int estadoLuz3=LOW;
int estadoLuz4=LOW;
int estadoLuz5=0;

String RecebeDados="";
String enviaDados="";

#include <RotaryEncoder.h>
//Pinos de ligacao do encoder
RotaryEncoder encoder(3, 4);

//Variavel para o botao do encoder
int valor = 0;
int newPos = 0;
const int bt5=2;

// Serial via cabo
#include <SoftwareSerial.h>
SoftwareSerial serialLuz(11, 12); // RX 11 | TX 12

void setup() {
  Serial.begin(9600);
  serialLuz.begin(2400);
  pinMode(bt1,INPUT_PULLUP);
  pinMode(bt2,INPUT_PULLUP);
  pinMode(bt3,INPUT_PULLUP);
  pinMode(bt4,INPUT_PULLUP);
  pinMode(bt5,INPUT);
  pinMode(luz1,OUTPUT);
  pinMode(luz2,OUTPUT);
  pinMode(luz3,OUTPUT);
  pinMode(luz4,OUTPUT);
  pinMode(luz5,OUTPUT);
  delay(3000);
  Serial.println("### Iniciando ### ");
  serialLuz.print("MestreLigou");
  
}

void loop() {
  
  if (digitalRead(bt1)==LOW){
    estadoLuz1= !estadoLuz1;
    digitalWrite(luz1,estadoLuz1);
    enviaDados="LUZ1=";
    enviaDados+=String(estadoLuz1);
    serialLuz.print(enviaDados);
    Serial.print("Botão 1 Pressionado >> Enviado:  ");
    Serial.println(enviaDados);
    while (digitalRead(bt1)==LOW){
      delay(50);
    }//while
  }//if botão

  if (digitalRead(bt2)==LOW){
    estadoLuz2= !estadoLuz2;
    digitalWrite(luz2,estadoLuz2);
    enviaDados="LUZ2=";
    enviaDados+=String(estadoLuz2);
    serialLuz.print(enviaDados);
    Serial.print("Botão 2 Pressionado >> Enviado:  ");
    Serial.println(enviaDados);
    while (digitalRead(bt2)==LOW){
      delay(50);
    }//while
  }//if botão

   if (digitalRead(bt3)==LOW){
    estadoLuz3= !estadoLuz3;
    digitalWrite(luz3,estadoLuz3);
    enviaDados="LUZ3=";
    enviaDados+=String(estadoLuz3);
    serialLuz.print(enviaDados);
    Serial.print("Botão 3 Pressionado >> Enviado:  ");
    Serial.println(enviaDados);
    while (digitalRead(bt3)==LOW){
      delay(50);
    }//while
  }//if botão


   if (digitalRead(bt4)==LOW){
    estadoLuz4= !estadoLuz4;
    digitalWrite(luz4,estadoLuz4);
    enviaDados="LUZ4=";
    enviaDados+=String(estadoLuz4);
    serialLuz.print(enviaDados);
    Serial.print("Botão 4 Pressionado >> Enviado:  ");
    Serial.println(enviaDados);
    while (digitalRead(bt4)==LOW){
      delay(50);
    }//while
  }//if botão


  //Le as informacoes do encoder
  static int pos = 0;
  encoder.tick();
  int newPos = encoder.getPosition();
  
  //Se a posicao foi alterada, mostra o valor
  //no Serial Monitor
  if (pos != newPos) {
 
    Serial.print(newPos);
    Serial.println();
 
    if ((pos-newPos)<0){
      estadoLuz5+=15;
      if (estadoLuz5>=255){
        estadoLuz5=255;
      }
    }
    if ((pos-newPos)>0){
      estadoLuz5-=15;
      if (estadoLuz5<=0){
        estadoLuz5=0;
      }
    }
    
    
    pos = newPos;
    
    enviaDados="LUZ5=";
    enviaDados+=String(estadoLuz5);
    serialLuz.print(enviaDados);
    Serial.print("Valor Luz 5 Alterado >> Enviado:  ");
    Serial.println(enviaDados);
  
  }
  
  RecebeDados="";
  if(serialLuz.available()){
    
    delay(3);
    RecebeDados="";
    while(serialLuz.available()){
        delay(3);
        char c = serialLuz.read();
        RecebeDados +=c;
      }
    Serial.print("\n <<<<  Dados Recebidos:  ");
    Serial.print(RecebeDados);

  }//if serial

   if(RecebeDados=="LUZ1=1"){
   estadoLuz1=1 ;
   Serial.print("  +++ Ligando 1 +++ ");
  }
  if(RecebeDados=="LUZ1=0"){
   estadoLuz1=0 ;
   Serial.print("  +++ Desligando 1 +++ ");
  }

   if(RecebeDados=="LUZ2=1"){
   estadoLuz2=1 ;
   Serial.print("  +++ Ligando 2 +++ ");
  }
  if(RecebeDados=="LUZ2=0"){
   estadoLuz2=0 ;
   Serial.print("  +++ Desligando 2 +++ ");
  }

   if(RecebeDados=="LUZ3=1"){
   estadoLuz3=1 ;
   Serial.print("  +++ Ligando 3 +++ ");
  }
  if(RecebeDados=="LUZ3=0"){
   estadoLuz3=0 ;
   Serial.print("  +++ Desligando 3 +++ ");
  }

   if(RecebeDados=="LUZ4=1"){
   estadoLuz4=1 ;
   Serial.print("  +++ Ligando 4 +++ ");
  }
  if(RecebeDados=="LUZ4=0"){
   estadoLuz4=0 ;
   Serial.print("  +++ Desligando 4 +++ ");
  }

  String qualLuz=(RecebeDados.substring(0,5));
  if (qualLuz=="LUZ5="){
    estadoLuz5=(RecebeDados.substring(5)).toInt();
  }

   if(RecebeDados=="EscravoLigou"){
    enviaDados="LUZ1=";
    enviaDados+=String(estadoLuz1);
    serialLuz.print(enviaDados);
    delay(100);
    enviaDados="LUZ2=";
    enviaDados+=String(estadoLuz2);
    serialLuz.print(enviaDados);
    delay(100);
    enviaDados="LUZ3=";
    enviaDados+=String(estadoLuz3);
    serialLuz.print(enviaDados);
    delay(100);
    enviaDados="LUZ4=";
    enviaDados+=String(estadoLuz4);
    serialLuz.print(enviaDados);
    delay(100);
     enviaDados="LUZ5=";
    enviaDados+=String(estadoLuz5);
    serialLuz.print(enviaDados);
    delay(100);
   
  }
  
  digitalWrite(luz1,estadoLuz1);
  digitalWrite(luz2,estadoLuz2);
  digitalWrite(luz3,estadoLuz3);
  digitalWrite(luz4,estadoLuz4);
  analogWrite(luz5,estadoLuz5);
}

Recebe v1:

const int luz1=A1;
const int luz2=A2;
const int luz3=A3;
const int luz4=A4;
const int luz5=9;

String qualLuz="";

int estadoLuz1=LOW;
int estadoLuz2=LOW;
int estadoLuz3=LOW;
int estadoLuz4=LOW;
int estadoLuz5=0;
int estadoLuz5Invertido=0;

String RecebeDados="";
String enviaDados="";

// Serial via cabo
#include <SoftwareSerial.h>
SoftwareSerial serialLuz(11, 12); // RX 11 | TX 12

void setup() {
  Serial.begin(9600);
  serialLuz.begin(2400);
  pinMode(luz1,OUTPUT);
  pinMode(luz2,OUTPUT);
  pinMode(luz3,OUTPUT);
  pinMode(luz4,OUTPUT);
  pinMode(luz5,OUTPUT);
  delay(3000);
  Serial.println("### Iniciando ### ");
  serialLuz.print("EscravoLigou");
}

void loop() {
  RecebeDados="";
  if(serialLuz.available()){
    
    delay(3);
    RecebeDados="";
    while(serialLuz.available()){
        delay(3);
        char c = serialLuz.read();
        RecebeDados +=c;
      }
    Serial.print("\n <<<<  Dados Recebidos:  ");
    Serial.print(RecebeDados);
    //Serial.println(RecebeDados.substring(0,5));
    //Serial.println(RecebeDados.substring(5));
   }//if serial

  if(RecebeDados=="LUZ1=1"){
   estadoLuz1=1 ;
   Serial.print("  +++ Ligando 1 +++ ");
  }
  if(RecebeDados=="LUZ1=0"){
   estadoLuz1=0 ;
   Serial.print("  +++ Desligando 1 +++ ");
  }

   if(RecebeDados=="LUZ2=1"){
   estadoLuz2=1 ;
   Serial.print("  +++ Ligando 2 +++ ");
  }
  if(RecebeDados=="LUZ2=0"){
   estadoLuz2=0 ;
   Serial.print("  +++ Desligando 2 +++ ");
  }

   if(RecebeDados=="LUZ3=1"){
   estadoLuz3=1 ;
   Serial.print("  +++ Ligando 3 +++ ");
  }
  if(RecebeDados=="LUZ3=0"){
   estadoLuz3=0 ;
   Serial.print("  +++ Desligando 3 +++ ");
  }

   if(RecebeDados=="LUZ4=1"){
   estadoLuz4=1 ;
   Serial.print("  +++ Ligando 4 +++ ");
  }
  if(RecebeDados=="LUZ4=0"){
   estadoLuz4=0 ;
   Serial.print("  +++ Desligando 4 +++ ");
  }

  qualLuz=(RecebeDados.substring(0,5));
  if (qualLuz=="LUZ5="){
    estadoLuz5=(RecebeDados.substring(5)).toInt();
//    estadoLuz5Invertido=map(estadoLuz5,0,255,255,0);
//    Serial.print("  >>> Invertido = ");
//    Serial.print(estadoLuz5Invertido);
  }
    
  

   if(RecebeDados=="MestreLigou"){
    enviaDados="LUZ1=";
    enviaDados+=String(estadoLuz1);
    serialLuz.print(enviaDados);
    delay(100);
    enviaDados="LUZ2=";
    enviaDados+=String(estadoLuz2);
    serialLuz.print(enviaDados);
    delay(100);
    enviaDados="LUZ3=";
    enviaDados+=String(estadoLuz3);
    serialLuz.print(enviaDados);
    delay(100);
    enviaDados="LUZ4=";
    enviaDados+=String(estadoLuz4);
    serialLuz.print(enviaDados);
    delay(100);
    enviaDados="LUZ5=";
    enviaDados+=String(estadoLuz5);
    serialLuz.print(enviaDados);
    delay(100);
   
  }
  
  digitalWrite(luz1,estadoLuz1);
  digitalWrite(luz2,estadoLuz2);
  digitalWrite(luz3,estadoLuz3);
  digitalWrite(luz4,estadoLuz4);
  analogWrite(luz5,estadoLuz5);

  


} //loop

Envia com RS485

const int bt1=5;
const int bt2=6;
const int bt3=7;
const int bt4=8;

const int luz1=A1;
const int luz2=A2;
const int luz3=A3;
const int luz4=A4;
const int luz5=9;

int estadoLuz1=LOW;
int estadoLuz2=LOW;
int estadoLuz3=LOW;
int estadoLuz4=LOW;
int estadoLuz5=0;

String RecebeDados="";
String enviaDados="";

#include <RotaryEncoder.h>
//Pinos de ligacao do encoder
RotaryEncoder encoder(3, 4);

//Variavel para o botao do encoder
int valor = 0;
int newPos = 0;
const int bt5=2;

// Serial via cabo
#include <SoftwareSerial.h>
SoftwareSerial serialLuz(11, 12); // RX 11 | TX 12
#define RS485Envia HIGH
#define RS485Recebe LOW
const int controleRS485=10;


void setup() {
  Serial.begin(9600);
  serialLuz.begin(2400);
  pinMode(bt1,INPUT_PULLUP);
  pinMode(bt2,INPUT_PULLUP);
  pinMode(bt3,INPUT_PULLUP);
  pinMode(bt4,INPUT_PULLUP);
  pinMode(bt5,INPUT);
  pinMode(luz1,OUTPUT);
  pinMode(luz2,OUTPUT);
  pinMode(luz3,OUTPUT);
  pinMode(luz4,OUTPUT);
  pinMode(luz5,OUTPUT);
  pinMode(controleRS485,OUTPUT);
  delay(3000);
  Serial.println("### Iniciando Principal ### ");
  digitalWrite(controleRS485,RS485Envia);
  serialLuz.print("PrincipalLigou");
  
}

void loop() {
  if (digitalRead(bt1)==LOW){
    estadoLuz1= !estadoLuz1;
    digitalWrite(luz1,estadoLuz1);
    enviaDados="LUZ1=";
    enviaDados+=String(estadoLuz1);
    digitalWrite(controleRS485,RS485Envia);
    serialLuz.print(enviaDados);  
    Serial.print("Botão 1 Pressionado >> Enviado:  ");
    Serial.println(enviaDados);
    while (digitalRead(bt1)==LOW){
      delay(50);
    }//while
  }//if botão

  if (digitalRead(bt2)==LOW){
    estadoLuz2= !estadoLuz2;
    digitalWrite(luz2,estadoLuz2);
    enviaDados="LUZ2=";
    enviaDados+=String(estadoLuz2);
    digitalWrite(controleRS485,RS485Envia);
    serialLuz.print(enviaDados);
    Serial.print("Botão 2 Pressionado >> Enviado:  ");
    Serial.println(enviaDados);
    while (digitalRead(bt2)==LOW){
      delay(50);
    }//while
  }//if botão

   if (digitalRead(bt3)==LOW){
    estadoLuz3= !estadoLuz3;
    digitalWrite(luz3,estadoLuz3);
    enviaDados="LUZ3=";
    enviaDados+=String(estadoLuz3);
    digitalWrite(controleRS485,RS485Envia);
    serialLuz.print(enviaDados);
    Serial.print("Botão 3 Pressionado >> Enviado:  ");
    Serial.println(enviaDados);
    while (digitalRead(bt3)==LOW){
      delay(50);
    }//while
  }//if botão


   if (digitalRead(bt4)==LOW){
    estadoLuz4= !estadoLuz4;
    digitalWrite(luz4,estadoLuz4);
    enviaDados="LUZ4=";
    enviaDados+=String(estadoLuz4);
    digitalWrite(controleRS485,RS485Envia);
    serialLuz.print(enviaDados);
    Serial.print("Botão 4 Pressionado >> Enviado:  ");
    Serial.println(enviaDados);
    while (digitalRead(bt4)==LOW){
      delay(50);
    }//while
  }//if botão


  //Le as informacoes do encoder
  static int pos = 0;
  encoder.tick();
  int newPos = encoder.getPosition();
  
  //Se a posicao foi alterada, mostra o valor
  //no Serial Monitor
  if (pos != newPos) {
 
    Serial.print(newPos);
    Serial.println();
 
    if ((pos-newPos)<0){
      estadoLuz5+=15;
      if (estadoLuz5>=255){
        estadoLuz5=255;
      }
    }
    if ((pos-newPos)>0){
      estadoLuz5-=15;
      if (estadoLuz5<=0){
        estadoLuz5=0;
      }
    }
    
    
    pos = newPos;
    
    enviaDados="LUZ5=";
    enviaDados+=String(estadoLuz5);
    digitalWrite(controleRS485,RS485Envia);
    serialLuz.print(enviaDados);
    Serial.print("Valor Luz 5 Alterado >> Enviado:  ");
    Serial.println(enviaDados);
  
  }
  digitalWrite(controleRS485,RS485Recebe);
  delay(10);
  RecebeDados="";
  if(serialLuz.available()){
    
    delay(3);
    RecebeDados="";
    while(serialLuz.available()){
        delay(3);
        char c = serialLuz.read();
        RecebeDados +=c;
      }
    Serial.print("\n <<<<  Dados Recebidos:  ");
    Serial.print(RecebeDados);

  }//if serial

   if(RecebeDados=="LUZ1=1"){
   estadoLuz1=1 ;
   Serial.print("  +++ Ligando 1 +++ ");
  }
  if(RecebeDados=="LUZ1=0"){
   estadoLuz1=0 ;
   Serial.print("  +++ Desligando 1 +++ ");
  }

   if(RecebeDados=="LUZ2=1"){
   estadoLuz2=1 ;
   Serial.print("  +++ Ligando 2 +++ ");
  }
  if(RecebeDados=="LUZ2=0"){
   estadoLuz2=0 ;
   Serial.print("  +++ Desligando 2 +++ ");
  }

   if(RecebeDados=="LUZ3=1"){
   estadoLuz3=1 ;
   Serial.print("  +++ Ligando 3 +++ ");
  }
  if(RecebeDados=="LUZ3=0"){
   estadoLuz3=0 ;
   Serial.print("  +++ Desligando 3 +++ ");
  }

   if(RecebeDados=="LUZ4=1"){
   estadoLuz4=1 ;
   Serial.print("  +++ Ligando 4 +++ ");
  }
  if(RecebeDados=="LUZ4=0"){
   estadoLuz4=0 ;
   Serial.print("  +++ Desligando 4 +++ ");
  }

  String qualLuz=(RecebeDados.substring(0,5));
  if (qualLuz=="LUZ5="){
    estadoLuz5=(RecebeDados.substring(5)).toInt();
  }

   if(RecebeDados=="SecundarioLigou"){
    digitalWrite(controleRS485,RS485Envia);
    enviaDados="LUZ1=";
    enviaDados+=String(estadoLuz1);
    serialLuz.print(enviaDados);
    delay(100);
    enviaDados="LUZ2=";
    enviaDados+=String(estadoLuz2);
    serialLuz.print(enviaDados);
    delay(100);
    enviaDados="LUZ3=";
    enviaDados+=String(estadoLuz3);
    serialLuz.print(enviaDados);
    delay(100);
    enviaDados="LUZ4=";
    enviaDados+=String(estadoLuz4);
    serialLuz.print(enviaDados);
    delay(100);
     enviaDados="LUZ5=";
    enviaDados+=String(estadoLuz5);
    serialLuz.print(enviaDados);
    delay(100);
  }
  
  digitalWrite(luz1,estadoLuz1);
  digitalWrite(luz2,estadoLuz2);
  digitalWrite(luz3,estadoLuz3);
  digitalWrite(luz4,estadoLuz4);
  analogWrite(luz5,estadoLuz5);
}

Recebe com RS485

const int luz1=A1;
const int luz2=A2;
const int luz3=A3;
const int luz4=A4;
const int luz5=9;

String qualLuz="";

int estadoLuz1=LOW;
int estadoLuz2=LOW;
int estadoLuz3=LOW;
int estadoLuz4=LOW;
int estadoLuz5=0;
int estadoLuz5Invertido=0;

String RecebeDados="";
String enviaDados="";

// Serial via cabo
#include <SoftwareSerial.h>
SoftwareSerial serialLuz(11, 12); // RX 11 | TX 12

#define RS485Envia HIGH
#define RS485Recebe LOW
const int controleRS485=10;

void setup() {
  Serial.begin(9600);
  serialLuz.begin(2400);
  pinMode(luz1,OUTPUT);
  pinMode(luz2,OUTPUT);
  pinMode(luz3,OUTPUT);
  pinMode(luz4,OUTPUT);
  pinMode(luz5,OUTPUT);
  pinMode(controleRS485,OUTPUT);
  delay(3000);
  Serial.println("### Iniciando Secundário ### ");
  digitalWrite(controleRS485,RS485Envia);
  serialLuz.print("SecundarioLigou");
}

void loop() {
  digitalWrite(controleRS485,RS485Recebe);
  RecebeDados="";
  if(serialLuz.available()){
    
    delay(3);
    RecebeDados="";
    while(serialLuz.available()){
        delay(3);
        char c = serialLuz.read();
        RecebeDados +=c;
      }
    Serial.print("\n <<<<  Dados Recebidos:  ");
    Serial.print(RecebeDados);
   }//if serial

  if(RecebeDados=="LUZ1=1"){
   estadoLuz1=1 ;
   Serial.print("  +++ Ligando 1 +++ ");
  }
  if(RecebeDados=="LUZ1=0"){
   estadoLuz1=0 ;
   Serial.print("  +++ Desligando 1 +++ ");
  }

   if(RecebeDados=="LUZ2=1"){
   estadoLuz2=1 ;
   Serial.print("  +++ Ligando 2 +++ ");
  }
  if(RecebeDados=="LUZ2=0"){
   estadoLuz2=0 ;
   Serial.print("  +++ Desligando 2 +++ ");
  }

   if(RecebeDados=="LUZ3=1"){
   estadoLuz3=1 ;
   Serial.print("  +++ Ligando 3 +++ ");
  }
  if(RecebeDados=="LUZ3=0"){
   estadoLuz3=0 ;
   Serial.print("  +++ Desligando 3 +++ ");
  }

   if(RecebeDados=="LUZ4=1"){
   estadoLuz4=1 ;
   Serial.print("  +++ Ligando 4 +++ ");
  }
  if(RecebeDados=="LUZ4=0"){
   estadoLuz4=0 ;
   Serial.print("  +++ Desligando 4 +++ ");
  }

  qualLuz=(RecebeDados.substring(0,5));
  if (qualLuz=="LUZ5="){
    estadoLuz5=(RecebeDados.substring(5)).toInt();
  }
    
  

   if(RecebeDados=="PrincipalLigou"){
    digitalWrite(controleRS485,RS485Envia);
    enviaDados="LUZ1=";
    enviaDados+=String(estadoLuz1);
    serialLuz.print(enviaDados);
    delay(100);
    enviaDados="LUZ2=";
    enviaDados+=String(estadoLuz2);
    serialLuz.print(enviaDados);
    delay(100);
    enviaDados="LUZ3=";
    enviaDados+=String(estadoLuz3);
    serialLuz.print(enviaDados);
    delay(100);
    enviaDados="LUZ4=";
    enviaDados+=String(estadoLuz4);
    serialLuz.print(enviaDados);
    delay(100);
    enviaDados="LUZ5=";
    enviaDados+=String(estadoLuz5);
    serialLuz.print(enviaDados);
    delay(100);
    digitalWrite(controleRS485,RS485Recebe);
  }
  
  digitalWrite(luz1,estadoLuz1);
  digitalWrite(luz2,estadoLuz2);
  digitalWrite(luz3,estadoLuz3);
  digitalWrite(luz4,estadoLuz4);
  analogWrite(luz5,estadoLuz5);


} //loop

Link da pesquisa:

https://www.arduinoecia.com.br/como-usar-comunicacao-rs485-com-arduino/

#serial #RS485 #comunicação #automação #DIY #maker #microcontrolador #façavocemesmo #tcc #sugestãoTCC #Projeto #arduino

Curta, compartilhe e inscreva-se para ficar atualizado com os nossos conteúdos!
Para saber mais sobre o Canal Projeto Bacana:
E-mail: contato@projetobacana.com.br
Site: https://www.projetobacana.com.br/
Facebook: https://www.facebook.com/projetobacana.com.br
Instagram: https://www.instagram.com/projetobacana.com.br/
Youtube: https://www.youtube.com/channel/UC0e1bfaL0-gnAP2KQA5vxqQ