#define LED_PIN LED_BUILTIN
#define BUTTON_PIN PC13
const int debDelay = 50;
bool ledState = false;
bool lastBtnState = HIGH;
//===== t-2
#define PWM_PERIOD 20
#define MAX_DUTY_CYCLE 1000
#define STEP_SIZE 50
#define UPDATE_INTERVAL 200
bool increaseBrightness;
uint8_t buttonState;
uint16_t currentDutyCycle;
uint32_t lastUpdateTime;
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
//===== t-2
increaseBrightness = true;
currentDutyCycle = 0;
lastUpdateTime = 0;
}
void heartbeatBlink(int interval) {
digitalWrite(LED_PIN, HIGH);
delay(interval);
digitalWrite(LED_PIN, LOW);
delay(interval);
}
void lightOnBtnPress() {
bool btnState = digitalRead(BUTTON_PIN);
if (btnState == LOW) {
digitalWrite(LED_PIN, HIGH);
} else {
digitalWrite(LED_PIN, LOW);
}
}
void toggleDebounce() {
bool btnState = digitalRead(BUTTON_PIN);
if (lastBtnState == HIGH && btnState == LOW) {
delay(debDelay);
btnState = digitalRead(BUTTON_PIN);
if (btnState == LOW) {
ledState = !ledState;
digitalWrite(LED_PIN, ledState);
}
}
lastBtnState = btnState;
}
void PWM(uint16_t dutyCycle) {
uint16_t onTime = (dutyCycle * PWM_PERIOD) / MAX_DUTY_CYCLE;
uint16_t offTIme = PWM_PERIOD - onTime;
if (onTime > 0) {
digitalWrite(LED_PIN, HIGH);
delay(onTime);
}
if (offTIme > 0) {
digitalWrite(LED_PIN, HIGH);
delay(onTime);
}
}
void dimming() {
buttonState = digitalRead(BUTTON_PIN);
// update brightness every 200 ms
if (buttonState == LOW && (millis() - lastUpdateTime >= UPDATE_INTERVAL )) {
lastUpdateTime = millis();
log(lastUpdateTime);
// chnage dir
if (currentDutyCycle >= MAX_DUTY_CYCLE) {
increaseBrightness = false;
} else if (currentDutyCycle <= 0 ) {
increaseBrightness = true;
}
// update brightness
if (increaseBrightness) {
currentDutyCycle += STEP_SIZE;
} else {
currentDutyCycle -= STEP_SIZE;
}
}
PWM(currentDutyCycle);
}
void loop() {
// t-1-a
// heartbeatBlink(500);
// t-1-b
// lightOnBtnPress();
// t-1-c
// toggleDebounce();
// t-2
dimming();
}