Часы на дисплее 0.54″ 14-segment LED HT16K33 и GPS модуле (Arduino IDE)

GPS (Global Positioning System) — это глобальная спутниковая система навигации, разработанная и поддерживаемая правительством США. Она позволяет определять координаты и время в любой точке Земли с помощью спутников, которые находятся на орбите вокруг Земли.

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

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

Модуль NEO-6M GPS — это компактное устройство, которое используется для определения координат и времени с помощью спутниковой системы GPS. Модуль NEO-6M GPS включает в себя высокочувствительный приемник GPS-сигналов, а также микроконтроллер для обработки полученных данных.

Основными характеристиками модуля NEO-6M GPS являются:

— Высокая точность определения координат и времени

— Широкий диапазон рабочих температур (-40…+85°C)

— Поддержка нескольких систем спутниковой навигации (GPS, GLONASS, Galileo, BeiDou)

— Низкое энергопотребление (в режиме ожидания — менее 20 мА)

— Интерфейс UART для передачи данных

Для работы с модулем NEO-6M GPS необходимо подключить его к микроконтроллеру или компьютеру через интерфейс UART и настроить его на прием данных от спутников. Модуль можно использовать в различных проектах, связанных с навигацией, геолокацией и мониторингом объектов.

Модуль NEO-6M GPS способен отслеживать до 22 спутников на 50 каналах с большим уровнем чувствительности -161 дБ. Рабочее напряжение модуля 3,3 В (или 5 В при наличии стабилизатора на плате модуля). В модуле установлена микросхема HK24C32 (EEPROM) с объемом памяти 4 КБ, в EEPROM хранятся данные часов, последние данные о местоположении (данные об орбите) и конфигурацию модуля. Батарейка автоматически заряжается при включении модуля и сохраняет данные до двух недель. В модуле установлен светодиод который сигнализирует о состоянии определения местоположения, если светодиод горит но не мигает, значит идет поиск спутников, если светодиод мигает, значит спутники найдены и идет определение местоположения.

Так как модуль NEO-6M GPS позволяет принимать время UTC, то его можно использовать для установки коррекции времени в часах.

UTC (Coordinated Universal Time) — это мировое координированное время, которое используется в качестве стандарта для согласования времени в разных частях мира. Оно основано на атомных часах и корректируется для согласования со сменой года и сезонов. UTC имеет постоянную длительность суток, которая составляет 24 часа.

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

UTC отличается от GMT (Greenwich Mean Time) тем, что он не зависит от времени в Гринвиче и использует атомные часы вместо звездного времени.

Время UTC не имеет временного сдвига относительно времени в Гринвиче (GMT), так как оно является мировым стандартом времени, который используется во всем мире. Однако, время UTC может отличаться от местного времени в зависимости от того, в какой части мира находится конкретное местоположение.

Для согласования времени в разных частях мира используются различные временные зоны, которые отличаются от UTC на определенное количество часов. Например, время в Нью-Йорке отличается от UTC на 5 часов в зимнее время и на 4 часа в летнее время из-за перехода на летнее время.

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

Часы на NEO-6M GPS достаточно простые, дополнительно в часах используется цифровой датчик температуры для вывода температуры в помещении. Дополнительно в часах установлен датчик освещенности в виде фоторезистора, который позволяет менять яркость свечения дисплея в зависимости от освещенности.

Как прошить микроконтроллер LGT8F328P в статье — LGT8F328P-LQFP32 MiniEVB в Arduino IDE. Более подробная информация о модуле NEO-6M описана в NEO-6M GPS (Arduino), про дисплей описано в Дисплей 0.54″ 14-segment LED HT16K33 Backpact (Arduino библиотека).

Схема часов

Показания времени выводятся на дисплей 0.54″ 14-segment LED HT16K33 Backpact, который представляет собой четырех разрядный 14 сегментный (15 сегмент  — запятая на каждом разряде) индикатор которым управляет светодиодный драйвер HT16K33.

ИМС HT16K33 – матричный драйвер светодиодов, также рассчитан на подключение и считывание матричной клавиатуры. Напряжение питания светодиодного драйвера от 4.5 до 5.5 В, ток потребления в активном режиме до 2 мА, а режиме ожидания до 10 мкА. Уровни интерфейса связи с микроконтроллером – 5 В, не совместимы с 3.3 В. Управление осуществляется посредством интерфейса I2C на скорости до 400 кГц, к одной шине I2C можно подключить до 8-и устройств (начальный адрес 0х70).

#define RX      2
#define TX      3
#define time_offset   21600  // смещение от UTC 1 час = 3600
#define KORR_T  -4.5   // DS18B20 коррекция температуры

#include <Wire.h>
#include <4x14LED.h>        // http://rcl-radio.ru/wp-content/uploads/2021/09/4x14LED.zip
#include <EEPROM.h>
#include <TinyGPS++.h>      // https://github.com/mikalhart/TinyGPSPlus/archive/refs/heads/master.zip
#include <TimeLib.h>        // https://github.com/PaulStoffregen/Time/archive/master.zip
#include <SoftwareSerial.h>  
#include <OneWire.h>        // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip                       
  TinyGPSPlus gps;
  SoftwareSerial SoftSerial(TX,RX);   
  HT4x14LED led;
  OneWire  ds(5); // Вход датчика 18b20
 unsigned long times;
 byte last_minute, Second, Minute, Hour, Day, Month;
 int Year;
 int timer;
 bool w=1;


void setup() {
   Wire.begin();
   SoftSerial.begin(9600);
   Serial.begin(9600);   
   led.init(1);
   led.brig(5);//0...15
   led.blink(1);
   led.clear();
   analogReadResolution(4);// АЦП 4 БИТ
   pinMode(A0,INPUT_PULLUP); // INPUT AUDIO
   Serial.println("SERIAL OK");
}

void loop() {
   led.brig(15-analogRead(A0));
   
 while (SoftSerial.available() > 0){
    if (gps.encode(SoftSerial.read())){
      if (gps.time.isValid()){
        Minute = gps.time.minute();
        Second = gps.time.second();
        Hour   = gps.time.hour();
        Serial.println("UTC");
        Serial.print(Hour);Serial.print(":");
        Serial.print(Minute);Serial.print(":");
        Serial.println(Second);
      }
      if (gps.date.isValid()){
        Day   = gps.date.day();
        Month = gps.date.month();
        Year  = gps.date.year();
        Serial.print(Day);Serial.print("-");
        Serial.print(Month);Serial.print("-");
        Serial.println(Year);
      }}}
      
      if(last_minute != gps.time.minute()){ w=1;
        last_minute = gps.time.minute();
        setTime(Hour, Minute, Second, Day, Month, Year);
        adjustTime(time_offset);
        Serial.println("UTC+");
        Serial.print(hour());Serial.print(":");
        Serial.print(minute());Serial.print(":");
        Serial.print(second());
        Serial.print(day());Serial.print("-");
        Serial.print(month());Serial.print("-");
        Serial.println(year());
        Serial.println(week_day());
 }

if (millis() > 5000 && gps.charsProcessed() < 10){
    Serial.println("No GPS detected");
    while(true);}
 
if(Year>=2023){
 
if(Second>=55){
 switch(week_day()){
  case 1:led.print(day()*100, 0,   -1, -1,0x37,0xF6);break;
  case 2:led.print(day()*100, 0,   -1, -1,0x2479,0x1201);break;
  case 3:led.print(day()*100, 0,   -1, -1,0x39,0x471);break;
  case 4:led.print(day()*100, 0,   -1, -1,0xE6,0x1201);break;
  case 5:led.print(day()*100, 0,   -1, -1,0x37,0x1201);break;
  case 6:led.print(day()*100, 0,   -1, -1,0x39,0x2079);break;
  case 0:led.print(day()*100, 0,   -1, -1,0x2479,0x39);break;
  } 
  delay(1000);
}

if(Second>=50 && Second<55){ 
  if(w==1){led.print(int(dsRead(0)*100), 2,   -1, -1,-1,0x39);}
  w=0;delay(1000);
  }
 
 if(Second<50){
  timer=hour()*100+minute();
   led.print(timer, 0,   -1, -1,-1,-1);
   delay(500);
   led.print(timer, 2,   -1, -1,-1,-1);
   delay(500);
 }
}// 2023

else{
   led.print(timer, 0,   0xed, 0x39,0xf7,0x2136);
   delay(500);
   led.print(timer, 0,   0, 0,0,0);
   delay(500);
  }
 //Serial.println(dsRead(0));

}// end loop

unsigned int f_div(unsigned int x, unsigned int y){
  unsigned int result;
  result = (x - (x % y)) / y;
  return result;
}

byte week_day(){
  byte a = f_div((14 - month()), 12);
  unsigned int y = year() - a;
  byte m = month() + 12 * a - 2;
  unsigned int y4 = f_div(y, 4);
  byte y100 = f_div(y, 100);
  byte y400 = f_div(y, 400);
  byte x = f_div(31 * m, 12);
  byte wd = (day() + y + y4 - y100 + y400 + x) % 7; 
  return wd;
} 

float dsRead(byte x) {
  byte data[2], addr[8][8], kol = 0;
  while (ds.search(addr[kol])) {  // поиск датчиков, определение адреса и кол-ва датчиков
    kol++;
  } 
  ds.reset_search();  // Сброс поиска датчика
  ds.reset();         // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Обращение к датчику по адресу
  ds.write(0x44, 0);  // Измерение температуры с переносом данных в память
  ds.reset();         // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Обращение к датчику по адресу
  ds.write(0xBE);     // Обращение памяти
  for (byte i=0; i<9; i++) data[i]=ds.read();
  int raw=(data[1]<<8)|data[0];
  float value = (float)raw *0.0625 + KORR_T; return value; // Расчет температуры и вывод
}

Скетч часов нуждается в корректировке двух параметров:

  • #define time_offset   21600  // смещение от UTC 1 час = 3600
  • #define KORR_T  4.5   // DS18B20 коррекция температуры

Первый параметр это сдвиг в секундах от времени UTC, второй параметр это корректировка показаний температуры датчика.

Рекомендуется устанавливать датчик температуры DS18B20 вне корпуса часов, при установке в корпусе возможен дополнительный нагрев датчика от других элементов схемы.

После включения часов модуль NEO-6M GPS начнет искать спутники, на это может потребоваться определенное время, при этом на дисплей будет выводится надпись SCAN.

После определения времени, часы с 0 по 50 секунду выводят время, далее с 50 по 55 секунду температуру, а с 55 по 59 секунду день недели и дату.

Форум — http://forum.rcl-radio.ru/viewtopic.php?id=562


 

Comments

  1. Привет. Повторил проект. Поставил модуль neo8 ,спутники поймал недалеко от окна. Грузил основной скетч из статьи.
    Если возможно как отключить датчик температуры , мне это не нужно.

    Привет.

    1. Удалите

      if(Second>=50 && Second<55){
      if(w==1){led.print(int(dsRead(0)*100), 2, -1, -1,-1,0×39);}
      w=0;delay(1000);
      }

      замените

      if(Second<50){
      timer=hour()*100+minute();
      led.print(timer, 0, -1, -1,-1,-1);
      delay(500);
      led.print(timer, 2, -1, -1,-1,-1);
      delay(500);
      }

      на

      if(Second<55){
      timer=hour()*100+minute();
      led.print(timer, 0, -1, -1,-1,-1);
      delay(500);
      led.print(timer, 2, -1, -1,-1,-1);
      delay(500);
      }

  2. liman28 МОЯ БЛАГОДАРНОСТЬ ЗА ОПЕРАТИВНУЮ ПОМОШЬ.

    p.s. При настройке часов посмотрите по телефону что со спутниками , а то есть такая штука как рэб.

Добавить комментарий

Войти с помощью: