Piszę update, może komuś się przyda w przyszłości, kod napisany. Do kompletu dokupiłem jeszcze Arduino screw shield v3.
Kod napisany, działa, przyciski na keypadzie zmieniają prędkość oraz zatrzymują i startują silniczek. W sumie enkodera nie używam, ale podłączony

Udało się uniknąć "delay", dzięki temu przyciski na keypadzie zawsze działają (w poprzedniej wersji przy komendzie 'delay' przyciski nie działały w momencie zatrzymania programu
Wklejam kod, może komuś się przyda. Od strony mechanicznej niestety jeszczcze wszystko leży i czeka na ostatnie części
Kod v0.01

w przyszłości dodam zapewne parę czujników i elementów, ale to w bliżej nieokreślonej przyszłości. Pozdrawiam
Kod: Zaznacz cały
#include <LiquidCrystal.h>
#include <Stepper.h>
//create object to control an LCD.
//number of lines in display=2
LiquidCrystal lcd( 8, 9, 4, 5, 6, 7 );
// Define pins
int driverPUL = 12; // PUL- pin
int driverDIR = 13; // DIR- pin
int EncoderDT = A1; // Encoder Output A
int EncoderCLK = A2; // Encoder Output B
int stopSwitch = A3; // Push button on encoder
// Define variables
int pause = 3000; // time for stepper to stop/pause
long previousMillis = 0; // will store last time LED was updated
long interval = pause;
bool stepperOn = false;
const int stepsPerRevolution = 1600; // change this to fit the number of steps per revolution
// Stepper options
Stepper myStepper(stepsPerRevolution, driverPUL, driverDIR);
//Keypad setup
int adc_key_val[5] ={30, 150, 360, 535, 760 };
int NUM_KEYS = 5;
int adc_key_in;
int key=-1;
int oldkey=-1;
///////////////////////////SETUP/////////////////////START///////
void setup() {
pinMode(stopSwitch, INPUT);
myStepper.setSpeed(300);
// Serial.begin(9600);
pinMode (driverPUL, OUTPUT);
pinMode (driverDIR, OUTPUT);
//////// LCD SETUP /////// START ///////
lcd.begin(16, 2);
lcd.clear();
lcd.print("Prototype v0.01");
lcd.setCursor(0, 2);
lcd.print("Pause:");
lcd.setCursor(6, 2);
lcd.print (pause);
//////// LCD SETUP /////// END ///////
}
///////////////////////////SETUP/////////////////////END///////
///////////////////////////LOOP///////////////////START/////////
void loop() {
////////////////////STEPPER IN LOOP///////START////
unsigned long currentMillis = millis();
if(stepperOn && currentMillis - previousMillis > interval)
{
previousMillis = currentMillis;
myStepper.step(stepsPerRevolution);
}
////////////////////STEPPER IN LOOP///////END////
////////////////////KYPAD IN LOOP///////START////
adc_key_in = analogRead(0); // read the value from the sensor
key = get_key(adc_key_in); // convert into key press
if (key != oldkey) // if keypress is detected
{
delayMicroseconds(500); // TODO wait for debounce time (will propably be interrupting stepper, change to millis or something, not v. important as it's gonna start/stop motor
adc_key_in = analogRead(0); // read the value from the sensor
key = get_key(adc_key_in); // convert into key press
if (key != oldkey)
{
oldkey = key;
if (key >=0){
lcd.setCursor(0, 2); //line=2, x=0
if(key == 0) //if key pressed is RIGHT;
{
Serial.println(key);
stepperOn = true;
}
if(key == 1) //if key pressed is UP;
{
pause += 100;
Serial.println(key);
}
if(key == 2) //if key pressed is DOWN;
{
Serial.println(key);
pause -= 100;
}
if(key == 3) //if key pressed is LEFT;
{
Serial.println(key);
stepperOn = false;
}
if(key == 4) //if key pressed is SELECT;
{
Serial.println(key);
}
Serial.println(pause);
lcd.setCursor(6, 2); //line=2, x=6
lcd.print (pause); //////TO DO //////////////////Print current pause time in milliseconds
interval = pause;
}
}
}
////////////////////KYPAD IN LOOP///////END////
}
///////////////////////////LOOP///////////////////END/////////
// Convert ADC value to key number
int get_key(unsigned int input)
{
int k;
for (k = 0; k < NUM_KEYS; k++)
{
if (input < adc_key_val[k])
{
return k;
}
}
if (k >= NUM_KEYS)
k = -1; // No valid key pressed
return k;
}
