управление бесколекторным двигателем

UD6ASQ/

✩✩✩✩✩✩✩
9 Янв 2023
4
0
Оформи код соответствующим тэгом, см. Правила
Доброго времени суток! Имеется код в котором осуществляется управление бесколлекторным двигателем двумя кнопками, при нажатии на первую кнопку двигатель должен включаться и крутиться до тех пор пока повторно не нажмется эта же кнопка. А при нажатии на вторую он должен работать пока кнопка нажата. Суть проблемы заключается в том что вторая кнопка работает как нужно, двигатель крутится пока нажата. С первой же кнопкой печально все при нажатии на неё ни происходит ни чего. Ткните носом)))) где ошибка.

C++:
// Include the necessary libraries

#include <Servo.h>

// Define the pins for the buttons and hall sensor

#define BUTTON_1_PIN 2

#define BUTTON_2_PIN 3

#define HALL_SENSOR_PIN A0

// Define the maximum run time in milliseconds (60 minutes)

#define MAX_RUN_TIME 3600000

// Define the desired speed in RPM

#define DESIRED_SPEED 2100

// Define the ESC control pin

#define ESC_PIN 9

// Create a servo object for the ESC

Servo esc;

// Variables to store the button states

int button1State = 0;

int button2State = 0;

// Variable to store the current speed

int currentSpeed = 0;

// Variable to store the start time

unsigned long startTime = 0;

// Setup function

void setup() {

  // Initialize the serial communication

  Serial.begin(9600);

  // Set the button pins as inputs

  pinMode(BUTTON_1_PIN, INPUT);

  pinMode(BUTTON_2_PIN, INPUT);

  // Attach the ESC to the control pin

  esc.attach(ESC_PIN);

  // Set the initial speed to 0

  esc.writeMicroseconds(1000);

}

// Loop function

void loop() {

  // Read the button states

  button1State = digitalRead(BUTTON_1_PIN);

  button2State = digitalRead(BUTTON_2_PIN);

  // If button 1 is pressed

  if (button1State == HIGH) {

    // Check if the motor has been running for more than 60 minutes

    if (millis() - startTime > MAX_RUN_TIME) {

      // Stop the motor

      esc.writeMicroseconds(1000);

      // Print a message to the serial monitor

      Serial.println("Maximum run time reached. Motor stopped.");

    } else {

      // Set the motor speed to the desired speed

      esc.writeMicroseconds(map(DESIRED_SPEED, 0, 10000, 1000, 2000));

      // Print a message to the serial monitor

      Serial.println("Motor running at 2800 RPM.");

    }

  }

  // If button 2 is pressed

  if (button2State == HIGH) {

    // Set the motor speed to the desired speed

    esc.writeMicroseconds(map(DESIRED_SPEED, 0, 10000, 1000, 2000));

    // Print a message to the serial monitor

    Serial.println("Motor running at 2800 RPM.");

  } else {

    // Stop the motor

    esc.writeMicroseconds(1000);

    // Print a message to the serial monitor

    Serial.println("Motor stopped.");

  }

  // Update the current speed

  currentSpeed = map(pulseIn(HALL_SENSOR_PIN, HIGH), 0, 10000, 0, 10000);

  // Print the current speed to the serial monitor

  Serial.print("Current speed: ");

  Serial.print(currentSpeed);

  Serial.println(" RPM");

  // Delay for 100 milliseconds

  delay(100);

}
 
Изменено:

poty

★★★★★★✩
19 Фев 2020
3,470
987
@UD6ASQ/, если просите помощи, приводите полную информацию. У Вас предусмотрена отладка в виде сообщений в serial, но в вопросе ничего из этого не видно.
Что предполагаю:
1. Не срабатывает проверка времени на работу больше часа из-за того, что не сохранено startTime перед отсчётом интервала.
2. Нет команды выключения мотора по первой кнопке.
 

UD6ASQ/

✩✩✩✩✩✩✩
9 Янв 2023
4
0
@poty, 1. один час - максимальное время работы двигателя от первой кнопки, если она не была нажата чтобы отключить двигатель
 

poty

★★★★★★✩
19 Фев 2020
3,470
987
@UD6ASQ/, я про другое говорил. Это условие использует переменную, которую Вы нигде, кроме определения переменной, не инициализируете.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,315
1,316
Москва
Если я правильно понял, то вторя кнопка всегда будет выключать мотор, если она не нажата, независимо от опроса 1-ой кнопки.
Ошибка в логике кода: включение и выключение мотора обрабатывается отдельно для событий каждой кнопки, а должно совместно, т.е. обработать данные с кнопок, понять что надо делать с мотором и уже после отдельно включить или выключить его.
Для теста закомментируйте обработку кнопки 2 и посмотрите как будет работать кнопка 1, полностью логику ее работы я не проверял, т.к. см. выше.

ЗЫ. Посмотрел работу 1-ой кнопки. Не заработает, т.к. нет обработки 1-го 2-го нажатия , т.е. сколько бы раз я не нажимал 1-ую кнопку, то 1-ый час всегда будет обрабатываться включение, а потом только выключение. Переменная startTime нигде не меняется, т.е. время запуска не определяется верно. @poty уже сказал об этом.
 
Изменено:

UD6ASQ/

✩✩✩✩✩✩✩
9 Янв 2023
4
0
@Старик Похабыч,при нажатии на вторую кнопку двигатель включается и работает до тех пор пока она нажата. Первую же кнопку нажал кратковременно, мотор включается и вращается до тех пор пока эта же кнопка не нажмется повторно, но не более 1-го часа
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,315
1,316
Москва
@UD6ASQ/, Я и с 1-го раза понял, не один день работаю с заказчиками, что бы мне 2 раза повторять.
Но самому мне приходиться повторять все не раз.
Совет. Для второй кнопки сравнение состояния с высоким подойдет, т.к. там не события клика кнопкой. Можно оставить так. А вот 1-ая кнопка работает с кликами (а не нажатиями). Клик это кратковременно нажать и отпустить, Может не кратковременно, но события именно нажать и отпустить, это будет 1-ый клик, второй та же последовательность после 1-го клика. Т.е. между высокими уровнями должен быть низкий, и причем не дребезг кнопок! Поэтому посмотрите на библиотеку обработки кнопок. Ту же ГайверБатон.
Совет 2. Мысленно посмотрите как будет работать код (прям по строчкам) в зависимости от состояния кнопок. Все ли верно работает ? Можно написать на бумажке состояния , что бы не запутаться.