Skocz do zawartości

Arduino Uno nie wykonuje poleceń przesyłanych na HC-06


Dzixe

Pomocna odpowiedź

Po ukończeniu kursu FORBOT programowania Arduino chciałem wykonać projekt załączania poprzez Bluetooth 8 przekaźników. Do kontroli wykorzystałem aplikację RoboRemo. Moduł HC-06 jest podłączony przez konwerter sygnałów logicznych 5-3,3 Vdc, zasilany jest 5 Vdc. W monitorze portu szeregowego widać po naciskaniu odpowiednich przycisków na telefonie pojawianie się komend "1 ON, 1 OFF" itd, jednak nie skutkuje to podawaniem napięcia na piny 2-9 w Arduino Uno. Prosiłbym o podpowiedź, gdzie można szukać jeszcze przyczyn problemu, podłączenia wszsytkie kilkukrotnie sprawdzone i są dobre, ciągłość połączeń też jest zachowana.

Zbudowałem na chwilę obecną układ, jak na zdjęciu poniżej:

IMG_20240320_140253133.thumb.jpg.259859fe5cc48c51da0536cd5cd9b11e.jpg 

Natomiast posiłkowałem się kodem znalezionym z identycznego projektu z sieci:

#include <SoftwareSerial.h>

int relay1 = 2;
int relay2 = 3;
int relay3 = 4;
int relay4 = 5;
int relay5 = 6;
int relay6 = 7;
int relay7 = 8;
int relay8 = 9;

String readString;

void setup() {
  Serial.begin(9600);
  pinMode(relay1, OUTPUT); 
  pinMode(relay2, OUTPUT); 
  pinMode(relay3, OUTPUT); 
  pinMode(relay4, OUTPUT); 
  pinMode(relay5, OUTPUT); 
  pinMode(relay6, OUTPUT); 
  pinMode(relay7, OUTPUT); 
  pinMode(relay8, OUTPUT); 
}

void loop() {
  while (Serial.available()) {
    delay(3);  
    char c = Serial.read();
    readString += c; 
  }
  if (readString.length() >0) {
    Serial.println(readString);
    if (readString == "1 ON")     
    {
      digitalWrite(relay1, HIGH);
    }
    if (readString == "1 OFF")
    {
      digitalWrite(relay1, LOW);
    }
    //relay2
    if (readString == "2 ON")     
    {
      digitalWrite(relay2, HIGH);
    }
    if (readString == "2 OFF")
    {
      digitalWrite(relay2, LOW);
    }
    //relay3    
    if (readString == "3 ON")     
    {
      digitalWrite(relay3, HIGH);
    }
    if (readString == "3 OFF")
    {
      digitalWrite(relay3, LOW);
    }
    //relay4    
    if (readString == "4 ON")     
    {
      digitalWrite(relay4, HIGH);
    }
    if (readString == "4 OFF")
    {
      digitalWrite(relay4, LOW);
    }
    //relay5    
    if (readString == "5 ON")     
    {
      digitalWrite(relay5, HIGH);
    }
    if (readString == "5 OFF")
    {
      digitalWrite(relay5, LOW);
    }
    //relay6    
    if (readString == "6 ON")     
    {
      digitalWrite(relay6, HIGH);
    }
    if (readString == "6 OFF")
    {
      digitalWrite(relay6, LOW);
    }
    //relay7    
    if (readString == "7 ON")     
    {
      digitalWrite(relay7, HIGH);
    }
    if (readString == "7 OFF")
    {
      digitalWrite(relay7, LOW);
    }
    //relay8    
    if (readString == "8 ON")     
    {
      digitalWrite(relay8, HIGH);
    }
    if (readString == "8 OFF")
    {
      digitalWrite(relay8, LOW);
    }
    //All on / off    
    if (readString == "ALL ON")     
    {
      digitalWrite(relay1, HIGH);
      digitalWrite(relay2, HIGH);
      digitalWrite(relay3, HIGH);
      digitalWrite(relay4, HIGH);
      digitalWrite(relay5, HIGH);
      digitalWrite(relay6, HIGH);
      digitalWrite(relay7, HIGH);
      digitalWrite(relay8, HIGH);
    }
    if (readString == "ALL OFF")
    {
      digitalWrite(relay1, LOW);
      digitalWrite(relay2, LOW);
      digitalWrite(relay3, LOW);
      digitalWrite(relay4, LOW);
      digitalWrite(relay5, LOW);
      digitalWrite(relay6, LOW);
      digitalWrite(relay7, LOW);
      digitalWrite(relay8, LOW);
    }
    //next
    readString="";
  } 
}

 

Edytowano przez Dzixe
Wstawienie kodu
Link do komentarza
Share on other sites

Bo serial może drukować po literce i zerować napis, który nigdy nie będzie w jednym kawałku czteroliterowym napisem "3 ON". Masz przykład w Arduino SerialEvent, tam to leci w ten deseń, że każdy przylatujący na serial znak jest dodawany do napisu, a dopiero gdy zostanie wykryty znak nowej linii '\n' napis jest uznany za kompletny, ustawiona jest flaga=1, wtedy używasz w innej części kodu tej flagi if(flaga) {blok programu sterujący switchami, zerowanie flagi, zerowanie napisu}.

Jak wszystkie polecenia miałby identycznie 4 znaki to też tak można zrobić, że jak zbierzesz 4 znaki to coś z tym robisz, ale to jest wadliwe, bo w razie błędu, literka ucieknie, wszystko się poprzesuwa, dlatego lepiej jest mieć jakiś szczególny znak na końcu, albo na początku i jak masz taki znacznik to wiesz, że zbierasz literki i kiedy masz komplet. Lepiej chyba go wstawić na koniec, a na początek ewentualnie inne znaki jak chcesz zrobić jakieś rozróżnienie, że coś jest komendą, a coś napisem do użycia do np. wyświetlenia.

Do porównywania napisów też są inne funkcje, zarówno do napisów string jak i tablic znaków char.

I nigdzie nie musi być delay choćby 1ms.

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.