Главная chevron_right Наши уроки chevron_right Arduino chevron_right Спидометр и часы реального времени через GPS

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

Собираем спидометр и часы реального времени на Arduino с Trema-модулем GPS ATGM336H и четырёхразрядным LED-индикатором. Скетч, библиотеки и схема подключения — всё в одном уроке

Видео-обложка запускается при наведении

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

В этом уроке мы соберём устройство на основе 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);

}

Ссылки

Комплект для повторения проекта

Что понадобится

Это быстрый ориентир по основным модулям и деталям. Полный список для повторения проекта смотрите в самой статье.

7 позиций
GPS/GLONASS модуль (Trema-модуль) Поддерживает GPS (США), Глонасс (Россия) и Beidou (Китай) Открыть в iArduino Piranha Ultra R3 Улучшенный аналог Arduino Uno R3 c микроконтроллером ATmega1284P на ядре AVR для разработки электронных устройств на языке C++ Открыть в iArduino Battery Shield (Li-po, 3200 мА·ч) Battery Shield Открыть в iArduino Trema Shield Плата расширения для удобного подключения периферийных устройств Открыть в iArduino Конструктор ПВХ Чёрный «Корпус Set Box XL» Корпус из решётчатого конструктора для Arduino с платами Trema Set Shield и Battery Shield Открыть в iArduino Кнопка, синяя (Trema-модуль) Тактовая кнопка, которая может служить источником сигналов (команд) для Ваших проектов Открыть в iArduino Четырехразрядный индикатор LED, красный (Trema-модуль) Яркий индикатор, отлично подойдет для проектов где нужно выводить цифровые значения. Имеет программную регулировку яркости Открыть в iArduino
Все уроки Arduino