Работа с последовательными данными Arduino - Сенсоры Serial Data, Чтение и анализ переменных - PullRequest
0 голосов
/ 07 января 2019

Я отправляю 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 Ответ

0 голосов
/ 08 января 2019

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

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

...