
Views: 5934
Эта функция доступна уже в версии 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.
Это может быть интересно
PIC18 – System Arbitration
Views: 565 Системный арбитр. Разрешает доступ к памяти между выборами уровнями системы (т.е. Main, Interrupt Service Routine) и выбором периферийных устройств (т.е. DMA и Scanner) на основе назначенных пользователем приоритетов. Каждый …WiFi ESP8266 ESP-202 (ESP-12F)
Views: 7703 Первое знакомство, сначала надо его купить… http://voron.ua/catalog/024404 Схема для подключения и тестирования По схеме ставим две кнопки, сброс и кнопку BT2, для перевода в режим обновления прошивки. Если надо сделать …Простой цифровой регулятор мощности
Views: 6979 Простой регулятор мощности с цифровой индикацией. Этот проект создан как обучающий, для ознакомления с основами построения сетевых регуляторов мощности. Устройства подобного типа можно использовать для управления освещением, скоростью …AD9833 – Programmable Waveform Generator
Views: 2865 Простой генератор звуковых частот на AD9833. Для тестирования БПФ в светомузыке мне нужен был генератор звуковых частот. Я использовал советский Г3-112, но он себя давно изжил. Все думал купить …TM1650 драйвер LED семисегментного индикатора
Views: 17951 Китайский производитель Shenzhen Titan Micro Electronics Co., Ltd. Выпускает широкую линейку драйверов управления светодиодными дисплеями, которые позволяют разгрузить микроконтроллер для основной работы, главная особенность этих драйверов не только …Altium Designer – подготовка документации для производства и сборки печатных плат
Views: 3701 В процессе освоения Altium Designer много возникает вопросов по подготовке документации для производства плат, а также для её сборки. Altium Designer позволяет сделать все требуемые документы, хотя скажем …NeoPixel LED и PIC18
Views: 1671 Еще раз об управлении светодиодами на драйвере WS2812 и ему подобных. Как известно эти светики управляются по однопроводной шине. Основная особенность, что программно можно описать передачу данных, …Оптосимистор и его применение
Views: 19688 Эрве Кадино “Цветомузыкальные установки” Ответ на вопрос – управление мощным тиристором или симистором, от терморегулятора. Статья в pdf[wpdm_file id=129 template=”link-template-calltoaction3.php”] Оптосимистор принадлежат к классу оптронов и обеспечивают очень хорошую …Часы-кухонный таймер
Views: 2729 Каждая кухня должна иметь кухонный таймер, который позволяет напоминать хозяйке когда проходить определенный промежуток времени. Например, печем пирог, варим яйца… , чтобы не смотреть постоянно на часы, установим таймер и …УКВ – радиоприем, часть 2
Views: 6227 Пришло свободное время решил вторую часть проекта реализовать (правда есть мысль и третью с использование цветного OLED и функцией ch-светомузыки, но это только задумка… Для понимания функций интегрального …