Приоритет одного датчика
Я хочу спросить, существует ли какой-либо код для определения приоритета определенной части кода? Итак, я делаю этот проект, в котором хочу использовать мышечный датчик, сервопривод и кнопку в приложении через 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 ответ
Лучший ответ:
Вы должны думать о своей программе как о двух различных режимах работы. операция:
Режим «фиксированного сервопривода» включается при нажатии кнопки на приложение. В этом режиме сервопривод удерживается в фиксированном положении. Режим длится заранее заданную задержку.
Нормальный режим (не фиксированный сервопривод) является режимом по умолчанию. В этом режиме сервопривод позиционируется в соответствии с показаниями датчика.
Итак, вам нужна логическая переменная, чтобы запомнить, является ли «фиксированный сервопривод»
активен или нет режим, и код в 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
- Как определить направление вращения с помощью датчика времени энкодера (фотоэлектрический датчик скорости)?
- Как устранить сообщение об ошибке "assignment of function 'void digitalWrite (uint8_t, uint_8)"?
- Как сохранить данные на SD-карту с помощью модуля защиты памяти SPI
- Требуются точные значения цвета RGB с помощью датчика цвета tcs3200 RGB
- Как запрограммировать 2 ультразвуковых датчика, один на серводвигателе и один прикрепленный на передней стороне автомобиля?
- Использование значения MAX30100 SpO2 для включения светодиода
- Датчик удара не работает в файле
- avrdude ser_open() can't set com-state
Ваш вопрос слишком расплывчатый, чтобы на него можно было ответить. Ответ: «Да, есть способ». Укажите текущий код цикла и выделите соответствующие разделы, в которых вы считываете показания мышечного датчика и где сервокод не вызывается. Мне кажется, это простая логическая проблема с вашим кодом, но мы не можем сказать, не **видя** код., @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