Tasmota/lib/lib_div/arduino-vid6608/examples/RandomMove/RandomMove.cpp
Peter Petrovich e5a6cad5e3
Add support for Analog Gauges (#24153)
* Add vid6608 library

* Add vid6608 pin definition (only GB for now)

* Try to debug GPIO - does not work

* First working version

* Trim whitespaces

* Add missing library; JSON response, Codeowners

* Fix blocking loop in esp8266

* Update language strings

* Format inline readme for vid driver

* Add example define in my_user_config.h

* Clanup changed VS Code config files

* Fix duplicated language values in en_GB.h
2025-11-25 11:58:13 +01:00

79 lines
1.6 KiB
C++

#include <Arduino.h>
#include <vid6608.h>
// standard X25.168 range 315 degrees at 1/3 degree steps
#define STEPS (320 * 12)
#define PIN_STEP 26 // Pin, connected to f(scx)
#define PIN_DIR 27 // Pin. connected to CW/CCW
// Custom Acceleration table for the X27.168
// Proposed non-linear curve by ChatGPT
static vid6608::AccelTable accelTable[] = {
{30, 3000},
{65, 2920},
{100, 2780},
{135, 2600},
{170, 2380},
{205, 2140},
{240, 1890},
{275, 1650},
{310, 1420},
{345, 1210},
{380, 1020},
{415, 860},
{450, 730},
{485, 620},
{520, 530},
{555, 460},
{590, 410},
{625, 370},
{660, 340},
{695, 320},
{730, 310},
{765, 305},
{800, 300},
};
vid6608 motor1(PIN_STEP, PIN_DIR, STEPS);
unsigned long nextMoveTime = 0;
uint16_t nextMovePos = 0;
void setup(void)
{
// Initalize debug here
Serial.begin(9600);
Serial.println("Setup");
// Set custom curve
motor1.setAccelTable(accelTable);
// run the motor against the stops
motor1.zero();
// We are done
Serial.println("Setup done");
}
void loop(void)
{
// the motor only moves when you call update
motor1.loop();
// Wait for motor to finish
if (motor1.isStopped()) {
// Plan next move here, to have real pause between moves
if (nextMoveTime == 0) {
nextMoveTime = millis() + random(500, 2000);
} else {
// Wait for next move time
if (millis() > nextMoveTime) {
// Plan next move here
nextMoveTime = 0;
nextMovePos = random(0, STEPS);
Serial.print("Moving to ");
Serial.println(nextMovePos);
motor1.moveTo(nextMovePos);
}
}
}
}