Самонастраивающиеся часы с электронным дисплеем

Автор оригинала: Иван Квасневский
  • Перевод


Основная идея заключалась в создании самонастраивающихся часов, которые должны работать в часовом поясе 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

    0
    1440 — «переворачиваний страницы» каждые сутки (~0.5М в год)… Как насчет ресурса дисплея?
      0
      Обычно несколько миллионов обновлений. Многое зависит от площади и места обновления.
      +4
      За схематику в виде картинки с ардуиной и за неотформатированный код хочется убивать.
        +3
        А что не так со схематикой? Инженерам такая статья в принципе интересна быть не может, а новичкам по картинке схему повторить проще.

        С форматированием кода, да, — беда. Однако можно было бы просто отправить автору-переводчику приват, чтобы код завернул в тег code.
          +2

          Не новичкам, а "ардуинщикам". Учиться надо на нормальных схемах электрических принципиальных, а не на таких картиночках.

            +1
            Кому что требуется. Если знаний нет, а собрать что-то хочется, то лучше быть Ардуинщиком, чем утонуть в программировании/схемотехнике и вовсе ничего не сделать.
            P.S. Сам из секты Arduino :D
              +1
              Но зачем оповещать весь мир о своем незнании и неумении? :)
                +2
                Тут проблема связанная с тем, что новичкам слишком сложно читать статьи написанные профессионалами для профессионалов, которым многие вещи очевидны (см. Проклятие знания). В статьях же новичков для новичков зачастую описываются теже грабли, на которые другой новичок может наступить.
                  +3
                  А идея читать книги вообще и учебники в частности, я так понимаю, окончательно вышла из моды?..
                    –1

                    Чукча не читатель...

                      +1
                      Вряд ли кто-то станет отрицать, что инструкцию что от техники, что от таблеток редко кто читает. Абсолютно аналогичная ситуация с учебниками. Человеческий мозг работает так, что «здесь и сейчас» превалирует над «надо поучить, зато потом окупится сторицей».

                      Учебник стоит читать, если потом это нужно будет для получения денег/развития своего проекта. А для сборки часов, метеостанции, автоматического лотка для кошки и прочей DIY-мелочевки — зачем?

                      Перфекционизм он не всегда нужен.
                        0

                        Диагноз: "Ардуинщик" классический.

                          +1
                          Спасибо, доктор!
                            –1
                            Всегда пожалуйста!
                          +3
                          А для сборки часов, метеостанции, автоматического лотка для кошки и прочей DIY-мелочевки — зачем?


                          А чьи-то статьи вам зачем для этого тогда читать?

                          Вполне хватит инструкции в картинках, какой проводок куда вставлять.

                          (впрочем, многие тут заметят, что по сути «статьи» к этому и сводятся)
                            +2
                            Он про то и пишет — что читать ничего не надо, это труд и сложно для мозга. Картинки и Ютуб — вот это современный уровень :)
                              +2
                              Картинки и Ютуб — вот это современный уровень :)
                              Тут надо смириться, что большинство людей не хотят и не могут обрести знания уровня хотя бы начинающего инженера. При этом много всяких менеджеров, продаванов, сантехников, которые таки хотят собрать себе умный туалет. Они вынуждены обращаться к ютубу и картинкам, т.к. большего они не могут осилит. Не всем дано рисовать, так же не всем дано создавать многослойные платы.
                            –1
                            Учебник стоит читать, чтобы метеостанция не показывала погоду на Марсе. Или для сборки кошачьего туалета, как в этой статье.
                              0
                              Что-то ссылка не работает, стало интересно что там за туалет
                            0
                            Вряд ли кто-то станет отрицать, что инструкцию что от техники, что от таблеток редко кто читает.

                            Не читать инструкцию к таблеткам. Даже не проглядеть. Не понимаю.
                              0
                              Как говорит молодой коллега: «Один раз живём!»
                                0
                                Если в случае с книгами я могу понять мотивацию, то в случае с таблетками… Нет, если стоит задача этот один раз укоротить, то да.
                                  0
                                  Он обычно это говорит, нарушая технику безопасности.
                                  0
                                  image
                              +4
                              я иногда играю в Starcraft, но совершенно не планирую читать о нем книги (они существуют, да). Мне вполне достаточно моей деревянной лиги, чтоб вечером после работы поиграть с такими же нубами, как я. Вот так и здесь.
                              То, что для вас это серьезная профессия, совершенно не означает, что все вокруг должны так же серьезно ее воспринимать.
                                –1
                                Научитесь отделять мух от котлет. Попробуйте на сайте проф. игроков написать статью про то, как надо играть со своим уровнем нуба. Узнаете реакцию.
                                  0
                                  Это уже другой вопрос. Хотя, туториалы с нубскими стратегиями вполне себе существуют, просто про-игроки туда не заходят
                                  0
                                  Тут совсем другое. Глядя на подавляющее большинство трудов ардуинщиков чувствуешь себя как сантехник, смотрящий на вот это:
                                +1
                                новичкам слишком сложно читать статьи написанные профессионалами

                                Учиться нынче не в почете? Хоть что-то почитать о тех деталях, из которых собираешься слепить что-то? Ну, например, узнать, что ардуина питается (и выдает на выходы) 5 вольт, а тот же модуль GPS допускает на своих входах максимум 3.6 вольта? :)
                                В статьях же новичков для новичков зачастую описываются теже грабли, на которые другой новичок может наступить.

                                А кроме описанной пары граблей молча прикладывается десяток других, неописанных. Просто потому что автор сам не в курсе их существования из-за недостатка знаний.
                                  0
                                  Учиться — это труд и это сложно для мозга, который старается избежать этого.

                                  Да, грабли в статьях от новичков имеются — это неизбежное зло. Однако отмечу, что у автора (оригнал статьи) устройство заработало. Сколько оно проработает — это уже другой вопрос.
                                    +1
                                    Учиться — это труд и это сложно для мозга

                                    Поэтому лучше учить других? Как сделать то, в чем сам не разбираешься? :)
                                    отмечу, что у автора (оригнал статьи) устройство заработало

                                    В чем его заслуги чуть больше нуля.
                                      0
                                      Учиться — это труд и это сложно для мозга, который старается избежать этого.

                                      Какой у Вас ленивый мозг.
                                        +1
                                        У вас мозг видимо другой, отличный от большинства обывателей этой планеты. Этому можно только позавидовать.

                                        Поэтому лучше учить других?

                                        Тут статья из серии «Смотрите у меня получилось!» и человеку захотелось поделиться. Обучения как такового в статье нет.

                                        В целом, я понимаю точку зрения, что «Работа должна выполняться профессионалом». Однако, в реальном мире в редких областях это действительно так.
                                          0
                                          Статьи из серии «Смотрите, что я сделаль, а оно ещё и работает!» не для Хабра. Для этих целей есть профильные сообщества.
                                            +1
                                            Насколько я понимаю, автор статьи и опубликовал её в профильном сообществе. То, что она появилась на Хабре — минус переводчика.
                                              +1

                                              Самый жирный минус переводчика, автора статьи на Хабре, в качестве перевода. А это показатель низкого уровня знаний в тематике. А низкий уровень знаний в тематика в отсутствии желания учиться. Хотя зачем учиться, это, по Вашим словам, бесполезная трата времени.

                                                0
                                                Хотя зачем учиться, это, по Вашим словам, бесполезная трата времени.

                                                Просьба указать сообщение, в котором я такое написал. Если вы имели в виду вот это, то увы, там речь шла про учебник. А читать учебник и учиться — это несколько разные вещи.
                                                  +2
                                                  Обучение без чтения профильной литературы (учебников) не бывает.
                                                    0
                                                    Не могу согласиться со столь категоричным заявлением. С моей точки зрения чтение учебников — это всего лишь один из способов обучения.
                                                      +1
                                                      Научится читать можно и без профильной литературы, а рассчитать антенный контур или импульсный источник питания не получится.
                                0

                                С таким подходом и начинать не стоило.

                                  +4
                                  Точно, надо сразу рождаться профессионалом в своей области!
                                    0

                                    Как минимум учиться по книгам, чтобы повышать свои навыки и умения. А не по картиночках для глупых и копипасту бестолковых программ, не понимая что она делает и почему именно так.

                                      +2
                                      Правильно подметил olartamonov, чтение профильной литературы не в почете. Судя по минусующим комментарий.
                                    0
                                    С таким подходом и начинать не стоило.
                                    Большая часть того, чем мы занимаемся в свободное от работы и семьи время, вызывает вопросы «зачем, ведь можно купить готовое?», «зачем, ведь другие уже сделали лучше?», «зачем, это не стоит потраченного времени», и т.д.
                                    В результате многие проводят значительную часть жизни, уставившись в телевизор, планшет, или с пивом на лавочке. Это лучше?
                                  0

                                  А что полезного, в данном случае, даст публикация полной схемы ардуины + гпс-модуля + модуля экрана? Это не несёт ни какого смысла. Никто не полезет внутрь гпс-модуля, всё взаимодейставе идёт на уровне интерфейсов и функциональных блоков. Знать, что D5 ардуины подключён к Rx гпс-ки для понимания работы мне необходимо. Знать номинал резистора в смесителе радиочастотной части гпс — нет. Публикация полной схемы электрической принципиальной только запутает и ухудшит понимание принципов работы прибора, ничего полезного не дав взамен. Вы ещё посетуйте, что прошивку в хекс-кодах не опубликовали в статье, как это было принято в журнале "коневодство" (то, есть, простите, "радио"). Да и то там это просто вынужденно делали...

                                    –1
                                    Сколько же вас «ардуинолюбов» бестолковых?! Учите основы. На схемах принципиальных электрических не обязательно изображать подробно каждый модуль. Для таких как Вы придумали ещё схемы соединений.
                                      0

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

                                        0
                                        Если это схема соединения, то вернитесь в ясли малолетний «ардуинолюб». В статье именно цветная картиночках и никакого отношения к схеме она не имеет.
                                        Я никому не хамил в отличие от Вас. Ещё надо посмотреть кто из нас необразованное и невоспитанное подзаборное хамло.
                                        И в отличие от Вас, я действительно образован и умен.
                                          +1
                                          НА самом деле это и есть схема соединений. Принятая как стандарт в среде ардуино. И рисуется она в программе разработанной ими же fritzing. Это именно та схема соединений которая понятна всем ардуинщикам. Им нельзя дать реальную принципиалку, и реальную схему соединений, могут банально не разобраться, а вот по такой схеме конструкцию может повторить любая домохозяйка, изначально в этом ее суть.
                                          P.S> Да и на самом деле, зря вы нападает на среду ардуино. На самом деле очень изюмительная штука, когда надо пощупать что то быстро и без разбора в регистрах нового датчика, просто взял — включил и оно работает. Я так множество датчиков тестирую. Это очень удобно, да и плюс все датчики и сенсоры что продаются на али, все уже изначально подготовлены под интерфейс ардуины, взял проводки воткнул и все завертелось.
                                            –1
                                            Раз принята в среде «ардуинолюбов», пускай и сидят и картиночки рисуют на своих сайтах и в своих сообществах. Хабр все таки более технический сайт, а не сборище домохозяек.
                                            З.Ы.
                                            Зная, как пишут библиотеки для Ардуино, у Вас вряд ли получится использовать все характеристики датчика не изучая его регистры. Вот мне не составляет проблемы быстро накидать программу без среды Ардуино для проверки работы внешних датчиков, исполнительных устройств и т.д.
                                            Мне Вас немного жаль, раз Вы так тестируете.
                                              0
                                              Тесты это взял включил и посмотрел а что выходит а как оно там работает. Понятно что в работе потом взял аппноут\датащит и посмотрел что в библиотеке ардуины 64-е лишних телодвижения, когда можно было банально 3 регистра прописать с нужной конфигруацией.
                                                +1
                                                Как оно работает — на любой датчик прекрасно описано в даташите, первая страница плюс раздел «Application».

                                                А как оно работает на самом деле, особенно в сложных условиях — с ардуиновскими библиотеками вы достоверно установите примерно никогда.
                                            –1
                                            В статье именно цветная картиночках и никакого отношения к схеме она не имеет.

                                            А, то есть вы даже не знаете как выглядят схемы соединений? Тогда понятно, почему вместо конструктивных аргументов вы используете личные оскорбления. Умище так и прёт, так и прёт!


                                            Я никому не хамил

                                            Вы не только хамло позорное, но и брехло подзаборное.
                                            Давайте просто процитирую :


                                            вернитесь в ясли малолетний «ардуинолюб

                                            Сколько же вас «ардуинолюбов» бестолковых?!

                                            Статьи из серии «Смотрите, что я сделаль, а оно ещё и работает!

                                            Какой у Вас ленивый мозг.

                                            Диагноз: "Ардуинщик" классический.

                                            Чукча не читатель…

                                            "Ардуинщик" неразумный взялся за перевод статьи

                                            Собственно, ничего иного, кроме оскорблений окружающих и хамства вы в теме не написали. Поздравляю вас, вы — брехливое хамло.


                                            в отличие от Вас, я действительно образован и умен.

                                            Более искушены в хамстве и вранье, это точно. Но тут меня не сложно победить, да я пытаться не буду — слаб я в этом, не то, что вы, такой умище, что не можете схему соединений не то, что прочесть, но даже опознать! Фу, позорище.

                                              –1

                                              Как раз в отличие от Вас я знаю, как выглядит схема соединений. В отличие от Вас схемы электрические разных видов за моим авторством проходили нормаконтроль и проверку военпредов. Так кто из нас неуч?
                                              Ах, Вас задевают "Ардуинщик" и "Ардуинолюб", ну извините, пока Вы и такие же как Вы необразованные товарищи будете писать безграмотные статьи, я называл и буду так продолжать называть все ваше сборище.

                                                0
                                                Схема соединений должна быть как-либо стандартизована?
                                                  0
                                                  Загуглите первое что предлагают по запросу «схема соединений».
                                                  Есть определенные стандарты схем. А то что кто-то продвигает свой вид «схем» — это «я художник, я так вижу».
                                                +3
                                                Это не схема. Это картинка. Разница между ними разъяснялась в детской книжке Борисова сразу после решения вопроса «где взять диод для детекторного приемника».
                                        +1
                                        Тут хоть сигналы подписаны, и на том уже спасибо :))
                                        +2

                                        Вот бы еще питание от солнечной панели и всё залить эпоксидной смолой. Полная автономность, походность… Хватит питания?

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

                                          Питания-то хватит, только сначала надо вот эту наколенную поделку выкинуть целиком и сделать нормально.
                                            0
                                            Прикинул ради интереса — при нормальной реализации такие часы смогут работать минимум 7-8 месяцев на аккумуляторе 18650 емкостью 2400 мА*ч :)
                                              +1
                                              Сильно больше.

                                              У дешёвого 3-дюймового графического e-ink обновление части экрана занимает 300 мс, жрёт он при этом в пределах 10 мА, обновлять надо раз в минуту одну цифру, раз в 10 минут две цифры, etc.

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

                                              Всё остальное время потребление всего этого хозяйства < 10 мкА.

                                              А работать нормально оно всё равно не будет, потому что в типовом железобетонном доме ставить часы придётся на окно, чтобы они что-то там поймали хотя бы теоретически.
                                                0
                                                Ну, я считал с допущениями по максимуму — GPS раз в сутки по минуте с потреблением 30 мА, обновление экрана — 1000 мс с потреблением 20 мА, потребление всего в спячке — 50 мкА :)
                                                За неделю RTC на обычном часовом кварце может и убежать довольно сильно :)
                                                  0
                                                  Обычный кварц — это не хуже 30 ppm, за неделю меньше 20 секунд уход.
                                                    0
                                                    Это если нормальный кварц, а не китайский с Алиэкспресса :)
                                                      +2
                                                      И тут я посмотрел в код этого мегадевайса и неприлично взоржал:

                                                      void loop() {
                                                        // put your main code here, to run repeatedly:
                                                        readGPSData(1000);
                                                        updateTime();
                                                        displayTime();
                                                        delay(59000);
                                                      }


                                                      Аффтар проверяет время каждые 59 секунд, то есть, его часы by design имеют отставание до 1 минуты. На ровном месте.

                                                      А мы тут кварцами меряемся.

                                                      Upd. А хотя ладно, дальше он кладёт в системные часы и секунды тоже, а ещё дальше берёт время из них. Но зачем тогда ежеминутно дёргать GPS? Ну или, наоборот, зачем эта задержка в 59 секунд, когда просто сиди да читай что тебе GPS сам в консоль сыпет? Загадки, одни загадки.
                                                        0
                                                        Угу, я тоже оценил этот ход. Даже представил рассуждения автора: «Таак, тут мы ровно одну секунду читаем GPS, потом обновляем время на экране (раз я тут не ставлю задержку значит обновление происходит мгновенно) и делаем паузу ровно 59 секунд. И получается обновление экрана раз в минуту с точностью до миллисекунды — ну не зря же задержку в миллисекундах надо указывать. Бинго!».
                                                        Автор, похоже, из того же лагеря ардуинистов, что и little-brother — не учиться же, напрягая мозг и себя, в самом деле-то…
                                                          +2
                                                          Меня просто поражает каждый раз вот это сочетание масштабности и бессмысленности в типичных ардуино-проектах.

                                                          То есть наворочен какой-то код, который, видимо, автору казался логичным и нужным, но есть очень серьёзные сомнения, что даже он сам сможет объяснить, почему он ему таким казался.
                                                            +1
                                                            почему он ему таким казался
                                                            Потому что этот код был в скетче откуда он содрал этот кусок программы, а выкинуть побоялся — вдруг сломается.
                                                              0
                                                              Я так подозреваю, что автор самостоятельно наворотил максимум 5 строчек, а остальное надергал из других скетчей и примеров к тем пяти чужим библиотекам, из которых, в общем-то, и состоит вся прошивка.
                                                                0
                                                                Классический подход любителей ардуино.
                                                                  0
                                                                  Потому что сама ардуина подталкивает к такому подходу. И широко пропагандируется она именно для такого ее использования.
                                                                    0
                                                                    Изначально идея была, как раз не в этом. Но как говаривал один наш политик: «Хотели как лучше, а получилось как всегда!»
                                                                      0
                                                                      Изначально идея была, как раз не в этом.

                                                                      Но пришли-то как раз к этому :)
                                                                    0
                                                                    Нет, классический подход — это посмотреть как написано в библиотеке, понять почему именно так и использовать. Если не удалось понять или написано плохо — переписать с нуля.
                                                                      0

                                                                      Очень редко встречается описанный Вами подход, что скорее исключение из большинства "ардуинолюбов".

                                                                        0
                                                                        А я ардуинку и не люблю собственно :) Больше к 32-разрядным контроллерам привязан. Но подход-то один, независимо от платформы.
                                                0
                                                Этому поделию — нет, не хватит. Но если выкинуть ардуину с ее кодом и заменить ее нормальным микроконтроллером с нормальным кодом, то хватит.
                                                  +1
                                                  По-моему, тут даже выкидывать ардуину не обязательно. Достаточно написать нормальный код. Там обычная atmega, которая умеет достаточно энергосбережений, чтоб не жрать попусту.
                                                    0
                                                    Энергосбережение умеет, не спорю. Хотя и далеко не так хорошо как какая-нибудь STM8L. Но во-первых нет удобного (для часов) выхода из энергосбережения, а во-вторых нет часов реального времени.
                                                      +1
                                                      Сделал на atmega48PA с часовым кварцем, работающем в асинхронном режиме на таймере2. Всё время сплю, по прерыванию таймера просыпаюсь каждые 20мс, вывожу через SPI данные на в 4 регистра HC595 для LCD от мультиметра, засыпаю. А время считываю с DS1302 раз в секунду по тому же SPI )
                                                        0
                                                        На STM32L это решилось бы без внешних регистров и время с DS считывалось бы раз в сутки… Или раз в неделю :) Батареек хватало бы на раз в десять дольше :)
                                                          0
                                                          Ну наверное и я бы мог раз в сутки/неделю считывать время :) Я для 1302 делал доп. коррекцию внешними конденсаторами для улучшения точности. Всё это у меня потребляет около 100мкА. Работает от 3-х Б/У батареек AAA
                                                0
                                                Интересует, измерялся ли реальный общий ток потребления данных часов?
                                                  +3
                                                  А там измерять — только расстраиваться: у чувака GPS фигачит непрерывно, это само по себе миллиампер двадцать. Плюс неспящая атмега ещё столько же.

                                                  Первые в мире часы на E-ink, которые не могут работать от батарейки.
                                                    0
                                                    В статье-оригинале (ссылка на неё есть в шапке) автор не приводит эту информацию.
                                                    +5
                                                    А зачем исходник сунули в переводчик?
                                                    readGPSData ( 1000 );
                                                    Время обновления();
                                                    displayTime ();
                                                    задержка ( 59000 );


                                                    Ну почему нельзя нормально перевести даже такую короткую заметку?
                                                    e-Paper (электронно переворачиваемые «листы» бумаги с цифрами)

                                                    серийный номер программного обеспечения для приема данных с модуля GPS, отображение e-Paper

                                                    4-строчный SPI для связи

                                                    Или переводчик не владеет тематикой — тогда зачем браться? Или перевод сделан по принципу «вот вам гуглоперевод, отстаньте от меня» — тогда зачем вообще его публиковать?
                                                    И откуда в последнее время пошла мода кое-как переводить всякую ерунду с hackaday.io? Без знаний по теме, без какой-либо изюминки, без хоть какого-то старания… Зачем оно здесь?
                                                      +3

                                                      Чему тут удивляться. "Ардуинщик" неразумный взялся за перевод статьи. И таких все больше и больше. Тут возникает вопрос, как такие статьи из песочницы пропускают.

                                                        0
                                                        Когда то нужно начинать! Получу тут по полной, чему нибудь и сам начусь.
                                                          0
                                                          Учиться надо было раньше, до написания корявого перевода.
                                                            0
                                                            В прошлой жизни я был деревом.
                                                              0

                                                              Похоже, ничего не изменилось с тех времен.

                                                                +1
                                                                Я буду первым баобабом, разобравшимся в ардуино!
                                                        0
                                                        Забавно, что пригласил его tormozedison, который штампует такие же переводы с ардуинами.
                                                          +3
                                                          И откуда в последнее время пошла мода кое-как переводить всякую ерунду с hackaday.io? Без знаний по теме, без какой-либо изюминки, без хоть какого-то старания… Зачем оно здесь?


                                                          Публикуешь пять бессмысленных переводов гуглотранслейтом — и вот уже можно называть себя «регулярный автор популярного ресурса Хабрахабр» и соваться в корпоративные блоги с предложением за денежку малую…
                                                            0
                                                            ОООО а так можно было????
                                                              0
                                                              Я нигде не обещал, что автора настигнет успех.

                                                              С другой стороны, вот за этот опус ему уже чуть-чуть в карму да капнуло, будет упорен в глулотранслейте и научится поменьше лажать в технических вещах («Время обновления();») — да норм, за несколько месяцев карму в +NN вытащит, а там можно и услуги начать предлагать, если бедненько — то через фрилансерские биржи, а там и прямые выходы в PR-отделы появятся.
                                                                0
                                                                Вон оно как… Ясно спс за наводку, щас тоже что нить напишу 0))))
                                                                  +3
                                                                  Вы так смайлики ставите, как будто я шучу.

                                                                  А я вот во вполне технологической области реально и лично знаю человека, который везде выступает как видный эксперт просто потому, что ему однажды зачем-то захотелось прослыть экспертом в этой области. Дальше всё по накатанной — завёл страницу во вконтакте, канал в телеге, стал копипастить туда новости по теме, начал везде подписываться экспертом. В области, в которой он эксперт, он сам при этом руками делает ровным счётом ничего и опыт имеет ровным счётом никакой.

                                                                  Но кто-то вот на подработку на написании текстов карму набирает, а кого-то уже и СМИ периодически цитируют.
                                                                    0
                                                                    я так не смогу… Я не спец ни в чем… я тока учусь… А смайлики это я в шоке был, хотя предполагал о таком развитии событий.
                                                                    P.S> А можно Вам в личку пару вопросов задать?) Вы вроде с нордиками плотно работаете… Я тут с ними играюсь и че та встрял… А дев зон гады молчат (
                                                                      0
                                                                      Ну попробуйте, хотя вот именно я планирую с ними работать примерно так с завтрашнего дня, специально на праздники домой наших модулёчков взял. Но если что, я переадресую тому, кто уже работает.
                                                                    0
                                                                    Вам будет в карму плюс, а кому-то минус)))
                                                            0
                                                            задержка ( 59000 );

                                                            Спасибо за хорошее настроение с утра!
                                                              +2
                                                              Заходим на hackaday, берём и переводим любую статью на habr.

                                                              Браво, вы прекрасны.

                                                              ИМХО, все переводы с hackaday надо запретить. Ибо какой смысл читать одно и то же в двух местах.
                                                                0
                                                                Тем более такие статьи с таким переводом. Тут все «прекрасно» — и схемотехника, и код, и перевод.
                                                                  +1
                                                                  О, спасибо за наводку! Интересный ресурс!
                                                                  +3
                                                                  Код вставлен просто божественно! Что мешало сделать так и не заставлять людей страдать?

                                                                  / * 
                                                                  Самонастраивающиеся часы для часового пояса 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 ());
                                                                  }
                                                                    +2
                                                                    А лучше так:
                                                                    /* 
                                                                       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());
                                                                    }
                                                                    

                                                                      0
                                                                      Слишком прекрасно для этой статьи будет)
                                                                      0
                                                                      Что мешало сделать так


                                                                      Гуглотранслейт так не умеет.
                                                                        +4
                                                                        Это плохой перевод. Хороший должен выглядеть как-то так:

                                                                        алг читатьДанныеГЛОНАСС (арг цел таймаутМс)
                                                                        нач
                                                                        цел старт
                                                                        старт := миллис()
                                                                        нц
                                                                        нц пока мягкийПоследовательный.доступен()
                                                                        глонасс.кодировать(мягкийПоследовательный.читать())
                                                                        кц
                                                                        кц пока (миллис — старт < таймаутМс )
                                                                        кон
                                                                          0
                                                                          Язык машинного программирования «Девил Опер»?
                                                                            +1
                                                                            Вообще-то это язык рая, но школоте не понять.

                                                                            bfy.tw/NRmp
                                                                              0
                                                                              Я тупой, но усидчивый, разберусь.
                                                                        0
                                                                        Интересно, но еще можно сэкономить и вместо GPS использовать DCF77 (готовый вариант около 1 тысячи против 2 с лишним тысяч за NEO-7M. Хотя, конечно, вне центральной части РФ принимать будет неустойчиво
                                                                          0
                                                                          При том, что есть посконные (т.е с нелимитированной доступностью сигнала) станции точного времени в том-же диапазоне. RBU и т.д.

                                                                          Исходная статья — не стоила затрат времени автора и нас и затрат энергии на работу всех задействованных вычислительных средств.
                                                                          +1
                                                                          Кроме всего прочего, функция
                                                                          gps.time.isValid ()
                                                                          в TinyGPS++ выдаёт True при значении 00:00, а именно нули выдаёт NEO при отсутствии связи со спутниками, со всеми вытекающими. Эти часы при отсутствии спутников будут показывать нули, а не неточное время.
                                                                          Странно, что ни один из популярных парсеров NMEA для Arduino не использует статус из $GPRMC для определения достоверности данных. («A» — статус: «A» — данные достоверны, «V» — недостоверны.) В итоге плюнул на все эти парсеры.
                                                                            0
                                                                            Странно, что ни один из популярных парсеров NMEA для Arduino не использует статус из $GPRMC для определения достоверности данных


                                                                            Я сегодня прямо весь день хожу и всем советую прекрасную футболку.

                                                                            Вот опять же, интересно, а что конкретно авторов этих парсеров побудило так делать?..
                                                                              0
                                                                              Может они просто не в курсе что есть такой статус?.. Совершенно не удивлюсь.
                                                                                0
                                                                                А кто из них осилит изучить NMEA, это выше их сил. Это же учебники читать надо!
                                                                                  0
                                                                                  А что в нём сложного? Этож текстовый протокол.
                                                                                    0
                                                                                    Вы у меня спрашиваете?! Спросите «ардуюнолюбов», раз не могут нормальный парсер пакетов NMEA изобразить.
                                                                                +1
                                                                                Флаг в пакете RMC — индикатор валидности решения навигационной задачи. Для ее решения приемнику необходимо видеть минимум 4 спутника на постоянной основе. Для определения времени достаточно одного и то изредка. В современных приемниках есть внутренние часы, которые приемнику крайне необходимы для «горячего» и «теплого» старта или для восстановления потерянного фикса. Таким образом приемники на актуальных чипсетах продолжают выдавать корректное для многих практических задач время даже при полной потере сигнала от спутника. Отдельного флага достоверности времени в NMEA нет. А еще есть такое прекрасное явление, как gps week number rollover, которое мы могли наблюдать в апреле сего года. Так что со временем все сложно не только у ардуинщиков.
                                                                                  0
                                                                                  Да, я полностью согласен что использование флага при получении только времени — избыточно. И был бы благодарен за подсказку в получении достоверного времени для построения энергоэффективного устройства. Так как разница ощутимая, на холодную — до получения времени 10-30 сек. до смены флага ~2мин.
                                                                                  Сравнивать несколько показаний с заданным интервалом?
                                                                                  Смотреть на количество видимых спутников в $GPGSV?
                                                                                    0
                                                                                    ЕМНИП, ublox'ы начинают выдавать импульсы на выход PPS, когда успешно определили время — так что можно ловить это.
                                                                                      0
                                                                                      Quectel L76 — 1PPS появляется строго в момент фиксации координат, одновременно с флагом A в RMC. Точное время при этом в RMC появляется через 3-4 секунды после приёма первого спутника (т.е. на GSV ориентироваться нельзя), до этого момента в RMC во времени отнюдь не нули, а данные с внутренних часов, стартующих при подаче питания на 23:59:42.

                                                                                      Но 1PPS, если нужно точное время, надо ловить в любом случае, потому как именно по его фронту определяется время, отданное позже в том же RMC. 1PPS можно игнорировать, если доли секунды роли не играют.
                                                                                      0
                                                                                      Самое простое, что приходит на ум — смотреть на дату. Она должна стать корректной. Т.е. больше 2 мая 2019. Насколько я вижу на примере китайского чипсета MT3333 во многих случаях сначала приемник выдает корректное время, но дата неправильна. Через несколько секунд время и дата становятся корректными. Но опять таки надо смотреть на особенности приемника. У uBlox тараканы могут быть другими.
                                                                                        0
                                                                                        Quectel 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.
                                                                                          0
                                                                                          Огромное спасибо за развёрнутый ответ!

                                                                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                                Самое читаемое