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

Visits: 5771


Эта функция доступна уже в версии 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.



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


  • I2C MODULE – PIC18F25K42 Device ID Revision = A001I2C MODULE – PIC18F25K42 Device ID Revision = A001
    Visits: 1045 I2C MODULE Обход ошибок в версии I2C MODULE – PIC18F25K42 Device ID Revision = A001 В Серии K42 применен совершенно новый модуль шины I2C, который позволяет поддерживать все …
  • TDA7294 part 1TDA7294 part 1
    Visits: 197 TDA7294 має унікальні дані для створення підсилювачів звукової частоти HI-FI класу. Варіант застосування є конфігурація BRIDGE (мостова схема включення), де використовуються два TDA7294, як показано на схематичній діаграмі …
  • Регулятор влажности ch-3800Регулятор влажности ch-3800
    Visits: 1382   И еще один проект на плате ch-c3xxx –  универсальный регулятор влажности ch-3800. Регулятор позволяет работать как в режиме индикатора влажности, так и в режиме регулятора. Рабочий диапазон …
  • Проект с использованием MCC часть 15Проект с использованием MCC часть 15
    Visits: 1471 EUSART – Универсальный асинхронный приёмопередатчик (УАПП, англ. Universal Asynchronous Receiver-Transmitter, UART) — узел вычислительных устройств, предназначенный для организации связи с другими цифровыми устройствами. … читать на вики. Внесем изменения в нашу схему, …
  • Часы + Календарь + Термометр + …Часы + Календарь + Термометр + …
    Visits: 2664 Часы + Календарь + Термометр + Индикатор влажности + Секундомер + Дистанционное управление на ИК лучах (пульты на RC-5 протоколе) + Автоматическая регулировка яркости + Возможность вывода данных через USB, …
  • WiFi ESP8266 – AT команды связанные с функцией TCP/IP (v.1.6.1)WiFi ESP8266 – AT команды связанные с функцией TCP/IP (v.1.6.1)
    Visits: 4989 AT команды связанные с функцией TCP/IP В этом разделе описаны команды которые позволяют устанавливать соединения между серверами и клиентами в сети. Приведено описание команд и примеры их выполнения. …
  • MAX7219/21 и 8х8 LED дисплеиMAX7219/21 и 8х8 LED дисплеи
    Visits: 903 MAX7219, MAX7221 предназначены для вывода информации на 8 разрядов семисегментного индикатора, но на нем легко организовать вывод на светодиодные индикаторы 8х8. продолжение следует…. Это может быть интересно Метки: MAX7219, …
  • Audio-bluetooth modules BK8000L (noname)Audio-bluetooth modules BK8000L (noname)
    Visits: 629 Еще один вариант, так сказать недоразумения Audio-bluetooth modules BK8000L (noname). Его отличительной маркировкой служат два отверстия в плате и надпись R2. Отличают его от модулей на чипе BK8000L, …
  • Система AT команд версии V2.0 для ESP8266 и ESP32Система AT команд версии V2.0 для ESP8266 и ESP32
    Visits: 9315 Появление нового модуля на базе ESP32 заставило систематизировать систему AT команд, а так же систему обновления и для модулей на базе ESP8266. Начиная с версии v2.0 в ESP8266 …
  • ch-4060 – регулятор температуры и влажности на датчике DHT11/DHT22/AM2302ch-4060 – регулятор температуры и влажности на датчике DHT11/DHT22/AM2302
    Visits: 2395 На плате ch-4000 очень легко собрать устройство регулятора температуры и влажности. Датчик DHT11  самый недорогой вариант для создания такого устройства, правда точность его не велика, но для бытовых устройств …



 

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

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.

Продолжайте читать

НазадДалее