Рассматриваемый GPS-корректор предназначен для коррекции показаний электронных часов, у которых имеется кнопка "Коррекция" (например,"Электроника 6.14"). Устройство состоит из трех функциональных блоков: плата Arduino Nano, GPS-модуль GY-NEO6MV2, исполнительный модуль на оптопаре транзисторной PC-817.
За основу для данной статьи был взят проект GPS часов на Arduino Uno.
Необходимые компоненты
- Плата Arduino Nano (купить на AliExpress).
- GPS-модуль GY-NEO6MV2 (купить на AliExpress).
- Транзисторная оптопара PC-817 (купить на AliExpress).
- Соединительные провода.
Принцип работы устройства
GPS-модуль передает данные в NMEA формате, который состоит из нескольких строк (предложений), из которых нужно будет извлечь только часы и дату. Эти данные содержатся в строке $GPRMC. Извлечение времени и даты происходит при помощи подсчета запятых в этой строке. Более подробно об этих процессах можно прочитать в уже упоминавшейся статье GPS часы на Arduino Uno.
Таким образом, с помощью Arduino будет находиться в GPS данных строка $GPRMC и сохраняться в массиве, в котором время (в 24-часовом формате) может быть найдено после одной запятой, а дата – после 9 запятых. Время и дата потом сохраняются в соответствующих строках.
GPS спутники передают время и дату в формате UTC (Universal Time Coordinated - всеобщее скоординированное время), поэтому нужно конвертировать его в местное время. Для своего региона нужно установить соответствующую поправку.
Работа схемы
Схема GPS-корректора на основе платы Arduino Nano представлена на следующем рисунке.
Плата Arduino управляет всеми процессами на этой схеме: она принимает данные от GPS модуля, извлекает дату и время из строки $GPRMC и в начале каждого часа подает сигнал коррекции в виде импульса длительностью 1 секунда с вывода D5 на исполнительный модуль (коллектор и эмиттер оптопары присоединяются параллельно кнопке "Коррекция" часов).
Контакт передачи Tx GPS модуля подсоединен к контакту Rx (pin 2) платы Arduino (этот контакт сделан входом последовательного порта с помощью соответствующей библиотеки). В данной схеме использован GPS-модуль GY-NEO6MV2, функционирующий на скорости 9600 бод/с, плата Arduino (ее последовательный порт) также сконфигурирована на работу со скоростью 9600 бод/с с помощью команды “Serial.begin(9600)”.
Основная цель работы схемы - подача импульса длительностью 1 секунда на контакт D5 платы Arduino. По этому импульсу и будет корректироваться работа интересующих нас электронных часов. Длительность импульса 1 сек можно уменьшить до 100-300 мс.
Тестирование работы проекта
После того как аппаратная часть проекта будет готова, необходимо загрузить программу в плату Arduino и устройство начнет работать. Для тестирования работы проекта мы к контакту D5 платы Arduino подключили вместо оптопары светодиод . Он будет загораться на 1 секунду в начале каждого часа - это будет свидетельствовать о правильной работе устройства.
Также мы в программу добавили специальные строки вывода данных работы проекта в окно монитора последовательной связи. Пример вывода этих данных в в окно монитора последовательной связи приведен на следующем рисунке.
Производится вывод текущего значения часов (Hours) и старого значения часов (oldHour). Как только разница между ними становится равной 1 это значит что наступил новый час - в этот момент времени производится формирование импульса длительностью 1 секунда на контакте D5 платы Arduino и в окно монитора последовательной связи выдается слово "Congratulations" (что означает поздравления).
Видео работы устройства - https://yadi.sk/i/RDECSHFL2RQtjg.
Исходный код программы (скетча)
Строки, которые отвечают за вывод информации в окно монитора последовательной связи (для целей отладки) - закомментарены. Если хотите задействовать этот функционал программы - просто снимите с них комментарии.
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 |
#include <SoftwareSerial.h> SoftwareSerial Serial1(2, 3); // RX, TX char str[70]; char *test=(char*)"$GPRMC"; int temp,i; int oldHour=100; void setup() { Serial1.begin(9600); //Serial.begin(9600); delay(300); pinMode (5,OUTPUT); digitalWrite(5, LOW); } void loop() { serial1Event(); if (temp) { 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 Second=UTC_second.toInt(); int Date=UTC_date.toInt(); int Month=UTC_month.toInt(); int Year=UTC_year.toInt(); int Hour=UTC_hourDec+4; if(Hour>23) { Hour-=24; Date+=1; } //Serial.println("Time: Hours"); //Serial.println(Hour); //Serial.println("Time: oldHour"); //Serial.println(oldHour); if(Hour-oldHour>1) oldHour=Hour; if(oldHour-Hour>1) oldHour=Hour; if(Hour-oldHour==1) { digitalWrite(5, HIGH); delay(1000); digitalWrite(5, LOW); oldHour=Hour; //Serial.println("Congratulations"); //Serial.println(Hour); //Serial.println(oldHour); } temp=0; i=0; x=0; str_lenth=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; } } |
Привет.Думаю,что проще сделать отработку часового импульса.
if(Second==59&&Minute==59)digitalWrite(5, HIGH);
else digitalWrite(5, LOW);
Добрый день. Ну у каждой задачи в программировании почти всегда есть несколько альтернативных способов решения. Возможно, ваш вариант будет чем-нибудь лучше чем тот, который предложил автор в статье