КОРЗИНА
магазина
8 (499) 500-14-56 | ПН. - ПТ. 12:00-18:00
ЛЕСНОРЯДСКИЙ ПЕРЕУЛОК, 18С2, БЦ "ДМ-ПРЕСС"

Спидометр и часы реального времени через GPS

Общие сведения

В этом уроке мы соберём устройство на основе Trema модуля GPS с отображением текущей скорости передвижения или часов реального времени.

Видео

Нам понадобится

Подключение

Для удобства подключения мы воспользуемся Trema Shield

Установим Battery Sheild

Установим Trema Shield

Подключим модули

Скетч проекта

Необходимо установить библиотеки

Если Вы не знаете как устанавливать библиотеки в Arduino IDE - Вы можете узнать по этой ссылке

// Подключаем библиотеки
#include <iarduino_4LED.h>
#include <iarduino_GPS_NMEA.h>
#include <iarduino_GPS_ATGM336.h>
#include <Battery_Shield.h>

// Определяем вывод кнопки
#define BUTTON 3

// Инстанцируем объекты библиотек
iarduino_4LED dispLED(4,5);
iarduino_GPS_NMEA gps;
iarduino_GPS_ATGM336 SettingsGPS;
Battery_Shield pwrBank;

// Флаг переключения режима работы
bool mode = false;
// Флаг состояния двоеточия
bool colon = false;

// Время последнего переключения двоеточия
unsigned long colonMillis = 0;
// Время последнего переключения кнопки
unsigned long buttonMillis = 0;

void setup()
{
    // Инициируем объект Battery Shield
    pwrBank.begin(0.0128f);
    // Инициируем последовательный порт
    Serial.begin(9600);

    // Инициируем работу с модулем GPS
    SettingsGPS.begin(Serial1);
    // Инициируем интерпретацию строк NMEA
    gps.begin(Serial1);
    // Устанавливаем часовой пояс
    gps.timeZone(3);
    // Устанавливаем скорость передачи данных модулем
    SettingsGPS.baudrate(9600);
    // Указываем, что данные можно получать от спутников GPS и GLONASS
    SettingsGPS.system(GPS_GP, GPS_GL);
    // Указываем, что нам необходимы только строки с текущей скоростью и временем
    SettingsGPS.composition(NMEA_VTG, NMEA_ZDA);
    // Устанавливаем режим "Транспортное средство"
    SettingsGPS.model(GPS_VEHICLE);
    // Указываем частоту обновления
    SettingsGPS.updaterate(10);

    // Инициируем четырёхразрядный дисплей
    dispLED.begin();
}

void loop()
{
    // Проверяем состояние кнопки
    checkButton();
    // Если флаг режим работы установлен
    if (mode) {
        // Отображаем время
        displayTime();
    }
    // Иначе
    else {
        // Отображаем скорость
        displaySpeed();
    }
}

// Функция проверки состояния кнопки
void checkButton()
{
    // Если на выводке логическая "1"
    if (digitalRead(BUTTON)) {
        // Очищаем дисплей
        dispLED.clear();
        // Устраняем дребезг
        if ((millis() - buttonMillis > 100) && digitalRead(BUTTON)) {
            // Сохраняем время нажатия
            buttonMillis = millis();
            // Меняем режим работы
            mode = !mode;
        }
    }
}

// Функция отображения скорости
void displaySpeed()
{
    // Считываем данные из модуля
    gps.read();

    // Если курс ошибочен
    if (gps.errCrs) {
        // Выводим буку "Е" на дисплей (Error)
        dispLED.print("e");
    }

    // Иначе
    else {
        // Выключаем двоеточие дисплея
        dispLED.point(0, 0);
        // Выводим скорость
        dispLED.print(gps.speed);
    }
}

// Функция отображения времени
void displayTime()
{
    // Считываем данные из модуля
    gps.read();

    // Сохраняем данные в локальные переменные
    uint8_t H = gps.Hours;
    uint8_t m = gps.minutes;

    // Сохраняем флаг ошибки в локальную переменную
    bool error = gps.errTim;
    // Если время ошибочно
    if (error) {

        // Выводим символы "E" и "Т" на дисплей (Error Time)
        dispLED.print("et");
    }

    // Если прошла секунда,
    if (millis() - colonMillis > 1000) {

        // меняем состояние флага двоеточия
        colon = !colon;

        // Записываем текущее время
        colonMillis = millis();

        // Если время верно
        if (!error)
            // Обновляем его на дисплее
            dispLED.print(H, m, TIME);
    }


    // Если флаг двоеточия установлен
    if (colon)

        // Включаем двоеточие на дисплее
        dispLED.point(0, 1);

    // Иначе
    else

        // Выключаем двоеточие на дисплее
        dispLED.point(0, 0);

}

Ссылки




Обсуждение

Гарантии и возврат Используя сайт Вы соглашаетесь с условями