Views: 6194
Эта функция доступна уже в версии 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.
Это может быть интересно
TM1650 драйвер LED семисегментного индикатораViews: 18382 UPDATES 2025/10/10 Китайский производитель Shenzhen Titan Micro Electronics Co., Ltd. Выпускает широкую линейку драйверов управления светодиодными дисплеями, которые позволяют разгрузить микроконтроллер для основной работы, главная особенность этих драйверов …
MCC PIC24 – модуль OUTPUT COMPARE – в режиме генератора звуковых сигналовViews: 805 При проектировании простых устройств автоматики, часто необходимо иметь механизм звукового оповещения. Самый верхний уровень, это формирование голосовых сообщений, но об этом, как то по позже… В самом примитивном …
NeoPixel LED and PIC24Views: 753 Популярность однопроводной шины для управления светодиода типа WS2812 не ослабевает, а новые типы светодиодов в корпусах 3,5*3,5мм, 2,0*2,0мм становяться все больше привлекательными. Построение дисплеев для анимации требуют все …
NeoPixel LED и PIC18Views: 1899 Еще раз об управлении светодиодами на драйвере WS2812 и ему подобных. Как известно эти светики управляются по однопроводной шине. Основная особенность, что программно можно описать передачу данных, …
CCP модуль для декодирования ИК-кодов пультов ДУViews: 1146 Множество изготовителей для своих пультов дистанционного управления на ИК лучах используют принцип широтно-импульсной модуляции. В таких кодах бит единицы представляется импульсом большой длительности, а ноль импульсом короткой длительности. …
Счетчики посетителейViews: 1299 Вас сосчитали!? или счетчики посетителей. Для чего нужны счетчики посетителей? Какие они бывают? ТОРГОВЛЯ. Подсчитайте, сколько ваш магазин посещает человек за день. Кок много человек приходит утром, какое …
Altium Designer my Libraries, Project templates, System settings by Catcatcat V23.09Views: 654 September 2023 component base update. Release updates V. – 23_09 added new components. Changed the structure of the database. Configuration file name – DXPPreferences1.DXPPrf. Added project CLUBBEST_50_Light. …
Дифференциальный терморегуляторViews: 4143 Дифференциальный терморегулятор ch-3020 Назначение. Ch-c3020 представляет собой дифференциальный терморегулятор. Основное назначение солнечные системы горячего водоснабжения, а также вентиляционные системы управление притоком свежего воздуха. Контроллер позволяет работать пяти режимах. …
Проблемы классической светомузыкиViews: 2180 Светомузыка – что это такое? Определение: Светомузыка (жаргонное: цветомузыка) — вид искусства, основанный на способности человека ассоциировать звуковые ощущения со световыми восприятиями. Такое явление в неврологии получило название …
Проект с использованием MCC часть 05Views: 2188 Эту часть назовем так как избавься от delay, там где а это реально не надо. Для это нам потребуется научиться использовать прерывания и работать с таймерами. Что такое …