Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Дешевые и точные часы на основе GPS

Компоненты и расходные материалы

Arduino UNO
× 1
ЖК-экран с подсветкой Adafruit RGB - 16x2
в моем случае ЖК-дисплей nobrand 20x4 с адаптером I2C для упрощения подключения
× 1
Макет (общий)
× 1
Перемычки (общие)
× 1
GPS-приемник (общий)
GY-GPS6Mv2 с ublox NEO-6M
× 1

Приложения и онлайн-сервисы

IDE Arduino

Об этом проекте


До сих пор я использовал различные часы RTC для проектов часов или получал время с серверов NTP. В этом проекте я представляю вам еще один источник:синтаксический анализ цепочки NMEA спутников GPS по всему миру.

Я был удивлен, насколько дешевый сегодня GPS-приемник:приобретите его (в моем случае используется GY-GPS6Mv2).

а.) первый - необязательный - тест на ПК с Windows:установите «u-center» как загружаемый с U-Blox.

С помощью адаптера FTDI выход GPS находит путь к COM-порту вашего ПК и показывает привязку (соединение) к орбите примерно через 1 минуту. Для этого на разъеме мигает красная контрольная лампа.

Автоматически сгенерированная графика заставит вас больше экспериментировать с GPS. С помощью F8 - Текстовая консоль в меню "Просмотр" вы можете получать различные строки NMEA.

б.) Вы можете провести тест декодирования на бесплатных онлайн-сервисах:https://rl.se/gprmc

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

Мы используем библиотеку Adafruit "Adafruit GPS Library" - если вы установили ее в Arduino IDE, вы можете немного поэкспериментировать с примерами.

в.) Схема

Arduino A4> Показать SDA Arduino A5> Показать SCL

#include #include LiquidCrystal_I2C lcd (0x3F, 20, 4); // устанавливаем адрес ЖК-дисплея> часто 0x27 или 0x3F

> использовать развернутый дисплей, может быть, 16x2?

#include #include

Подключите контакт GPS Power к 5V Подключите контакт GPS Ground к земле Подключите контакт GPS TX (передача) к Digital 8 Подключите контакт GPS RX (прием) к Digital 7 // вы можете изменить номера контактов в соответствии с вашей проводкой:SoftwareSerial mySerial (8 , 7); Adafruit_GPS GPS (&mySerial);

> GPS-приемник устойчив к напряжению 3,3 / 5 В.

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

Строка NMEA предоставляет время в стандарте UTC. Перевод в местный часовой пояс зависит от нас. Пока никто не делает лучшего предложения, я добавляю +1 для своего часового пояса (Европа, Берлин).

  int timezone =+1; // Европа / Берлин (UTC +0100)> NMEA ориентирован на UTC  

Настройте часовой пояс по своему вкусу. Затем переменная час используется в коде для вывода на ЖК-дисплей вместо GPS. Час - значение UTC.

  // вывод на ЖК-дисплей 
lcd.setCursor (5,0); //, 0 =первая строка
int hour =(GPS.hour) + timezone; // форматируем GPS.hour UTC в ваш индивидуальный часовой пояс
if (hour <10) {lcd.print ('0'); }
lcd.print (час, DEC); lcd.print (':');

В Европе для обозначения скорости ветра мы используем «км / ч» вместо узлов. Поэтому я сначала преобразовал значение из узлов в км / ч, используя константу, а затем сгруппировал его. > 1 узел =1,852 километра в час

  скорость поплавка =(GPS.speed) * 1,852; // Переключение со Speed ​​/ Knoten> Speed ​​/ km / h  

Оценка по Википедии:

  if (speed <=1) {lcd.print ("Windstille");} 
else if ((speed> 1) &&(speed <=9)) {lcd.print (" leiser Zug ");}
else if ((speed> 9) &&(speed <=46)) {lcd.print (" Brise ");}
else if ((speed> 46) &&(speed <=56)) {lcd.print ("starker Wind");}
else if ((speed> 56) &&(speed <=74)) {lcd.print ("stuerm. Wind");}
else if ((speed> 74) &&(speed <=83)) {lcd.print ("Sturm");}
else if ((speed> 83) &&(speed <=102)) {lcd.print ("schwerer Sturm");}
else if (speed> 102) {lcd.print ("Orkan");}
else {lcd.print ("ohne Bewertung ");}

Результат отображается на дисплее следующим образом и, конечно, может быть адаптирован к вашим собственным пожеланиям:

Я оставил частоту обновления в пределах 2 секунд в цикле. Я даже склонен отказаться от секунд и высоты в пользу дисплея 16x2.

Получайте удовольствие от изучения разнообразных вариантов GPS!

В Европе также доступна оценка радиосигнала DCF77. Однако это значительно дороже, а обращение с ним считается очень чувствительным.

Код

  • GPS_SoftwareSerial_Parsing_ilo
GPS_SoftwareSerial_Parsing_ilo C / C ++
Пример Adafruits немного скорректирован
 // Тестовый код для GPS-модулей Adafruit с использованием драйвера MTK3329 / MTK3339 //// Этот код показывает, как прослушивать GPS-модуль в прерывании, // что позволяет программе иметь больше «свободы» - просто проанализируйте // когда появится новое предложение NMEA! Затем при необходимости обращайтесь к данным. //// Протестировано и отлично работает с GPS-модулем Adafruit Ultimate // с использованием чипсета MTK33x9 // ------> http://www.adafruit.com/products/746/ / Купите один сегодня в магазине электроники Adafruit // и помогите поддерживать оборудование и программное обеспечение с открытым исходным кодом! -ada // изменено 01.02.2020 - Инго Лос // Декодер GPRMC и GPGGA:https://rl.se/gprmc#include  #include  LiquidCrystal_I2C lcd (0x3F, 20,4); // установить адрес ЖК-дисплея на 0x27 для 16-символьного и 2-строчного дисплея> 0x3F в моем случае для ЖК-дисплея 2004 года # include  #include  // Подключите вывод питания GPS к 5V / / Подключите контакт заземления GPS к земле // Подключите контакт GPS TX (передача) к Digital 8 // Подключите контакт GPS RX (прием) к Digital 7 // вы можете изменить номера контактов, чтобы они соответствовали вашей проводке:SoftwareSerial mySerial ( 8, 7); Adafruit_GPS GPS (&mySerial); // Установите для GPSECHO значение false, чтобы отключить отображение данных GPS на последовательной консоли // Установите значение true, если вы хотите отлаживать и прослушивать необработанные предложения GPS # определить часовой пояс GPSECHO trueint =+1; // Европа / Берлин (UTC +0100)> NMEA ориентирован на UTCvoid setup () {lcd.init (); lcd.backlight (); // подключаемся к 115200, чтобы мы могли достаточно быстро считывать данные GPS и выводить эхо без потери символов // также выводим его Serial.begin (115200); задержка (5000); Serial.println («Базовый тест библиотеки Adafruit GPS!»); // 9600 NMEA - это скорость передачи данных по умолчанию для GPS Adafruit MTK - некоторые используют 4800 GPS.begin (9600); //> в моем случае я использую UBLOX 6M:GY-GPS6Mv2 // раскомментируйте эту строку, чтобы включить RMC (рекомендуемый минимум) и GGA (исправить данные), включая высоту GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA); // раскомментируйте эту строку, чтобы включить только "минимально рекомендуемые" данные //GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY); // Для синтаксического анализа данных мы не предлагаем использовать только RMC или RMC + GGA, поскольку // синтаксический анализатор не заботится о других предложениях в это время // Установите частоту обновления GPS.sendCommand (PMTK_SET_NMEA_UPDATE_1HZ); // Частота обновления 1 Гц // Чтобы код синтаксического анализа работал нормально и у него было время, чтобы отсортировать данные и // распечатать их, мы не предлагаем использовать что-либо выше 1 Гц // Запрашивать обновления состояния антенны, комментировать молчать GPS.sendCommand (PGCMD_ANTENNA); задержка (1000); // Запрос версии прошивки mySerial.println (PMTK_Q_RELEASE);} uint32_t timer =millis (); void loop () // запускаем снова и снова {char c =GPS.read (); // если вы хотите отладить, сейчас хорошее время для этого! if ((c) &&(GPSECHO)) Serial.write (c); // если предложение получено, мы можем проверить контрольную сумму, проанализировать его ... if (GPS.newNMEAreceived ()) {// хитрость здесь заключается в том, если мы печатаем предложение NMEA или данные // мы в конечном итоге не слушать и ловить другие предложения! // поэтому будьте очень осторожны, используя OUTPUT_ALLDATA и пытаясь распечатать данные //Serial.println (GPS.lastNMEA ()); // это также устанавливает для флага newNMEAreceived () значение false if (! GPS.parse (GPS.lastNMEA ())) // это также устанавливает для флага newNMEAreceived () значение false return; // мы можем не разобрать предложение, и в этом случае мы должны просто дождаться другого} // если цикл millis () или таймер завершается, мы просто сбросим его if (timer> millis ()) timer =millis (); // примерно каждые 2 секунды распечатываем текущую статистику if (millis () - timer> 2000) {timer =millis (); // сбросить таймер Serial.print ("\ nTime:"); if (GPS.hour <10) {Serial.print ('0'); } Serial.print (GPS.hour, DEC); Серийный принт (':'); if (GPS.minute <10) {Serial.print ('0'); } Serial.print (GPS.minute, DEC); Серийный принт (':'); if (GPS.seconds <10) {Serial.print ('0'); } Serial.print (GPS.seconds, DEC); Serial.print ('.'); Серийный принт ('.'); if (GPS.milliseconds <10) {Serial.print ("00"); } else if (GPS.milliseconds> 9 &&GPS.milliseconds <100) {Serial.print ("0"); } Serial.println (GPS.milliseconds); Serial.print ("Дата:"); Серийный.печать (GPS.day, DEC); Серийный принт ('/'); Серийный.принт (GPS.месяц, DEC); Serial.print ("/ 20"); Serial.println (GPS.year, DEC); Serial.print ("Исправить:"); Serial.print ((int) GPS.fix); Serial.print ("качество:"); Serial.println ((int) GPS.fixquality); // вывод на ЖК-дисплей lcd.setCursor (5,0); //, 0 =первая строка int hour =(GPS.hour) + timezone; // форматируем GPS.hour UTC в ваш индивидуальный часовой пояс if (hour <10) {lcd.print ('0'); } lcd.print (час, декабрь); lcd.print (':'); если (GPS.minute <10) {lcd.print ('0'); } lcd.print (GPS.minute, DEC); lcd.print (':'); если (GPS.seconds <10) {lcd.print ('0'); } lcd.print (GPS.seconds, DEC); // вывод на ЖК-дисплей lcd.setCursor (5,1); //, 0 =вторая строка if (GPS.day <10) {lcd.print ('0'); } lcd.print (GPS.day, DEC); ЖК-печать ('.'); если (GPS.month <10) {lcd.print ('0'); } lcd.print (GPS.month, DEC); ЖК-печать ('.'); lcd.print (GPS.год, DEC); if (GPS.fix) {// у нас есть спутниковая связь? если да, то у нас есть другие значения:Serial.print ("Location:"); Serial.print (широта GPS, 4); Serial.print (GPS.lat); Serial.print (","); Серийный отпечаток (долгота GPS, 4); Serial.println (GPS.lon); Serial.print ("Скорость (узлы):"); Serial.println (GPS.speed); Serial.print ("Угол:"); Serial.println (GPS.angle); Serial.print ("Высота:"); Serial.println (GPS.высота); Serial.print («Спутники:»); Serial.println ((int) GPS.satellites); lcd.setCursor (0,2); //, 2 =третья строка // 1 узел =1,852 километра в час плавающая скорость =(GPS.speed) * 1.852; // Переключение с Speed ​​/ Knoten> Speed ​​/ km / h //lcd.print("Speed ​​km / h:"); lcd.print (скорость); // Bewertung der Windstärke nach https://de.wikipedia.org/wiki/Windgeschwindigkeit / * Beschreibung - Geschwindigkeit в км / ч * Windstille - 0-1 * leiser Zug - 2-9 * leichte Brise - 10-19 * schwache Brise - 20-28 * mäßige Brise - 29-37 * frische Brise - 38-46 * starker Wind - 47-56 * stürmischer Wind - 57-74 * Sturm - 75-83 * schwerer Sturm - 84-102 * Orkan -> 103 * / if (speed <=1) {lcd.print ("Windstille");} else if ((speed> 1) &&(speed <=9)) {lcd.print ("leiser Zug");} else if ((speed> 9) &&(speed <=46)) {lcd.print ("Brise");} else if ((speed> 46) &&(speed <=56)) {lcd.print ("более сильный ветер ");} else if ((speed> 56) &&(speed <=74)) {lcd.print (" stuerm. Wind ");} else if ((speed> 74) &&(speed <=83)) { lcd.print ("Sturm");} else if ((speed> 83) &&(speed <=102)) {lcd.print ("schwerer Sturm");} else if (speed> 102) {lcd.print ( "Orkan");} else {lcd.print ("ohne Bewertung");} lcd.setCursor (0,3); //, 3 =четвертая строка lcd.print ("Hoehe:"); lcd.print (GPS.высота); }}} 

Производственный процесс

  1. Сделай сам дешевый контроллер для перчаток и пропеллерный автомобиль
  2. Датчик DHT11 со светодиодами и пьезо-динамиком
  3. Регистратор данных GPS, пространственный анализ и Azure IoT Hub.
  4. Регистратор данных температуры и влажности
  5. Arduino Temp. Монитор и часы реального времени с дисплеем 3.2
  6. Светодиодные часы POV в аналоговом стиле
  7. С Днем Рождения:свет и звук
  8. u-blox LEA-6H 02 GPS-модуль с Arduino и Python
  9. Клеточные автоматы на основе Arduino и OLED
  10. Гитарный медиатор и педаль Stomp!