Skocz do zawartości

Wykorzystanie przez Arduino danych ze smartfonowego akcelerometra


MarJanPol

Pomocna odpowiedź

Witam, uczę się cały czas przejmowania przez Arduino danych przychodzących po UART z aplikacji smartfonowej RoboRemo i napotkałem problem. Próbuję wykorzystać dane pochodzące z akcelerometru telefonu, które są łańcuchami znaków: na początku tego łańcucha jest jeden z dwóch znaków: X lub Y (bo akcelerometr monitoruje obrót wokół 2 osi), potem jest spacja a następnie wartość liczbowa od 0 do 255. Chciałbym wykorzystać selektywnie tylko te dane, które dotyczą osi Y.

Próbuję więc napisać programik, który będzie pokazywać wartość liczbową na monitorze portu szeregowego ale tylko dla osi Y. Ogólnie staram się przechwycić dane jako String, potem wyciąć niepotrzebne dane a następnie wartość liczbową zamienić na typ int - żeby wykorzystać ją później do sterowania PWM. Zastosowałem if-a, dzięki któremu na monitorze powinna wyświetlać się albo konkretna wartość dla Y albo napis "cokolwiek" - w przypadku X. Niestety coś nie działa i na monitorze cały czas pojawia się napis "cokolwiek" - tak jakby dane Y w ogóle nie docierały do Arduino. Ale wiem, że docierają.

Dodam, że nie jestem informatykiem i języka C/C++ dla Arduino uczę się powoli samodzielnie na własnych próbach i błędach. Niestety błędów jest cały cza jeszcze dużo... 🙂

Poniżej kod. Z góry dziękuję za podpowiedź.

Marek

String sdane = ""; //zdefiniowanie zmiennych w klasie String do przechowywania łańcucha znaków
String sXczyY= ""; 
String svalue= "";

int ivalue;

void setup() {
Serial1.begin(9600); //uruchomienie Serial1 do komunikacji UART przez moduł Bluetooth 
Serial.begin(9600);
}

void loop() {
if(Serial1.available() >0) // jeśli na porcie szeregowym z Bluetooth (czyli Serial1) pojawią się jakieś dane z akcelerometru RoboRemoFree to wykonuj poniżej
{sdane = Serial1.readStringUntil('\n'); //przypisanie otrzymanego łańcucha znaków do zmiennej sdane
sXczyY = sdane.substring(0,1); //przypisanie zmiennej sXczyY pierwszego znaku - to jest X lub Y
svalue = sdane.substring(2); //przypisanie zmiennej svalue aktualnej wartości liczbowej po usunięciu X/Y i spacji
ivalue = svalue.toInt();} //transformacja wartości liczbowej przypisanej do zmiennej w klasie String na zmienną typu int 
sprawdzenie();}


void sprawdzenie()
{
if (sXczyY == 'Y')
{Serial.println(ivalue);
delay(2000);}
else
{Serial.println("cokolwiek");
delay(2000);}
}
Link do komentarza
Share on other sites

A jeszcze nawiązując trochę do tematu - znalazłem na forum.arduino.cc taką oto instrukcję pobierania i przekazywania dalej łańcucha znaków: LINK DO STRONY -


// Example 2 - Receive with an end-marker

const byte numChars = 32;
char receivedChars[numChars];   // an array to store the received data

boolean newData = false;

void setup() {
   Serial.begin(9600);
   Serial.println("<Arduino is ready>");
}

void loop() {
   recvWithEndMarker();
   showNewData();
}

void recvWithEndMarker() {
   static byte ndx = 0;
   char endMarker = '\n';
   char rc;

   while (Serial.available() > 0 && newData == false) {
       rc = Serial.read();

       if (rc != endMarker) {
           receivedChars[ndx] = rc;
           ndx++;
           if (ndx >= numChars) {
               ndx = numChars - 1;
           }
       }
       else {
           receivedChars[ndx] = '\0'; // terminate the string
           ndx = 0;
           newData = true;
       }
   }
}

void showNewData() {
   if (newData == true) {
       Serial.print("This just in ... ");
       Serial.println(receivedChars);
       newData = false;
   }
}

Zastanawiam się czy nie można prościej? (ale dalej używając klasy Serial a nie String)

mar

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

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.