Я создаю проект IoT, в котором Arduino Uno соединяется с сонаром Lowrance с помощью NMEA0183 и Spackfun's Weather Shield .Поскольку это IoT, мне нужно выгрузить все данные в базу данных и проанализировать данные NMEA0183 для хранения.
Мне нужно использовать данные GPS, которые я выбрал, чтобы использовать формат GLL и данные сонара, которые представляют собой глубину DPT и температуру жидкости MTW.Я уже завершил синтаксический анализ без использования какой-либо библиотеки, так как нет библиотеки для анализа данных сонара.Код написан ниже.
while(Serial.available() > 0){
NMEAsentence[i] = Serial.read();
//Serial.print(NMEAsentence[i]);
if(NMEAsentence[i] == 0x0a){
//Serial.print(NMEAsentence[1]);
if(NMEAsentence[0] == '$' && NMEAsentence[1] == 'S' && NMEAsentence[2] == 'D' && NMEAsentence[3] == 'M' && NMEAsentence[4] == 'T' && NMEAsentence[5] == 'W'){
w_temp = atof(TEST=strtok(&NMEAsentence[6], ","));
Serial.println(w_temp);
}
if(NMEAsentence[0] == '$' && NMEAsentence[1] == 'G' && NMEAsentence[2] == 'P' && NMEAsentence[3] == 'G' && NMEAsentence[4] == 'L' && NMEAsentence[5] == 'L'){
latitude = atof(TEST=strtok(&NMEAsentence[6], ","));
while(TEST != NULL){
TEST = strtok(NULL,",");
if(TEST != NULL){
switch (count){
case 0:
dirNS = *TEST;
count++;
break;
case 1:
longitude = atof(TEST);
count++;
break;
case 2:
dirWE = *TEST;
count++;
break;
default:
break;
}
//Serial.println(TEST);
Serial.println(latitude);
Serial.println(dirNS);
Serial.println(longitude);
Serial.println(dirWE);
}
}
}//gll parsing loop if
i = 0;
}else i++;
}
Код работает нормально, когда я тестирую его отдельно с помощью эхолота Lowrance.Проблема заключается в том, что я комбинирую данные из поиска рыбы и Weather Shield Sparkfun с измерением 10 минут (предположительно) за 1 раз измерения.
В соответствии с примером Weather Shield от Sparkfun здесь ,автор использовал код
if (millis() - lastSecond >= PERIOD_WAIT_TIME){
lastSecond += PERIOD_WAIT_TIME;
}
для создания интервала измерения.Я вставляю свой код разбора NMEA в этот цикл (код ниже), и результат не тот, который я хочу.
if (millis() - lastSecond >= PERIOD_WAIT_TIME){
lastSecond += PERIOD_WAIT_TIME;
//NMEA parsing here
//get data from weather shield
Temp = PressureSensor.readTemp();
Serial.print(" Temp = ");
Serial.print(Temp, 2);
Serial.print("C, ");
//upload data to IoT Platform
if(sakuraio.enqueueTx(0,Temp) != CMD_ERROR_NONE){
Serial.println("[ERR] enqueue error");
}
sakuraio.send();
}
Оператор NMEA читается и анализируется, но только одно предложение за один раунд измерения.Например, у меня есть как GLL, так и MTW для анализа, но когда я запускаю программу, анализируется только MTW или GLL (другой игнорируется), и мне нужно подождать еще 10 минут.Будет ли анализ MTW или GLL казаться случайным.
Мне нужно проанализировать оба во время измерения, у вас есть какие-либо предложения для этого?Кроме того, я думаю о загрузке обоих операторов NMEA в виде строк и их последующем синтаксическом анализе с помощью сценария PHP или JS, прежде чем они попадут в базу данных?Это будет действительным?