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
Привет на ардуинке уно работать не будет ? Компиляции идет с ошибкой. Ставлю LGT8F328P , проблем нет.
Это из-за
analogReadResolution(4);// АЦП 4 БИТ
А так все совместимо с UNO
То есть покупать платку LGT8F328P ?
Как хотите, можно использовать LGT8F328P или Arduino Nano на Atmega328.
Так что с ошибкой делать ?
Просто закомментировать строку:
//analogReadResolution(4);
Спасибо , зто наш метод , загрузил.
Привет. Повторил проект. Поставил модуль neo8 ,спутники поймал недалеко от окна. Грузил основной скетч из статьи.
Если возможно как отключить датчик температуры , мне это не нужно.
Привет.
Удалите
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);
}
liman28 МОЯ БЛАГОДАРНОСТЬ ЗА ОПЕРАТИВНУЮ ПОМОШЬ.
p.s. При настройке часов посмотрите по телефону что со спутниками , а то есть такая штука как рэб.