Arduino LED Helpers
Simply create an LED object from the helper functions to handle fading, pulsing or manual call of the LED without interfering with the main loop routines.
// ---------------------------------- // -------- MAIN LOOP -------- // ---------------------------------- // setup the LED object aLED namewhatever(pin); aLED led1(11); void setup() { } void loop() { led1.operateLED(); //operate specific LED handleSerial(); //only for testing purpose!!! delay(20); } // very basic function to handle serial command from pc console void handleSerial() { while (Serial.available() > 0) { char incomingCharacter = Serial.read(); switch (incomingCharacter) { // set led to manual mode case 'm': led1.setMode(0); led1.brightness = int(random(0,255) ); break; // set led to pulse mode case 'p': led1.setMode(1); led1.pulse_speed = ( random(0,1) *.4) + .01; // set the pulse speed led1.pulse_amplitude = int(random(10,255)); // set the pulse amplitude break; // set led to fade mode case 'f': led1.fade_target = int(random(0,255)); // set a random fading target 0-255 led1.fade_speed = int(random(4,20)); // set a random fading speed > 1 led1.setMode(2); break; } } }
This helper code needs to be PRIOR to your mainloop – or 🙁
// ---------------------------------- // -------- BASIC LED HELPER -------- // ---------------------------------- // basic lerp function float return_lerp(float _s, int _target,int _time){ _s = _s + (( float(_target) - _s)/float(_time)); return _s; } // -------------- // LED Object // ------------- class aLED { private: byte pin; long ts = 0; int led_mode = 0; //0 manual / 1:sinpulse / 2:fading public: int brightness = 0; // current brightness float fade_target = 0; // where to fade? int fade_speed = 4; float pulse_speed = .004; // speed of pulse when in pulsemode int pulse_amplitude = 125; aLED(byte pin) { this->pin = pin; init(); } void init(){ pinMode(pin,OUTPUT); } void operateLED(){ if(led_mode==0){ // if in manual mode }else if(led_mode==1){ // ----------- PULSE MODE brightness = int((sin(millis()*pulse_speed)+1)*pulse_amplitude*.5); }else if(led_mode==2){ // ----------- FADING MODE brightness = int(return_lerp(brightness,fade_target,fade_speed)); } analogWrite(pin,brightness); } void setMode(int _mode){ led_mode = _mode; } };
ESP32 LED Helpers
The ESP32 has a slightly different architecture than Arduino – so the PWM is managed differently. The following code works for ESP32 with the same features as Arduino.
// ---------------------------------- // -------- MAIN LOOP -------- // ---------------------------------- // setup the LED object aLED namewhatever(pin); aLED led1(12); aLED led2(14); void setup() { Serial.begin(9600); } void loop() { led1.operateLED(); //operate specific LED led2.operateLED(); //operate specific LED handleSerial(); //only for testing purpose!!! delay(20); } // very basic function to handle serial command from pc console void handleSerial() { while (Serial.available() > 0) { char incomingCharacter = Serial.read(); switch (incomingCharacter) { // set led to manual mode case 'm': led1.setMode(0); led1.brightness = int(random(0,255) ); break; // set led to pulse mode case 'p': led1.setMode(1); led1.pulse_speed = ( random(0,10) *.4) + .01; // set the pulse speed led1.pulse_amplitude = int(random(10,255)); // set the pulse amplitude led2.setMode(1); led2.pulse_speed = ( random(0,10) *.4) + .01; // set the pulse speed break; // set led to fade mode case 'f': led1.fade_target = int(random(0,255)); // set a random fading target 0-255 led1.fade_speed = int(random(4,20)); // set a random fading speed > 1 led1.setMode(2); break; } } }
// ---------------------------------- // -------- BASIC LED HELPER -------- // ---------------------------------- // basic lerp function float return_lerp(float _s, int _target,int _time){ _s = _s + (( float(_target) - _s)/float(_time)); return _s; } // ONLY FOR ESP32 needed! // setting PWM properties const int freq = 5000; const int resolution = 8; // NOTE : ESP32 can only manage 16 diferent PWM channels // https://circuitdigest.com/microcontroller-projects/esp32-pwm-tutorial-controlling-brightness-of-led // -------------- // LED Object // ------------- class aLED { private: byte pin; long ts = 0; int led_mode = 0; //0 manual / 1:sinpulse / 2:fading int myledChannel = int(random(15)); public: int brightness = 0; // current brightness float fade_target = 0; // where to fade? int fade_speed = 4; float pulse_speed = .04; // speed of pulse when in pulsemode int pulse_amplitude = 222; aLED(byte pin) { this->pin = pin; init(); } void init(){ // pinMode(pin,OUTPUT); // configure LED PWM functionalitites ledcSetup(myledChannel, freq, resolution); ledcAttachPin(pin, myledChannel); // attach the channel to the GPIO to be controlled } void operateLED(){ if(led_mode==0){ // if in manual mode }else if(led_mode==1){ // ----------- PULSE MODE brightness = int((sin(millis()*pulse_speed)+1)*pulse_amplitude*.5); }else if(led_mode==2){ // ----------- FADING MODE brightness = int(return_lerp(brightness,fade_target,fade_speed)); } //digitalWrite(pin,brightness); ledcWrite(myledChannel, brightness); //analogWrite(pin,brightness); >>> WORKS for ARDUINO!!!! } void setMode(int _mode){ led_mode = _mode; } };