Faça um DMX Relay ou DMX Dimmer – Controle o Arduino com e Acione Lâmpadas comuns com a DMX512

Neste vídeo vamos criar um projeto que irá receber sinais DMX e assim controlar e acionar lâmpadas e outros dispositivos. Poderemos ligar e desligar dispositivos e também controlar a intensidade da luz!

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

Link blog BR-Arduino – Esp
https://www.usinainfo.com.br/blog/projeto-esp32-dimmer-automacao-para-controle-de-luz/

Comunicação entre arduinos
https://www.youtube.com/watch?v=qygwv5ktkB8

Dimer
https://youtu.be/6xIQty7LMKU

Principais Materiais:

  • Arduino
  • Esp32
  • Módulo RS485
  • Módulo Dimmer
  • Potenciômetro
  • Botões

Imagens da montagem:

Códigos Arduino
// - - - - -
// DmxSerial - A hardware supported interface to DMX.
// DmxSerialRecv.ino: Sample DMX application for retrieving 3 DMX values:
// address 1 (red) -> PWM Port 9
// address 2 (green) -> PWM Port 6
// address 3 (blue) -> PWM Port 5
//
// Copyright (c) 2011-2015 by Matthias Hertel, http://www.mathertel.de
// This work is licensed under a BSD style license. See http://www.mathertel.de/License.aspx
//
// Documentation and samples are available at http://www.mathertel.de/Arduino
// 25.07.2011 creation of the DmxSerial library.
// 10.09.2011 fully control the serial hardware register
//            without using the Arduino Serial (HardwareSerial) class to avoid ISR implementation conflicts.
// 01.12.2011 include file and extension changed to work with the Arduino 1.0 environment
// 28.12.2011 changed to channels 1..3 (RGB) for compatibility with the DmxSerialSend sample.
// 10.05.2012 added some lines to loop to show how to fall back to a default color when no data was received since some time.
// - - - - -

#include <DMXSerial.h>


int valor_Canal_1=0;
int valor_Canal_2=0;
int valor_Canal_3=0;
int valor_Canal_4=0;
int valor_Canal_5=0;

const int LED_1 =3;  // PWM output pin for Red Light.
const int LED_2 =5;  // PWM output pin for Green Light.
const int LED_3 =6;  // PWM output pin for Blue Light.
const int LED_4 =9;
const int LED_5 =10;

const int canal_2=A0;
const int canal_3=A1;
const int canal_4=A2;
const int canal_5=A3;


// This Example receives the 3 values starting with this channel:
const int startChannel = 177; //0 * 3 + 1;

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

unsigned long anteriorMillis = 0;
const long intervalo = 500; 
const int ledEnvia = 13;
int ledState = LOW; 

void setup() {
  DMXSerial.init(DMXReceiver);

  // enable pwm outputs
  pinMode(LED_1, OUTPUT); // sets the digital pin as output
  pinMode(LED_2, OUTPUT);
  pinMode(LED_3, OUTPUT);
  pinMode(LED_4, OUTPUT);
  pinMode(LED_5, OUTPUT);
  pinMode(ledEnvia, OUTPUT);
  pinMode(canal_2, OUTPUT);
  pinMode(canal_3, OUTPUT);
  pinMode(canal_4, OUTPUT);
  pinMode(canal_5, OUTPUT);
  digitalWrite(canal_2,HIGH);
  digitalWrite(canal_3,HIGH);
  digitalWrite(canal_4,HIGH);
  digitalWrite(canal_5,HIGH);
  serialLuz.begin(9600);
  serialLuz.print("#### Iniciando DMX Remoto ####");
}


void loop() {
  // Calculate how long no data bucket was received
  unsigned long lastPacket = DMXSerial.noDataSince();

  if (lastPacket < 5000) {
    valor_Canal_1=DMXSerial.read(startChannel);
    valor_Canal_2=DMXSerial.read(startChannel + 1);
    valor_Canal_3=DMXSerial.read(startChannel + 2);
    valor_Canal_4=DMXSerial.read(startChannel + 3);
    valor_Canal_5=DMXSerial.read(startChannel + 4);

    unsigned long atualMillis = millis();
    if (atualMillis - anteriorMillis >= intervalo) {
    // save the last time you blinked the LED
    anteriorMillis = atualMillis;

    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    digitalWrite(ledEnvia, ledState);
    
      
      analogWrite(LED_1, valor_Canal_1);
      analogWrite(LED_2, valor_Canal_2);
      analogWrite(LED_3, valor_Canal_3);
      analogWrite(LED_4, valor_Canal_4);
      analogWrite(LED_5, valor_Canal_5);
           
      enviaDados="c1=";
      if(valor_Canal_1<10){
        enviaDados+="00";
      }else if(valor_Canal_1<100){
        enviaDados+="0";
      }
      enviaDados+=String(valor_Canal_1);  
      enviaDados+="c2=";
      if(valor_Canal_2<10){
        enviaDados+="00";
      }else if(valor_Canal_2<100){
        enviaDados+="0";
      }
      enviaDados+=String(valor_Canal_2);  
      enviaDados+="c3=";
      if(valor_Canal_3<10){
        enviaDados+="00";
      }else if(valor_Canal_3<100){
        enviaDados+="0";
      }
      enviaDados+=String(valor_Canal_3);
      enviaDados+="c4=";
      if(valor_Canal_4<10){
        enviaDados+="00";
      }else if(valor_Canal_4<100){
        enviaDados+="0";
      }
      enviaDados+=String(valor_Canal_4);
      enviaDados+="c5=";
      if(valor_Canal_5<10){
        enviaDados+="00";
      }else if(valor_Canal_5<100){
        enviaDados+="0";
      }
      enviaDados+=String(valor_Canal_5); 
      enviaDados+="ProjetoBacana";  
      serialLuz.print(enviaDados);
      
    }
    if(valor_Canal_2>127){
      digitalWrite(canal_2,LOW);
    }else{
      digitalWrite(canal_2,HIGH);
    }
    if(valor_Canal_3>127){
      digitalWrite(canal_3,LOW);
    }else{
      digitalWrite(canal_3,HIGH);
    }
    if(valor_Canal_4>127){
      digitalWrite(canal_4,LOW);
    }else{
      digitalWrite(canal_4,HIGH);
    }
    if(valor_Canal_5>127){
      digitalWrite(canal_5,LOW);
    }else{
      digitalWrite(canal_5,HIGH);
    }

  } 
  delay(50);
}
// End.

Códigos ESP32

#include <Arduino.h>
#define PINO_DIM    26
#define PINO_ZC     27
#define maxBrightness 900 // brilho maximo em micro segundos 800
#define minBrightness 7500 // brilho minimo em micro segundos
#define TRIGGER_TRIAC_INTERVAL 20 // tempo quem que o triac fica acionado
#define IDLE -1
int brilho_convertido = 0;

const int LED=2;
int luminosidadeLED=0;
//const int canal_2=5;
//const int canal_3=18;
//const int canal_4=19;
//const int canal_5=21;
int valorDimmer=1;
int valorCanal_2=0;
int valorCanal_3=0;
int valorCanal_4=0;
int valorCanal_5=0;


hw_timer_t * timerToPinHigh;
hw_timer_t * timerToPinLow;
 
portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED;
 
volatile bool isPinHighEnabled = false;

volatile long currentBrightness = minBrightness;

 void IRAM_ATTR ISR_turnPinLow(){ // desliga o pino dim
  portENTER_CRITICAL_ISR(&mux); // desativa interrupçoes
    digitalWrite(PINO_DIM, LOW);
    isPinHighEnabled = false;
  portEXIT_CRITICAL_ISR(&mux); // ativa as interrupçoes novamente
}
 
void IRAM_ATTR setTimerPinLow(){ // executa as configuracoes de pwm e aplica os valores da luminosidade ao dimmer no tempo em que ra ficar em low
  timerToPinLow = timerBegin(1, 80, true);
  timerAttachInterrupt(timerToPinLow, &ISR_turnPinLow, true);
  timerAlarmWrite(timerToPinLow, TRIGGER_TRIAC_INTERVAL, false);
  timerAlarmEnable(timerToPinLow);
}
 
void IRAM_ATTR ISR_turnPinHigh(){ // liga o pino dim
  portENTER_CRITICAL_ISR(&mux);  // desativa interrupçoes
    digitalWrite(PINO_DIM, HIGH); 
    setTimerPinLow();
  portEXIT_CRITICAL_ISR(&mux); // ativa as interrupçoes novamente
}
 
void IRAM_ATTR setTimerPinHigh(long brightness){ // executa as configuracoes de pwm e aplica os valores da luminosidade ao dimmer no tempo que ira ficar em high
  isPinHighEnabled = true;
  timerToPinHigh = timerBegin(1, 80, true);
  timerAttachInterrupt(timerToPinHigh, &ISR_turnPinHigh, true);
  timerAlarmWrite(timerToPinHigh, brightness, false);
  timerAlarmEnable(timerToPinHigh);
}

void IRAM_ATTR ISR_zeroCross()  {// funçao que é chamada ao dimmer registrar passagem por 0
  if(currentBrightness == IDLE) return;
  portENTER_CRITICAL_ISR(&mux); // desativa interrupçoes
    if(!isPinHighEnabled){
       setTimerPinHigh(currentBrightness); // define o brilho
    }
  portEXIT_CRITICAL_ISR(&mux); // ativa as interrupçoes novamente
}

String RecebeDados="";
String RecebeDadosAnterior="";

void setup() {
  Serial2.begin(9600);
  Serial.begin(9600);
  Serial.println(" ");
  Serial.println("#### INICIANDO ESP32 ####");
  pinMode(PINO_DIM, OUTPUT);
//  pinMode(canal_2, OUTPUT);
//  pinMode(canal_3, OUTPUT);
//  pinMode(canal_4, OUTPUT);
//  pinMode(canal_5, OUTPUT);
//  digitalWrite(canal_2,HIGH);
//  digitalWrite(canal_3,HIGH);
//  digitalWrite(canal_4,HIGH);
//  digitalWrite(canal_5,HIGH);
  attachInterrupt(digitalPinToInterrupt(PINO_ZC), ISR_zeroCross, RISING);
  pinMode(LED, OUTPUT);//Definimos o pino 2 (LED) como saída.
  ledcAttachPin(LED, 0);//Atribuimos o pino 2 ao canal 0.
  ledcSetup(0, 1000, 10);//Atribuimos ao canal 0 a frequencia de 1000Hz com resolucao de 10bits.
  delay(1000);

}

void loop() {
  RecebeDados="";
  if(Serial2.available()){
    while(Serial2.available()){
        delay(3);
        char c = Serial2.read();
        RecebeDados +=c;
      }
    RecebeDados=RecebeDados.substring(0,43);
    //Serial.print("\n<< ");
    //Serial.print(RecebeDados);
    //Serial.print(" >> ");
    //Serial.print(RecebeDados.substring(3,6));

    
    

      if(RecebeDadosAnterior != RecebeDados){
        int tamanhoString = RecebeDados.length();
        RecebeDadosAnterior=RecebeDados;
        Serial.print("\n>>String= ");
        Serial.print(RecebeDados);
        Serial.print(" ||Tam=");
        Serial.print(tamanhoString);
        
        if((RecebeDados.substring(0,2)=="c1") &&
           (RecebeDados.substring(6,8)=="c2") &&
           (RecebeDados.substring(12,14)=="c3") &&
           (RecebeDados.substring(18,20)=="c4") &&
           (RecebeDados.substring(24,26)=="c5") &&
           (RecebeDados.substring(30,43)=="ProjetoBacana")       
        ){
          valorDimmer=1;
          valorDimmer=(RecebeDados.substring(3,6)).toInt(); 
          Serial.print("\nDimmer C1= ");
          Serial.print(valorDimmer);
          valorCanal_2=(RecebeDados.substring(9,12)).toInt();
          Serial.print(" C2=");
          Serial.print(valorCanal_2);
          valorCanal_3=(RecebeDados.substring(15,18)).toInt();
          Serial.print(" C3=");
          Serial.print(valorCanal_3);
          valorCanal_4=(RecebeDados.substring(21,24)).toInt();
          Serial.print(" C4=");
          Serial.print(valorCanal_4);
          valorCanal_5=(RecebeDados.substring(27,30)).toInt();
          Serial.print(" C5=");
          Serial.print(valorCanal_5);
        } 
      }    
    luminosidadeLED=map(valorDimmer,0,255,0,1023);
    ledcWrite(0, luminosidadeLED);//Escrevemos no canal 0


    brilho_convertido=map(valorDimmer,0,255,minBrightness,maxBrightness);
    portENTER_CRITICAL(&mux); //desliga as interrupçoes
      currentBrightness = brilho_convertido; // altera o brilho
    portEXIT_CRITICAL(&mux);// liga as interrupçoes
//    if(valorCanal_2>127){
//      digitalWrite(canal_2,LOW);
//    }else{
//      digitalWrite(canal_2,HIGH);
//    }
//    if(valorCanal_3>127){
//      digitalWrite(canal_3,LOW);
//    }else{
//      digitalWrite(canal_3,HIGH);
//    }
//    if(valorCanal_4>127){
//      digitalWrite(canal_4,LOW);
//    }else{
//      digitalWrite(canal_4,HIGH);
//    }
//    if(valorCanal_5>127){
//      digitalWrite(canal_5,LOW);
//    }else{
//      digitalWrite(canal_5,HIGH);
//    }


    
    delay(50);
   }//if serial

   

}

Link para outros projetos:
https://projetobacana.com.br

#ESP32 #DMXRelay #DMXDimmer #Arduino #dimmer #luminosidade #maker #automação #microcontrolador #DIY #façavocemesmo #tcc #sugestãoTCC #Projeto

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/vansanjulio
Youtube: https://www.youtube.com/ProjetoBacana