Основная идея заключалась в создании самонастраивающихся часов, которые должны работать в часовом поясе CET с поддержкой перехода на летнее время. В качестве источника времени я использовал сигнал GPS, полученный от модуля NEO-7M, который имеет последовательный порт. В качестве блока индикации я использовал 2,9-дюймовый дисплей e-Paper (электронно переворачиваемые «листы» бумаги с цифрами). Все эти модули подключены к Arduino Nano.
Схема подключения модулей
Ниже представлена ??схема подключения модулей:
- модуль GPS использует последовательный порт для связи,
- дисплей e-Paper использует 4-строчный SPI для связи.
Программа
Программа была написана в Arduino IDE. Я использовал следующие библиотеки:
- TinyGPS ++ — для декодирования полученного сигнала GPS и разбора времени и даты,
- U8g2lib — для управления дисплея e-Paper,
- Часовой пояс — для управления временем и датой в заданном часовом поясе и поддержкой летнего времени (дело происходит в Восточной Европе, прим. переводчика).
Диаграмма
1. Первый шаг — инициализация платформы: серийный номер программного обеспечения для приема данных с модуля GPS, отображение e-Paper, начальное значение даты и времени.
2. На втором этапе мы получаем данные от последовательного порта. Полученный сигнал GPS анализируется.
3. Если данные GPS действительны, мы обновляем дату и время.
4. На этом этапе мы обновляем время на дисплее e-Paper.
Исходный код (также доступен во вложении к конце статьи)
/ *
Самонастраивающиеся часы для часового пояса CET с DST
по kk99
2018
* /
# include <SoftwareSerial.h>
# include <TinyGPS ++. h>
# include <SPI.h>
# include <U8g2lib.h>
# include <Timezone.h>
# include <Arduino.h>
// дескриптор GPS
TinyGPSPlus gps;
// дескриптор EDP
U8G2_IL3820_V2_296X128_1_4W_HW_SPI u8g2 (U8G2_R0, / * cs = * / 10 , / * dc = * / 9 , / * reset = * / 8 ) ;
// Центральноевропейское время
TimeChangeRule CEST = { "CEST" , Last, Sun, Mar, 2 , 120 }; // Центральноевропейское летнее время
TimeChangeRule CET = { "CET" , Last, Sun, Oct, 3 , 60 }; // Центрально-европейский стандартный часовой
пояс CE (CEST, CET) ;
TimeChangeRule * tcr;
// Серийный дескриптор
SoftwareSerial softSerial ( 3 , 2 ) ;
void setup () {
// поместите здесь свой установочный код, чтобы запустить его один раз:
u8g2.begin ();
softSerial.begin ( 9600 );
setTime ( 00 , 00 , 00 , 01 , 01 , 1970 );
}
void loop () {
// поместите ваш основной код здесь для повторного запуска:
readGPSData ( 1000 );
Время обновления();
displayTime ();
задержка ( 59000 );
}
static void readGPSData ( unsigned long timeoutMs)
{
unsigned long start = millis ();
делать
{
while (softSerial.available ())
gps.encode (softSerial.read ());
} while (millis () - start <timeoutMs);
}
static void updateTime ( void ) {
if (gps.time.isValid () && gps.date.isValid ()) {
setTime (gps.time.hour (), gps.time.minute (), gps.time.second (), gps.date.day (), gps.date.month (), gps.date.year ()) ;
}
}
static void displayTime ( void )
{
const unsigned timeLength = 6 ;
char timeValue [timeLength];
time_t utc = now ();
time_t local = CE.toLocal (utc, & tcr);
snprintf (timeValue, timeLength, "% 02d:% 02d" , час (местный), минута (местный));
u8g2.firstPage ();
делать {
u8g2.setFont (u8g2_font_logisoso78_tn);
u8g2.drawStr ( 26 , 103 , timeValue);
} while (u8g2.nextPage ());
}
Короткая видео презентация
Используемые электронные компоненты
1 ? 2,9 'дисплей e-Paper (электронно переворачиваемые «листы» бумаги с цифрами),
1 ? Arduino Nano,
1 ? НЕО-7М
Исходный код
164955
Комментарии (131)
staticmain
30.04.2019 10:41+2За схематику в виде картинки с ардуиной и за неотформатированный код хочется убивать.
little-brother
30.04.2019 11:11+1А что не так со схематикой? Инженерам такая статья в принципе интересна быть не может, а новичкам по картинке схему повторить проще.
С форматированием кода, да, — беда. Однако можно было бы просто отправить автору-переводчику приват, чтобы код завернул в тег code.augorelov
30.04.2019 11:15+1Не новичкам, а "ардуинщикам". Учиться надо на нормальных схемах электрических принципиальных, а не на таких картиночках.
little-brother
30.04.2019 11:33Кому что требуется. Если знаний нет, а собрать что-то хочется, то лучше быть Ардуинщиком, чем утонуть в программировании/схемотехнике и вовсе ничего не сделать.
P.S. Сам из секты Arduino :DAndy_Big
30.04.2019 11:41Но зачем оповещать весь мир о своем незнании и неумении? :)
little-brother
30.04.2019 11:47Тут проблема связанная с тем, что новичкам слишком сложно читать статьи написанные профессионалами для профессионалов, которым многие вещи очевидны (см. Проклятие знания). В статьях же новичков для новичков зачастую описываются теже грабли, на которые другой новичок может наступить.
olartamonov
30.04.2019 11:48А идея читать книги вообще и учебники в частности, я так понимаю, окончательно вышла из моды?..
little-brother
30.04.2019 11:55Вряд ли кто-то станет отрицать, что инструкцию что от техники, что от таблеток редко кто читает. Абсолютно аналогичная ситуация с учебниками. Человеческий мозг работает так, что «здесь и сейчас» превалирует над «надо поучить, зато потом окупится сторицей».
Учебник стоит читать, если потом это нужно будет для получения денег/развития своего проекта. А для сборки часов, метеостанции, автоматического лотка для кошки и прочей DIY-мелочевки — зачем?
Перфекционизм он не всегда нужен.olartamonov
30.04.2019 12:08+1А для сборки часов, метеостанции, автоматического лотка для кошки и прочей DIY-мелочевки — зачем?
А чьи-то статьи вам зачем для этого тогда читать?
Вполне хватит инструкции в картинках, какой проводок куда вставлять.
(впрочем, многие тут заметят, что по сути «статьи» к этому и сводятся)Andy_Big
30.04.2019 12:10+2Он про то и пишет — что читать ничего не надо, это труд и сложно для мозга. Картинки и Ютуб — вот это современный уровень :)
NordicEnergy
30.04.2019 12:57Картинки и Ютуб — вот это современный уровень :)
Тут надо смириться, что большинство людей не хотят и не могут обрести знания уровня хотя бы начинающего инженера. При этом много всяких менеджеров, продаванов, сантехников, которые таки хотят собрать себе умный туалет. Они вынуждены обращаться к ютубу и картинкам, т.к. большего они не могут осилит. Не всем дано рисовать, так же не всем дано создавать многослойные платы.
augorelov
30.04.2019 12:10Учебник стоит читать, чтобы метеостанция не показывала погоду на Марсе. Или для сборки кошачьего туалета, как в этой статье.
yefrem
30.04.2019 15:54+1я иногда играю в Starcraft, но совершенно не планирую читать о нем книги (они существуют, да). Мне вполне достаточно моей деревянной лиги, чтоб вечером после работы поиграть с такими же нубами, как я. Вот так и здесь.
То, что для вас это серьезная профессия, совершенно не означает, что все вокруг должны так же серьезно ее воспринимать.augorelov
30.04.2019 16:02Научитесь отделять мух от котлет. Попробуйте на сайте проф. игроков написать статью про то, как надо играть со своим уровнем нуба. Узнаете реакцию.
yefrem
30.04.2019 16:03Это уже другой вопрос. Хотя, туториалы с нубскими стратегиями вполне себе существуют, просто про-игроки туда не заходят
Andy_Big
30.04.2019 16:04Тут совсем другое. Глядя на подавляющее большинство трудов ардуинщиков чувствуешь себя как сантехник, смотрящий на вот это:
Andy_Big
30.04.2019 11:56новичкам слишком сложно читать статьи написанные профессионалами
Учиться нынче не в почете? Хоть что-то почитать о тех деталях, из которых собираешься слепить что-то? Ну, например, узнать, что ардуина питается (и выдает на выходы) 5 вольт, а тот же модуль GPS допускает на своих входах максимум 3.6 вольта? :)
В статьях же новичков для новичков зачастую описываются теже грабли, на которые другой новичок может наступить.
А кроме описанной пары граблей молча прикладывается десяток других, неописанных. Просто потому что автор сам не в курсе их существования из-за недостатка знаний.little-brother
30.04.2019 12:01Учиться — это труд и это сложно для мозга, который старается избежать этого.
Да, грабли в статьях от новичков имеются — это неизбежное зло. Однако отмечу, что у автора (оригнал статьи) устройство заработало. Сколько оно проработает — это уже другой вопрос.Andy_Big
30.04.2019 12:05+1Учиться — это труд и это сложно для мозга
Поэтому лучше учить других? Как сделать то, в чем сам не разбираешься? :)
отмечу, что у автора (оригнал статьи) устройство заработало
В чем его заслуги чуть больше нуля.
augorelov
30.04.2019 12:06+1Учиться — это труд и это сложно для мозга, который старается избежать этого.
Какой у Вас ленивый мозг.little-brother
30.04.2019 12:21У вас мозг видимо другой, отличный от большинства обывателей этой планеты. Этому можно только позавидовать.
Поэтому лучше учить других?
Тут статья из серии «Смотрите у меня получилось!» и человеку захотелось поделиться. Обучения как такового в статье нет.
В целом, я понимаю точку зрения, что «Работа должна выполняться профессионалом». Однако, в реальном мире в редких областях это действительно так.augorelov
30.04.2019 12:25+1Статьи из серии «Смотрите, что я сделаль, а оно ещё и работает!» не для Хабра. Для этих целей есть профильные сообщества.
little-brother
30.04.2019 12:34+1Насколько я понимаю, автор статьи и опубликовал её в профильном сообществе. То, что она появилась на Хабре — минус переводчика.
augorelov
30.04.2019 12:45+1Самый жирный минус переводчика, автора статьи на Хабре, в качестве перевода. А это показатель низкого уровня знаний в тематике. А низкий уровень знаний в тематика в отсутствии желания учиться. Хотя зачем учиться, это, по Вашим словам, бесполезная трата времени.
little-brother
30.04.2019 13:03-1Хотя зачем учиться, это, по Вашим словам, бесполезная трата времени.
Просьба указать сообщение, в котором я такое написал. Если вы имели в виду вот это, то увы, там речь шла про учебник. А читать учебник и учиться — это несколько разные вещи.augorelov
30.04.2019 13:13+1Обучение без чтения профильной литературы (учебников) не бывает.
little-brother
30.04.2019 13:25Не могу согласиться со столь категоричным заявлением. С моей точки зрения чтение учебников — это всего лишь один из способов обучения.
augorelov
30.04.2019 13:34Научится читать можно и без профильной литературы, а рассчитать антенный контур или импульсный источник питания не получится.
augorelov
30.04.2019 11:45С таким подходом и начинать не стоило.
little-brother
30.04.2019 11:48Точно, надо сразу рождаться профессионалом в своей области!
augorelov
30.04.2019 11:57Как минимум учиться по книгам, чтобы повышать свои навыки и умения. А не по картиночках для глупых и копипасту бестолковых программ, не понимая что она делает и почему именно так.
augorelov
30.04.2019 13:18+1Правильно подметил olartamonov, чтение профильной литературы не в почете. Судя по минусующим комментарий.
seri0shka
03.05.2019 14:49С таким подходом и начинать не стоило.
Большая часть того, чем мы занимаемся в свободное от работы и семьи время, вызывает вопросы «зачем, ведь можно купить готовое?», «зачем, ведь другие уже сделали лучше?», «зачем, это не стоит потраченного времени», и т.д.
В результате многие проводят значительную часть жизни, уставившись в телевизор, планшет, или с пивом на лавочке. Это лучше?
avost
01.05.2019 01:00А что полезного, в данном случае, даст публикация полной схемы ардуины + гпс-модуля + модуля экрана? Это не несёт ни какого смысла. Никто не полезет внутрь гпс-модуля, всё взаимодейставе идёт на уровне интерфейсов и функциональных блоков. Знать, что D5 ардуины подключён к Rx гпс-ки для понимания работы мне необходимо. Знать номинал резистора в смесителе радиочастотной части гпс — нет. Публикация полной схемы электрической принципиальной только запутает и ухудшит понимание принципов работы прибора, ничего полезного не дав взамен. Вы ещё посетуйте, что прошивку в хекс-кодах не опубликовали в статье, как это было принято в журнале "коневодство" (то, есть, простите, "радио"). Да и то там это просто вынужденно делали...
augorelov
01.05.2019 06:54Сколько же вас «ардуинолюбов» бестолковых?! Учите основы. На схемах принципиальных электрических не обязательно изображать подробно каждый модуль. Для таких как Вы придумали ещё схемы соединений.
avost
02.05.2019 01:01Вы, должно быть, чересчур умны, чтобы заметить это, но на иллюстрации изображена именно схема соединений, дорогое невоспитанное подзаборное хамло.
augorelov
02.05.2019 07:45Если это схема соединения, то вернитесь в ясли малолетний «ардуинолюб». В статье именно цветная картиночках и никакого отношения к схеме она не имеет.
Я никому не хамил в отличие от Вас. Ещё надо посмотреть кто из нас необразованное и невоспитанное подзаборное хамло.
И в отличие от Вас, я действительно образован и умен.lenz1986
02.05.2019 07:54НА самом деле это и есть схема соединений. Принятая как стандарт в среде ардуино. И рисуется она в программе разработанной ими же fritzing. Это именно та схема соединений которая понятна всем ардуинщикам. Им нельзя дать реальную принципиалку, и реальную схему соединений, могут банально не разобраться, а вот по такой схеме конструкцию может повторить любая домохозяйка, изначально в этом ее суть.
P.S> Да и на самом деле, зря вы нападает на среду ардуино. На самом деле очень изюмительная штука, когда надо пощупать что то быстро и без разбора в регистрах нового датчика, просто взял — включил и оно работает. Я так множество датчиков тестирую. Это очень удобно, да и плюс все датчики и сенсоры что продаются на али, все уже изначально подготовлены под интерфейс ардуины, взял проводки воткнул и все завертелось.augorelov
02.05.2019 09:04Раз принята в среде «ардуинолюбов», пускай и сидят и картиночки рисуют на своих сайтах и в своих сообществах. Хабр все таки более технический сайт, а не сборище домохозяек.
З.Ы.
Зная, как пишут библиотеки для Ардуино, у Вас вряд ли получится использовать все характеристики датчика не изучая его регистры. Вот мне не составляет проблемы быстро накидать программу без среды Ардуино для проверки работы внешних датчиков, исполнительных устройств и т.д.
Мне Вас немного жаль, раз Вы так тестируете.lenz1986
02.05.2019 11:40Тесты это взял включил и посмотрел а что выходит а как оно там работает. Понятно что в работе потом взял аппноут\датащит и посмотрел что в библиотеке ардуины 64-е лишних телодвижения, когда можно было банально 3 регистра прописать с нужной конфигруацией.
olartamonov
02.05.2019 12:18Как оно работает — на любой датчик прекрасно описано в даташите, первая страница плюс раздел «Application».
А как оно работает на самом деле, особенно в сложных условиях — с ардуиновскими библиотеками вы достоверно установите примерно никогда.
avost
03.05.2019 03:10-2В статье именно цветная картиночках и никакого отношения к схеме она не имеет.
А, то есть вы даже не знаете как выглядят схемы соединений? Тогда понятно, почему вместо конструктивных аргументов вы используете личные оскорбления. Умище так и прёт, так и прёт!
Я никому не хамил
Вы не только хамло позорное, но и брехло подзаборное.
Давайте просто процитирую :
вернитесь в ясли малолетний «ардуинолюб
Сколько же вас «ардуинолюбов» бестолковых?!
Статьи из серии «Смотрите, что я сделаль, а оно ещё и работает!
Какой у Вас ленивый мозг.
Диагноз: "Ардуинщик" классический.
Чукча не читатель…
"Ардуинщик" неразумный взялся за перевод статьиСобственно, ничего иного, кроме оскорблений окружающих и хамства вы в теме не написали. Поздравляю вас, вы — брехливое хамло.
в отличие от Вас, я действительно образован и умен.
Более искушены в хамстве и вранье, это точно. Но тут меня не сложно победить, да я пытаться не буду — слаб я в этом, не то, что вы, такой умище, что не можете схему соединений не то, что прочесть, но даже опознать! Фу, позорище.
augorelov
03.05.2019 08:32Как раз в отличие от Вас я знаю, как выглядит схема соединений. В отличие от Вас схемы электрические разных видов за моим авторством проходили нормаконтроль и проверку военпредов. Так кто из нас неуч?
Ах, Вас задевают "Ардуинщик" и "Ардуинолюб", ну извините, пока Вы и такие же как Вы необразованные товарищи будете писать безграмотные статьи, я называл и буду так продолжать называть все ваше сборище.
GennPen
03.05.2019 16:34Загуглите первое что предлагают по запросу «схема соединений».
Есть определенные стандарты схем. А то что кто-то продвигает свой вид «схем» — это «я художник, я так вижу».
devil_oper
02.05.2019 09:14+1Это не схема. Это картинка. Разница между ними разъяснялась в детской книжке Борисова сразу после решения вопроса «где взять диод для детекторного приемника».
Salavat
30.04.2019 10:52Вот бы еще питание от солнечной панели и всё залить эпоксидной смолой. Полная автономность, походность… Хватит питания?
olartamonov
30.04.2019 11:02+1Вопрос про энергопотребление средний автор успешного ардуино-проекта, я так понимаю, воспринимает как прямое оскорбление и попытку унизить его человеческое достоинство.
Питания-то хватит, только сначала надо вот эту наколенную поделку выкинуть целиком и сделать нормально.Andy_Big
30.04.2019 11:49Прикинул ради интереса — при нормальной реализации такие часы смогут работать минимум 7-8 месяцев на аккумуляторе 18650 емкостью 2400 мА*ч :)
olartamonov
30.04.2019 12:06Сильно больше.
У дешёвого 3-дюймового графического e-ink обновление части экрана занимает 300 мс, жрёт он при этом в пределах 10 мА, обновлять надо раз в минуту одну цифру, раз в 10 минут две цифры, etc.
GPS более чем достаточно включать раз в неделю на пару минут.
Всё остальное время потребление всего этого хозяйства < 10 мкА.
А работать нормально оно всё равно не будет, потому что в типовом железобетонном доме ставить часы придётся на окно, чтобы они что-то там поймали хотя бы теоретически.Andy_Big
30.04.2019 12:15Ну, я считал с допущениями по максимуму — GPS раз в сутки по минуте с потреблением 30 мА, обновление экрана — 1000 мс с потреблением 20 мА, потребление всего в спячке — 50 мкА :)
За неделю RTC на обычном часовом кварце может и убежать довольно сильно :)olartamonov
30.04.2019 12:30Обычный кварц — это не хуже 30 ppm, за неделю меньше 20 секунд уход.
Andy_Big
30.04.2019 12:41Это если нормальный кварц, а не китайский с Алиэкспресса :)
olartamonov
30.04.2019 15:42И тут я посмотрел в код этого мегадевайса и неприлично взоржал:
void loop() { // put your main code here, to run repeatedly: readGPSData(1000); updateTime(); displayTime(); delay(59000); }
Аффтар проверяет время каждые 59 секунд, то есть, его часы by design имеют отставание до 1 минуты. На ровном месте.
А мы тут кварцами меряемся.
Upd. А хотя ладно, дальше он кладёт в системные часы и секунды тоже, а ещё дальше берёт время из них. Но зачем тогда ежеминутно дёргать GPS? Ну или, наоборот, зачем эта задержка в 59 секунд, когда просто сиди да читай что тебе GPS сам в консоль сыпет? Загадки, одни загадки.Andy_Big
30.04.2019 15:55Угу, я тоже оценил этот ход. Даже представил рассуждения автора: «Таак, тут мы ровно одну секунду читаем GPS, потом обновляем время на экране (раз я тут не ставлю задержку значит обновление происходит мгновенно) и делаем паузу ровно 59 секунд. И получается обновление экрана раз в минуту с точностью до миллисекунды — ну не зря же задержку в миллисекундах надо указывать. Бинго!».
Автор, похоже, из того же лагеря ардуинистов, что и little-brother — не учиться же, напрягая мозг и себя, в самом деле-то…olartamonov
30.04.2019 16:16Меня просто поражает каждый раз вот это сочетание масштабности и бессмысленности в типичных ардуино-проектах.
То есть наворочен какой-то код, который, видимо, автору казался логичным и нужным, но есть очень серьёзные сомнения, что даже он сам сможет объяснить, почему он ему таким казался.NordicEnergy
30.04.2019 16:23почему он ему таким казался
Потому что этот код был в скетче откуда он содрал этот кусок программы, а выкинуть побоялся — вдруг сломается.
Andy_Big
30.04.2019 16:40Я так подозреваю, что автор самостоятельно наворотил максимум 5 строчек, а остальное надергал из других скетчей и примеров к тем пяти чужим библиотекам, из которых, в общем-то, и состоит вся прошивка.
augorelov
30.04.2019 17:01Классический подход любителей ардуино.
Andy_Big
30.04.2019 18:04Потому что сама ардуина подталкивает к такому подходу. И широко пропагандируется она именно для такого ее использования.
garageman
01.05.2019 10:00Нет, классический подход — это посмотреть как написано в библиотеке, понять почему именно так и использовать. Если не удалось понять или написано плохо — переписать с нуля.
Andy_Big
30.04.2019 11:19Этому поделию — нет, не хватит. Но если выкинуть ардуину с ее кодом и заменить ее нормальным микроконтроллером с нормальным кодом, то хватит.
Stanislavvv
30.04.2019 13:56По-моему, тут даже выкидывать ардуину не обязательно. Достаточно написать нормальный код. Там обычная atmega, которая умеет достаточно энергосбережений, чтоб не жрать попусту.
Andy_Big
30.04.2019 14:50Энергосбережение умеет, не спорю. Хотя и далеко не так хорошо как какая-нибудь STM8L. Но во-первых нет удобного (для часов) выхода из энергосбережения, а во-вторых нет часов реального времени.
moviq
30.04.2019 18:44Сделал на atmega48PA с часовым кварцем, работающем в асинхронном режиме на таймере2. Всё время сплю, по прерыванию таймера просыпаюсь каждые 20мс, вывожу через SPI данные на в 4 регистра HC595 для LCD от мультиметра, засыпаю. А время считываю с DS1302 раз в секунду по тому же SPI )
Andy_Big
30.04.2019 21:10На STM32L это решилось бы без внешних регистров и время с DS считывалось бы раз в сутки… Или раз в неделю :) Батареек хватало бы на раз в десять дольше :)
moviq
01.05.2019 11:11Ну наверное и я бы мог раз в сутки/неделю считывать время :) Я для 1302 делал доп. коррекцию внешними конденсаторами для улучшения точности. Всё это у меня потребляет около 100мкА. Работает от 3-х Б/У батареек AAA
ieroglyph
30.04.2019 11:07Интересует, измерялся ли реальный общий ток потребления данных часов?
olartamonov
30.04.2019 11:12+1А там измерять — только расстраиваться: у чувака GPS фигачит непрерывно, это само по себе миллиампер двадцать. Плюс неспящая атмега ещё столько же.
Первые в мире часы на E-ink, которые не могут работать от батарейки.
seg1 Автор
30.04.2019 11:20В статье-оригинале (ссылка на неё есть в шапке) автор не приводит эту информацию.
Andy_Big
30.04.2019 11:08+1А зачем исходник сунули в переводчик?
readGPSData ( 1000 );
Время обновления();
displayTime ();
задержка ( 59000 );
Ну почему нельзя нормально перевести даже такую короткую заметку?
e-Paper (электронно переворачиваемые «листы» бумаги с цифрами)
серийный номер программного обеспечения для приема данных с модуля GPS, отображение e-Paper
4-строчный SPI для связи
Или переводчик не владеет тематикой — тогда зачем браться? Или перевод сделан по принципу «вот вам гуглоперевод, отстаньте от меня» — тогда зачем вообще его публиковать?
И откуда в последнее время пошла мода кое-как переводить всякую ерунду с hackaday.io? Без знаний по теме, без какой-либо изюминки, без хоть какого-то старания… Зачем оно здесь?REPISOT
30.04.2019 11:14Забавно, что пригласил его tormozedison, который штампует такие же переводы с ардуинами.
olartamonov
30.04.2019 11:14+1И откуда в последнее время пошла мода кое-как переводить всякую ерунду с hackaday.io? Без знаний по теме, без какой-либо изюминки, без хоть какого-то старания… Зачем оно здесь?
Публикуешь пять бессмысленных переводов гуглотранслейтом — и вот уже можно называть себя «регулярный автор популярного ресурса Хабрахабр» и соваться в корпоративные блоги с предложением за денежку малую…lenz1986
30.04.2019 20:21ОООО а так можно было????
olartamonov
30.04.2019 21:31Я нигде не обещал, что автора настигнет успех.
С другой стороны, вот за этот опус ему уже чуть-чуть в карму да капнуло, будет упорен в глулотранслейте и научится поменьше лажать в технических вещах («Время обновления();») — да норм, за несколько месяцев карму в +NN вытащит, а там можно и услуги начать предлагать, если бедненько — то через фрилансерские биржи, а там и прямые выходы в PR-отделы появятся.lenz1986
30.04.2019 21:33Вон оно как… Ясно спс за наводку, щас тоже что нить напишу 0))))
olartamonov
30.04.2019 22:06Вы так смайлики ставите, как будто я шучу.
А я вот во вполне технологической области реально и лично знаю человека, который везде выступает как видный эксперт просто потому, что ему однажды зачем-то захотелось прослыть экспертом в этой области. Дальше всё по накатанной — завёл страницу во вконтакте, канал в телеге, стал копипастить туда новости по теме, начал везде подписываться экспертом. В области, в которой он эксперт, он сам при этом руками делает ровным счётом ничего и опыт имеет ровным счётом никакой.
Но кто-то вот на подработку на написании текстов карму набирает, а кого-то уже и СМИ периодически цитируют.lenz1986
02.05.2019 07:59я так не смогу… Я не спец ни в чем… я тока учусь… А смайлики это я в шоке был, хотя предполагал о таком развитии событий.
P.S> А можно Вам в личку пару вопросов задать?) Вы вроде с нордиками плотно работаете… Я тут с ними играюсь и че та встрял… А дев зон гады молчат (olartamonov
02.05.2019 10:39Ну попробуйте, хотя вот именно я планирую с ними работать примерно так с завтрашнего дня, специально на праздники домой наших модулёчков взял. Но если что, я переадресую тому, кто уже работает.
dlinyj
30.04.2019 11:19+1Заходим на hackaday, берём и переводим любую статью на habr.
Браво, вы прекрасны.
ИМХО, все переводы с hackaday надо запретить. Ибо какой смысл читать одно и то же в двух местах.Andy_Big
30.04.2019 11:30Тем более такие статьи с таким переводом. Тут все «прекрасно» — и схемотехника, и код, и перевод.
NordicEnergy
30.04.2019 11:34Код вставлен просто божественно! Что мешало сделать так и не заставлять людей страдать?
/ * Самонастраивающиеся часы для часового пояса CET с DST по kk99 2018 * / # include <SoftwareSerial.h> # include <TinyGPS ++. h> # include <SPI.h> # include <U8g2lib.h> # include <Timezone.h> # include <Arduino.h> // дескриптор GPS TinyGPSPlus gps; // дескриптор EDP U8G2_IL3820_V2_296X128_1_4W_HW_SPI u8g2 (U8G2_R0, / * cs = * / 10, / * dc = * / 9, / * reset = * / 8 ); // Центральноевропейское время TimeChangeRule CEST = { «CEST», Last, Sun, Mar, 2, 120 }; // Центральноевропейское летнее время TimeChangeRule CET = { «CET», Last, Sun, Oct, 3, 60 }; // Центрально-европейский стандартный часовой пояс CE (CEST, CET); TimeChangeRule * tcr; // Серийный дескриптор SoftwareSerial softSerial ( 3, 2 ); void setup () { // поместите здесь свой установочный код, чтобы запустить его один раз: u8g2.begin (); softSerial.begin ( 9600 ); setTime ( 00, 00, 00, 01, 01, 1970 ); } void loop () { // поместите ваш основной код здесь для повторного запуска: readGPSData ( 1000 ); Время обновления(); displayTime (); задержка ( 59000 ); } static void readGPSData ( unsigned long timeoutMs) { unsigned long start = millis (); делать { while (softSerial.available ()) gps.encode (softSerial.read ()); } while (millis () — start <timeoutMs); } static void updateTime ( void ) { if (gps.time.isValid () && gps.date.isValid ()) { setTime (gps.time.hour (), gps.time.minute (), gps.time.second (), gps.date.day (), gps.date.month (), gps.date.year ()); } } static void displayTime ( void ) { const unsigned timeLength = 6; char timeValue [timeLength]; time_t utc = now (); time_t local = CE.toLocal (utc, & tcr); snprintf (timeValue, timeLength, "% 02d:% 02d", час (местный), минута (местный)); u8g2.firstPage (); делать { u8g2.setFont (u8g2_font_logisoso78_tn); u8g2.drawStr ( 26, 103, timeValue); } while (u8g2.nextPage ()); }
Andy_Big
30.04.2019 11:37А лучше так:/* Self-adjusting clock for CET time zone with DST by kk99 2018 */ #include <SoftwareSerial.h> #include <TinyGPS++.h> #include <SPI.h> #include <U8g2lib.h> #include <Timezone.h> #include <Arduino.h> // GPS handle TinyGPSPlus gps; // EDP handle U8G2_IL3820_V2_296X128_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Central European Time TimeChangeRule CEST = {"CEST", Last, Sun, Mar, 2, 120}; // Central European Summer Time TimeChangeRule CET = {"CET ", Last, Sun, Oct, 3, 60}; // Central European Standard Time Timezone CE(CEST, CET); TimeChangeRule *tcr; // Serial handle SoftwareSerial softSerial(3, 2); void setup() { // put your setup code here, to run once: u8g2.begin(); softSerial.begin(9600); setTime(00, 00, 00, 01, 01, 1970); } void loop() { // put your main code here, to run repeatedly: readGPSData(1000); updateTime(); displayTime(); delay(59000); } static void readGPSData(unsigned long timeoutMs) { unsigned long start = millis(); do { while (softSerial.available()) gps.encode(softSerial.read()); } while (millis() - start < timeoutMs); } static void updateTime(void) { if (gps.time.isValid() && gps.date.isValid()) { setTime(gps.time.hour(), gps.time.minute(), gps.time.second(), gps.date.day(), gps.date.month(), gps.date.year()); } } static void displayTime(void) { const unsigned timeLength = 6; char timeValue[timeLength]; time_t utc = now(); time_t local = CE.toLocal(utc, &tcr); snprintf(timeValue, timeLength, "%02d:%02d", hour(local), minute(local)); u8g2.firstPage(); do { u8g2.setFont(u8g2_font_logisoso78_tn); u8g2.drawStr(26, 103, timeValue); } while (u8g2.nextPage()); }
devil_oper
30.04.2019 13:12Это плохой перевод. Хороший должен выглядеть как-то так:
алг читатьДанныеГЛОНАСС (арг цел таймаутМс)
нач
цел старт
старт := миллис()
нц
нц пока мягкийПоследовательный.доступен()
глонасс.кодировать(мягкийПоследовательный.читать())
кц
кц пока (миллис — старт < таймаутМс )
конseg1 Автор
30.04.2019 13:14Язык машинного программирования «Девил Опер»?
lamoss
30.04.2019 12:01Интересно, но еще можно сэкономить и вместо GPS использовать DCF77 (готовый вариант около 1 тысячи против 2 с лишним тысяч за NEO-7M. Хотя, конечно, вне центральной части РФ принимать будет неустойчиво
VT100
01.05.2019 22:14При том, что есть посконные (т.е с нелимитированной доступностью сигнала) станции точного времени в том-же диапазоне. RBU и т.д.
Исходная статья — не стоила затрат времени автора и нас и затрат энергии на работу всех задействованных вычислительных средств.
Vbeerby
30.04.2019 20:01Кроме всего прочего, функция
в TinyGPS++ выдаёт True при значении 00:00, а именно нули выдаёт NEO при отсутствии связи со спутниками, со всеми вытекающими. Эти часы при отсутствии спутников будут показывать нули, а не неточное время.gps.time.isValid ()
Странно, что ни один из популярных парсеров NMEA для Arduino не использует статус из $GPRMC для определения достоверности данных. («A» — статус: «A» — данные достоверны, «V» — недостоверны.) В итоге плюнул на все эти парсеры.olartamonov
30.04.2019 21:06Странно, что ни один из популярных парсеров NMEA для Arduino не использует статус из $GPRMC для определения достоверности данных
Я сегодня прямо весь день хожу и всем советую прекрасную футболку.
Вот опять же, интересно, а что конкретно авторов этих парсеров побудило так делать?..
Andy_Big
30.04.2019 21:12Может они просто не в курсе что есть такой статус?.. Совершенно не удивлюсь.
augorelov
01.05.2019 00:12А кто из них осилит изучить NMEA, это выше их сил. Это же учебники читать надо!
JerleShannara
01.05.2019 00:36А что в нём сложного? Этож текстовый протокол.
augorelov
01.05.2019 07:00Вы у меня спрашиваете?! Спросите «ардуюнолюбов», раз не могут нормальный парсер пакетов NMEA изобразить.
vau
02.05.2019 22:34+1Флаг в пакете RMC — индикатор валидности решения навигационной задачи. Для ее решения приемнику необходимо видеть минимум 4 спутника на постоянной основе. Для определения времени достаточно одного и то изредка. В современных приемниках есть внутренние часы, которые приемнику крайне необходимы для «горячего» и «теплого» старта или для восстановления потерянного фикса. Таким образом приемники на актуальных чипсетах продолжают выдавать корректное для многих практических задач время даже при полной потере сигнала от спутника. Отдельного флага достоверности времени в NMEA нет. А еще есть такое прекрасное явление, как gps week number rollover, которое мы могли наблюдать в апреле сего года. Так что со временем все сложно не только у ардуинщиков.
Vbeerby
03.05.2019 09:31Да, я полностью согласен что использование флага при получении только времени — избыточно. И был бы благодарен за подсказку в получении достоверного времени для построения энергоэффективного устройства. Так как разница ощутимая, на холодную — до получения времени 10-30 сек. до смены флага ~2мин.
Сравнивать несколько показаний с заданным интервалом?
Смотреть на количество видимых спутников в $GPGSV?devil_oper
03.05.2019 09:41ЕМНИП, ublox'ы начинают выдавать импульсы на выход PPS, когда успешно определили время — так что можно ловить это.
olartamonov
03.05.2019 13:41Quectel L76 — 1PPS появляется строго в момент фиксации координат, одновременно с флагом A в RMC. Точное время при этом в RMC появляется через 3-4 секунды после приёма первого спутника (т.е. на GSV ориентироваться нельзя), до этого момента в RMC во времени отнюдь не нули, а данные с внутренних часов, стартующих при подаче питания на 23:59:42.
Но 1PPS, если нужно точное время, надо ловить в любом случае, потому как именно по его фронту определяется время, отданное позже в том же RMC. 1PPS можно игнорировать, если доли секунды роли не играют.
vau
03.05.2019 17:09Самое простое, что приходит на ум — смотреть на дату. Она должна стать корректной. Т.е. больше 2 мая 2019. Насколько я вижу на примере китайского чипсета MT3333 во многих случаях сначала приемник выдает корректное время, но дата неправильна. Через несколько секунд время и дата становятся корректными. Но опять таки надо смотреть на особенности приемника. У uBlox тараканы могут быть другими.
olartamonov
03.05.2019 17:22Quectel L76 (тот же MT3333 внутри)
Включение:
$GPRMC,235954.970,V,,,,,0.00,0.00,050180,,,N*43
Увидел один спутник, время стало правильным, дата изменилась, но опять неправильная:
$GPRMC,141524.094,V,,,,,0.00,0.00,110180,,,N*4E
Увидел несколько спутников (в т.ч. ГЛОНАСС, поэтому GPRMC сменилось на GNRMC), время и дата правильные, но координат пока нет:
$GNRMC,141709.078,V,,,,,42.33,255.93,030519,,,N*66
Короче, до фиксации координат никто ничего не гарантирует. Более того, NMEA 0183 подразумевает, что поля времени и даты в RMC без координат тупо не имеют смысла — т.к. это время собственно фиксации данных координат.
Какую-то эмпирику, не связанную с явным признаком валидности, можно использовать только на конкретной модели приёмника с конкретной версией прошивки.
Хотите, чтобы гарантированно работало на всех приёмниках — ждите «A» в RMC и строба 1PPS.
r00tGER
1440 — «переворачиваний страницы» каждые сутки (~0.5М в год)… Как насчет ресурса дисплея?
GennPen
Обычно несколько миллионов обновлений. Многое зависит от площади и места обновления.