#define SERVO_PIN 12
#define SERVO_CHANNEL 0
#define SERVO_FREQ_HZ 50
#define SERVO_RES_BITS 12
#define SERVO_MIN_MS 0.5
#define SERVO_MAX_MS 2.4
#define SERVO_STEP pow(2, SERVO_RES_BITS) / (1000.0 / SERVO_FREQ_HZ)
constexpr int servoMinStep = floor(SERVO_STEP * SERVO_MIN_MS);
constexpr int servoMaxStep = floor(SERVO_STEP * SERVO_MAX_MS);
#define INPUT_BUFFER_LEN 16
char inputBuffer[INPUT_BUFFER_LEN];
unsigned int inputIndex = 0;
void setup() {
ledcSetup(SERVO_CHANNEL, SERVO_FREQ_HZ, SERVO_RES_BITS);
ledcAttachPin(SERVO_PIN, SERVO_CHANNEL);
Serial.begin(115200);
while(!Serial);
Serial.printf("Range: %d - %d\n", servoMinStep, servoMaxStep);
}
void loop() {
int b;
inputIndex = 0;
while(inputIndex < INPUT_BUFFER_LEN - 1){
b = Serial.read();
if(b == -1){
delay(50);
continue;
}
if(b == '\n' || b == '\r'){
break;
}
if(b == ','){
b = '.';
}
inputBuffer[inputIndex++] = (char) b;
}
inputBuffer[inputIndex++] = '\0';
float inputPercentage = min(100.0f, max(0.0f, (float) atof(inputBuffer)));
Serial.printf("Setting servo to %f%%... ", inputPercentage);
ledcWrite(SERVO_CHANNEL, map(inputPercentage, 0.0, 100.0, servoMinStep, servoMaxStep));
Serial.println("done.");
}
void loopPercentageInput(){
}
void loopFadeFullRange(){
for(int i = servoMinStep; i <= servoMaxStep; i++){
ledcWrite(SERVO_CHANNEL, i);
delayMicroseconds(500);
}
delay(500);
for(int i = servoMaxStep; i >= servoMinStep; i--){
ledcWrite(SERVO_CHANNEL, i);
delayMicroseconds(500);
}
delay(500);
}