Skocz do zawartości

Kurs Arduino - #3 - UART (komunikacja z PC), zmienne


Pomocna odpowiedź

Widzę że temat jeszcze żyje, więc dołączę się z nietypowym pytaniem, jak w arduino zrobić parsowanie danych z bluetootha, mam apkę w tel która wysyła przez bt dane w jakimś tam formacie i teraz jak z tego wyciągnąć liczby do sterowania robotem (np pwm silników albo impulsy do serwa?) a może gdzieś to jest opisane na formum, jeśli tak to proszę o info gdzie szukać? Dziękuję serdecznie za każdą podpowiedź.

Link do komentarza
Share on other sites

Witam.

Super kurs!

Potrzebowałbym pomocy fachowców.

Po wgraniu tego programu:

void setup(){
 Serial.begin(9600); //Uruchamiamy transmisję

 pinMode(8, OUTPUT); //Wyjście diody czerwonej
 pinMode(9, OUTPUT); //Wyjście diody zielonej
 pinMode(10, INPUT_PULLUP); //Przycisk

 digitalWrite(8, LOW); //Wyłączenie obu diod
 digitalWrite(9, LOW);
}

void loop() {
 if (digitalRead(10) == LOW) { //Jeśli przycisk jest wciśnięty
   digitalWrite(9, HIGH); //Włączenie diody zielonej
   digitalWrite(8, LOW); //Wyłączenie diody czerwonej
 } else { //Jeśli przycisk nie jest wciśnięty
   digitalWrite(9, LOW); //Wyłączenie diody zielonej
   digitalWrite(8, HIGH); //Włączenie diody czerwonej
   Serial.println("Uwaga! Alarm! Okno nie jest zamkniete!");
 }
} 

nie moge już wgrać żadnego innego programu z kursu.

W Monitorze cały czas nadawana jest informacja o alarmie.

Jak wgrywam jakikolwiek program z kursu wywala błąd .

Arduino UNO R3 programuje za pomocą telefonu i ArduinoDroid.

Jak dotąd nie miałem żadnych problemów.

Pozdrawiam

__________

Komentarz dodany przez: Treker

Kody programów należy umieszczać przez narzędzie KOD (znajdziesz je w edytorze pod ikonką "<>"). Dzięki niemu składania programów jest automatycznie kolorowana, a wtedy wszystkim znacznie łatwiej analizować wklejone programy. Proszę to poprawić - z góry dziękuję za zrozumienie i pomoc przy utrzymaniu porządku na forum.




     
            
   

			
		
Link do komentarza
Share on other sites

Niff, witam na forum 🙂 Na przyszłość pamiętaj, aby kody programów umieszczać zawsze w tagach .

Niestety nie korzystałem z tego środowiska, więc ciężko powiedzieć, co się dzieje. Najprawdopodobniej nie potrafi ono wywołać resetu Arduino w odpowiednim momencie (tak jak dzieje się to podczas normalnego programowania). Najlepiej byłoby zacząć programować z PC... Jeśli nie masz takiej możliwości, to są dwa wyjścia:

1) Spróbuj trzymać wciśnięty przycisk, który jest podłączony do pinu 10. Wtedy Arduino nie będzie wysyłało ciągle komunikatu i może uda się zaprogramować układ. Rozwiązanie to zadziała jednak tylko i wyłącznie dla tego programu, który wkleiłeś.

2) Druga opcja: tuż przed rozpoczęciem wgrywania programu wciśnij reset na płytce Arduino.

  • 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

Kosmetyka ale na rysunku przycisk jest nieprawidłowo wpięty w płytkę prototypową.

Dla mnie to żaden problem w końcu od czegoś mam miernik.

Podsyłam poprawioną grafikę.

Link do komentarza
Share on other sites

kozolex, faktycznie w niektórych miejscach jest taki błąd - jednak z tego co pamiętam w zestawach i tak są przyciski, które mają tylko dwa wyprowadzenia, więc nie powinno być problemów. Rysunki będą wymienione przy okazji odświeżania tego kursu 🙂

Link do komentarza
Share on other sites

Co do zadania domowego z gwiazdką to chyba zamiast tworzenia zmiennych globalnych bool można po prostu zrobić:

if (digitalRead(8) == 0) digitalWrite(8, HIGH);

else digitalWrite(8, LOW);

I trochę pamięci zaoszczędzone, zresztą zauważyłem, że zmienne globalne zabierają dużo miejsca w swoim programie mam zajęte 12%. Chociaż to akurat pewnie wina struktury 'String'.

Ciekawe jest to, że mam ustawiony pin 8 na OUTPUT a nadal mogę z niego sczytać wartość.

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

W przypadku "czujnika"

otwarcia okna można było zastosować jedną zmienną globalną, dzięki czemu

informacja wyświetli się tylko raz na każdą zmianę stanu.

Kod trochę słabo sformatowany

- zwykle używam "wygodnych" IDE, które same poprawiają 😳

bool last_high = false;
void setup()
{
 pinMode(2,INPUT_PULLUP);
 pinMode(3,OUTPUT);
 pinMode(4,OUTPUT);
 digitalWrite(3,LOW);
 digitalWrite(4,LOW);
 Serial.begin(9600);
}

void loop()
{


 if(digitalRead(2) == HIGH)
 {
   digitalWrite(3,HIGH);
   digitalWrite(4,LOW);
   if(!last_high)
   {
     Serial.println("zamkniete!");
     last_high = true;
   }
 }
 else
 {
   digitalWrite(4,HIGH);
   digitalWrite(3,LOW);    
   if(last_high)
   {
     Serial.println("Otwarte!");
     last_high = false;
   }
 }
}
Link do komentarza
Share on other sites

#define zielona 8
#define czerwona 9

String odebraneDane = ""; //Pusty ciąg odebranych danych
boolean stanczerwonej = false;
boolean stanzielonej = false;


void setup() {
 Serial.begin(9600); //Uruchomienie komunikacji
 pinMode(zielona, OUTPUT); //Konfiguracja wyjść
 pinMode(czerwona, OUTPUT);

 digitalWrite(zielona, LOW); //Wyłączamy diody
 digitalWrite(czerwona, LOW);
}

void loop() {
 if(Serial.available() > 0) { //Czy Arduino odebrano dane
   //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej odebraneDane
   odebraneDane = Serial.readStringUntil('\n'); 

   if (odebraneDane == "zielona") {     
     digitalWrite(zielona, stanzielonej); 
     stanzielonej =! stanzielonej;
     }

   if (odebraneDane == "czerwona") { 
     digitalWrite(czerwona, stanczerwonej); 
     stanczerwonej =! stanczerwonej;
     }

   if (odebraneDane != "czerwona") {
     if (odebraneDane != "zielona"){

     Serial.println("Nie ma takiego koloru ! ");
   }}
 }
}

!

Link do komentarza
Share on other sites

Michal_78, witam na forum 🙂 Wszystko wygląda dobrze, jeśli miałbym się tylko do czegoś "przyczepić", to zmieniłbym zapis:

stanzielonej =! stanzielonej; 

Na:

stanzielonej = !stanzielonej; 

Tak, chodzi o jedną spację, która wiele nie wnosi, ale widać wtedy, że "!" neguje zmienną, a nie jest częścią operatora przypisania, co może być czasami mylące z operatorem "różne", czyli "!=" 🙂

Link do komentarza
Share on other sites

Jak już szukamy czego się przyczepić, to proponowałbym dodać kilka instrukcji else do programu.

Jeśli pierwszy warunek jest prawdziwy:

 if (odebraneDane == "zielona") {

To nie ma sensu sprawdzać kolejnych - odebrane dane nie mogą już zawierać napisu "czerwona". Używanie else daje nieco efektywniejszy kod, ale co ważniejsze w przyszłości może uchronić przed dość złośliwymi błędami, gdy niechcący więcej niż jeden warunek jest jednocześnie spełniony.

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

Witam wszystkich.

Ja sobie wykombinowałem coś takiego

#define zielona 8
#define czerwona 9

bool led_zielona = false;
bool led_czerwona = false;

String odebraneDane = "";

void setup() {
 Serial.begin(9600);
 pinMode(zielona, OUTPUT);
 pinMode(czerwona, OUTPUT);

 digitalWrite(zielona, LOW);
 digitalWrite(czerwona, LOW);

}

void loop() {
 if(Serial.available() > 0) {
   odebraneDane = Serial.readStringUntil('\n');

   if(odebraneDane == "zielona" && !led_zielona) {
     digitalWrite(zielona, HIGH);
     led_zielona = true;
   }
   else if(odebraneDane == "zielona" && led_zielona) {
     digitalWrite(zielona, LOW);
     led_zielona = false;
   }
   else if(odebraneDane == "czerwona" && !led_czerwona) {
     digitalWrite(czerwona, HIGH);
     led_czerwona = true;
   }
   else if(odebraneDane == "czerwona" && led_czerwona) {
     digitalWrite(czerwona, LOW);
     led_czerwona = false;
   }
   else {
     Serial.println("Nie ma takiego koloru.");
     Serial.println("Prawidlowy kolor to:");
     Serial.println("zielona");
     Serial.println("czerwona");
   }
 }
}

Chciałem zapytać czy można zagęścić Serial.println?

Chciałem to zrobić w ten sposób:

Serial.println("Nie ma takiego koloru." + '/n' + "Prawidlowy kolor to:" + '/n'+ "zielona" + '/n' + "czerwona");

Okazało się że nie można używać operatora "+" do tekstu.

Jest jakiś inny sposób?

Fajne rozwiązanie ma Michal_78 w kodzie.

Nie wiedziałem że, "LOW" jest równoznaczne z "false"

Link do komentarza
Share on other sites

Krigare, witam na forum 🙂

Zaczynając od końca:

LOW = false = 0

HIGH = true = 1

Łączenie kilku tekstów ze zmiennymi, to dość złożony temat i łatwo można wpaść w problem "dziwnych błędów". Więcej na ten temat znajdziesz w dokumentacji Arduino: https://www.arduino.cc/en/Tutorial/StringAdditionOperator

Tak właściwie, to w Twoim przykładzie "plusy" są zbędne - wszystko może być jednym ciągiem:

Serial.println("Nie ma takiego koloru. \n Prawidlowy kolor to:  \n zielona \n czerwona");
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.