Опрос датчиков

yah
Offline
Зарегистрирован: 09.11.2013
К Arduino MEGA подключается куча различных датчиков. Акселерометр, магнитометр, гироском, 2 датчика температуры, датчик давление. А ко всему в придачу еещ и GPS. Скорочть опроса все этих датчиков (помимо GPS) давольно высокая.
Программа поочередно опрашивает датчики и GPS делает из всех данных 3 строки + GPS выглядит это так:
 
SN: 7; PRS_1= 99857; TMP= 24.2; U= 1.2; STATUS= 0;
AX: 7; X= 3040; Y= -3024; Z= 18528;
MG: 7; X= 94; Y= 575; Z= -1363;
 
И иногда приходят данные GPS (хотя в serial они льются постоянно и безпрерывно с частотой 1 раз в секунду). Вопрос состоит в том как не терять данные приходящие с GPS. Приложу код и то что приходит. https://yadi.sk/d/fndAOANhc8bAm
 
Radjah
Offline
Зарегистрирован: 06.08.2014

Я бы после комментария "// формируем строку GPS (GPS)" использовал один буфер на 10 байт и буфер под результирующую строку. А то у тебя получается 70 байт используется одноразово и висит в памяти. Тоже самое с датчиками.

Ты датчики вообще без задержки опрашиваешь? Т.е. не "датчики - gps - отправка - задержка", а "датчики - gps - отправка".

Если так, то добавь переменные глобальные для значений GPS и изменяй их по мере поступления информации с GPS-приёмника. Т.е. если в Serial, что-то упало, то обновляешь, если ничего не упало между опросами датчиков, то будут браться старые значения.

yah
Offline
Зарегистрирован: 09.11.2013

Спасибо. Мысль понял, испробую. 
P.S.

Если в Serial что то упало то это что то там будет висеть до следущего обновления?

Radjah
Offline
Зарегистрирован: 06.08.2014

Если в Serial что есть, то отработает код после Serial.avialible() отработае и обновит переменные, если нет, то в переменных останутся старые значения.

yah
Offline
Зарегистрирован: 09.11.2013

Radjah пишет:

Если в Serial что есть, то отработает код после Serial.avialible() отработае и обновит переменные, если нет, то в переменных останутся старые значения.

Это ясно, но если скажем:

//объявляем переменные

loop()
{
  if(Serial.avialible())
    {
       //обновляем переменные
    }
    
  delay(3000);
}

то 2 пакета GPS потеряются (ведь так), а как их сохранить использовать какой то буфер?

Radjah
Offline
Зарегистрирован: 06.08.2014

Планировать программу так, чтобы потерь не было. Либо читать датчики на каждый третий проход, либо по таймеру каждые три секунды.

Тут получается, что значение GPS меняется каждый раз, а значения с датчиков раз в три секунды, а всё остальное время берутся старые.

Момент отправки выбирай сам. Самое главно сделать так, чтобы данные всегда были максимально актуальные.