Приоритет одного датчика

Я хочу спросить, существует ли какой-либо код для определения приоритета определенной части кода? Итак, я делаю этот проект, в котором хочу использовать мышечный датчик, сервопривод и кнопку в приложении через Bluetooth. Проблема в том, что все выполняется в цикле void(), хотя я не использую датчик мышц, я не могу перемещать сервопривод с помощью приложения, поскольку он сначала считывает датчик мышц. Итак, существует ли возможный код, позволяющий останавливать мышечный датчик на некоторое время после нажатия кнопки в приложении и перемещения сервопривода?

Вот код:

void loop() 
 {
  if(Serial.available()>0)
   {
    char data = Serial.read();

      if (data == 'a')
       {
        myservo.write(15);
       }
  }



int value = analogRead(EMG_PIN);

 if(value > THRESHOLD)
  {
   myservo.write(15);
  }

  else{
       myservo.write(140);
      }

Итак, первый код — это код Bluetooth, в котором сервопривод управляется с помощью кнопки в приложении. Второй — мышечный датчик. Как указано выше, проблема в том, что он всегда будет считывать показания мышечного датчика, даже если кнопка нажата в приложении.

#include <Servo.h> 

 int increment = 0;

 Servo myservo;

 void setup() {

   myservo.attach(1);

 }

 void loop() 
 {

   Serial.println(increment++);

   if (increment > 9);
    {

     if(Serial.available()>0)
      {
       char data = Serial.read();

       if (data == 'a')
       {
        myservo.write(15);
       }
 }

      else if (increment = 0);

      int value = analogRead(EMG_PIN);

      if(value > THRESHOLD)
       {
        myservo.write(15);
       }

     else{
       myservo.write(140);
      }
  }

, 👍1

Обсуждение

Ваш вопрос слишком расплывчатый, чтобы на него можно было ответить. Ответ: «Да, есть способ». Укажите текущий код цикла и выделите соответствующие разделы, в которых вы считываете показания мышечного датчика и где сервокод не вызывается. Мне кажется, это простая логическая проблема с вашим кодом, но мы не можем сказать, не **видя** код., @Duncan C

зачем тебе код, чтобы остановить мышечный датчик? ....есть ли у него функция "стоп"? ....... почему бы вам просто не читать его только на каждой 10-й итерации цикла()?, @jsotola

@DuncanC Хорошо, ребята, я уже отредактировал свой пост и вставил свой код, надеюсь, это даст вам лучшее представление о прошлом, @Brilliant Purnawan

@jsotola Я новичок в этом деле, поэтому не знаю, как это сделать :), можете ли вы показать мне пример кода из моего кода выше, это действительно помогло бы, спасибо, @Brilliant Purnawan

@jsotola это что-то вроде этого, второй код, я все еще новичок в этом, поэтому немного запутался, @Brilliant Purnawan

что-то в этом роде... похоже, что у вас несовпадающие фигурные скобки {} ..... ваши уровни отступов перепутаны, поэтому это неясно, просто взглянув на ваш код, @jsotola

Обратите внимание, что строка else if (increment = 0); имела три фатальных ошибки:, @Duncan C

(1) Он должен использовать ==, а не = (= — это присваивание, поэтому он присваивает 0 для increment, и тогда оператор if всегда терпит неудачу., @Duncan C

(2) никогда не следует ставить точку с запятой после оператора if. В результате получается `if (условие) {ничего не делать}, поскольку точка с запятой отмечает пустой оператор., @Duncan C

(3) Вам не хватает фигурной скобки после оператора if. Код типа «оператор if (условие)» допустим, но сбивает с толку и подвержен ошибкам. Это выполняет только один оператор, если if истинно, а затем переходит к оператору после if. Если у вас неправильный отступ, вы можете подумать, что оператор if выполнит ВЕСЬ код с отступом только в том случае, если оператор if истинен, но это не так., @Duncan C

Ааа, я посмотрю на это, спасибо @DuncanC, @Brilliant Purnawan


1 ответ


Лучший ответ:

0

Вы должны думать о своей программе как о двух различных режимах работы. операция:

  • Режим «фиксированного сервопривода» включается при нажатии кнопки на приложение. В этом режиме сервопривод удерживается в фиксированном положении. Режим длится заранее заданную задержку.

  • Нормальный режим (не фиксированный сервопривод) является режимом по умолчанию. В этом режиме сервопривод позиционируется в соответствии с показаниями датчика.

Итак, вам нужна логическая переменная, чтобы запомнить, является ли «фиксированный сервопривод» активен или нет режим, и код в loop() должен позаботиться об этом. обеспечение правильного поведения в зависимости от режима и его обновление переменная при необходимости. Например:

void loop()
{
    static bool fixed = false;  // находимся ли мы в режиме «фиксированного сервопривода»
    static uint32_t fixed_started;  // когда режим запустился
    uint32_t now = millis();

    // При нажатии кнопки запускается режим «фиксированного сервопривода».
    if (Serial.available() && Serial.read() == 'a') {
        servo.write(SERVO_LEFT);
        fixed = true;
        fixed_started = now;
    }

    // Выходим из "фиксированного" режима после некоторой задержки.
    if (fixed && now - fixed_started >= FIXED_DELAY) {
        fixed = false;
    }

    // Если не в «фиксированном» режиме, реагировать на датчик.
    if (!fixed) {
        if (analogRead(EMG_PIN) >= THRESHOLD) {
            servo.write(SERVO_LEFT);
        } else {
            servo.write(SERVO_RIGHT);
        }
    }
}
,

Ааа, я вижу, это сработало отлично, спасибо, Эдгар., @Brilliant Purnawan

Молодцы, что выяснили намерения ОП из этой путаницы кода., @Duncan C