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

Установить DS3231 по GPS

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

Arduino Nano R3
× 1
Модуль часов DS3231
× 1
МОДУЛЬ GPS NEO 6M
× 1
НАПРАВЛЕНИЕ СДВИГАТЕЛЯ УРОВНЯ BI
× 1
ЖК-дисплей 16 * 2
× 1
РЮКЗАК ЖК-дисплея I2C
× 1
15-контактные 0,1-дюймовые розетки
× 2
6-контактные 0,1-дюймовые розетки
× 2
4-контактная 0,1-дюймовая розетка
× 1
5-контактная 0,1-дюймовая розетка
× 1
4-контактная полоска с выводами 0,1 дюйма
× 1
Стрипборд, 24 полосы * 37 столбцов
× 1
резисторы 4K7
× 2
Кнопка (однополюсный мгновенный квадрат 6 м)
× 1

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

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

После того, как я обнаружил, что GPS выдает точное время (UTC) и дату, я решил использовать их для установки моего DS3231.

Схема:

Рюкзак с ЖК-дисплеем для Arduino:

ЗЕМЛЯ - ЗЕМЛЯ

VCC - 5 В

ПДД - ПДД (A4)

SCL - SCL (A5)

Модуль часов DS3231 для Arduino:

ЗЕМЛЯ - ЗЕМЛЯ

VCC - 5 В

ПДД - ПДД (A4)

SCL - SCL (A5)

СДВИГ УРОВНЯ от Arduino:

5–5 В

ЗЕМЛЯ - ЗЕМЛЯ

D3 - АВТОБУС

D4 - АВТОБУС

NEO 6M GPS от уровнемера

3 В - VCC

ЗЕМЛЯ - ЗЕМЛЯ

АВТОБУС - TXD (заканчивается на D3)

АВТОБУС - RXD (заканчивается на D4)

ПЕРЕКЛЮЧЕНИЕ КОНТАКТОВ:

ПЕРЕКЛЮЧАТЕЛЬ - D9

ВЫКЛЮЧАТЕЛЬ - ЗЕМЛЯ

Мощность:

Я подаю питание на свою схему через USB-кабель.

Программное обеспечение:

99% программного обеспечения - это пример parsing.ino из библиотеки Adafruit GPS. Я добавил небольшой объем кода для передачи извлеченных данных GPS и времени на DS3231 и некоторый дополнительный код для отображения времени с DS3231 на ЖК-дисплее.

Используемая библиотека:

Adafruit GPSLibrary от Adafruit, версия 1.0.3

RTCLib от Adafruit, версия 1.2.0

NewL LiquidCrystalдля рюкзака дисплея I2C.

Операция:

Включите устройство.

На ЖК-дисплее будут отображаться текущие значения даты и времени в регистрах DS3231.

Подождите, пока GPS не заблокируется.

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

На ЖК-дисплее отобразится новое время.

Ограничения работы:

Прибору GPS требуется время для блокировки, и нет индикатора того, что блокировка была достигнута. Нажатие кнопки установки без блокировки привело к тому, что моя дата DS3231 была установлена ​​на 2000:0:0, а время на 0:0:0.

Когда красный светодиод на устройстве GPS начинает мигать, кажется, самое подходящее время для нажатия кнопки настройки - это может быть до 10 минут (в помещении).

Изначально у DS3231, который я использовал, была разряженная батарея, при нажатии кнопки Set дата была установлена ​​на 2000:0:0, а время на 0:164:164. Батареи потребовалось довольно много времени, чтобы получить достаточно заряда, чтобы принять данные GPS и продолжить работу самостоятельно.

Особенности GPS:

На плате, которую я купил, было написано просто NEO 6M GPS, а на соединительных контактах отмечены их функции. Я взглянул на техническое описание устройства [1], в котором говорилось, что устройство работает при напряжении около 3 В, поэтому я использовал переключатель уровня. Однако при ближайшем рассмотрении я обнаружил микросхему 4A2D, припаянную к плате, поиск в Интернете показал, что это регулятор напряжения, но это не гарантирует, что линии связи сдвинуты по уровню (у моего устройства не было принципиальной схемы).

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

Причуда ЖК-дисплея:

Я использую один из необычных, у которого I2C-адрес 0x3F, большинство из них используют адрес 0x27, поэтому, если вы ничего не видите, попробуйте сначала изменить его.

Причуда библиотеки:

Библиотека RTCLib (Adafruit версии 1.2.0) устанавливает регистры времени и даты, но не регистр дня DS3231. В библиотеке есть функция для возврата дня недели, который вычисляется на лету с использованием значений в регистре даты.

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

UTC и местное время:

Я провел поиск по UTC и обнаружил, что для моего местного времени не требуется никаких изменений, поэтому, если вам это нужно, вам придется добавить этот фрагмент кода самостоятельно.

[1] https://www.u-blox.com/sites/default/files/products/documents/NEO-6_DataSheet_(GPS.G6-HW-09005).pdf (последнее обращение / декабрь 2018 г.)

Код

  • Установить файл кода DS3231
Установить файл кода DS3231 Arduino
 // Функции даты и времени с использованием DS3231 RTC, подключенного через I2C и Wire lib # include  #include "RTClib.h" // Aadafruit версии 1.2.0 на моей машине RTC_DS3231 RTC; char daysOfTheWeek [7] [12] ={«Воскресенье», «Понедельник», «Вторник», «Среда», «Четверг», «Пятница», «Суббота»}; const int days_string_length =12; // конец показаний часов // для ЖК-дисплея display // # include  // уже включен (см. выше) // Получите библиотеку LCD I2C здесь:// https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads#include  // Обратите внимание на необычный адрес 0x3F, который используется большинством ЖК-дисплеев - 0x27, поэтому, если вы ничего не видите, попробуйте изменить этот firstLiquidCrystal_I2C lcd (0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Установка адреса I2C ЖК-дисплея // конец для ЖК-дисплея // для кнопки # определить кнопку 9 // Тестовый код для модулей Adafruit GPS с использованием драйвера MTK3329 / MTK3339 //// Этот код показывает, как прослушивать модуль GPS в // прерывание, которое дает программе больше «свободы» - просто проанализируйте // когда доступно новое предложение NMEA! Затем при необходимости обращайтесь к данным. //// Протестировано и отлично работает с GPS-модулем Adafruit Ultimate // с использованием чипсета MTK33x9 // ------> http://www.adafruit.com/products/746/ / Купите один сегодня в магазине электроники Adafruit // и помогите поддерживать оборудование и программное обеспечение с открытым исходным кодом! -ada # include  #include  // Если вы используете модуль GPS:// Подключите контакт питания GPS к 5 В // Подключите контакт заземления GPS к земле // При использовании программного обеспечения serial (пример эскиза по умолчанию):// Подключите контакт GPS TX (передача) к Digital 3 // Подключите контакт GPS RX (получение) к Digital 2 // При использовании аппаратного последовательного порта (например, Arduino Mega):// Подключите GPS Контакт TX (передача) к Arduino RX1, RX2 или RX3 // Подключите контакт GPS RX (прием) к соответствующему TX1, TX2 или TX3 // Если вы используете экран Adafruit GPS, измените // SoftwareSerial mySerial (3, 2 ); -> SoftwareSerial mySerial (8, 7); // и убедитесь, что переключатель установлен в положение SoftSerial // Если используется программный последовательный порт, оставьте эту строку включенной // (вы можете изменить номера контактов в соответствии с вашей проводкой):SoftwareSerial mySerial ( 3, 2); // При использовании аппаратного последовательного порта (например, Arduino Mega) закомментируйте // вышеприведенную строку SoftwareSerial и включите вместо нее // (вы можете изменить серийный номер в соответствии с вашей проводкой):// HardwareSerial mySerial =Serial1; Adafruit_GPS GPS (&mySerial); // Установите для GPSECHO значение false, чтобы отключить отображение данных GPS на последовательной консоли. // Установите значение true, если вы хотите отлаживать и прослушивать необработанные предложения GPS. #define GPSECHO false // ---------> выключено // отслеживает, используем ли мы прерывание // по умолчанию выключено! boolean usingInterrupt =false; void useInterrupt (boolean); // Прототип Func поддерживает Arduino 0023 happyvoid setup () {// подключается к 115200, чтобы мы могли достаточно быстро читать GPS и отображать эхо, не отбрасывая символы // также выводим Serial.begin (115200); Serial.println («Базовый тест библиотеки Adafruit GPS!»); // 9600 NMEA - это скорость передачи данных по умолчанию для GPS Adafruit MTK - некоторые используют 4800 GPS.begin (9600); // раскомментируйте эту строку, чтобы включить 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); // в этом коде хорошо то, что вы можете отключать прерывание timer0 // каждую миллисекунду и считывать данные с GPS за вас. это делает код цикла // чертовски проще! useInterrupt (правда); задержка (1000); // Запрос версии прошивки mySerial.println (PMTK_Q_RELEASE); // запускаем lcd lcd.begin (16,2); lcd.backlight (); lcd.clear (); // настройка кнопки pinMode (button, INPUT_PULLUP); } // Прерывание вызывается один раз в миллисекунду, ищет новые данные GPS и сохраняет их SIGNAL (TIMER0_COMPA_vect) {char c =GPS.read (); // если вы хотите отладить, самое время это сделать! #ifdef UDR0 if (GPSECHO) if (c) UDR0 =c; // запись напрямую в UDR0 намного быстрее, чем Serial.print // но за раз можно записать только один символ. #endif} void useInterrupt (boolean v) {if (v) {// Timer0 уже используется для millis () - мы просто прервем где-нибудь // посередине и вызовем функцию «Сравнить A» выше OCR0A =0xAF; TIMSK0 | =_BV (OCIE0A); usingInterrupt =true; } else {// больше не вызывать функцию прерывания COMPA TIMSK0 &=~ _BV (OCIE0A); usingInterrupt =false; }} uint32_t timer =millis (); void loop () // запускаем снова и снова {// в случае, если вы не используете прерывание, указанное выше, вам // потребуется «вручную запросить» GPS, а не рекомендуется:(if (! usingInterrupt) {// считываем данные с GPS в 'основном цикле' char c =GPS.read (); // если вы хотите отладить, сейчас хорошее время для этого! if (GPSECHO) if (c) Serial.print (c);} // если предложение получено, мы можем проверить контрольную сумму, проанализировать его ... if (GPS.newNMEAreceived ()) {// сложная вещь, если мы напечатаем предложение NMEA или данные // мы не слушаем и не улавливаем другие предложения! // поэтому будьте очень осторожны при использовании OUTPUT_ALLDATA и trytng для распечатки данных //Serial.println (GPS.lastNMEA ()); // это тоже устанавливает флаг newNMEAreceived () в значение false if (! GPS.parse (GPS.lastNMEA ())) // это также устанавливает флаг newNMEAreceived () в значение false return; // мы можем не разобрать предложение, и в этом случае мы должны просто ждите другого} // если цикл millis () или таймер завершается, мы просто сбросим его if (timer> millis ()) timer =millis (); static bool second_time_round =false; // примерно каждые 2 секунды распечатываем текущую статистику // if (millis () - timer> 2000) {// timer =millis (); // сбрасываем таймер // Записываем данные в часы, если кнопка нажата - кнопка обычно удерживается на высоком уровне внутренним подтягиванием if (! digitalRead (button)) {// Примечание:RTClib не устанавливает явно регистр дня недели на DS3231. // Вместо этого, когда вы используете dayOfTheWeek (), день рассчитывается по формуле, основанной на дате. // Воскресенье принято равным нулю. //( на основании чтения заголовка библиотеки и файлов ccp) // установить rtc RTC.adjust (DateTime (GPS.year, GPS.month, GPS.day, GPS.hour, GPS.минуты, GPS.секунды)); // ЖК-дисплей lcd.clear (); lcd.setCursor (2,0); lcd.print («Прессованный набор»); задержка (5000); lcd.clear (); } DateTime now =RTC.now (); lcd.setCursor (4,0); lcd.print (now.year (), DEC); lcd.print ('/'); lcd.print (now.month (), DEC); lcd.print ('/'); lcd.print (now.day (), DEC); ЖК-печать (''); lcd.setCursor (4,1); lcd.print (now.hour (), DEC); lcd.print (':'); lcd.print (now.minute (), DEC); lcd.print (':'); lcd.print (now.second (), DEC); lcd.print ("");} 

Схема


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

  1. Что такое установочные винты?
  2. Оставляя прочное наследие
  3. SMRP публикует набор определений показателей M&R
  4. Java 10 — Настройка среды
  5. Что такое заданный квадрат?
  6. Плоское шлифование по старинке
  7. Лучший выбор:токарный станок с ЧПУ Box Way
  8. Что такое набор ударов?
  9. Что такое линейный токарный станок с ЧПУ?
  10. Понимание набора инструментов механика