Skocz do zawartości

Wykorzystanie przez Arduino danych ze smartfonowego akcelerometra


Pomocna odpowiedź

Napisano

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);}
}

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

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