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

Точное время: синхронизация DS3231 RTC с GPS на Arduino Nano

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

О проекте

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

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

Схема подключения

I2C LCD backpack → Arduino:

DS3231 → Arduino:

Преобразователь уровней → Arduino:

NEO-6M GPS → преобразователь уровней:

Кнопка:

Питание

Питание через USB-кабель.

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

99% кода — это парсинг из примера parsing.ino библиотеки Adafruit GPS. Добавлен код для передачи времени GPS в DS3231 и вывода времени на LCD.

Используемые библиотеки

Работа устройства

  1. Включите блок.
  2. LCD покажет текущие дату и время из DS3231.
  3. Подождите, пока GPS зафиксирует спутники.
  4. Нажмите кнопку для установки времени по GPS.
  5. LCD покажет новое время.

Ограничения

Особенности GPS-модуля

Купленный модуль просто назывался «NEO 6M GPS», на плате был стабилизатор 4A2D (3.3В), но не гарантировано, что линии связи тоже преобразованы. Поэтому использован преобразователь уровней.

Разные GPS-модули по-разному ловят сигнал в помещении, поэтому добавлен LCD для переноса на улицу.

Особенность LCD

Мой I2C-адрес 0x3F (большинство используют 0x27). Если ничего не видно — смените адрес.

Особенность библиотеки RTCLib

Библиотека устанавливает регистры времени и даты, но не регистр дня недели. День недели вычисляется формулой из даты. Это удобно — не нужно корректировать на високосные годы.

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

Для моего часового пояса корректировка UTC не требовалась. При необходимости добавьте код самостоятельно.

Ссылки

[1] Datasheet NEO-6M: https://www.u-blox.com/sites/default/files/products/documents/NEO-6_DataSheet_(GPS.G6-HW-09005).pdf

Исходный код

Код настройки DS3231 по GPS

// Date and time functions using a DS3231 RTC connected via I2C and Wire lib
#include 
#include "RTClib.h"
RTC_DS3231 RTC;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
const int days_string_length = 12;

// for lcd display
#include 
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

#define button 9

#include 
#include 
SoftwareSerial mySerial(3, 2);
Adafruit_GPS GPS(&mySerial);
#define GPSECHO false
boolean usingInterrupt = false;
void useInterrupt(boolean);

void setup() {
  Serial.begin(115200);
  Serial.println("Adafruit GPS library basic test!");
  GPS.begin(9600);
  GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
  GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
  GPS.sendCommand(PGCMD_ANTENNA);
  useInterrupt(true);
  delay(1000);
  mySerial.println(PMTK_Q_RELEASE);
  lcd.begin(16,2);
  lcd.backlight();
  lcd.clear();
  pinMode(button, INPUT_PULLUP);
}

SIGNAL(TIMER0_COMPA_vect) {
  char c = GPS.read();
#ifdef UDR0
  if (GPSECHO) if (c) UDR0 = c;
#endif
}

void useInterrupt(boolean v) {
  if (v) {
    OCR0A = 0xAF;
    TIMSK0 |= _BV(OCIE0A);
    usingInterrupt = true;
  } else {
    TIMSK0 &= ~_BV(OCIE0A);
    usingInterrupt = false;
  }
}

uint32_t timer = millis();

void loop() {
  if (!usingInterrupt) {
    char c = GPS.read();
    if (GPSECHO) if (c) Serial.print(c);
  }
  if (GPS.newNMEAreceived()) {
    if (!GPS.parse(GPS.lastNMEA())) return;
  }
  if (timer > millis()) timer = millis();
  static bool second_time_round = false;
  if (!digitalRead(button)) {
    RTC.adjust(DateTime(GPS.year, GPS.month, GPS.day, GPS.hour, GPS.minute, GPS.seconds));
    lcd.clear();
    lcd.setCursor(2,0);
    lcd.print("Pressed set");
    delay(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.print(' ');
  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(" ");
}

Схемы

Точное время: синхронизация DS3231 RTC с GPS на Arduino Nano
Точное время: синхронизация DS3231 RTC с GPS на Arduino Nano

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

  1. Грунтовые винты (set screws): конструкция, отличия и применение
  2. Оставляя наследие: аутентичное лидерство для лучшего будущего
  3. SMRP выпускает стандартизированный набор KPI для профессионалов обслуживания и надежности
  4. Настройка среды разработки Java 10: сборка, компиляция и запуск
  5. Угольники: назначение, типы и применение в техническом черчении
  6. Плоское шлифование: традиционные техники для точности
  7. Почему токарный станок с коробчатыми направляющими — оптимальный выбор для точности и производительности
  8. Наборы кernenов (пробивок): полное руководство
  9. ЧПУ-токарные станки с линейными направляющими: точность, скорость, легкое производство
  10. Полное руководство по выбору правильного набора инструментов механика