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

Views: 5884


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



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


  • Система отопления на солнечных коллекторах от Дмитрия (rv3dpi)Система отопления на солнечных коллекторах от Дмитрия (rv3dpi)
    Views: 3206 Солнечные коллекторы для отопления в Европе используют в более 50% от общего количества установленных гелиосистем. Однако следует понимать, что гелиосистемы предназначены лишь для поддержки отопления и экономии затрат на основную …
  • Проект с использованием MCC часть 05Проект с использованием MCC часть 05
    Views: 1943 Эту часть назовем так как избавься от delay, там где а это реально не надо. Для это нам потребуется научиться использовать прерывания и работать с таймерами. Что такое …
  • VU Meter Tower ARTVU Meter Tower ART
    Views: 1611 Стерео индикатор уровня аудио сигнала. Компактность и удобство проектирования устройств на светодиодах WS2812B, а также легкость реализации алгоритма родило идею созданию своей конструкции. В этом проекте я предоставлю …
  • Защита датчиков температуры DS18B20 от статического электричестваЗащита датчиков температуры DS18B20 от статического электричества
    Views: 1836 Статья перепечатана с сайта http://svetomuzyka.narod.ru При удалении датчика на большие расстояния возникает опасность наведения импульсов высокого напряжения на кабель, который соединяет датчик с контролером. Если не принимать меры защиты, …
  • Temperature measurement with NTC thermistor.Temperature measurement with NTC thermistor.
    Views: 325 Проекты в которых присутствовало измерение температуры начинал с цифровых датчиков, т.к. в них все просто и не надо ничего преобразовывать и вычислять. При использовании цифровых датчиков ты получаешь …
  • CCP – модуль в режиме Compare на примере PIC18CCP – модуль в режиме Compare на примере PIC18
    Views: 3099 CCP – модуль можно использовать в трех режимах: Capture – позволяет захватывать входной сигнал и определять его параметры (длительность или частоту). Дополнительно управлять внутренними модулями. Compare –  позволяет …
  • Самый простой индикатор уровня звукового сигналаСамый простой индикатор уровня звукового сигнала
    Views: 6321 Демонстрационный проект создания индикаторов уровня с использованием WS2812B. Изучив этот проект вы сможете  самостоятельно изготавливать и конструировать свои индикаторы уровня звукового сигнала. Дополнительно читайте статью Бегущие огни на …
  • Бегущие огни (ch-bo-36)Бегущие огни (ch-bo-36)
    Views: 2438 Проект на PIC-микроконтроллере PIC16F648A. Количество каналов 36. Для индикации используется подключение по матрице 6х6. Расположение светодиодов в одну линию. Все эффекты написаны для возможности увеличения количества светодиодов. Рекомендуется …
  • Мониторинг температурыМониторинг температуры
    Views: 1389 Настоящий проект создан как обучающий с применением библиотек ds18b20 и LCDHD44780 и компилятора Microchip MPLAB XC8 C Compiler V1.12. Если необходимо иметь информацию по состоянию температуры в помещении или в здании, с количеством до 6 точек (16), то …
  • Мультизоновый индикатор-терморегулятор ch-c3010Мультизоновый индикатор-терморегулятор ch-c3010
    Views: 1173 Часто возникает необходимость получить информацию по температуре с множества точек контроля. Вам необходимо знать температуру в комнате, в коридоре,  температуру на улице, а в погребе (или на балконе) …



 

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

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.

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

НазадДалее