Рубрики
Схемы на Arduino

GPS часы на Arduino Uno

В настоящее время вокруг земли летает достаточно много GPS спутников, которые обеспечивают точное определение местоположения любой точки на Земле. Но вместе с координатами (широта и долгота) они передают и много других полезных данных, например, время, дату, высоту над уровнем моря, угол и т.д. Более подробно эти вещи мы уже рассматривали в статье про считывание GPS данных с помощью персонального компьютера и Arduino Uno, в этой же статье мы рассмотрим проектирование GPS часов на основе платы Arduino Uno, использующих данные о времени и дате, получаемые с GPS спутников. Эти GPS часы будут весьма точными и показывать дату и время с точностью до миллисекунды.

Необходимые компоненты

  1. Плата Arduino Uno (купить на AliExpress).
  2. ЖК дисплей 16х2 (купить на AliExpress).
  3. GPS модуль (купить на AliExpress).
  4. Источник питания.
  5. Соединительные провода.

Принципы работы устройства

GPS модуль передает данные в NMEA формате, пример этих данных можно посмотреть на рисунке ниже. NMEA формат состоит из нескольких строк (предложений), из которых нам нужно будет извлечь только время и дату. Эти данные содержатся в строке $GPRMC, которая содержит время, дату, координаты и другую полезную информацию. Длина строки $GPRMC составляет примерно 70 символов. Мы уже рассматривали пример извлечения нужных нам GPS данных из строки $GPGGA в проекте определения местоположения автомобиля, здесь же мы будем извлекать данные из строки $GPRMC.

Строка $GPRMC, в основном, содержит скорость, время, дату и местоположение:

$GPRMC,123519.000,A, 7791.0381,N, 06727.4434,E,022.4,084.4,230394,003.1,W*6A

$GPRMC,HHMMSS.SSS,A,latitude,N,longitude,E,speed,angle,date,MV,W,CMD

В следующей таблице представлен перевод (описание) данных GPS из строки $GPRMC.

Идентификатор Описание
RMC Recommended Minimum sentence C
HHMMSS.SSS Время в формате: час минута секунда и миллисекунда
A Статус // A=active (активный) and V= void (пустой, недействительный)
Latitude Широта (координата)
N Направление: N=North (север), S=South (юг)
Longitude Долгота (координата)
E Направление: E= East (восток), W=West (запад)
Speed Скорость в узлах (1 узел= 1,87 км в час)
Angle Угол места в градусах
Date Временная отметка (дата в UTC, Universal Time Coordinated — всеобщее скоординированное время)
MV Магнитное возмущение
W Direction of variation E/W (направление изменения E/W)
CMD (*6A) Данные контрольной суммы

В большинстве случаев эта строка ($GPRMC) используется для извлечения данных времени, даты и скорости.

Мы можем извлечь время и дату из строки $GPRMC при помощи подсчета запятых в этой строке. Таким образом, с помощью Arduino мы будем находить в GPS данных строку $GPRMC и сохранять ее в массиве, в котором время (в 24-часовом формате) может быть найдено после одной запятой, а дата – после 9 запятых. Время и дата потом сохраняются в соответствующих строках.

GPS спутники передают время и дату в формате UTC (Universal Time Coordinated — всеобщее скоординированное время), поэтому мы должны конвертировать его в местное время. В нашем проекте мы добавили к этому времени 5:30 чтобы получить время, соответствующее времени в Индии, вы для своего региона можете легко узнать соответствующую поправку.

Работа схемы

Схема устройства представлена на следующем рисунке.

Плата Arduino управляет всеми процессами на этой схеме: она принимает данные от GPS модуля, извлекает дату и время из строки $GPRMC и показывает их на экране ЖК дисплея.

Контакты данных ЖК дисплея D4, D5, D6, D7 подсоединены к контактам 5, 4 , 3, 2 Arduino, а контакты управления ЖК дисплея RS и EN подсоединены к контактам 7 и 6 Arduino. Контакт передачи Tx GPS модуля подсоединен к контакту Rx (pin 10) платы Arduino (мы этот контакт сделаем входом последовательного порта с помощью соответствующей бибблиотеки). Контакты земли GPS модуля и платы Arduino соединены вместе. В данной схеме мы использовали GPS модуль SKG13BL, функционирующий на скорости 9800 бод/с, плату Arduino (ее последовательный порт) также можно сконфигурировать на работу со скоростью 9800 бод/с с помощью команды “Serial.begin(9800)”.

Исходный код программы

В программе мы первым делом должны подключить необходимые библиотеки и инициализировать контакты для подключения ЖК дисплея и последовательной связи. Также необходимо инициализировать необходимые переменные и массивы для хранения данных. При помощи библиотеки для последовательной связи (Software Serial Library) мы можем осуществить последовательную связь на контактах 10 и 11 (мы будем использовать только 10-й) и сделать их выводами Rx и Tx соответственно. По умолчанию последовательная связь в плате Arduino доступна на ее контактах 0 и 1, но благодаря библиотеке для последовательной связи (Software Serial Library) мы дополнительно к этому можем реализовать последовательную связь и на контактах 10 и 11 Arduino.

#include<LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
#include <SoftwareSerial.h>
SoftwareSerial Serial1(10, 11); // RX, TX
... ....
.... ....

После этого мы инициализируем последовательную связь, ЖК дисплей и показываем приветственное сообщение на ЖК дисплее. Затем извлекаем время и дату из принятой строки.

while(x<str_lenth)
{
if(str[x]==',')
comma++;
if(comma==1)
{
x++;
UTC_hour+=str[x++];
... ....
.... ....

Затем конвертируем время и дату в десятичный формат и приводим ее ко времени в Индии (UTC +5:30).

int UTC_hourDec=UTC_hour.toInt();
int UTC_minutDec=UTC_minut.toInt();
int Second=UTC_second.toInt();
int Date=UTC_date.toInt();
int Month=UTC_month.toInt();
... ....
.... ....

После этого выводим дату и время на экран ЖК дисплея с помощью функции lcd.print. Далее представлен полный текст программы.

Видео, демонстрирующее работу схемы

116 ответов к “GPS часы на Arduino Uno”

здравствуйте. можно ли переделать прошивку под ардуино нано и 4 модуля точечной матрицы на MAX7219? подобное уже видел, но там собрано на ESP8266 и идет синхронизация через WIFI. нужно просто время без датчиков, погоды, даты. главное синхронизация времени со спутником. просто в здании нет интернета но часики очень нужны.

Добрый день. Да, я думаю такая переделка не очень сложна, но я завтра в отпуск уезжаю на 2 недели, поэтому в течение этих 2-х недель ничем подобным, к сожалению, не могу помочь

Здравствуйте, ничего страшного. я пока подбираю комплектующие из китая. если будет возможность поправить прошивку то будет смысл заказать комплектующие. хорошего отдыха!!!

Добрый вечер. Спасибо, только вернулся с отдыха

Здравствуйте! Могли бы дополнить проект так, чтобы каждую четную минуту на выводе А появлялся короткий импульс длительностью 2 сек, а каждую нечетную — такой же импульс на выводе В. Спасибо

Добрый день. Но не всем же читающим эту статью потребуется такое нововведение и подобное усложнение кода. Если нужно, я могу подсказать как это можно сделать, а реализовать мой совет, я думаю, будет достаточно просто

Здравствуйте!
У меня появилась идея для автоматизации работы газового котла. Нужна Ваша помощь с программированием Arduino Nano (или ATMega8).
Суть идеи в автоматической регулировке сопротивления на электронном потенциометре MCP410xx (X9Cxx) в зависимости от температуры на датчике DS18B20. Электронный потенциометр устанавливается вместо ручного потенциометра контура отопления. Регулировка ручного потенциометра: крайнее левое положение — выключено и далее 19 меток до крайнего правого положения.
Пределы соответствия (примерные):
температура — 40 … + 17 градусов С — 20 значений сопротивления на выходе электронного потенциометра (количество ступеней регулирования конкретного электронного потенциометра привести к 20 значениям сопротивления);
+17 градусов С — максимальное сопротивление электронного потенциометра — отопление отключено;
— 40 градусов С — минимальное сопротивление электронного потенциометра — отопление максимально.
Проверка изменения температуры:
если изменение на 3 градуса (от предыдущего значения), то регулировка на одну ступень;
время, через которое начинается регулировка при изменении температуры на 3 градуса, 5 секунд.

Здравствуйте, с датчиком DS18B20 вряд ли могу помочь — ни одной статьи по нему я на сайт не писал. Могу помочь с другими датчиками температуры, например, DHT11 или LM35 — проекты на их основе есть на сайте. И есть просьба, давайте на будущее общаться не по теме данной статьи в комментариях к какой-нибудь другой (более тематичной вашему проекту) статье на моем сайте. Я все равно увижу ваши новые комментарии на сайте независимо от того к какой статье вы их добавили. А то к этой статье уже достаточно много комментариев

Хорошо, пусть будет датчик LM35.
Предлагаю общаться по электронной почте, но если Вам важны комментарии, то выберите сами статью.

Да, мне важны комментарии. По сути вашего нового проекта тогда предлагаю пообщаться в комментариях к этой статье. Напишите там подключали ли вы когда-нибудь датчик LM35 к плате Arduino и есть ли у вас какой-нибудь опыт работы с ним

Да, Вы правы. Подключил выход датчика освещенности на D6 и все заработало!

Я рад что у вас получилось. Может быть, когда окончательно этот свой проект «говорящих часов» доделаете, напишите об нем статью для нашего сайта?

Есть то, что мне не совсем нравится — при включении говорящих часов выключателем SA1 время и температура озвучивается постоянно через очень короткие интервалы времени. При добавлении в схему GPS-корректора (с доработками схемы часов, которые я описывал раньше) с постоянным интервалом для коррекции происходит следующее — озвучивается скорректированное время и температура полностью и затем ещё частично из-за разной длительности воспроизводимых слов. Если уменьшить постоянный интервал для коррекции в GPS-корректоре, то озвучивание времени и температуры может быть не полным.
Чтобы это устранить, нужно вносить изменения в программу микроконтроллера DD2 PIC16F876 схемы часов для однократного озвучивания времени и температуры.

К сожалению, в этом уже не силен — не могу вам помочь. А вы не думали над вариантом, чтобы голос озвучивать с помощью платы Ардуино, а не с помощью микроконтроллера DD2 PIC16F876? Вот, к примеру, на нашем сайте рассматривался преобразователь текста в речь на Arduino Uno. Не подойдет вам подобный? С его программированием, я думаю, мог бы попробовать вам помочь

Над Ардуино не думал. Все уже собрано и само озвучивание мне нравится. Возможно, найду специалиста по программированию PIC микроконтроллеров, который переделает программу.

Хорошо, я понял. Ну вы тогда напишите нам как у вас все получится. Будем ждать

Здравствуйте!
Говорящие часы заработали, но ввиду особенностей их работы нужно изменить время появления сигналов на выводах:
на D5 — сигнал высокого уровня на 4 секунды, на D6 — сигнал высокого уровня спустя 200 миллисекунд после появления сигнала на D5 и на время 200 миллисекунд. Я изменил, но проверьте, пожалуйста — https://yadi.sk/d/ZSGIElk7EqDbXQ.

Здравствуйте. По вашему коду получается что у вас сигнал высокого уровня на D5 будет подаваться не 4 секунды, а 4.4 секунды. Я думаю последнюю задержку целесообразно уменьшить с 4000 до 3600.

Чтобы ночью часы не говорили, решил добавить модуль освещенности, но не получается внести изменения в программу. Посмотрите, что в ней не так — https://yadi.sk/d/SMSklAoV5hKoZw
D0 модуля освещенности на pin A7 Arduino;
D4 (pin Arduino) управляет ключом, который параллельно кнопке SB1 схемы часов;
D5 (pin Arduino) управляет ключом, который параллельно кнопке (заменил выключатель на кнопку) SA1 схемы xfcjd, это дневной режим с озвучкой GPS-коррекции;
D3 (pin Arduino) управляет ключом, который подает напряжение +5В на схему минуя DA1, это ночной режим без озвучки GPS-коррекции.
Кстати вот говорящие часы, которые пытаюсь модернизировать — kazus.ru/shemes/showpage/0/1448/1.html

А что конкретно не так?
Вы добавили в программу следующие строки:
if (digitalRead(A7)==LOW)
{
digitalWrite(4, HIGH);
delay(100);
digitalWrite(5, HIGH);
delay(900);
digitalWrite(4, LOW);
delay(6000);
digitalWrite(5, LOW);
}
else
{
digitalWrite(4, HIGH);
delay(100);
digitalWrite(3, HIGH);
delay(900);
digitalWrite(4, LOW);
delay(1000);
digitalWrite(3, LOW);
}
То есть это условие что делать программе в зависимости от уровня освещенности. Но что вы хотели получить (меня интересуют сигналы на каких контактах и на какое время) и что не получается?

Получить вот что:
светло (коррекция со звуком) — высокий уровень на D4, через 0.1 сек высокий уровень на D5, через 0.9 сек низкий уровень на D4 и через 6 сек низкий уровень на D5;
темно (коррекция без звука) — высокий уровень на D4, через 0.1 сек высокий уровень на D3, через 0.9 сек низкий уровень на D4 и через 1 сек низкий уровень на D3.
Чем управляют D3, D4 и D5 описано выше — 29.01.2021 в 21:55.
Но получается каждый час коррекция со звуком независимо от выхода датчика освещенности.

Ну у вас просто условие не срабатывает. Сразу не обратил внимание. A7 — это же аналоговый контакт, поэтому на нем функция digitalRead работает некорректно, насколько я понимаю. На аналоговых контактах необходимо использовать функцию analogRead — на ее выходе будет число от 0 до 1023. Но если у модуля освещенности цифровой выход, то вам лучше подключить его к цифровому контакту Ардуино, тогда на нем функция digitalRead будет работать корректно

Я отправил Вам сообщение сегодня часа полтора назад. Его здесь нет. Это сбой какой-то или что?

Оно почему то попало в спам и мне пришлось его вручную одобрять. Я через день-два постараюсь вам помочь. Сегодня что то очень спать хочется

Да, использовать с устройством говорящих часов, статью о которых нашел в интернете. Но пока они не работают согласно статье.

Ну когда они у вас появятся дополните тогда вашу статью на моем сайте?

Если всё получится, то дополню.
Вы можете написать программу для PIC12F675?

Хорошо, будем ждать. Нет, пока не могу. Я еще пару месяцев планирую наполнять сайт статьями про Arduino, потом начать добавлять статьи по Raspberry Pi, а после нее уже начать добавлять статьи про PIC микроконтроллеры. Пока примерно такие планы

И вам удачи. Буду надеяться что вы еще появитесь у нас с каким-нибудь своим новым проектом

Точно не знаю, но по сообщениям местных СМИ, с осени стало больше заболевающих как тенденция второй волны.

Точно не знаете? Вы как будто на улицу совсем не выходите и ни с кем в городе не общаетесь. )) Мне кажется сейчас коронавирус — самая актуальная тема для разговоров по всей России.
У статьи вашей, кстати, понемногу растет число просмотров. Никогда бы сам не подумал что проблема корректировки электронных часов настолько актуальна. Не проще ли самому вручную их раз в месяц корректировать с помощью кнопок?

Общение сейчас не безопасно)) Местные СМИ каждый день приводят статистику заболевших, умерших и выздоровевших.
Насчет ручной корректировки… Конечно проще, но… количество просмотров растет!)

Так что же вы, на работу сейчас не ходите, на удаленке работаете? Ну а как у вас идея появилась такой корректор сделать? Подсмотрели идею на каком-нибудь сайте или яблоко на голову упало как Ньютону и вас осенило? ))

Давным-давно, ещё в прошлом тысячелетии, учась в институте, увидел у одного студента устройство, объединяющее часы на БИС К145ИК1901, самодельный радиоприёмник СВ и модуль коррекции, использующий сигналы точного времени р/с «Маяк». Схема показалась сложной, пытался сделать сам по-проще, но не получилось…
В прошлом году нашел в интернете модуль коррекции по сигналам точного времени на микроконтроллере. Использовался местный УКВ ФМ «Радио России». При точной настройке коррекция происходит стабильно, но есть задержка сигнала в 6 секунд, связанная с распространением радиоволн.
Потом собрал эти часы mysku.ru/blog/diy/58750.html.
Месяца три назад возникла идея этого корректора, с которым Вы удачно мне помогли!

Понятно, а вы как хотите его использовать? Вы я, помню, писали что вам чего то не хватает чтобы запустить его полноценно в работу

Образование техническое по электронике. Меня интересует больше прикладная сторона, т.е. то, что можно сделать с помощью микроконтроллеров в соответствии со своими потребностями. В интернете много всего, но если не находится что-то, то обращаюсь к специалистам-программистам.

Понятно. Я добавил вашу статью на сайт. Можете посмотреть и если найдете где я, может быть, сделал опечатку или неточность, то с помощью вашего совета я могу ее исправить.

В этом предложении разные скорости.
В данной схеме использован GPS-модуль GY-NEO6MV2, функционирующий на скорости 9600 бод/с, плату Arduino (ее последовательный порт) также сконфигурирован на работу со скоростью 9000 бод/с с помощью команды “Serial.begin(9800)”.
Можно ещё добавить, что длительность импульса 1 сек можно уменьшить до 100-300 мс.

Хорошо, спасибо, я исправил. А вы в каком городе живете если не секрет?

Исправили не полностью:
В данной схеме использован GPS-модуль GY-NEO6MV2, функционирующий на скорости 9600 бод/с, плату Arduino (ее последовательный порт) также сконфигурирован на работу со скоростью 9600 бод/с с помощью команды “Serial.begin(9800)”.
Живу в городе Волгограде.

Хорошо, поправил. Заезжал в Волгоград этим летом на полдня, посмотрел Мамаев курган и музей диораму. Как там у вас сейчас ситуация с коронавирусом, сильно плохая? Я когда летом в ваших краях был, мне местные жаловались на то, что весной было нормально и локдаун весной был бесполезен для Волгограда, а вот летом стало много людей умирать от этой болезни

Хорошо, спасибо. Постараюсь добавить вашу статью в ближайшие 2-3 дня.

Спасибо и вам что оценили мой труд. Вы, если не секрет, каким путем в электронику пришли и заинтересовались платформой Arduino.

Когда-то давным-давно одноклассник заинтересовал радиотехникой. О микроконтроллерах, и в частности о платформе Arduino, узнал пару лет назад из интернета.

А так, образование у вас гуманитарное или техническое? Платформу Arduino часто называют инструментом для «не технарей», но на практике это не совсем так

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

Убирать переменные temp, i, x и str_lenth?
Добавьте ещё вывод сигнала на выводы D6 и D7.
Моя конструкция состоит из соединённых плат Arduino Nano и модуля GPS. Нужно фото этой соединённой конструкции?
Нарисовать не могу, просто никогда этим не занимался на компьютере. Вы чем рисовали схему устройства в этой статье?

Переменные temp, i, x и str_lenth — их не надо убирать, там просто в конце цикла некоторые из них присваиваются нулю, может быть можно убрать некоторые из этих операций.
На D6 и D7 точно такой же импульс нужен как и на D5?
Да, фото конструкции желательно. Я эту схему не рисовал, статья переводная с иностранного сайта. Можно из схемы этой статьи переделать в редакторе Paint, но это, конечно, не очень удобно.
Можно нарисовать в Microsoft Visio — работали с этой программой?

Меня не надо представлять, сделайте от своего имени.
Да, на D6 и D7 точно такой же импульс.
С программой Microsoft Visio не работал.

Добавил такой же импульс на контакты D6 и D7 — https://yadi.sk/d/tnq_p2ccBGRx2g.
Может быть вы от руки тогда нарисуете под линейку и сфотографируете. На первое время так в статью вставим, а потом я подумаю что можно сделать. Вам можно даже сделать проще, распечатать схему платы Arduino (как ее на схемах рисуют), а к ней потом вручную дорисовать ваши элементы — так вообще придется мало рисовать

Хорошо, спасибо. В ближайшие дни постараюсь добавить вашу статью.
А, совсем забыл, сделайте еще пожалуйста фотографию вашего устройства чтобы мне в анонс статьи в ленте статей ее можно было поставить

Нужный импульс подается на D5, видно по прибору. В одной из самых первых версий нашей программы не наблюдается проблема, что число часов всегда в начале начинается с 4.

int oldHour=100;
Поясните, что значит строка?

Это чтобы присвоить переменной oldHour начальное значение, можно использовать любое число кроме тех, которое может принимать значение часов (от 0 до 24). В основном цикле программы мы потом присваиваем ей нужное значение. Начальное значение нужно для того, чтобы значение этой переменной случайно не инициализировалось текущим значением часов.
По сравнению с прежними версиями программы я только минуты убрал, больше ничего не трогал. Неужели только это могло привести к тому, что теперь при включении схемы счет часов почему то начинается с 4. Можем попробовать снова со старой версией программы (с минутами), в которую вставим эти самые последние изменения чтобы импульс на контакт 5 подавался, если хотите.

Может 4 — это часовой пояс?
Можно ли убрать из программы лишние данные
String UTC_minut=»»;
String UTC_second=»»;
String UTC_date=»»;
String UTC_month=»»;
String UTC_year=»»;
Давайте попробуем со старой версией программы с минутами. Нужно же выяснить, почему сначала 4.

Это не лишние строки, это объявляются строковые переменные. Но некоторые из них вам в вашем проекте не нужны.

Часовой пояс делал +3 потом +5 — начальное значение было 3 потом 5. Поэтому с минутами пробовать не будем. Начальное значение Time: oldHour в обоих случаях 100.

Не понятно, почему так долго (несколько минут) устанавливается местное время после начального значения, равного часовому поясу (4, 3 или 5)?

А в самом первом варианте программы с минутами, которая у вас заработала, не было такого эффекта?

В самом первом варианте программы с минутами не было такого эффекта.

Мда, какой то труднообъяснимый эффект

Нет, конечно не повлияет. Можно еще убрать вывод информации в окно монитора последовательной связи если вам это не нужно

Да, уберите вывод информации в окно монитора последовательной связи. Может ещё что можно убрать?

Про статью. Текст статьи в Word’е, фотографии соединения GPS модуля и платы Arduino Nano? Те часы, для которых нужен этот корректор, у меня ещё не готовы, и когда будут готовы неизвестно.

Убрал вывод информации в окно монитора последовательной связи — https://yadi.sk/d/aOdWWwm3D6MT5A
Там еще в конце цикла некоторые переменные присваиваются нулю, можете попробовать по одной убирать их и проверять заработает программа или нет (только лучше это проверять на предыдущей версии программы — с выводом информации в окно монитора последовательной связи), я просто боюсь убрать нужную из этих операций потому что не могу проверить работу программы.
Да, текст статьи в Word’е, фотографии вашей конструкции и желательно еще схему вашего проекта. Можете в чем-нибудь ее нарисовать? Про часы можно потом будет статью дополнить если у вас будет такое желание.

В окне монитора последовательной связи ничего нет в начале часа, вообще пусто.
Вы описали свой алгоритм 05.11.2020 с двумя переменными, в одной будет предыдущее кол-во часов, а в другой текущее. На разнице часов выдается импульс.
Можно сделать так? В память записать 59 минут 59 секунд и постоянно сравнивать с текущими показаниями минут и секунд; как только совпадают показания, через секунду выдается импульс.
И ещё сделать мигание светодиода на плате GPS-модуля, который сигнализирует о приеме данных.

Тут какая то примитивная ошибка. Был бы я рядом с вами, думаю быстро бы нашел.
Попробуйте свежую версию — https://yadi.sk/d/M3B_10orwXh32Q
Я добавил в нее строки в основном цикле
Serial.println(«Time: Hours»);
Serial.println(Hour);
Serial.println(«Time: oldHour»);
Serial.println(oldHour);
То есть у вас каждую секунду в окне монитора последовательной связи будет печататься значение Hour (текущее значение часов) и oldHour (старое значение часов). Сообщите мне как они меняются. Возможно это поможет понять почему не срабатывает мое условие в программе.
Ваш вариант с минутами и секундами тоже может заработать, но для меня он немного сложнее потому что надо дописывать вычленение из данных GPS еще и секунд — без Arduino IDE это не очень быстро получится.
Про светодиод — а разве он автоматом не должен загораться при приеме данных? Разве не это его основная цель? Или у него другие функции? Просто ваш GPS модуль я подробно не изучал

Вот как меняются — https://yadi.sk/d/iQ7ahyrIT10vGw.

Про светодиод на плате модуля не знаю. Собирал часы с применением этого модуля и там светодиод мигал как только начинался прием данных, а здесь не мигает, хотя данные принимаются. Может это как-то программно делается? Ладно, это второстепенное.

Что то странное у вас происходит в схеме — сначала текущее значение часов было 4, а потом оно сразу перескочило на 21, естественно при таком раскладе условие разницы в 1 между старым и текущим значением часов не может выполниться, поэтому и на контакт 5 никакого импульса не подается.
Попробуйте свежую версию — https://yadi.sk/d/bfYF1LhA8qCW0A
Также сообщите мне как будут меняться Hour (текущее значение часов) и oldHour (старое значение часов). В этой версии я добавил еще два условия, которые могут «побороть» эти неожиданные перескоки времени. Если все таки наше главное условие в программе выполнится, то в мониторе последовательного порта будет напечатано Congratulations, а на контакт 5 будет подан импульс.

Ну я вижу в мониторе последовательного порта у вас появляется слово Congratulations — это значит что наше условие срабатывает и в начале каждого часа на контакт 5 подается нужный вам импульс. Вы видите его?
Теперь возникла проблема почему при запуске схемы число часов всегда устанавливается в 4. Попробуйте запустить одну из самых первых версий нашей программы, в которой в монитор последовательного порта выдавались не только часы, но и минуты. В ней не наблюдается такая же проблема что число часов всегда в начале начинается с 4?

Программа zzz_test_pin работает — периодически появляется сигнал высокого уровня на pin D5.
Вот ссылка работающей у меня программы https://yadi.sk/d/s4mIrmS4jijZ5w. Отставание времени есть на 1 час 30 минут (у меня часовой пояс +4).

Попробуйте эту программу — https://yadi.sk/d/DKuVgB7o-6Y27A.
Чтобы устранить отставание времени поэкспериментируйте со следующими строками в программе:
int Hour=UTC_hourDec+5; (попробуйте поставить в ней +4 — то есть ваш часовой пояс)
int Minut=UTC_minutDec+30; (+30 в этой строке уберите, в дальнейшем мы вообще можем убрать из программы минуты если они вам не нужны)

Вынесите строку с объявлением переменной «int oldHour=100;» из функции void setup() выше в код программы — туда, где объявляются глобальные переменные, например, поместите ее сразу после строки «int temp,i;». Тут я накосячил, к сожалению ))

Проверил программу — напряжение на D5 в начале часа не появляется.

Попробуйте свежую версию — https://yadi.sk/d/kdU1zUG6pOBbyA
Убрал минуты из программы, теперь в начале каждого часа она должна печатать в окне монитора последовательной связи значение этого часа и значение переменной oldHour (они должны быть равны). Проверьте, делает ли она это. Если она это не делает, значит какая то ошибка с самим условием, буду тогда думать как его изменить

Добрый вечер, что то вы долго отсутствовали. Я уже подумал что вы сами со всем справились, а обещанную мне статью не хотите писать. )) Я тут приболел немного, в таком состоянии не очень хочется писать программы. Дня через 3-4 напишите, попробую вам помочь

Здравствуйте!
Если выздоровели, то давайте продолжим с программой.

Хорошо, расскажите что у вас сейчас работает (может быть вы самостоятельно уже что то доделали) и что еще нужно сделать

Здравствуйте!
Добавил строку сюда (https://yadi.sk/d/5IH7nfljZoXKYQ) — char *test=(char*)»$GPRMC»;
Заработало — в мониторе порта часы и минуты.
Самостоятельно ничего больше не делал.
Нужен импульс длительностью 1 секунда на D5 в начале каждого часа.

Пришлите мне тогда код этой работающей у вас программы (можете на яндекс диск загрузить или еще куда-нибудь), а я постараюсь внести в нее необходимые вам изменения. Отставания времени, о котором вы писали, больше нет? И вот эта программа https://yadi.sk/d/vOWDdgSj4Ba1dg заработала у вас или нет?

Arduino: 1.8.13 (Windows 10), Плата:»Arduino Nano, ATmega328P (Old Bootloader)»
C:\Temp\arduino_modified_sketch_133120\sketch_nov09a.ino: In function ‘void serial1Event()’:
sketch_nov09a:91:22: error: ‘test’ was not declared in this scope
if(str[i-1] != test[i-1]) // проверка на строку $GPRMC
^~~~
C:\Temp\arduino_modified_sketch_133120\sketch_nov09a.ino:91:22: note: suggested alternative: ‘temp
if(str[i-1] != test[i-1]) // проверка на строку $GPRMC
^~~~
temp
exit status 1
‘test’ was not declared in this scope

Добавил строку — char *test=(char*)»$GPRMC»;
Заработало — в мониторе порта часы и минуты, только отставание на 30 минут.

Ну вот, вы уже самостоятельно делаете успехи в программировании Arduino. )) Вы просто не в очень удачное время ко мне обратились — на компьютер, на котором я сейчас временно работаю, не устанавливается корректно Arduino IDE.
С отставанием времени мы, надеюсь, чуть позже разберемся. Сейчас подскажите импульс какой длительности и на каком контакте платы вам нужен.

Взял 6-ую строку из программы этого Вашего поста — красная надпись в Arduino IDE, в интернете нашёл как подправить)).
Портабельную версию Arduino IDE не пробовали?
Импульс длительностью 1 секунда на D5.

Не пробовал, но я надеюсь мои проблемы временные.
Я предлагаю сначала попробовать работу вашего устройства с этим импульсом на маленькой программе, без использования информации с модуля GPS. Например, будем подавать на этот контакт импульс длительностью 1 секунда, потом пауза 5 секунд, потом снова этот импульс и т.д. Вам такой вариант подойдет?

В Arduino IDE включить окно монитора последовательной связи я умею. А по какой схеме подключать GPS-модуль GY-NEO6MV2 к Arduino Nano?

А та, которая в этой статье, разве не подойдет? Три провода всего ведь подключить нужно. Контакт Tx модуля (передача) можете подключить к любому цифровому контакту Ардуино, мы с помощью библиотеки SoftwareSerial.h потом на этом контакте сделаем приемник последовательного порта связи для Ардуино

Соединил модули, Тх к выводу D2 Arduino Nano. Какую программу использовать для проверки принятия платой Arduino от GPS датчика данных и их обработки?

Попробуйте вот эту — https://yadi.sk/d/vLaWxvkErQ3b5g
Если все будет нормально, она в окне последовательного монитора будет выводить часы и минуты, принимаемые от GPS модуля

При проверке скетча в Arduino IDE ошибка:
Arduino: 1.8.13 (Windows 10), Плата:»Arduino Nano, ATmega328P (Old Bootloader)»
C:\Temp\arduino_modified_sketch_878694\sketch_nov09a.ino:4:12: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
char *test=»$GPRMC»;
^~~~~~~~
C:\Temp\arduino_modified_sketch_878694\sketch_nov09a.ino: In function ‘void loop()’:
sketch_nov09a:17:5: error: ‘lcd’ was not declared in this scope
lcd.clear();
^~~
exit status 1
‘lcd’ was not declared in this scope

«Проблема в том, что я в программировании ни «бум-бум». Поэтому и обратился к Вам с просьбой изменить прошивку в соответствии с моим условием.»
Задача ваша не сложная, но я в любом случае не могу написать 100% рабочую программу не видя вашего устройства и его схемы, нюансов то в этих делах очень много. Я лишь могу дать общие советы как это можно сделать, что я и попытался сделать. Обратитесь к какому-нибудь знакомому кто хотя бы немного понимает в программировании, покажите ему приведенную здесь статью, наши с вами комментарии здесь, я думаю он без проблем вам поможет. Если возникнут какие-либо вопросы, то можете также задать их в комментариях.

Если бы был такой знакомый, то я к Вам не обращался бы. Устройства у меня никакого нет. Ваше устройство вполне подходит, только нужно изменить прошивку и исключить индикатор. GPS-модуль GY-NEO6MV2 принимает данные, Arduino Nano делает обработку для выделения сигнала коррекции каждый час на один (несколько) вывод(ов) и всё. Больше никаких нюансов нет.

Ну могу предложить вам следующий вариант. Я вам попробую помочь с программой (хотя 100% гарантии успеха при такой удаленной работе не смогу дать), а вы мне напишите на сайт статью про ваше устройство если все получится (примерно в стиле как написана эта статья). Оформлю я статью сам, от вас только текст статьи в Word’е, схема устройства и фотографии ваши, не скопированные откуда-нибудь из интернета. Подойдет вам такой вариант?

Тогда начнем с простого. Сначала давайте проверим правильно ли принимает данные плата Arduino от GPS датчика и обрабатывает их. Вы умеете в Arduino IDE включать окно монитора последовательной связи (serial monitor)?

Здравствуйте!
Не совсем так. GPS-модуль GY-NEO6MV2 принимает много разной информации, она поступает в модуль Arduino Nano для обработки, после обработки с одного из выходов (а лучше несколько выходов) каждый час выводится сигнал коррекции в виде секундного импульса, а далее на оптопару или реле, которые замкнут кнопку «Коррекция» на часах. Подобно как сигналы точного времени по радио каждый час, только выводятся не шесть импульсов, а один.

То есть вам нужно чтобы один раз в час на одном из выходов (или нескольких выходах) Arduino Nano формировался импульс длительностью одну секунду? Никаким другим образом вы GPS данные с модуля не используете? Или все таки есть связь между этими данными и периодом формирования импульса коррекции?

Никаким другим образом GPS данные с модуля не используются, только импульс коррекции каждый час.

Тогда поясните еще немного в чем состоит ваша проблема? Как извлечь время из данных GPS модуля? Это подробно описано в представленной статье. Чтобы точно отмерить один час можно завести две переменные: в одной будет храниться предыдущее количество часов, а в другой — текущее количество часов. Изначально они равны. Текущее количество часов будет непрерывно считываться с GPS модуля. Как только разница между этими двумя переменными станет равна единице значит прошел час. Выдаем требуемый вам импульс и в предыдущее количество часов записываем текущее количество часов. И все повторяется сначала. Только еще нужно добавить одно условие чтобы корректно обрабатывался переход времени в полночь

Проблема в том, что я в программировании ни «бум-бум». Поэтому и обратился к Вам с просьбой изменить прошивку в соответствии с моим условием.

Здравствуйте!
Вы можете изменить прошивку в данном устройстве, чтобы использовать его для коррекции часов с кнопкой «Коррекция» (например, «Электроника — 6-14-03, чтобы коррекция происходила раз в час? Индикатор не нужен, просто сигнал коррекции.

Добрый вечер, вы хотите чтобы значение времени, полученное от GPS модуля, сравнивалось со временем, полученным от модуля часов реального времени (к примеру) и на основании результатов этого сравнения производилась коррекция времени? Я правильно понял?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *