#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
// 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 30000
#define MIN_SPEED 100
#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
bool hidastus;
void setup() {
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
// säädetään askelmoottorin maximi pyörimisnopeus
stepper1.setMaxSpeed(30000.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);
pinMode(HIDASTUS_PIN, INPUT_PULLUP);
}
void loop() {
static float current_speed = 0.0; // Holds current motor speed in steps/second
static float old_speed = 0.0;
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) päällenappi pin4, yläraja pin3, alaraja pin2, valianturi/hidastus pin5
if ((digitalRead(PAALLENAPPI_PIN) == 0) && (digitalRead(YLARAJA_PIN) == 0)) {
sign = -1;
Serial.println("Starting Process");
}
if ((sign == 0) && (digitalRead(PAALLENAPPI_PIN) == 1) && (digitalRead(YLARAJA_PIN) == 1)) {
sign = 1;
Serial.println("Going Up");
}
if ((sign == 1) && (digitalRead(YLARAJA_PIN) == 0)) {
sign = 0;
Serial.println("Top Reached");
}
if (((digitalRead(ALARAJA_PIN) == 0)) && (sign != 1)) {
sign = 1;
int thePot = analogRead(DELAY_POT_PIN);
int theDelay = map(thePot, 0, 1023, MIN_DELAY, MAX_DELAY);
Serial.print("Dip Delay Start: ");
Serial.println(theDelay);
delay(theDelay);
Serial.println("Dip Delay End");
}
if (!hidastus && (digitalRead(HIDASTUS_PIN) == 0) && (sign == -1)) {
Serial.println("Slowly");
hidastus = true;
digitalWrite(LED_BUILTIN, HIGH);
}
if (hidastus && (digitalRead(HIDASTUS_PIN) == 0) && (sign == 1)) {
Serial.println("Normal Speed");
hidastus = false;
digitalWrite(LED_BUILTIN, LOW);
}
if (hidastus) {
// potikkaa(nopeutta luetaan silloin tällöin (koska se ottaa ohjelmassa pitkän ajan
// eikä sitä haluta tehdä koko ajan pääsilmukassa)
analog_value = analogRead(SPEED_PIN);
// 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);
}
if (old_speed != current_speed) {
old_speed = current_speed;
Serial.print("Current Speed: ");
Serial.println(current_speed);
stepper1.setSpeed(current_speed);
}
// päivitetään askelmoottorin nopeus uuteen arvoon
// tämä ajaa askelmoottoria vakionopeudella
stepper1.runSpeed();
}Delay
Speed