Как объединить два скетча 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);

    }

    }

, 👍0


1 ответ


1

В вашем коде есть несколько особенностей.

  1. Каждый раз, когда вы выполняете цифровую запись, вы присваиваете значение светодиодному контакту:

    digitalWrite(ledpin = 3, LOW);
    

    В этом нет необходимости, поскольку вы ничего не делаете с переменнойledpin. Вместо этого просто укажите номер контакта цифрового ввода-вывода:

    digitalWrite(3, LOW);
    

    Или просто используйте две переменные: одну для контакта 2, а другую для контакта 3. Например.

    redledpin = 2;
    greenledpin = 3;
    

    Это также относится к вызовам функции pinMode в функции настройки.

  2. Каждый из ваших операторов if( Serial.read() == xx) будет считывать последовательный символ из последовательного буфера. Вместо этого сохраните прочитанный символ в локальной переменной:

    readChar = Serial.read()
    if( readchar == 'a')
    ...
    if( readchar == 'A')
    ...
    if( readchar == 'b')
    ...
    if( readchar == 'B')
    ... 
    
  3. Я бы заключил весь код внутри loop() с помощью:

    if ( Serial.available() )
    {
        ...
    }
    
  4. Функция задержки блокируется, и это может вызвать проблемы. Предлагаю вообще убрать задержку.

  5. Поскольку вы отправляете команды на включение и выключение цифровых выходов, а также отправляете целое число для двигателя и другое для положения, я предлагаю вам определить структуру пакета и заставить ваш код следовать ей ( с необходимой обработкой ошибок). В текущем коде вы пропустите информацию в зависимости от того, какой символ он увидит первым в последовательном буфере.

    Я предлагаю что-то вроде:

    A, B, 142, 090
    

    Хорошая идея — начать пакет со знакомого символа. То же самое касается и периода ожидания — на случай, если будет получена только часть вашего пакета.

,

Это присвоит значение 3 светодиодному контакту, и, поскольку операция прошла успешно, оно будет оценено как true. Нет, это не так. Он будет оцениваться как 3., @Nick Gammon

Это работает, потому что true — это любое значение, отличное от 0. Если вы попытаетесь написать ledpin = 0, это будет оценено как false, @frarugi87