Views: 5841
Эта функция доступна уже в версии 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.
Это может быть интересно
- Униполярный шаговый двигательViews: 2196 В приводах различных устройств часто применяются шаговые двигатели, Шаговый двигатели различают двух типов униполярные – когда обмотки коммутируются током текущим только в одну сторону, например при …
- CAN – Controller Area NetworkViews: 1075 Controller Area Network (CAN) первоначально был создан немецким поставщиком автомобильных систем Робертом Бош в середины 1980-х для автомобильной промышленности как метод для обеспечения возможности надежной последовательной связи. Целью было сделать автомобили более надежными, …
- Altium Designer first projectViews: 265 Эта статья подразумевает, что у вас установлен и настроен Altium Designer как описано в статье Altium Designer my setup system and project structure. Обратите внимание! Библиотека постоянно обновляется, …
- WiFi ESP8266 ESP-202 (ESP-12F)Views: 7686 Первое знакомство, сначала надо его купить… http://voron.ua/catalog/024404 Схема для подключения и тестирования По схеме ставим две кнопки, сброс и кнопку BT2, для перевода в режим обновления прошивки. Если надо сделать …
- LED модуль P10 (1R) V706AViews: 7687 Это еще одно чудо от китайского брата. Это монохромные матрицы, называются они P10 (1R) V706A, ну типа R-красные, но не верьте паяют светики и зеленые и синие, в общем …
- AD9833 – Programmable Waveform GeneratorViews: 2830 Простой генератор звуковых частот на AD9833. Для тестирования БПФ в светомузыке мне нужен был генератор звуковых частот. Я использовал советский Г3-112, но он себя давно изжил. Все думал купить …
- Проект с использованием MCC часть 03Views: 1587 Первым делом перенастроим регистры конфигурации, следующим образом: Отключим выход генератора (CLKOUT function is disabled. I/O function on the CLKOUT pin) Включим сторожевой таймер (WDT enabled) После этой настройки …
- TDA7294 part 1Views: 246 TDA7294 має унікальні дані для створення підсилювачів звукової частоти HI-FI класу. Варіант застосування є конфігурація BRIDGE (мостова схема включення), де використовуються два TDA7294, як показано на схематичній діаграмі …
- TM1650 драйвер LED семисегментного индикатораViews: 17776 Китайский производитель Shenzhen Titan Micro Electronics Co., Ltd. Выпускает широкую линейку драйверов управления светодиодными дисплеями, которые позволяют разгрузить микроконтроллер для основной работы, главная особенность этих драйверов не только …
- Audio-bluetooth modules BK8000L (noname)Views: 662 Еще один вариант, так сказать недоразумения Audio-bluetooth modules BK8000L (noname). Его отличительной маркировкой служат два отверстия в плате и надпись R2. Отличают его от модулей на чипе BK8000L, …