ESP8266 процедура получение данных даты и времени от серверов точного времени.

Просмотров: 5569


Эта функция доступна уже в версии 1.6.1.

Для многих приложений, необходимо часы реального времени,  если в вашем проекте есть модуль WiFI ESP8266, то легко можно сделать следующим образом.

Процедура описывает полный цикл подключения к  роутеру WIFI подключение к серверам, получение данных времени конвертация его в двоично десятичный форма, для часов реального времени и отключения от роутера.

  1. AT+CWMODE_CUR=1  – настройка режим станции.
  2. AT+CIPMUX=0 – установить режим одного соединения.
  3. AT+CWJAP_CUR=”логин вашего роутера”,”пароль вашего роутера” – подключение к роутеру.
  4. AT+CIPSNTPCFG=1,3,”0.ua.pool.ntp.org”,”1.ua.pool.ntp.org”,”2.ua.pool.ntp.org” – вариант подключения к часовым серверам .(*1)
  5. AT+CIPSNTPTIME? – запрос времени.

ESP8266 – вернет время, день недели и дату в следующем формате:

Если не получено данных:

+CIPSNTPTIME:Thu Jan 01 00:00:00 1970

И если данные получены:

+CIPSNTPTIME:Wed Mar 18 12:35:17 2018

После получения времени, можно отключиться от сети.

  1. AT+CIPSNTPCFG=0 отключиться от серверов
  2. AT+CWQAP отключиться от роутера
  3. При желании можно перевести модуль в спящий режим.

ПРИМЕЧАНИЕ!!! После подключения в серверам точного времени и перед командой чтения времени возможно придется сделать пауза она может быть более 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.



Это может быть интересно


  • Проект с использованием MCC часть 16Проект с использованием MCC часть 16
    Просмотров: 990 Продолжим изучение EUSART. На этом этапе отработает передачи данных с ПК и получения эха. Для этого в основной цикл программы добавим код if(EUSART_DataReady) // проверим флаг готовности данных …
  • Analog-to-Digital Converter with Computation Technical BriefAnalog-to-Digital Converter with Computation Technical Brief
    Просмотров: 1064 Аналого-цифровой преобразователь с вычислительным модулем. ВВЕДЕНИЕ Аналого-цифровой преобразователь (ADC) с вычислительным модулем (ADC2) в 8-разрядном микроконтроллере Microchip имеет встроенные вычислительные функции, которые обеспечивают функции пост-обработки, такие как передискретизация, …
  • ch-4050 – дифференциальный терморегуляторch-4050 – дифференциальный терморегулятор
    Просмотров: 1754 ch-4050 – это не новая модель, это расширенная версия универсального терморегулятора ch-4000. Различия коснулись в появлении новой функции дифференциального регулирования. Это вид регулирования по разности температур измеренного двумя …
  • MPLAB® Harmony – или как это просто! Часть 2.MPLAB® Harmony – или как это просто! Часть 2.
    Просмотров: 2570 Часть вторая – Первая программа на PIC32. Музыкальная тема к статье, слушаем: Для начала изучения PIC32 надо иметь или демоплату или самому её изготовить имея микроконтроллер. Начнем из …
  • MCC PIC24 – модуль REAL-TIME CLOCK AND CALENDAR (RTCC)MCC PIC24 – модуль REAL-TIME CLOCK AND CALENDAR (RTCC)
    Просмотров: 394 RTCC предоставляет пользователю часы реального времени и функция календаря (RTCC), точность “хода” может быть откалибрована. Основные особенности модуля RTCC: • Работает в режиме глубокого сна. • Возможность выбора источника …
  • TDA7294 part 1TDA7294 part 1
    Просмотров: 119 TDA7294 має унікальні дані для створення підсилювачів звукової частоти HI-FI класу. Варіант застосування є конфігурація BRIDGE (мостова схема включення), де використовуються два TDA7294, як показано на схематичній діаграмі …
  • Ссылки на интересные источникиСсылки на интересные источники
    Просмотров: 763 Сбор 3D моделей от André L’Hérault конденсаторы, резисторы, индуктивности dropbox IPC-SM-782 Surface Mount Design and Land Pattern Standard Видео уроки по Altium designer Alexey Sabunin https://www.youtube.com/channel/UCG7N5CqXpyK8nQjr1EmMgng Сергей Булавинов https://www.youtube.com/channel/UCISAMXRnN_Qw9UTjUwZI1Jw Robert Feranec https://www.youtube.com/user/matarofe …
  • Altium Designer my setup system and project structureAltium Designer my setup system and project structure
    Просмотров: 318 Используйте только последнее обновление!!! Updates https://catcatcat.d-lan.dp.ua/altium-designer-my-libraries-project-templates-system-settings-by-catcatcat-v23-04/        Тут хочу поделиться как я настраиваю Altium Designer и как я использую файлы DXPPreferences.DXPPrf для быстрой конфигурации и получения …
  • APA102 – светодиоды со встроенным драйвером и SPI интерфейсомAPA102 – светодиоды со встроенным драйвером и SPI интерфейсом
    Просмотров: 3204 APA102 В 2014 году фирма Shenzhen Led Color Optoelectronic Co., Ltd http://www.szledcolor.com/ начала производство светодиодов на драйвере APA102. Это серия так называемых светодиодов со встроенным драйвером. Основной особенностью этих …
  • LCD драйвер – UC1601sLCD драйвер – UC1601s
    Просмотров: 1461 http://svetomuzyka.narod.ru/project/UC1601s.html Читайте обновление на http://catcatcat.d-lan.dp.ua/?page_id=178 В данный момент можно приобрести в ООО “Гамма” несколько типов индикаторов на драйвере UC1601s. RDX0048-GC, RDX0077-GS, RDX0154-GC и RDX0120-GC выполнены по технологии COG. Метки:UC1601s



 

Поделись этим!

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.