Невозможно управлять цифровыми контактами с помощью команд, отправленных через модуль HC-05.

Я пытаюсь управлять светодиодом на контакте 13, используя приведенный ниже код, но он не работает. С помощью этого кода я могу печатать на последовательном мониторе, но код не влияет ни на один из цифровых контактов. Я не могу управлять светодиодом, поэтому я застрял и не могу двигаться дальше. Я не могу понять, почему это происходит, даже если я исключил новую строку из приложения Bluetooth, которое я использую для отправки строк и того же на последовательном мониторе.

#include<SoftwareSerial.h>          // импортируем серийную библиотеку

SoftwareSerial bluetooth(6, 7);     // прием, передача

void setup(){
  Serial.begin(9600);               //установить скорость передачи данных
  bluetooth.begin(9600);
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);
}

void loop(){
  while (bluetooth.available()){
    char ch = bluetooth.read();
    message += ch;
  }

  if(!bluetooth.available()){
    if(message != ""){
      if(message.equalsIgnoreCase("on")){
        digitalWrite(13, HIGH);
      }else{
        digitalWrite(13, LOW);
      }
      Serial.println(message);
      message = "";
    }
  }
}

, 👍-1

Обсуждение

Каков вывод последовательного терминала? Это именно то, что достигает кода, так что это очень поможет. Я обновлю свой ответ, когда вы предоставите больше информации . Также: Как вы подключили HC-05? Вы использовали делитель напряжения для линии RX? (HC-05 работает с 3,3 В, а большинство плат Arduino с 5 В). И оператор if if(!bluetooth.available()) здесь не нужен, потому что, когда вы выходите из цикла while, нет ничего доступного. , если он не получен в течение этих нескольких тактов выполнения между ними., @chrisl

последовательный монитор выводит «on» как «o» и «n» в отдельных строках. Bluetooth-терминал на моем телефоне ничего не печатает. Но код работает нормально, если я использую обычные контакты (Rx, Tx), терминал на моем телефоне также печатает строки, которые он отправляет, и это работает нормально даже без делителя напряжения. Я просто не хочу задействовать штифты (1,2). Я не знаю, есть ли проблема с библиотекой SoftwareSerial, @Sudhanshu Shivam

символы приходят медленнее по SoftwareSerial, и ваш код не ждет их. если следующий символ недоступен сразу, вы продолжаете цикл, @Juraj

пожалуйста, уточните, я пробовал while(blurtooth.available()==0); ждать данных, но это не работает;, @Sudhanshu Shivam

В основном у меня возникла проблема из-за того, что некоторые значения мусора поступали, и я справился с этим, используя if(message.substring(0,2).equals("on")). и теперь он работает нормально, @Sudhanshu Shivam


1 ответ


0

Ваша логика - полный бардак. У вас есть:

  1. Если символ доступен, прочитайте его и добавьте в сообщение.
  2. Если доступен другой символ, сравните то, что вы уже сохранили, с помощью on.
    • Если оно равно ("o" не равно "on"), включить, иначе выключить.
    • Распечатайте то, что вы сохранили.
  3. Забудьте о том, что вы сохранили
  4. Перейдите к шагу 1 (символ все еще доступен, поскольку вы никогда не читали его на этапе 2).

Вместо этого вам нужно нечто большее, например:

  1. Если символ доступен, считать его в переменную.
  2. Если прочитанный вами символ является символом конца строки:
    • Сравните свое сообщение со словом "включено" и примите соответствующие меры
  3. Если прочитанный вами символ не является символом конца строки:
    • Добавьте символ в сообщение.
  4. Перейти к 1.

Обратите внимание, что вы проверяете наличие доступного символа только один раз, и все ваши проверки выполняются в одном блоке if.

,

так что я в основном пробовал это, но это не работает, @Sudhanshu Shivam

Комментарии не место для сброса кода., @Majenko

очень жаль об этом, @Sudhanshu Shivam