Как объединить два скетча Arduino: один для реле и один для серводвигателя?
Недавно я загрузил отдельные коды для реле и серводвигателя отдельно, все работало нормально. Но когда я объединил эти два кода и ввел их в цикл, возникла задержка в работе реле, но серводвигатель работает нормально.
Мне приходится управлять этими устройствами через модуль Bluetooth HC-05. Не могли бы вы помочь мне с кодом?
/*
simple LED test
*/
#include <Servo.h>
char val; // переменная для получения данных из последовательного порта
int ledpin = 2; // Светодиод подключен к контакту 2 (встроенный светодиод)
Servo myservo;
int pos = 0; // переменная для хранения положения сервопривода
int motor = 0;
void setup()
{
pinMode(ledpin = 2, OUTPUT); // контакт 2 (встроенный светодиод) как ВЫХОД
pinMode(ledpin = 3, OUTPUT); // контакт 3 (встроенный светодиод) как ВЫХОД
myservo.attach(9); // прикрепляет сервопривод к контакту 9 к сервообъекту
Serial.print("Arduino control Servo Motor Connected OK");
Serial.print('\n');
Serial.begin(9600); // начинаем последовательную связь со скоростью 115200 бит/с
digitalWrite(ledpin = 2 ,HIGH);
digitalWrite(ledpin = 3 ,HIGH);
}
void loop()
{
if( Serial.read() == 'a' ) // если получено 'a', светодиод 2 выключается
{
digitalWrite(ledpin = 2, HIGH); // выключаем контакт 2
}
if( Serial.read() == 'A' ) // если получен 'A', горит светодиод 2
{
digitalWrite(ledpin = 2, LOW); // включаем контакт 2
}
if( Serial.read() == 'b' ) // если получено 'b', светодиод 3 выключается
{
digitalWrite(ledpin = 3, HIGH); // выключаем контакт 3
}
if( Serial.read() == 'B' ) // если получено 'B', светодиод 3 включен
{
digitalWrite(ledpin = 3, LOW); // включаем контакт 3
}
if (Serial.read() == '\n')
{
motor = Serial.parseInt();
pos = Serial.parseInt();
myservo.write(pos);
delay(15);
Serial.print("Data Response : ");
Serial.print(motor, DEC);
Serial.print(pos, DEC);
}
}
@elvis , 👍0
1 ответ
В вашем коде есть несколько особенностей.
Каждый раз, когда вы выполняете цифровую запись, вы присваиваете значение светодиодному контакту:
digitalWrite(ledpin = 3, LOW);
В этом нет необходимости, поскольку вы ничего не делаете с переменнойledpin. Вместо этого просто укажите номер контакта цифрового ввода-вывода:
digitalWrite(3, LOW);
Или просто используйте две переменные: одну для контакта 2, а другую для контакта 3. Например.
redledpin = 2; greenledpin = 3;
Это также относится к вызовам функции pinMode в функции настройки.
Каждый из ваших операторов
if( Serial.read() == xx)
будет считывать последовательный символ из последовательного буфера. Вместо этого сохраните прочитанный символ в локальной переменной:readChar = Serial.read() if( readchar == 'a') ... if( readchar == 'A') ... if( readchar == 'b') ... if( readchar == 'B') ...
Я бы заключил весь код внутри
loop()
с помощью:if ( Serial.available() ) { ... }
Функция задержки блокируется, и это может вызвать проблемы. Предлагаю вообще убрать задержку.
Поскольку вы отправляете команды на включение и выключение цифровых выходов, а также отправляете целое число для двигателя и другое для положения, я предлагаю вам определить структуру пакета и заставить ваш код следовать ей ( с необходимой обработкой ошибок). В текущем коде вы пропустите информацию в зависимости от того, какой символ он увидит первым в последовательном буфере.
Я предлагаю что-то вроде:
A, B, 142, 090
Хорошая идея — начать пакет со знакомого символа. То же самое касается и периода ожидания — на случай, если будет получена только часть вашего пакета.
- HC-05 bluetooth-модуль малой дальности действия
- Сервоуправление Arduino bluetooth HC-05
- Сервопривод сохраняет свою позицию каждый раз, когда я отправляю какое-то значение
- Как заставить сервопривод вращаться на угол больше 180°
- Причины, по которым нельзя подключать реле непосредственно к цифровому контакту Arduino
- Подключение Arduino к сервоприводу с внешним источником питания
- Мой сервопривод не работает плавно
- Бесполезная проводка коробки и код
Это присвоит значение 3 светодиодному контакту, и, поскольку операция прошла успешно, оно будет оценено как true.
Нет, это не так. Он будет оцениваться как 3., @Nick GammonЭто работает, потому что true — это любое значение, отличное от 0. Если вы попытаетесь написать
ledpin = 0
, это будет оценено как false, @frarugi87