I can't test this but something like:
#define SN "Four Fader Test"
#define SV "0.1a"
#define NUMBER_OF_DIMMERS 4
//System settings
#define MY_RADIO_NRF24
#define MY_RF24_CE_PIN 8 //ADDED
#define MY_NODE_ID 71
#include <MySensors.h>
#include <SPI.h>
#include "Fade.h"
MyMessage dimmer[NUMBER_OF_DIMMERS];
MyMessage light[NUMBER_OF_DIMMERS];
Fade fader[NUMBER_OF_DIMMERS];
byte leds[NUMBER_OF_DIMMERS] = {3, 5, 6, 9};
void before()
{
int i = 0;
for (auto fdr : fader)
{
fdr = Fade(leds[i++], 10, 0, 255, MILLIS_TIMER); // led speed 5 milliseconds/step; pwm at 0 min and 255 max (MILLIS_TIMER)
fdr.begin();
}
i = 0;
for (auto msg : dimmer)
msg = MyMessage(i++, S_DIMMER);
i = 0;
for (auto msg : light)
msg = MyMessage(i++, S_BINARY);
}
void presentation()
{
sendSketchInfo(SN, SV);
int i = 0;
for (auto d : dimmer)
present(i++, S_DIMMER);
}
void setup()
{
Serial.begin(9600);
Serial.println(F("Setup Complete..."));
}
void loop()
{
uint32_t currentMillis = millis();
for (auto fdr : fader)
fdr.update(currentMillis);
}
void receive(const MyMessage &message)
{
if (message.type == V_STATUS || message.type == V_PERCENTAGE)
{
int requestedLevel = atoi(message.data);
if (message.type == V_STATUS)
requestedLevel = requestedLevel ? 100 : 0;
else
requestedLevel = constrain(requestedLevel, 0, 100);
fader[message.sensor].setTarget(map(requestedLevel, 0, 100, 0, 255));
send(light[message.sensor].set(requestedLevel > 0 ? 1 : 0));
send(dimmer[message.sensor].set(requestedLevel));
}
}
I used my non-blocking Fade.h:
#ifndef Fade_h
#define Fade_h
#include <Arduino.h>
enum timer{
MILLIS_TIMER,
MICROS_TIMER
};
class Fade
{
public:
Fade() {};
Fade(int pin, uint32_t timeStep = 15, uint8_t minVal = 0, uint8_t maxVal = 255, timer timerSelect = MILLIS_TIMER);
void begin();
void setTarget(int to);
void update();
void update(uint32_t time);
uint8_t getMin();
uint8_t getMax();
uint8_t getCurrent();
uint32_t readSpeed();
uint32_t writeSpeed(uint32_t time);
uint8_t getSetpoint();
private:
uint8_t _min;
uint8_t _max;
uint8_t _targetFade;
uint8_t _pwmRate;
uint32_t _time;
uint32_t _last;
uint8_t _pin;
bool _microsTimer;
};
#endif
and my Fade.cpp:
#include "Fade.h"
#include <Arduino.h>
Fade::Fade(int pin, uint32_t timeStep, uint8_t minVal, uint8_t maxVal, timer timerSelect)
{
_pin = pin;
_time = timeStep;
_min = minVal;
_max = maxVal;
analogWrite(_pin, _min);
_pwmRate = _min;
_microsTimer = timerSelect;
}
void Fade::begin()
{
analogWrite(_pin, _min);
}
void Fade::setTarget(int to)
{
_targetFade = (uint8_t) constrain(to, _min, _max);
this->update();
}
void Fade::update()
{
this->update(_microsTimer? micros() : millis());
}
void Fade::update(uint32_t time)
{
if (time - _time > _last)
{
_last = time;
if (_pwmRate > _targetFade) analogWrite(_pin, --_pwmRate);
if (_pwmRate < _targetFade) analogWrite(_pin, ++_pwmRate);
}
}
uint8_t Fade::getSetpoint()
{
return _targetFade;
}
uint8_t Fade::getCurrent()
{
return _pwmRate;
}
uint32_t Fade::readSpeed()
{
return _time;
}
uint32_t Fade::writeSpeed(uint32_t time)
{
_time = time;
}
uint8_t Fade::getMin()
{
return _min;
}
uint8_t Fade::getMax()
{
return _max;
}