#include <SPI.h>
#include <AccelStepper.h>
#define HALFSTEP 8 // Halfstep (4096 Steps per output shaft revolution)
#define motorPin1 3 // To ULN2003 driver Pin 1
#define motorPin2 4 // To ULN2003 driver Pin 2
#define motorPin3 5 // To ULN2003 driver Pin 3
#define motorPin4 6 // To ULN2003 driver Pin 4
// список поворотов
uint8_t numTurn[]={18, 36, 9, 0};
//массив семисегментных кодов
uint8_t segmCode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
bool btnFlag = false;
volatile bool jobFlag = false;
uint32_t btnTimer = 0;
uint32_t tmr = 0;
uint8_t arrSize= sizeof(numTurn) / sizeof(numTurn[0]);
uint8_t current=0;
volatile uint32_t debounce;
AccelStepper stepper(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);
// обработка прерывания
void isr() {
// оставим 100 мс таймаут на гашение дребезга
if (millis() - debounce >= 500 ){
debounce = millis();
jobFlag = false;
}
}
//вывод десятичного числа на индикатор
void toIndicator(uint8_t dec){
if (dec < 10) {
SPI.transfer(segmCode[dec]);
//запись в регистр десятка секунд
SPI.transfer(0xFF);
}
else{
//запись в регистр единицы секунд
SPI.transfer(segmCode[dec % 10]);
//запись в регистр десятка секунд
SPI.transfer(segmCode[dec /10 % 10]);
}
//обновляем выходы сдвигового регистра
digitalWrite(SS,HIGH);
digitalWrite(SS,LOW);
}
// выбор поворотов
void pick(uint8_t num){
Serial.println(numTurn[num]);
while(!jobFlag){
bool btnState = !digitalRead(3);
if (btnState && !btnFlag && millis() - btnTimer > 100) {
btnFlag = true;
btnTimer = millis();
if (num < arrSize){
++num;
toIndicator(numTurn[num]);
Serial.println(numTurn[num]);
}
else {
num = 0;
toIndicator(numTurn[num]);
Serial.println(numTurn[num]);
}
}
if (btnState && btnFlag && millis() - btnTimer > 600) {
btnTimer = millis();
current = num;
jobFlag = true;
Serial.println("press hold");
}
if (!btnState && btnFlag && millis() - btnTimer > 600) {
btnFlag = false;
btnTimer = millis();
//Serial.println("release");
}
}
}
void job (){
uint16_t steps= 4096/numTurn[current];
uint8_t pos = 0;
while (pos < 4097){
// take picture
//if(!stepper.isRunning()){
//
//}
//turn table
if (stepper.currentPosition() < 4095 && jobFlag)
{
pos = pos + steps;
stepper.runToNewPosition(pos);
Serial.print("Job pos = ");
Serial.println(pos);
}
}
}
//настройка периферии микроконтроллера
void setup() {
pinMode(14, OUTPUT);
SPI.begin();
digitalWrite(SS,LOW);
Serial.begin(9600);
// подключили кнопку на D2 и GND
pinMode(2, INPUT_PULLUP);
attachInterrupt(0, isr, FALLING);
stepper.setMaxSpeed(1200.0); //Stepper Maxspeed
stepper.setAcceleration(200.0); //Stepper Acceleration
stepper.setSpeed(800); // Stepper Speed
stepper.setCurrentPosition(0);
}
void loop() {
toIndicator(numTurn[current]);
if (!jobFlag){
pick(current);
}
if (jobFlag&&numTurn[current] == 0){
// постоянное вращение
}
if (jobFlag&&numTurn[current] != 0){
Serial.println("Start job");
job();
}
}