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

Views: 5812


Эта функция доступна уже в версии 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 часть 15Проект с использованием MCC часть 15
    Views: 1498 EUSART – Универсальный асинхронный приёмопередатчик (УАПП, англ. Universal Asynchronous Receiver-Transmitter, UART) — узел вычислительных устройств, предназначенный для организации связи с другими цифровыми устройствами. … читать на вики. Внесем изменения в нашу схему, …
  • Ultrasonic Level Meters – ULM –53LUltrasonic Level Meters – ULM –53L
    Views: 709 Измерение расстояния при помощи ультра звукового датчика ULM–53L–10. Диапазон измерения от 0,5 м до 10 м, полностью пластмассовый излучатель PVDF, механическое соединение фланцем из полиэтилена HDPE (исполнение “N”) Характеристики …
  • Применение typedef, struct и unionПрименение typedef, struct и union
    Views: 8710 Полезные описания переменных Часто необходимо в памяти расположить последовательно разные виды данных, что бы потом можно было их использовать. Полезные ссылки Взято и переработано с сайта http://www.butovo.com/~zss/cpp/struct.htm http://cppstudio.com/post/9172/ …
  • Самый простой индикатор уровня звукового сигналаСамый простой индикатор уровня звукового сигнала
    Views: 6227 Демонстрационный проект создания индикаторов уровня с использованием WS2812B. Изучив этот проект вы сможете  самостоятельно изготавливать и конструировать свои индикаторы уровня звукового сигнала. Дополнительно читайте статью Бегущие огни на …
  • Проект с использованием MCC часть 06Проект с использованием MCC часть 06
    Views: 1251 Изменим схему следующим образом добавим две тактовые кнопки BT1 и BT2. Теперь переключимся на конфигурацию выводов, для этого сделаем двойной клик в окне Ресурсы проекта на Pin Module. …
  • Проект с использованием MCC часть 11Проект с использованием MCC часть 11
    Views: 834 Можно несколько облагородить программу вынести наши процедуры обработки нажатия кнопок в отдельные функции. Но вы должны понимать, что это хоть и не значительно, но будет тормозить общую скорость …
  • PIC18 – модуль DMAPIC18 – модуль DMA
    Views: 1157 Введение   Модуль прямого доступа к памяти (DMA) предназначен для обслуживания передачи данных непосредственно между различными областями памяти без вмешательства процессора. Исключив при этом необходимость в интенсивной  обработки …
  • Проблемы классической светомузыкиПроблемы классической светомузыки
    Views: 2047 Светомузыка – что это такое? Определение: Светомузыка  (жаргонное: цветомузыка)  — вид искусства, основанный на способности человека ассоциировать звуковые ощущения со световыми восприятиями. Такое явление в неврологии получило название …
  • Toyota Auto Fader – Модуль включения усилителяToyota Auto Fader – Модуль включения усилителя
    Views: 1920 Toyota Auto Fader – Модуль включения усилителя. Часто автолюбители прибегают к замене штатного головного устройства на универсальное мультимедийное, в котором значительно расширены функциональные возможности. Если возникает желание оставить …
  • Простой цифровой милливольтметр постоянного токаПростой цифровой милливольтметр постоянного тока
    Views: 4049 Простой цифровой вольтметр постоянного тока. Три диапазона измерений с автоматическим переключением 1 – 0,001 – 0,999 V, 2 – 0,01-9,99 V, 3 – 0,1-99,9. Четыре управляемых выхода с возможностью задания функции контроля …



 

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

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.

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

НазадДалее