Работа с последовательными данными Arduino - Сенсоры Serial Data, Чтение и анализ переменных

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

+22,5624728451
+944
8523

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

температура = 22.5624728451
газ =944
курить =8523

Изначально у меня было только 2 датчика, и я отправляю данные этих 2 датчиков примерно так:
22.5624728451944 (22.5624728451 - температура, 944 - газ), и я получил их обоих в одной строке и разделил все на две переменные (с readString.substring()) с кодом ниже. Но теперь у меня есть 3 датчика, и я получаю данные в отдельной строке, потому что я не знаю, какова длина каждой строки данных... И я не могу использовать один и тот же метод (отправка только одной строки, содержащей все данные датчиков, на то же самое, а потом разделить их)

Мой старый код:

    #include <LiquidCrystal.h>
    LiquidCrystal lcd(12,11,10,9,8,7);  
    String temperature;
    String gas;
    String readString;

    void setup() {
    Serial.begin(9600);          
    lcd.begin(16, 2);                              
    }
    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 wichs is updating properly when I have sensor values changes 

    // Process message when new line character is DatePrimite
    if (IncomingData == '\n')
    {
      Serial.println(temperature);
      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 = "";
  }
}

}

Все, что я хочу сейчас сделать, - это назначить переменную для каждого обновляемого датчика постоянно (3 строки - 3 переменные для каждой строки), а затем передать эти значения остальной части программы. У кого-нибудь есть идеи, как изменить код для работы в этой ситуации? Заранее спасибо!

1 ответ

Я бы порекомендовал объединить значения в одну строку на отправляющем конце и использовать разделитель как запятую вместе с string.split() на принимающей стороне, если вы привержены использованию строковых значений. РЕДАКТИРОВАТЬ: кажется, Arduino не имеет string.split() функция. Смотрите этот разговор для примера.

Альтернативой может быть установка стандартной длины байта и отправка чисел в двоичном виде вместо строк в кодировке ASCII, представляющих числа. Смотрите этот пост на форуме Arudino для небольшого фона. Я рекомендую отправлять число в необработанных байтовых обозначениях, а не как символы ASCII. Когда вы определяете переменную как целое число в arduino, по умолчанию используется 16-разрядное целочисленное значение со знаком. Число с плавающей запятой - это 32-разрядное число с плавающей запятой. Например, если вы отправляете число с плавающей запятой и два целых числа как двоичные значения, то число с плавающей запятой всегда будет первым 4 байтом, первым целым числом, следующими двумя, а последним целым числом - последним 2. Порядок байтов ( порядковый номер или большинство старший значащий байт (Big Endian, стиль Motorolla)/ младший значащий бит (Little Endian, стиль Intel)).

Другие вопросы по тегам