Neste vídeo vamos mostrar nosso último projeto funcionando, este 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/
Faça um DMX Relay ou DMX Dimmer – Controle o Arduino com e Acione Lâmpadas comuns com a DMX512
DMX com Arduino – Controle PARLED, LUZ e outros dispositivos DMX – Simule uma controladora DMX-512
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:
// - - - - -
// 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