Views: 5915
Эта функция доступна уже в версии 1.6.1.
Для многих приложений, необходимо часы реального времени, если в вашем проекте есть модуль WiFI ESP8266, то легко можно сделать следующим образом.
Процедура описывает полный цикл подключения к роутеру WIFI подключение к серверам, получение данных времени конвертация его в двоично десятичный форма, для часов реального времени и отключения от роутера.
- AT+CWMODE_CUR=1 – настройка режим станции.
- AT+CIPMUX=0 – установить режим одного соединения.
- AT+CWJAP_CUR=”логин вашего роутера”,”пароль вашего роутера” – подключение к роутеру.
- AT+CIPSNTPCFG=1,3,”0.ua.pool.ntp.org”,”1.ua.pool.ntp.org”,”2.ua.pool.ntp.org” – вариант подключения к часовым серверам .(*1)
- AT+CIPSNTPTIME? – запрос времени.
ESP8266 – вернет время, день недели и дату в следующем формате:
Если не получено данных:
+CIPSNTPTIME:Thu Jan 01 00:00:00 1970
И если данные получены:
+CIPSNTPTIME:Wed Mar 18 12:35:17 2018
После получения времени, можно отключиться от сети.
- AT+CIPSNTPCFG=0 отключиться от серверов
- AT+CWQAP отключиться от роутера
- При желании можно перевести модуль в спящий режим.
ПРИМЕЧАНИЕ!!! После подключения в серверам точного времени и перед командой чтения времени возможно придется сделать пауза она может быть более 3 секунд (это зависит от вашего провайдера сети)!!!
Дополнительно можно прочитать WiFi ESP8266 – AT команды связанные с функцией TCP/IP (v.1.6.1)
*1 Небольшое описание для команды +CIPSNTPCFG
Чтение времени
SNTP включить, часовой пояс 3 часовые сервера “0.ua.pool.ntp.org”,”1.ua.pool.ntp.org”,”2.ua.pool.ntp.org”
// для подключения к конкретным серверам
AT+CIPSNTPCFG=1,3,”0.ua.pool.ntp.org”,”1.ua.pool.ntp.org”,”2.ua.pool.ntp.org”
для подключения к китайским серверам, по умолчанию
AT+CIPSNTPCFG=1,3
AT+CIPSNTPCFG?
+CIPSNTPCFG:1,3,”cn.ntp.org.cn”,”ntp.sjtu.edu.cn”,”us.pool.ntp.org”
// прочитать время
AT+CIPSNTPTIME? // команда
+CIPSNTPTIME:Wed Apr 11 22:00:46 2018 // ответ
OK
в 16-ричном виде (обрезаны данные для удобства)
+CIPSNTPTIME:Wed Apr 11 22:02:48 2018
+ C I P S N T P T I M E : W e d A p r 1 1 2 2 : 0 2 : 4 8 2 0 1 8
2B 43 49 50 53 4E 54 50 54 49 4D 45 3A 57 65 64 20 41 70 72 20 31 31 20 32 32 3A 30 32 3A 34 38 20 32 30 31 38
месяц
Jan – January – Январь
Feb – February – Февраль
Mar – March – Март
Apr – April – Апрель
May – May – Май
Jun – June – Июнь
Jul – July – Июль
Aug – August – Август
Sep – September – Сентябрь
Oct – October – Октябрь
Nov – November – Ноябрь
Dec – December –Декабрь
дни недели
Fri – Monday-понедельник
Tue – Tuesday-вторник
Wed – Wednesday-среда
Thu – Thursday-четверг
Fri – Friday-пятница
Sat – Saturday-суббота
Sun – Sunday-воскресенье
Преобразуем в формат двоично десятичный для хранения в часах реального времени
input_buf откуда извлекаются текстовый данные
DS1340.buf[] – где храняться данные для записи в часы
DS1340.buf[0] Seconds
DS1340.buf[1] Minutes
DS1340.buf[2] Hours
DS1340.buf[3] Day
DS1340.buf[4] Date
DS1340.buf[5] Month
DS1340.buf[6] Year
Процедура, сначала читаем данные с часов, чтобы получить со временем флаги управления
потом читаем время от сервера (ESP должна быть подключен к инету)
записываем новые данные от сервера времени, с учетом коррекции флагов
и сохраняем в часы реального времени
Возвращает
1-если операция прошла корректно
0-если ошибка
в не подключено варианте к сети будут возвращать время
+CIPSNTPTIME:Thu Jan 01 00:00:00 1970
bool realtime (void) // чтение реального времени { bool errorconnect=0; // флаг ошибки обена работы с ESP uint8_t * ucazat ; // указатель на данные uint8_t mas[4]; // Чтение времени и даты от часов реального времени на устройстве readtime (); // подключиться к серверам AT+CIPSNTPCFG=1,3,"0.ua.pool.ntp.org","1.ua.pool.ntp.org","2.ua.pool.ntp.org" if(AT_COMMAND ((uint8_t *)"AT+CIPSNTPCFG=1,3,\"0.ua.pool.ntp.org\",\"1.ua.pool.ntp.org\",\"2.ua.pool.ntp.org\"",500)) { //------------------------------------- // задержка подбирается индивидуально, для вашего провайдера ClrWdt(); // сброс сторожевого таймера __delay_ms(1000); ClrWdt(); // сброс сторожевого таймера __delay_ms(1000); ClrWdt(); // сброс сторожевого таймера __delay_ms(1000); ClrWdt(); // сброс сторожевого таймера //------------------------------------- if(AT_COMMAND ((uint8_t *)"AT+CIPSNTPTIME?",20)) // - запрос времени! { ucazat = strstr (input_buf,":"); // ищем первый ":" (13 байт) получаем указатель на начало данных // день недели ucazat++; mas[0] = *ucazat++; mas[1] = *ucazat++; mas[2] = *ucazat++; mas[3] = 0; // преобразование имени месяца в цифру if(!strcmp (mas, "Mon")) mas[0] = 0; else if(!strcmp (mas, "Tue")) mas[0] = 1; else if(!strcmp (mas, "Wed")) mas[0] = 2; else if(!strcmp (mas, "Thu")) mas[0] = 3; else if(!strcmp (mas, "Fri")) mas[0] = 4; else if(!strcmp (mas, "Sat")) mas[0] = 5; else if(!strcmp (mas, "Sun")) mas[0] = 6; // загрузить день недели DS1340.buf[3] = mas[0]; // загрузить // месяц ucazat++; mas[0] = *ucazat++; mas[1] = *ucazat++; mas[2] = *ucazat++; mas[3] = 0; // преобразование имени месяца в цифру if(!strcmp (mas, "Jan")) mas[0]=1; else if(!strcmp (mas, "Feb")) mas[0]=2; else if(!strcmp (mas, "Mar")) mas[0]=3; else if(!strcmp (mas, "Apr")) mas[0]=4; else if(!strcmp (mas, "May")) mas[0]=5; else if(!strcmp (mas, "Jun")) mas[0]=6; else if(!strcmp (mas, "Jul")) mas[0]=7; else if(!strcmp (mas, "Aug")) mas[0]=8; else if(!strcmp (mas, "Sep")) mas[0]=9; else if(!strcmp (mas, "Oct")) mas[0]=10; else if(!strcmp (mas, "Nov")) mas[0]=11; else if(!strcmp (mas, "Dec")) mas[0]=12; DS1340.buf[5] = bin_decbin (mas[0]); // загрузить значение месяца // день - число месяца ucazat++; mas[0] = (uint8_t)((*ucazat++ - 0x30)<<4); // десятки mas[0] += (uint8_t)(*ucazat++ - 0x30); // единицы DS1340.buf[4] = mas[0]; // загрузить день - число месяца // часы ucazat++; mas[0] = (uint8_t)((*ucazat++ - 0x30)<<4); // десятки mas[0] += (uint8_t)(*ucazat++ - 0x30); // единицы DS1340.buf[2] &= 0b11000000; // очистить DS1340.buf[2] |= mas[0]; // записать часы // минуты ucazat++; mas[0] = (uint8_t)((*ucazat++ - 0x30)<<4); // десятки mas[0] += (uint8_t)(*ucazat++ - 0x30); // единицы DS1340.buf[1] = mas[0]; // записать минуты // секунды ucazat++; mas[0] = (uint8_t)((*ucazat++ - 0x30)<<4); // десятки mas[0] += (uint8_t)(*ucazat++ - 0x30); // единицы DS1340.buf[0] &= 0b10000000; // очистить DS1340.buf[0] |= mas[0]; // записать секунды // год ucazat++; ucazat++; ucazat++; mas[0] = (uint8_t)((*ucazat++ - 0x30)<<4); // десятки mas[0] += (uint8_t)(*ucazat++ - 0x30); // единицы DS1340.buf[6] = mas[0]; // записать год } else { errorconnect = 1; // нет связи } } else { errorconnect = 1; // нет связи } //------------------------------------------------------------------------------ if(!errorconnect) { savetime ();// Сохранение настроек календаря return 1; // выполнено } else { return 0; // ошибка } //------------------------------------------------------------------------------ }
В функции используются функции для чтения времени из часов реального времени и работы с UART через модуль DMA.
Это может быть интересно
- CLUBBEST – reasoning on the visualization of music.Views: 137 ВІД ЗАХОДУ ДО СВІТАНКУ АБО ПОБАЧИТИ МУЗИКУ. Час доби, коли почуття людини загострюються, – це час від заходу до світанку. В цей час людина відкрита для …
- Униполярный шаговый двигатель – часть 2Views: 810 В этой части только итог и версия 2.0 универсальной, которая позволяет управлять шаговым двигателем во всех трех режимах и 3.0 специальной библиотеки только для одного полушагового режима. В …
- LCD индикаторы на драйвере ML1001Views: 1901 ML1001 – статический LCD GOG (чип в стекле) драйвер для 40-сегментного LCD в позолоченном противоударном исполнении. На них можно каскадно строить цельные из 80 или 120 сегментов LCD индикаторы. …
- PIC32MZ – Core Timer (библиотека)Views: 543 Переработанные файлы от Microchip, библиотека для работы с Core Timer.
- MPLAB® Code Configurator and EncoderViews: 1419 Еще раз про энкодер… Для некоторых приложений очень удобно и экономически выгодно, для настройки и управления использовать энкодер. Такие энкодеры имеют строенную тактовую кнопку которую можно применить для выбора …
- The art of DJViews: 132 The art of DJ. The art of DJ has gained wide popularity. Today, a DJ is not just someone whose task is to mix tracks; a DJ is …
- Проект с использованием MCC часть 04Views: 1142 Теперь простого горения светиков нам не достаточно, заставим их мигать. Для начала используем первобытно простой способ, но достаточно простой. Используем функции delay, напрягаться откуда они берутся не будем, самое …
- Проект с использованием MCC часть 05Views: 1959 Эту часть назовем так как избавься от delay, там где а это реально не надо. Для это нам потребуется научиться использовать прерывания и работать с таймерами. Что такое …
- NeoPixel LED и PIC18Views: 1668 Еще раз об управлении светодиодами на драйвере WS2812 и ему подобных. Как известно эти светики управляются по однопроводной шине. Основная особенность, что программно можно описать передачу данных, …
- ch-4000 – универсальная печатная платаViews: 1004 На смену устаревшей плате ch-3000, пришла новая ch-4000. Плату уже можно приобрести в магазине Ворон. Схема. Плата позволяет создавать таймеры, часы реального времени, регуляторы температуры, регуляторы влажности, вольтметры, …