// Для работы должна быть установлена библиотека GyverStepper
//Если на дуине горит диод постоянно, значит концевик находится в правильном месте.
// отправь q для тормоза
// отправь w для плавной остановки
// отправь e для скорости 5 град/сек
// отправь r для скорости 100 град/сек
#include <GyverStepper.h>
//#include "HX711.h"
GStepper<STEPPER2WIRE> stepper(200, 4, 5,6); //Настройка количества шагов и пинов подключения
//const int LOADCELL_SCK_PIN = 10;
//const int LOADCELL_DOUT_PIN = 11;
int MXSpeed = 200; // Макс Скорость движения
int Acc = 20; //Переменная ускорения-замедления
int Krug = -200; // Шагов в полном круге. Можно изменять направление движения добавив или убрав знак минус -
const unsigned long pauseTimer = 10000; //установка времени паузы в миллисикундах
const unsigned long tries = 5; // количество кругов в цикле - чем больше добавить тем дольше будет вращаться без остановки
int BSFlag = 3; // Флаг начального цикла 1-работа, 0-стоп\ожидание, 3 - стоп\ничего не делать 5 - Калибровка 6 - Постоянное вращение
int flagmem = 3;
unsigned long FinalPos = Krug * tries; //расчет конечной позиции
bool loopmode = false; //Установка режима бесконечного вращения. по умолчанию - false
unsigned long lastend;
bool flag = false;
bool flag1 = false;
bool flag2= false;
bool flag3= false;
uint32_t btnTimer = 0;
uint32_t btnTimer1 = 0;
uint32_t btnTimer2 = 0;
uint32_t btnTimer3 = 0;
int tries1 =0;
void setup() {
Serial.begin(115200);
Serial.println("poexali");
stepper.setRunMode(FOLLOW_POS); //pos
stepper.setSpeedDeg(1); // в градусах/сек
stepper.setMaxSpeed(MXSpeed); // Значение максимальной скорости
stepper.setAcceleration(Acc); // Значение ускорения - торможения
stepper.reset();
// stepper.invertEn(true);
pinMode(2, INPUT_PULLUP); // knopkaA
pinMode(3, INPUT_PULLUP); // dat4ik shtora
pinMode(7, INPUT_PULLUP); //knopka B
pinMode(8, INPUT_PULLUP); // koncevik
pinMode(9, INPUT_PULLUP); //signal dat4ikov ard
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
switch (BSFlag) { //выбор режимов
case 0: //режим 0 - Двигатель остановлен, ждет начала следущего круга
{
if (millis() > lastend+pauseTimer){
BSFlag=1;
Serial.println("BSFlag=1");
Serial.println("next start");
}
}
break;
case 1: //режим 1 - Движение по режиму круг с задержкой
{
if (!stepper.tick()){
static bool dir;
dir = !dir;
stepper.setTarget(FinalPos);
}
if (stepper.getCurrent() == FinalPos){
BSFlag=0;
Serial.println("BSFlag=0");
stepper.brake();
stepper.reset();
lastend = millis();
Serial.print("done at ");
Serial.println(lastend);
tries1=0;
Serial.println(stepper.getCurrent());
}
}
break;
case 2: //режим 2 - резерв
{
Serial.println("mode 2 is not active yet");
}
break;
case 3: //режим 3 - Плавная Остановка
{
if (!stepper.tick()){
//Serial.println("ne edet");
// dir = !dir;
// stepper.setTarget(Krug,RELATIVE);
} else {
//Serial.println("edet");
if (stepper.getSpeed()>= -5){
stepper.stop();
}
}
}
break;
case 4: //режим 4
{
Serial.println("mode 4 is not active yet");
}
break;
case 5: //режим 5
{
if (!stepper.tick()){
static bool dir;
dir = !dir;
stepper.setTarget(Krug);
}
if (stepper.getCurrent() == -100) {
BSFlag=1;
Serial.println("BSFlag=1");
tries1=0;
stepper.brake();
stepper.reset();
}
}
break;
case 6: //режим 6
{
if (!stepper.tick()){
static bool dir;
dir = !dir;
stepper.setTarget(Krug * 999999);
}
}
break;
default:
{
Serial.println("РЕЖИМ НЕ ВЫБРАН, СБОЙ РЕЖИМА");
}
break;
}
bool btnState1 = !digitalRead(2);
if (btnState1 && !flag1 && millis() - btnTimer1 > 100) {
flag1 = true;
BSFlag=1;
Serial.println("BSFlag=1");
Serial.println("start");
diagrun();
btnTimer1 = millis();
//tries1 = tries;
}
if (!btnState1 && flag1 && millis() - btnTimer1 > 100) {
flag1 = false;
btnTimer1 = millis();
BSFlag=3;
Serial.println("BSFlag=3");
//stepper.stop();
//stepper.reset();
//lastend = millis();
Serial.println("STOP");
stepper.stop();
}
bool btnState = !digitalRead(3);
if (!btnState && !flag && millis() - btnTimer > 150) {
flag = true;
btnTimer = millis();
Serial.println("press halt");
halterr();
}
if (btnState && flag && millis() - btnTimer > 100) {
flag = false;
btnTimer = millis();
Serial.println("release");
}
bool btnState2 = !digitalRead(8);
if (btnState2 && !flag2 && millis() - btnTimer2 > 100) {
flag2 = true;
digitalWrite(LED_BUILTIN, LOW);
Serial.println("концевик открыт");
tries1 = tries1 -= 1;
Serial.print("осталось кругов: ");
Serial.println(tries1);
Serial.println(stepper.getCurrent());
btnTimer2 = millis();
}
if (!btnState2 && flag2 && millis() - btnTimer2 > 100) {
flag2 = false;
btnTimer2 = millis();
Serial.println("концевик закрыт");
digitalWrite(LED_BUILTIN, HIGH);
if (BSFlag==1 && tries1 == 1) {
//stepper.reset();
stepper.setTarget(stepper.getCurrent()-16330);
tries1 = tries;
}
if (BSFlag==5 && tries1 == 1) {
stepper.reset();
stepper.stop();
stepper.setTarget(-16330);
Serial.println("-10400");
lastend = millis();
//tries1 = tries;
//BSFlag=1;
}
//if (BSFlag==5 && tries1 == 0) {
//BSFlag=0;
//stepper.stop();
//stepper.reset();
//lastend = millis();
//tries1 = tries;
//}
}
bool btnState3 = !digitalRead(7);
if (btnState3 && !flag3 && millis() - btnTimer3 > 100) {
flag3 = true;
//flagmem = BSFlag;
BSFlag = 6;
Serial.println("BSFlag=6");
Serial.println("start contin");
btnTimer3 = millis();
//tries1 = tries;
}
if (!btnState3 && flag3 && millis() - btnTimer3 > 100) {
flag3 = false;
btnTimer3 = millis();
BSFlag = 3;
Serial.println("STOP contin");
Serial.print("BSFlag=3");
stepper.stop();
}
if (Serial.available()) {
char ch = Serial.read();
switch (ch) {
case 'q':
{
BSFlag=1;
Serial.println("Changed to 1");
}
break;
case 'a':
{
BSFlag=2;
Serial.println("Changed to 2");
}
break;
case 'z':
{
BSFlag=3;
Serial.println("Changed to 3");
}
break;
case 'w':
{
BSFlag=4;
Serial.println("Changed to 4");
}
break;
case 's':
{
BSFlag=5;
Serial.println("Changed to 5");
}
break;
case 'x':
{
BSFlag=6;
Serial.println("Changed to 6");
}
break;
}
}
}
void halterr()
{
Serial.print("Speed halt");
//stepper.stop();
//Serial.println(lastend);
// lastend = millis();
//bool btnState = !digitalRead(3);
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(50); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(100);
}
void diagrun(){
Serial.print("diag run");
BSFlag = 5;
Serial.println("BSFlag=5");
stepper.reset();
stepper.setTarget(Krug);
tries1 = 1;
}