В настоящее время вокруг земли летает достаточно много GPS спутников, которые обеспечивают точное определение местоположения любой точки на Земле. Но вместе с координатами (широта и долгота) они передают и много других полезных данных, например, время, дату, высоту над уровнем моря, угол и т.д. Более подробно эти вещи мы уже рассматривали в статье про считывание GPS данных с помощью персонального компьютера и Arduino Uno, в этой же статье мы рассмотрим проектирование GPS часов на основе платы Arduino Uno, использующих данные о времени и дате, получаемые с GPS спутников. Эти GPS часы будут весьма точными и показывать дату и время с точностью до миллисекунды.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- ЖК дисплей 16х2 (купить на AliExpress).
- GPS модуль (купить на AliExpress).
- Источник питания.
- Соединительные провода.
Принципы работы устройства
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. Далее представлен полный текст программы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
#include<LiquidCrystal.h> LiquidCrystal lcd(7, 6, 5, 4, 3, 2); #include <SoftwareSerial.h> SoftwareSerial Serial1(10, 11); // RX, TX char str[70]; char *test="$GPRMC"; int temp,i; void setup() { lcd.begin(16,2); Serial1.begin(9600); lcd.setCursor(0,0); lcd.print("GPS Updated Clock"); lcd.setCursor(0,1); lcd.print(" Circuit Digest "); delay(300); } void loop() { serial1Event(); if (temp) { lcd.clear(); int str_lenth=i; int x=0,comma=0; String UTC_hour=""; String UTC_minut=""; String UTC_second=""; String UTC_date=""; String UTC_month=""; String UTC_year=""; String str1=""; while(x<str_lenth) { if(str[x]==',') comma++; if(comma==1) { x++; UTC_hour+=str[x++]; UTC_hour+=str[x++]; UTC_minut+=str[x++]; UTC_minut+=str[x++]; UTC_second+=str[x++]; UTC_second+=str[x]; comma=2; } if(comma==10) { x++; UTC_date+=str[x++]; UTC_date+=str[x++]; UTC_month+=str[x++]; UTC_month+=str[x++]; UTC_year+=str[x++]; UTC_year+=str[x]; } x++; } 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(); int Year=UTC_year.toInt(); int Hour=UTC_hourDec+5; if(Hour>23) { Hour-=24; Date+=1; } int Minut=UTC_minutDec+30; if(Minut>59) Minut-=60; // UTC_ind_zone_time lcd.clear(); lcd.print("Date: "); lcd.print(Date); lcd.print("/"); lcd.print(Month); lcd.print("/"); lcd.print("20"); lcd.print(Year); lcd.setCursor(0,1); lcd.print("Time: "); lcd.print(Hour); lcd.print(":"); lcd.print(Minut); lcd.print(":"); lcd.print(Second); // delay(100); temp=0; // j=0; i=0; x=0; str_lenth=0; // k=0; } // delay(1000); } void serial1Event() { while(1) { while (Serial1.available()) // проверка наличия данных от GPS по каналу последовательной связи { char inChar = (char)Serial1.read(); str[i]= inChar; // сохраняем данные от GPS в массиве str[] i++; if (i < 7) { if(str[i-1] != test[i-1]) // проверка на строку $GPRMC { i=0; } } if(i>65) { temp=1; break; } } if(temp) break; } } |
Здравствуйте!
Говорящие часы заработали, но ввиду особенностей их работы нужно изменить время появления сигналов на выводах:
на D5 - сигнал высокого уровня на 4 секунды, на D6 - сигнал высокого уровня спустя 200 миллисекунд после появления сигнала на D5 и на время 200 миллисекунд. Я изменил, но проверьте, пожалуйста - https://yadi.sk/d/ZSGIElk7EqDbXQ.
Здравствуйте. По вашему коду получается что у вас сигнал высокого уровня на D5 будет подаваться не 4 секунды, а 4.4 секунды. Я думаю последнюю задержку целесообразно уменьшить с 4000 до 3600.
Да, использовать с устройством говорящих часов, статью о которых нашел в интернете. Но пока они не работают согласно статье.
Ну когда они у вас появятся дополните тогда вашу статью на моем сайте?
Если всё получится, то дополню.
Вы можете написать программу для PIC12F675?
Хорошо, будем ждать. Нет, пока не могу. Я еще пару месяцев планирую наполнять сайт статьями про Arduino, потом начать добавлять статьи по Raspberry Pi, а после нее уже начать добавлять статьи про PIC микроконтроллеры. Пока примерно такие планы
Ясно. Ещё раз большое спасибо за помощь! Удачи Вам!
И вам удачи. Буду надеяться что вы еще появитесь у нас с каким-нибудь своим новым проектом
Точно не знаю, но по сообщениям местных СМИ, с осени стало больше заболевающих как тенденция второй волны.
Точно не знаете? Вы как будто на улицу совсем не выходите и ни с кем в городе не общаетесь. )) Мне кажется сейчас коронавирус - самая актуальная тема для разговоров по всей России.
У статьи вашей, кстати, понемногу растет число просмотров. Никогда бы сам не подумал что проблема корректировки электронных часов настолько актуальна. Не проще ли самому вручную их раз в месяц корректировать с помощью кнопок?
Общение сейчас не безопасно)) Местные СМИ каждый день приводят статистику заболевших, умерших и выздоровевших.
Насчет ручной корректировки... Конечно проще, но... количество просмотров растет!)
Так что же вы, на работу сейчас не ходите, на удаленке работаете? Ну а как у вас идея появилась такой корректор сделать? Подсмотрели идею на каком-нибудь сайте или яблоко на голову упало как Ньютону и вас осенило? ))
Давным-давно, ещё в прошлом тысячелетии, учась в институте, увидел у одного студента устройство, объединяющее часы на БИС К145ИК1901, самодельный радиоприёмник СВ и модуль коррекции, использующий сигналы точного времени р/с "Маяк". Схема показалась сложной, пытался сделать сам по-проще, но не получилось...
В прошлом году нашел в интернете модуль коррекции по сигналам точного времени на микроконтроллере. Использовался местный УКВ ФМ "Радио России". При точной настройке коррекция происходит стабильно, но есть задержка сигнала в 6 секунд, связанная с распространением радиоволн.
Потом собрал эти часы https://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)”.
Живу в городе Волгограде.
Хорошо, поправил. Заезжал в Волгоград этим летом на полдня, посмотрел Мамаев курган и музей диораму. Как там у вас сейчас ситуация с коронавирусом, сильно плохая? Я когда летом в ваших краях был, мне местные жаловались на то, что весной было нормально и локдаун весной был бесполезен для Волгограда, а вот летом стало много людей умирать от этой болезни
фотография устройства - https://yadi.sk/d/ZSI1Fv3juwabXA
Хорошо, спасибо. Постараюсь добавить вашу статью в ближайшие 2-3 дня.
Спасибо Вам большое за помощь!!!
Спасибо и вам что оценили мой труд. Вы, если не секрет, каким путем в электронику пришли и заинтересовались платформой Arduino.
Когда-то давным-давно одноклассник заинтересовал радиотехникой. О микроконтроллерах, и в частности о платформе Arduino, узнал пару лет назад из интернета.
А так, образование у вас гуманитарное или техническое? Платформу Arduino часто называют инструментом для "не технарей", но на практике это не совсем так
https://yadi.sk/i/RDECSHFL2RQtjg
Видео работы устройства. На D5 светодиод для наглядности появления секундного импульса в начале часа.
https://yadi.sk/i/tgpdiJLLxvG2bg.
Взял за основу эту Вашу статью. В рисовании схемы нужна помощь.
Про исходный код программы не знаю что писать.
Про исходный код программы не нужно ничего писать, я его сам потом добавлю. Вас в конце статьи как представить?
Убирать переменные 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 (как ее на схемах рисуют), а к ней потом вручную дорисовать ваши элементы - так вообще придется мало рисовать
Хорошо, я попробую.
фото схемы - https://yadi.sk/i/82Ez427Dm6yqVg
Хорошо, спасибо. В ближайшие дни постараюсь добавить вашу статью.
А, совсем забыл, сделайте еще пожалуйста фотографию вашего устройства чтобы мне в анонс статьи в ленте статей ее можно было поставить
Нужный импульс подается на 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)?
А в самом первом варианте программы с минутами, которая у вас заработала, не было такого эффекта?
В самом первом варианте программы с минутами не было такого эффекта.
Мда, какой то труднообъяснимый эффект
https://yadi.sk/d/xYMtIm2bg1y5jw.
Оставил только часы и дату. Это не повлияет на функциональность нашей программы в течение месяца, года?
Нет, конечно не повлияет. Можно еще убрать вывод информации в окно монитора последовательной связи если вам это не нужно
Да, уберите вывод информации в окно монитора последовательной связи. Может ещё что можно убрать?
Про статью. Текст статьи в 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 будет подан импульс.
https://yadi.sk/d/7igDhcUGIH6UDQ
https://yadi.sk/d/einjeAtroj8g0g.
Ну я вижу в мониторе последовательного порта у вас появляется слово 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 в этой строке уберите, в дальнейшем мы вообще можем убрать из программы минуты если они вам не нужны)
Ошибка в программе - https://yadi.sk/d/WYawF2N8R9Z-aQ.
Минуты можно убрать.
Вынесите строку с объявлением переменной "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 заработала у вас или нет?
Попробуйте тогда следующую простую программу
https://yadi.sk/d/vOWDdgSj4Ba1dg
Эти две опечатки в программе я поправил, попробуйте следующую версию:
https://yadi.sk/d/5IH7nfljZoXKYQ
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 модуля. Как только разница между этими двумя переменными станет равна единице значит прошел час. Выдаем требуемый вам импульс и в предыдущее количество часов записываем текущее количество часов. И все повторяется сначала. Только еще нужно добавить одно условие чтобы корректно обрабатывался переход времени в полночь
Проблема в том, что я в программировании ни "бум-бум". Поэтому и обратился к Вам с просьбой изменить прошивку в соответствии с моим условием.
Только для модуля GPS GY-NEO6MV2.
Здравствуйте!
Вы можете изменить прошивку в данном устройстве, чтобы использовать его для коррекции часов с кнопкой "Коррекция" (например, "Электроника - 6-14-03, чтобы коррекция происходила раз в час? Индикатор не нужен, просто сигнал коррекции.
Добрый вечер, вы хотите чтобы значение времени, полученное от GPS модуля, сравнивалось со временем, полученным от модуля часов реального времени (к примеру) и на основании результатов этого сравнения производилась коррекция времени? Я правильно понял?