#include <ModbusMaster.h>
#define MAX485_DE_PIN 12 // Pino GPIO conectado ao pino DE do MAX485
#include <FastLED.h>
#define LED_PIN 14
#define NUM_LEDS 16
#define BRIGHTNESS 100
#define LED_TYPE WS2812
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
ModbusMaster node;
void setup() {
pinMode(MAX485_DE_PIN, OUTPUT);
FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
FastLED.setBrightness(BRIGHTNESS);
// Iniciar comunicação serial
Serial.begin(9600);
// Iniciar comunicação RS485
node.begin(1, Serial);
}
void loop() {
// Ativar recepção
digitalWrite(MAX485_DE_PIN, LOW);
// Simula a chama de uma vela
flameEffect();
// Atualiza os LEDs
FastLED.show();
// Aguarda um curto período antes de atualizar novamente
// delay(50);
// Ler dados
uint8_t result = node.readHoldingRegisters(0, 1);
// Processar dados
if (result == node.ku8MBSuccess) {
uint16_t data = node.getResponseBuffer(0);
Serial.print("Dados recebidos: ");
Serial.println(data);
// Exemplo de envio de dados
uint16_t sendData = 1234; // Valor fixo para enviar como exemplo
// Ativar transmissão
digitalWrite(MAX485_DE_PIN, HIGH);
node.writeSingleRegister(1, sendData);
Serial.print("Dados enviados: ");
Serial.println(sendData);
// Voltar para recepção
digitalWrite(MAX485_DE_PIN, LOW);
} else {
Serial.println("Erro ao ler dados.");
}
delay(200);
}
void flameEffect() {
// Define uma paleta de cores para simular a chama
CRGBPalette16 palette;
for (int i = 0; i < 16; i++) {
// Gradiente de cores para simular a chama (amarelo escuro a laranja)
palette[i] = CRGB(255, 128 + i * 8, 0);
}
// Calcula o brilho para simular a chama
uint8_t baseBrightness = 0; // Brilho base
uint8_t brightnessRange = 255; // Variação máxima de brilho
for (int i = 0; i < NUM_LEDS; i++) {
int flicker = baseBrightness + random8(brightnessRange);
// Define a cor do LED com base no valor de flicker e na paleta de cores
leds[i] = ColorFromPalette(palette, flicker);
}
}