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

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


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



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


  • Регулятор влажности ch-3800Регулятор влажности ch-3800
    Просмотров: 859   И еще один проект на плате ch-c3xxx –  универсальный регулятор влажности ch-3800. Регулятор позволяет работать как в режиме индикатора влажности, так и в режиме регулятора. Рабочий диапазон …
  • Altium Designer – подготовка документации для производства и сборки печатных платAltium Designer – подготовка документации для производства и сборки печатных плат
    Просмотров: 3249 В процессе освоения Altium Designer много возникает вопросов по подготовке документации для производства плат, а также для её сборки. Altium Designer позволяет сделать все требуемые документы, хотя скажем …
  • УКВ – радиоприем, часть 1УКВ – радиоприем, часть 1
    Просмотров: 8839 Музыкальная тема к статье, слушаем: Первый мой радиоприемник, выглядел так. Использовал исключительно в школе на уроках, держась за одно ухо и преданно смотря на училку и сладко улыбаясь. …
  • BMP280 – температура и атмосферное давление – учебный проектBMP280 – температура и атмосферное давление – учебный проект
    Просмотров: 1724 Учебный проект на PIC32 и светодиодной панели P5 (2121)-168-6432-80 (32*64). Проект позволяет ознакомиться с простой графикой и с чтением давления и температуры с датчика BMP280. Для тестирования необходимо …
  • Емкостной сенсорЕмкостной сенсор
    Просмотров: 2703 Изучаем изготовление емкостных сенсоров на PIC-микроконтроллере. Конструкция емкостных сенсоров имеет вид: Емкостные сенсоры строятся по схеме высокочастотного генератора, сам принцип основан на измерение частоты этого генератора. Частота зависит …
  • Audio-bluetooth modules F-6188 (BK8000L)Audio-bluetooth modules F-6188 (BK8000L)
    Просмотров: 1586Следующий модуль на чипе BK8000L. Заводское обозначение F-6188 также основным производителем не выпускается и отдан на тиражирование. с нижней стороны имеет маркировку В этом варианте мне попалась вроде полноценная …
  • I2C MODULE – PIC18F25K42 Device ID Revision = A001I2C MODULE – PIC18F25K42 Device ID Revision = A001
    Просмотров: 886 I2C MODULE Обход ошибок в версии I2C MODULE – PIC18F25K42 Device ID Revision = A001 В Серии K42 применен совершенно новый модуль шины I2C, который позволяет поддерживать все …
  • Универсальный терморегулятор ch-c3000Универсальный терморегулятор ch-c3000
    Просмотров: 2731 Терморегулятор ch-c3000 предназначен для управления системами регулирования температуры в пределах от – (минус) 55 до + 125 С. Регулятор может использоваться как в системах отопления, так и в …
  • Простой сенсорный регулятор светаПростой сенсорный регулятор света
    Просмотров: 2178 Простой сенсорный регулятор. Проект – 2007 года. Регулятор выполнена на микроконтроллере PIC12F683 и имеет минимальное количество элементов. Выполняет стандартные функции, включение выключение света, изменение яркости, запоминание последнего установленного уровня …
  • USB K-L-line адаптерUSB K-L-line адаптер
    Просмотров: 5614 USB K-L-line адаптер предназначен для связи персонального компьютера с диагностической шиной автомобиля – интерфейс ISO-9141. Этот проект предназначен для сборки недорого устройства с использованием специально для этой цели …



 

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

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.