Skip to content
Snippets Groups Projects
Commit 0d3f5ee6 authored by David Huss's avatar David Huss :speech_balloon:
Browse files

Fix discontinuity issues, add comments

parent a2feb1c3
No related branches found
No related tags found
No related merge requests found
...@@ -20,14 +20,21 @@ double blend = 0.0f; ...@@ -20,14 +20,21 @@ double blend = 0.0f;
Ticker ticker; Ticker ticker;
double lerp(double a, double b, double t) { unsigned long current_time, last_target_time;
t = max(0.0, min(1.0, t));
return a + t * (b - a); /// Linear Interpolation between a and b
double lerp(double a, double b, double blend) {
// Clamp blend to 0.0 and 1.0
blend = max(0.0, min(1.0, blend));
// Return blended values
return a + blend * (b - a);
} }
// Normalized Servo function
void setServoNormalized(double pos) { void setServoNormalized(double pos) {
pos = min(1.0, max(0.0, pos)); pos = min(1.0, max(0.0, pos));
// // SQRT to emphasize small values
pos = sqrt(pos); pos = sqrt(pos);
int span = abs(SERVO_MAX - SERVO_MIN); int span = abs(SERVO_MAX - SERVO_MIN);
int servo_pos = SERVO_MIN + span * pos; int servo_pos = SERVO_MIN + span * pos;
...@@ -35,6 +42,7 @@ void setServoNormalized(double pos) { ...@@ -35,6 +42,7 @@ void setServoNormalized(double pos) {
// Serial.print(pos); // Serial.print(pos);
// Serial.print(" --> "); // Serial.print(" --> ");
// Serial.println(servo_pos); // Serial.println(servo_pos);
Serial.print(SERVO_MIN); // To freeze the lower limit Serial.print(SERVO_MIN); // To freeze the lower limit
Serial.print(" "); Serial.print(" ");
Serial.print(SERVO_MAX); // To freeze the upper limit Serial.print(SERVO_MAX); // To freeze the upper limit
...@@ -43,15 +51,26 @@ void setServoNormalized(double pos) { ...@@ -43,15 +51,26 @@ void setServoNormalized(double pos) {
servo.write(servo_pos); servo.write(servo_pos);
} }
// Function to select a new target from the list
void setNewTarget() { void setNewTarget() {
// Store time since power up (milliseconds)
last_target_time = millis();
// Store the previous target
ptarget = target; ptarget = target;
// Select a new target from the data array (see data.h)
target = data[data_index]; target = data[data_index];
// Set a new current value
current = target; current = target;
// Serial.print("New Target is ["); // Serial.print("New Target is [");
// Serial.print(data_index); // Serial.print(data_index);
// Serial.print("]: "); // Serial.print("]: ");
// Serial.print(target); // Serial.print(target);
// Increment data_index (count up +1)
data_index++; data_index++;
// Reset index when longer than the data (loop over) // Reset index when longer than the data (loop over)
...@@ -61,8 +80,7 @@ void setNewTarget() { ...@@ -61,8 +80,7 @@ void setNewTarget() {
} }
} }
float testval = 0.0f;
float increment = 0.01f;
void setup() { void setup() {
Serial.begin(115200); Serial.begin(115200);
...@@ -73,6 +91,8 @@ void setup() { ...@@ -73,6 +91,8 @@ void setup() {
ESP32PWM::allocateTimer(2); ESP32PWM::allocateTimer(2);
ESP32PWM::allocateTimer(3); ESP32PWM::allocateTimer(3);
// Servo setup
servo.setPeriodHertz(50);// Standard 50hz servo servo.setPeriodHertz(50);// Standard 50hz servo
servo.attach(servoPin, 1000, 2000); // attaches the servo on pin 18 to the servo object servo.attach(servoPin, 1000, 2000); // attaches the servo on pin 18 to the servo object
// using SG90 servo min/max of 500us and 2400us // using SG90 servo min/max of 500us and 2400us
...@@ -80,24 +100,26 @@ void setup() { ...@@ -80,24 +100,26 @@ void setup() {
// which are the defaults, so this line could be // which are the defaults, so this line could be
// "myservo.attach(servoPin);" // "myservo.attach(servoPin);"
// Set new Target every 28.44 seconds (leads to 3 days) // Set new Target every INTERVAL seconds (see define statement above)
ticker.attach(INTERVAL, setNewTarget); // Interval in seconds ticker.attach(INTERVAL, setNewTarget); // Interval in seconds
} }
// Loop is run forever, repeated
void loop() { void loop() {
unsigned long currentMillis = millis(); // Store current time
blend = fmod(float(currentMillis), (INTERVAL * 1000.0f)) / (INTERVAL * 1000.0f); current_time = millis();
// Calculate blend value (0.0 directly after new target selected, counts up till 1.0)
// (this uses the modulo operation (division remainder) to create a repeating pattern)
blend = fmod(
float(current_time - last_target_time),
(INTERVAL * 1000.0f))
/ (INTERVAL * 1000.0f);
current = lerp(ptarget, target, blend); current = lerp(ptarget, target, blend);
// Serial.print(ptarget);
// Serial.print(" (");
// Serial.print(int(blend*100));
// Serial.print("%) ");
// Serial.print(target);
// Serial.print(" (");
// Serial.print(int((1.0-blend)*100));
// Serial.print("%) = ");
// Serial.println(current);
// Set servo position
setServoNormalized(current); setServoNormalized(current);
delay(2);
// Wait for x milliseconds
delay(20);
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment