Dzixe Napisano 20 marca Udostępnij Napisano 20 marca (edytowany) 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: 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 20 marca przez Dzixe Wstawienie kodu Link do komentarza Share on other sites More sharing options...
kaczakat 21 marca Udostępnij 21 marca 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. 1 Link do komentarza Share on other sites More sharing options...
jand 21 marca Udostępnij 21 marca Po pętli while, a przed pierwszym if wstaw linijkę readString.trim(); Link do komentarza Share on other sites More sharing options...
farmaceuta 21 marca Udostępnij 21 marca Spróbuj tak... if(Serial.available() > 0) { readString = Serial.readStringUntil('\n'); } Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
Pomocna odpowiedź
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ę »