#define LEDC_TIMER_12_BIT 12 // Use 12-bit precision for the LEDC timer
#define LEDC_BASE_FREQ 5000 // Use 5000 Hz as the LEDC base frequency
#define LED_PIN A0 // Fade LED PIN (replace with LED_BUILTIN constant for the built-in LED)
int brightness = 0; // How bright the LED is
int maxBrightness = 200; // value must be between 0 and 255
// Arduino-like analogWrite
// Value has to be between 0 and valueMax
void ledcAnalogWrite(uint8_t pin, uint32_t value, uint32_t valueMax = 255) {
// Calculate duty, 4095 from 2 ^ 12 - 1
uint32_t duty = (4095 / valueMax) * min(value, valueMax);
// Write duty to LEDC
ledcWrite(pin, duty);
}
void setup() {
Serial.begin(115200);
Serial.setDebugOutput(true);
// Setup timer and attach timer to the LED pin
ledcAttach(LED_PIN, LEDC_BASE_FREQ, LEDC_TIMER_12_BIT);
}
void loop() {
receiveBeat();
//heartBeat(); // 10/10 loco jaja
Serial.printf("demo done");
delay(100000);
}
/*
Beats like sistole/diastole in a single led.
uses maxBrightness, brightness
*/
void heartBeat(){
brightness = 0;
int rampUp = 40;
int atenuate = 0; // percentage of the full brightness to reach on the atenuation part
int goDown = 20;
int delayAmount = 10; // ms between steps
atenuate = maxBrightness*atenuate/100; // now contains the abs atenuation output
// beat 3 times
for(int i = 0; i < 3; i++){
int phase = 0;
while (phase <= 4){
switch(phase){
case 0:
case 2:
// goes up at rampUp speed
while (brightness < maxBrightness){
brightness = min(brightness+rampUp, maxBrightness);
ledcAnalogWrite(LED_PIN, brightness);
delay(delayAmount);
}
phase++; break;
delay(delayAmount);
// goes down until atenuation point
case 1:
while (brightness > atenuate){
brightness = max(brightness-goDown, atenuate);
ledcAnalogWrite(LED_PIN, brightness);
delay(delayAmount);
}
phase++; break;
// goes down finally at goDown speed
case 3:
while (brightness > 0){
brightness = max(brightness-goDown, 0);
ledcAnalogWrite(LED_PIN, brightness);
delay(delayAmount);
}
phase++; break;
// wait between heartbeats
case 4:
delay(1000);
phase++;
break;
}
}
}
}
/*
Kind of beating the led does when receiving a beat request.
uses maxBrightness
*/
void receiveBeat(){
int step = 15;
int phase = 0;
int delayAmount = 50; // ms between steps
// beat 3 times
for(int i = 0; i < 3; i++){
phase = 0;
brightness = 0; // reset brightness
while (phase <= 3){
switch(phase){
case 0:
while (brightness < maxBrightness){
brightness = min(brightness+step, maxBrightness);
ledcAnalogWrite(LED_PIN, brightness);
delay(delayAmount);
}
phase++; break;
case 1:
delay(100); // stay at the top for a lil'
phase++;break;
// goes down until 0
case 2:
while (brightness > 0){
brightness = max(brightness-step, 0);
ledcAnalogWrite(LED_PIN, brightness);
delay(delayAmount);
}
phase++; break;
// wait between heartbeats
case 3:
delay(1000);
phase++;
break;
}
}
}
}Loading
esp32-c6-devkitc-1
esp32-c6-devkitc-1