#include <Stepper.h>
Stepper myStepper(200, 12, 13);
int PinENA=11;
int present_posi=3000;
int want_posi=0;
void calibration(){
int u=1;
digitalWrite(PinENA, LOW);//включаем двигатель
while (u!=0){
if (analogRead(A1)>500 && analogRead(A0)>500) {//проверяем краевоен условие
//Serial.println(i);
myStepper.setSpeed(1000);//задаём скорость
myStepper.step(10);//0.1мм за шаг
}
else if (analogRead(A1)<500){
Serial.println("iCR");//вдвинут
present_posi=0;//обнуляем позицию
u=0;
}
}
digitalWrite(PinENA, HIGH);
}
void setup()
{
Serial.begin(9600);
myStepper.setSpeed(1000);
pinMode (A0,INPUT_PULLUP);//передний концевик
pinMode (A1,INPUT_PULLUP);//задний концевик
pinMode(PinENA,OUTPUT);//пин отключения питания
digitalWrite(PinENA, HIGH);//отключаем питание чтобы не грелся
calibration();//калибруем в начале
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
}
bool flag = false;
uint32_t btnTimer = 0;
void loop()
{
if (Serial.available()) {//что то прислал комп
int message = Serial.parseInt();//читаем сообщение
//Serial.println(y);
//Serial.println(l);
//Serial.println(message);
Serial.flush();//отчищаем буфер
//==========================
if (message==9999){
Serial.print(present_posi);
Serial.println("yCR");//говорит что живой (заменить на отправку значения present_posi для сверки значений, иначе калибровка) Serial.println(present_posi);
}
else if(message==8888) {//сигнал на принудительную калибровку
calibration();
Serial.print(present_posi);
Serial.println("rCR");//говорит что сделал (заменить на отправку значения present_posi для сверки значений, иначе калибровка) Serial.println(present_posi);
}
else if (message!=present_posi && message!=0){//===
want_posi=message;
int displacement=want_posi-present_posi;//пк у себя проверяет чтобы было куда ехать
int mod_displacement=abs(displacement);
int direc=mod_displacement/displacement;//если -1 то вдвигаем, 1 -выдвигаем
//Serial.println(want_posi);
//Serial.println(mod_displacement);
//Serial.println(direc);
//Serial.println(displacement);
for(int i=0;i<mod_displacement;i++){
if (analogRead(A0)>500 && analogRead(A1)>500) {//=
//Serial.println(i);
digitalWrite(PinENA, LOW);
myStepper.setSpeed(1000);
if (direc == 1){
myStepper.step(10);
present_posi+=1;}
else if (direc ==-1){
myStepper.step(-10);
present_posi-=1;}
}//=
else if (analogRead(A0)<500) {//доехал до переднего концевика, что то пошло не так, нужна калибровка
Serial.println("oCR");
i=displacement;}
else if (analogRead(A1)<500) {//доехал до заднего концевика, дошли до нуля автокалибровка калибровка
Serial.println("iCR");
present_posi=0;
i=displacement;}
}
digitalWrite(PinENA, HIGH);
Serial.print(present_posi);
Serial.println("rCR");//говорит что сделал (заменить на отправку значения present_posi) Serial.println(present_posi);
}//===
}
else {
//сработала кнопка
bool btnState1 = !digitalRead(2);
if (btnState1 && !flag && millis() - btnTimer > 100) {
flag = true;
btnTimer = millis();
digitalWrite(PinENA, LOW);
myStepper.step(10);
present_posi+=1;
digitalWrite(PinENA, HIGH);
Serial.print(present_posi);
Serial.println("rCR1");
}
if (btnState1 && flag && millis() - btnTimer > 500) {
btnTimer = millis();
digitalWrite(PinENA, LOW);
myStepper.step(10);
present_posi+=1;
digitalWrite(PinENA, HIGH);
Serial.print(present_posi);
Serial.println("rCR1");
}
bool btnState2 = !digitalRead(3);
if (btnState2 && !flag && millis() - btnTimer > 100) {
flag = true;
btnTimer = millis();
digitalWrite(PinENA, LOW);
myStepper.step(-10);
present_posi-=1;
digitalWrite(PinENA, HIGH);
Serial.print(present_posi);
Serial.println("rCR1");
}
if (btnState2 && flag && millis() - btnTimer > 500) {
btnTimer = millis();
digitalWrite(PinENA, LOW);
myStepper.step(-10);
present_posi-=1;
digitalWrite(PinENA, HIGH);
Serial.print(present_posi);
Serial.println("rCR1");
}
}}