serial.write()5つのセンサーと処理

このすべてに、問題の権利を定式化することを願う。

In my project I have 5 sensors connected to Arduino, which I want to interpret via Seria.write() --> Processing.

Arduino:

firstSens = 100 + (155 * digitalRead(8));
secondSens = analogRead(A1)/4;
thirdSens = analogRead(A2)/4;
fourthSens = humData;
fifthSens = tempData;
int sensData[6] = {firstSens, secondSens, thirdSens, fourthSens, fifthSens};

int i;
for (i = 0; i < 5; i = i + 1) {
  Serial.write(sensData[i]);
}

処理:

serialInArray[serialCount] = inByte;
    serialCount++;

if (serialCount > 4 ) {
  firstSens = serialInArray[0];
  secondSens = serialInArray[1];
  thirdSens = serialInArray[2];
  fourthSens = serialInArray[3];
  fifthSens = serialInArray[4];

 //print the values (for debugging purposes only):
  println(firstSens + "\t" + secondSens + "\t" + thirdSens + "\t" + fourthSens + "\t" + fifthSens);

 //Send a capital A to request new sensor readings:
  myPort.write('A');
 //Reset serialCount:
  serialCount = 0;

My problem is that sensors find their place in Processing's array randomly, so for example arduino's firstSens could be Processing's secondSens or fifthSens

なぜこれが起こって、どうすればそれを制御できますか?

0

2 答え

何が起こっているのかは、数字のリストを吐き出しているだけです:

4132
132
1928
3240
1239
238
3048
391
... etc ...

何が何であるかを言うことはどこにもありません。

そのような情報を追加する必要があります。各ブロックの前、または各行の「データの開始」タグとして。例えば:

---START OF DATA---
4132
132
1928
3240
1239
---START OF DATA---
238
3048
391
... etc ...

または:

0:4132
1:132
2:1928
3:3240
4:1239
0:238
1:3048
2:391

データを解釈して何が何かを処理するのは、処理アプリケーションによって異なります。

個人的には、毎回すべてのデータを送信する必要がないため、更新の速度を変えて異なる値を送信し、処理の最後に「現在の値」を維持できるので、2番目の方法を使用するのが好きです。たとえば、頻繁に更新される値と、更新されない値があるとします。

3:4132
1:132
3:1928
3:3240
3:1239
2:238
3:3048
0:391

あなたは数字を使う必要はなく、単語を使うこともできます:

pressure:4132
temperature:132
pressure:1928
pressure:3240
pressure:1239
humidity:238
pressure:3048
rainfall:391
1
追加された

私は私たちの車のプロジェクトのダッシュ表示のための同様のコードを行っている

あなたはArduino側でこちらのようなものを探しています:

  Serial.print("U*"); //A header
  Serial.print("A");  //a token to indicate the message payload
  Serial.print(avgRPM);
  Serial.println("");

  Serial.print("U*"); //A header
  Serial.print("B");  //a token to indicate the message payload
  Serial.print(avgVoltage);
  Serial.println("");

  Serial.print("U*"); //A header
  Serial.print("C");  //a token to indicate the message payload
  Serial.print(avgCurrent);
  Serial.println("");

  Serial.print("U*"); //A header
  Serial.print("D");  //a token to indicate the message payload
  Serial.print(avgThrottle);
  Serial.println("");

  Serial.print("U*"); //A header
  Serial.print("E");  //a token to indicate the message payload
  Serial.print(avgBrake);
  Serial.println("");

処理側の this のようなもの:

 if (port.available() > 0) {
    data = port.readStringUntil('\n');
  }
  String payload = "";
  if (data != ""){
    int offset = data.indexOf("U*"); //this is our Header (0x552A)
    if(offset>=0){
      payload = data.substring(offset+3, data.indexOf('\n'));
      switch(data.substring(offset+2, offset+3)){
        case "A":
          RPM = payload;
          break;
        case "B":
          voltage = payload;
          break;
        case "C":
          current = payload;
          break;
        case "D":
          throttle = payload;
          break;
        case "E":
          brake = payload;
          break;
        case "F":
          telemBits = payload;
          break;
        default:
          //packet not recognised
      }
    }
} 
0
追加された