// Replacing a 10k potentiometer with a programmable timer
// https://forum.arduino.cc/t/replacing-a-10k-potentiometer-with-a-programmable-timer/1414670
#include <AccelStepper.h>
// määritetään askelmoottorin ohjaimen pinnit 9 askellus, 8 suunta
AccelStepper stepper1(AccelStepper::DRIVER, 9, 8);
// määritetään painikkeiden pinnit arduinolle
#define PAALLENAPPI_PIN 4
#define YLARAJA_PIN 3
#define ALARAJA_PIN 2
#define HIDASTUS_PIN 5
#define DELAY_POT_PIN A1 // Pot Wiper on Pin A1
#define MIN_DELAY 1000 // 1 second min delay
#define MAX_DELAY 10000 // 10 seconds max delay
// määritetään nopeus säädön potikka analogia pinni
#define SPEED_PIN A0
// määritetään maksimi ja minimi askelnopeus sekuntia kohden (skaalaa potikan tähän väliin)
#define MAX_SPEED 20000
#define MIN_SPEED 100
bool hidastus;
void setup() {
// säädetään askelmoottorin maximi pyörimisnopeus
stepper1.setMaxSpeed(40000.0);
hidastus = false;
// Asetetaan antureiden ja painonapin nappityyppi. input_pullupit tarkoittaa, että käytössä ylösvetovastuksilla toteutettu toiminta
pinMode(PAALLENAPPI_PIN, INPUT_PULLUP);
pinMode(YLARAJA_PIN, INPUT_PULLUP);
pinMode(ALARAJA_PIN, INPUT_PULLUP);
pinMode(PAALLENAPPI_PIN, INPUT_PULLUP);
}
void loop() {
static float current_speed = 0.0; // Holds current motor speed in steps/second
static int analog_read_counter = 1000; // Counts down to 0 to fire analog read
static char sign = 0; // Holds -1, 1 or 0 to turn the motor on/off and control direction
static int analog_value = 0; // Holds raw analog value.
// 1 kelkka liikkuu ylöspäin
// -1 kelkka liikkuu alaspäin
// 0 kelkka pysähtyy
// jos anturi tai painonappi on aktiivinen, seuraava merkki kirjoitetaan ohjelmaan(sign)
if ((digitalRead(PAALLENAPPI_PIN) == 1) && (digitalRead(YLARAJA_PIN) == 1)) {
sign = -1;
}
if ((digitalRead(PAALLENAPPI_PIN) == 1) && (digitalRead(YLARAJA_PIN) == 0)) {
sign = 1;
}
if ((sign == 1) && (digitalRead(YLARAJA_PIN) == 1)) {
sign = 0;
}
if (((digitalRead(ALARAJA_PIN) == 1)) && (sign != 1)) {
sign = 1;
int thePot = analogRead(DELAY_POT_PIN);
int theDelay = map(thePot, 0, 1023, MIN_DELAY, MAX_DELAY);
delay(theDelay);
}
if ((digitalRead(HIDASTUS_PIN) == 1) && (sign == -1)) {
hidastus = true;
}
if ((digitalRead(HIDASTUS_PIN) == 1) && (sign == 1)) {
hidastus = false;
}
if (hidastus) {
// potikkaa(nopeutta luetaan silloin tällöin (koska se ottaa ohjelmassa pitkän ajan
// eikä sitä haluta tehdä koko ajan pääsilmukassa)
if (analog_read_counter > 0) {
analog_read_counter--;
}
else {
analog_read_counter = 3000;
// Now read the pot (from 0 to 1023)
analog_value = analogRead(SPEED_PIN);
// Give the stepper a chance to step if it needs to
stepper1.runSpeed();
}
// skaalataan potikan arvo minimistä maksiminopeuteen
current_speed = sign * (((analog_value / 1023.0) * (MAX_SPEED - MIN_SPEED)) + MIN_SPEED);
}
else {
current_speed = sign * (((1) * (MAX_SPEED - MIN_SPEED)) + MIN_SPEED);
}
// päivitetään askelmoottorin nopeus uuteen arvoon
stepper1.setSpeed(current_speed);
// tämä ajaa askelmoottoria vakionopeudella
stepper1.runSpeed();
}Delay
Speed