Кнопку нажали отпустили двигатель вращается, еще раз нажали остановился

Не могу разобраться почему он не вращаетсяНе вращается двигатель. Светодиод работает как надо. Помогите разобраться.

const int StepsForRotation = 200; // 200 шага на оборот - 1,8 градуса на один шаг
Stepper stepmotor (StepsForRotation, 8, 9, 10, 11); // Инициализируем шаговый двигатель 200 шага на оборот, управление обмотками через 8, 9, 10, 11 цифровые выходы
int buttonPin6 = 6; //номер входа, подключенный к кнопке
boolean butt_flag = 0; //запоминает последнее состояние кнопки
boolean butt; // текущее значение кнопки
boolean led_flag = 0;
unsigned long last_press; //переменная хранящая время прошлого нажатия

void setup()
{
pinMode(6, INPUT_PULLUP); //обозначаем пин 6 входом
Serial.begin(9600);
pinMode(13, OUTPUT);
}
void loop() {
int Napr = 0; // переменная направления вращения двигателя варианты значений 1 / 0 / -1
stepmotor.setSpeed (200) ; // устанавливаем скорость вращения
butt = !digitalRead(3); // считать текущее положение кнопки, инвертированное

if (butt == 1 && butt_flag == 0 && millis() - last_press > 100) {
butt_flag = 1;
Serial.println("Button pressed");
led_flag = !led_flag;
digitalWrite(13, led_flag); //проверка нажатия кнопки
last_press = millis();
}
if (digitalRead(6) == HIGH) {
buttonState = 1;
}
else
{
buttonState = 0;
}
}

if (buttonState == 1) Napr = 1; // если кнопка нажата, сделать шаговому двигателю 1 шаг
if (buttonState == 0) Napr = 0; // если кнопка нажата еще раз, двигатель сделает 0 шагов

stepmotor.step(Napr) ; // Дивагеть должен сделать кол-во шагов согласно переменной Napr
}```

А он, в принципе, вращается?

В том то и дело что нет. Но он рабочий. Подключен правильно. Он делает по одному шагу.

Код не компилируется. Так что про вращение рано говорить.

Раз ему написали делать шаг, он и делает его. Под условие перещелкивания переменная не попадает.

Переделал код. Теперь после нажатии и удержании вращается.

const int StepsForRotation = 200; // 200 шага на оборот - 1,8 градуса на один шаг
Stepper stepmotor (StepsForRotation, 8, 9, 10, 11); // Инициализируем шаговый двигатель 200 шага на оборот, управление обмотками через 8, 9, 10, 11 цифровые выходы
int buttonPin6 = 6; //номер входа, подключенный к кнопке
boolean butt_flag = 0; //запоминает последнее состояние кнопки
boolean butt; // текущее значение кнопки
boolean led_flag = 0;
unsigned long last_press; //переменная хранящая время прошлого нажатия

void setup()
{
	pinMode(6, INPUT_PULLUP); //обозначаем пин 6 входом
	Serial.begin(9600);
	pinMode(13, OUTPUT);
}
void loop() {
	int Napr = 0; // переменная направления вращения двигателя варианты значений 1 / 0 / -1
	stepmotor.setSpeed (200) ; // устанавливаем скорость вращения
	butt = !digitalRead(3); // считать текущее положение кнопки, инвертированное

	if (butt == 1 && butt_flag == 0 && millis() - last_press > 100) 
	{
		butt_flag = 1;
		Serial.println("Button pressed");
		led_flag = !led_flag;
		digitalWrite(13, led_flag); //проверка нажатия кнопки
		last_press = millis();
	}
	if (digitalRead(6) == HIGH) 
	{
		Napr = 1;
	}
	else
	{
		Napr = 0;
	}

	stepmotor.step(Napr) ; // Дивагеть должен сделать кол-во шагов согласно переменной Napr
}

Теперь сделайте переменную Napr статической, а кнопка чтобы не приравнивала ее всегда к единице, а инвертировала.
И тогда у вас будет работать именно так, как написано в заголовке

То есть в 16 строке сделать так static int Napr = 0?
И если убрать строки 32-35, запускается норм. Но надо что бы при повторном нажатии останавливался.

я вам написал как сделать

Извините, а в какой строке? Я начинающий

Работает. Ура!!!

#include "Stepper.h"
const int StepsForRotation = 200; // 200 шага на оборот - 1,8 градуса на один шаг
Stepper stepmotor (StepsForRotation, 8, 9, 10, 11); // Инициализируем шаговый двигатель 200 шага на оборот, управление обмотками через 8, 9, 10, 11 цифровые выходы
int buttonPin6 = 6; //номер входа, подключенный к кнопке
boolean butt_flag = 0; //запоминает последнее состояние кнопки
boolean butt; // текущее значение кнопки
boolean led_flag = 0;
unsigned long last_press; //переменная хранящая время прошлого нажатия

void setup()
{
	pinMode(6, INPUT_PULLUP); //обозначаем пин 6 входом
	Serial.begin(9600);
	pinMode(13, OUTPUT);
}
void loop() {
	static int Napr = 0; // переменная направления вращения двигателя варианты значений 1 / 0 / -1
	stepmotor.setSpeed (200) ; // устанавливаем скорость вращения
	butt = !digitalRead(6); // считать текущее положение кнопки, инвертированное

	if (butt == 1 && butt_flag == 0 && millis() - last_press > 100) 
	{
		butt_flag = 1;
		Serial.println("Button pressed");
		led_flag = !led_flag;
		digitalWrite(13, led_flag); //проверка нажатия кнопки
		if (led_flag == 1)
		{	Napr=1;}
		else
		{	Napr=0;}
		last_press = millis();
	}
	if (butt == 0 && butt_flag == 1) {
		butt_flag = 0;
		Serial.println("Button released");
	}
	//if (digitalRead(6) == HIGH) 
	//{
	//Napr = 1;
	//}
	//else
	//{
	//Napr = 0;
	//}

	stepmotor.step(Napr) ; // Дивагеть должен сделать кол-во шагов согласно переменной Napr
}
2 лайка

Молодец

1 лайк

Строка №24

Поясните пожалуйста, как именно осуществляется “проверка нажатия кнопки” в это строке.

Это для визуального контроля работы кнопки.