PWM com efeito fade Arduino UNO + Elipse E3

Bom dia

Possuo uma aplicação que necessito de um efeito fade (piscar a cada ms) para alguns leds, a ideia é variar o pwm via tela do elipse E3, segui esse tutorial (https://kb.elipse.com.br/comunicando-o-arduino-com-elipse-e3-eou-elipse-scada/), a comunicação funcionou, utilizei o código 5369 que está em anexo ao link, mas apenas para a DO09 e DO11, que é o que eu preciso, uma saída pwm apenas utilizei esse código:


#include <modbus.h>
#include <modbusDevice.h>
#include <modbusRegBank.h>
#include <modbusSlave.h>

modbusDevice regBank;
modbusSlave slave;

byte bomba = 9;
int led = 11; // the PWM pin the LED is attached to
int brightness = 0; // how bright the LED is
int fadeAmount = 5; // how many points to fade the LED by

void setup()
{
//Set Slave ID
regBank.setId(1);

//Add Digital Output registers
regBank.add(9);
regBank.add(11);

//Analog Output registers
regBank.add(40011);

slave._device = &regBank;

//Set BaudRate
slave.setBaud(9600);

//Configure pins
pinMode(bomba,OUTPUT);
pinMode(led,OUTPUT);
}

void loop(){
while(1){

// change the brightness for next time through the loop:
brightness = brightness + fadeAmount;

// reverse the direction of the fading at the ends of the fade:
if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount;
}
bomba = regBank.get(9);
if (bomba <= 0 && digitalRead(9) == HIGH)digitalWrite(9,LOW);
if (bomba >= 1 && digitalRead(9) == LOW)digitalWrite(9,HIGH);

brightness = regBank.get(40011);
analogWrite(led,brightness);
delay(1);

slave.run();
}
}


A comunicação funciona perfeitamente, mas quando seto algum valor de PWM via elipse, esse valor setado não é aceito no valor da variável brightness para o cálculo do fade e os leds ou ficam desligados ou ligados, ou seja, não faz o fade, apenas liga/desliga ao mudar de valor no elipse, agora se eu comento a parte do registrador 40011 e deixo valores fixos e testo manualmente via ide do arduino, o efeito fade ocorre com qualquer valor.

Reparei que o regBank.get(40011) se trata de uma word e no cálculo do fade tenho variáveis int, tentei realizar a conversão de word para int e ainda sim persiste isso de não ter o efeito fade, como consigo contornar esse porém e o valor que eu inserir no elipse realize o efeito fade na lógica fade?

Bom dia @willian_nsl.

Sua dúvida não é bem sobre o elipse né?
De toda forma eu vou tentar te ajudar.

A sua lógica de fade usa a mesma variável que está sendo recebida pela rede modbus. Por isso não funciona.

Minha sugestão é alterar um pouco o loop do seu programa, para algo assim:

void loop(){

// change the brightness for next time through the loop:
brightness = brightness + fadeAmount;

// reverse the direction of the fading at the ends of the fade:
if (brightness <= 0 || brightness >= max_brightness) {
fadeAmount = -fadeAmount;
}
bomba = regBank.get(9);
if (bomba <= 0 && digitalRead(9) == HIGH)digitalWrite(9,LOW);
if (bomba >= 1 && digitalRead(9) == LOW)digitalWrite(9,HIGH);

max_brightness = regBank.get(40011);
analogWrite(led,brightness);
delay(1);

slave.run();
}

Nivaldo Nicolau

2 Likes

Sim, funcionou, obrigado!
Como eu não encontrei muita informação específica e detalhada de modbus e afins (em específico para integração elipse/arduino), usei como base um artigo no KB aqui mesmo, porém sua sugestão sanou a minha dúvida.