Работа с последовательными данными 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)).