#ifndef __train_H__ #define __train_H__ #include class train { private: const uint8_t _MAX_FADE_STEP = 255; const uint8_t _MIN_FADE_STEP = 0; static const unsigned long _FADE_DELAY_MS = 50; size_t _pwmpin; size_t _pwmchannel; uint8_t _fade_step; unsigned long _last_faded_ms; unsigned long _delay_ms; bool _fade(bool fade_up); public: train(size_t pwmpin , size_t pwmchannel,unsigned long delay_ms = _FADE_DELAY_MS); ~train(); void stop(); bool fade_on(); bool fade_off(); void set_pwm(uint8_t pwm_value); }; train::train(size_t pwmpin, size_t pwmchannel, unsigned long delay_ms) { _pwmpin = pwmpin; _pwmchannel = pwmchannel; _fade_step = 0; _last_faded_ms = 0; _delay_ms = delay_ms; ledcSetup(pwmchannel, 100, 8); ledcAttachPin(_pwmpin, pwmchannel); } train::~train() { } void train::set_pwm(uint8_t pwm_value) { ledcWrite(_pwmchannel, pwm_value); } void train::stop() { set_pwm(0); } bool train::_fade(bool fade_up) { if(millis() - _last_faded_ms > _delay_ms) { _last_faded_ms = millis(); if(true == fade_up) { if(_MAX_FADE_STEP > _fade_step) _fade_step++; else return false; } else { if(_MIN_FADE_STEP < _fade_step) _fade_step--; else return false; } } return true; } bool train::fade_on() { return _fade(true); } bool train::fade_off() { return _fade(false); } #endif