Последовательное чтение данных и анализ переменных из непрерывной строки (Arduino) - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть 2 Arduino и 2 xbee.Я посылаю данные 2 датчиков с Arduino 1 (маршрутизатор) на Arduino (координатор): На координаторе я получаю беспроводные данные от этих 2 датчиков (от маршрутизатора) отлично.

Поток данных выглядит примерно так:

20.1324325452924 делится на:
-первый датчик (температура): 20.1324325452
-секундный датчик (газ): 924


Myцель состоит в том, чтобы эти 2 значения представляли собой две переменные, которые постоянно обновляются, а затем передают эти значения остальной части программы, чтобы сделать что-то вроде печати на ЖК-дисплее или что-то еще:

температура = 20.1324325452
gas = 924


Мне удалось разделить эту исходную строку, которую я получаю для последовательного (20.1324325452924), на 2 переменные, но значения из этих 2 переменных не обновляются, как в исходномстрока (при изменении значений датчика):

Мой код:

LiquidCrystal lcd(12,11,10,9,8,7);
String temperature;
String gas;
String readString;

char IncomingData[13];


 void setup() {
 Serial.begin(9600);                                     
}

 void loop() {
 while (Serial.available() > 0)                           
 {
       char IncomingData = Serial.read();                   
        readString += IncomingData ;     
        temperature = readString.substring(0, 13); //get the first 13 characters
        gas = readString.substring(13, 16); //get the last 3 characters 

        Serial.print(IncomingData);  //here I have my string: 20.1324325452924  wich is updating properly when I have sensor values changes 

        // Process message when new line character is DatePrimite
        if (IncomingData == '\n')
        {
          Serial.println(temperature);
           lcd.begin(16, 2);
          lcd.setCursor(0,0);                              
          lcd.write("T:");
          lcd.print(temperature);               
         delay(500);
         temperature = "";                               // Clear DatePrimite buffer

         Serial.println(gaz);
         lcd.begin(16, 2);
         lcd.setCursor(0,1);                              
         lcd.write("G:");
         lcd.print(gas);
         delay(500);
         gaz = "";                                       // Clear DatePrimite buffer
      }
    }
}

Выход из серийного номера:
20.1324325452924
20.1324325452
924

Первая строка обновленакогда я получаю новые данные датчика, но следующие 2 остаются неизменными каждый раз.Я застрял на несколько дней, я не знаю, чтобы сделать эту работу.Все, что мне нужно сделать, это разделить исходную строку, которая содержит данные от 2 датчиков на 2 переменные, которые постоянно обновляются, и затем передать эти значения остальной части программы, чтобы сделать что-то вроде печати на ЖК-дисплее.

Кто-нибудь знает, как заставить это работать?

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Разделить данные после получения полной строки.

void loop() {

  while(!Serial.available()); // wait till data to be filled in serial buffer

  String incommingStr = Serial.readStringUntil('\n'); // read the complete string

  String temperature = incommingStr.substring(0, 13);
  String gas = incommingStr.substring(13, 16);

  Serial.print(incommingStr);
  Serial.println(temperature);
  Serial.println(gas);

  lcd.setCursor(0,0);                              
  lcd.print(temperature);

  lcd.setCursor(0,1);                              
  lcd.print(gas);

  delay(500);
}

Вам нужно вызвать lcd.begin () только один раз.Вызов из функции setup ().

0 голосов
/ 19 декабря 2018

Вы должны изменить программу следующим образом: (выполнить действие для readString в цикле)

    // Process message when new line character is DatePrimite
    if (IncomingData == '\n')
    {
      Serial.println(temperature);
       lcd.begin(16, 2);
      lcd.setCursor(0,0);                              
      lcd.write("T:");
      lcd.print(temperature);               
     delay(500);
     temperature = "";                               // Clear DatePrimite buffer

     Serial.println(gaz);
     lcd.begin(16, 2);
     lcd.setCursor(0,1);                              
     lcd.write("G:");
     lcd.print(gas);
     delay(500);
     gaz = "";                                       // Clear DatePrimite buffer

     readString = "";   //clear either you concatenate  at each loop!!*******
  } 
...