Цифровая электроника для начинающих (Елисеев) - страница 36


Теперь мы можем выводить нужные нам данные на экран. Следующим шагом узнаем, как получать необходимые данные из сети Интернет.


Самостоятельная работа: изучить исходный текст библиотеки рисования по адресу https://github.com/ThingPulse/esp8266-oled-ssd1306/blob/master/OLEDDisplay.h. Помимо функции drawString, там описано множество других полезных функций, например drawCircle или drawProgressBar. Испытать их в программе.


3.5 Получаем время от атомных часов

Раз уж мы подключились к Интернет, можно сделать много чего полезного. Например, получить точное время с атомных часов от NTP-сервера, тем более что библиотеки для этого уже есть.


Добавим в программу соединения с WiFi код вывода точного времени.


#include

#include


const char* ssid = "TP-LINK_AB11";

const char* password = "12345678";


const char* ntpServer = "pool.ntp.org";

const long gmtOffset_sec = 3600;

const int daylightOffset_sec = 3600;


void setup() {

Serial.begin(115200);

while (WiFi.status() != WL_CONNECTED) {

delay(1000);

Serial.print(".");

WiFi.begin(ssid, password);

}

Serial.println("WiFi connected!");

Serial.print("IP address: ");

Serial.println(WiFi.localIP());


// Настройки службы времени

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

}


void loop() {

// Получение времени

struct tm timeinfo;

if (!getLocalTime(&timeinfo)){

Serial.println("getLocalTime: error");

delay(10000);

return;

}

Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");

delay(30000);

}


Как можно видеть, мы добавили вызов двух функций: configTime и getLocalTime. Первая функция настраивает нужные параметры (например часовой пояс), вторая получает время. Кстати, само время хранится в структуре tm, которая хранится в файле time.h и имеет следующий вид:

struct tm {


int tm_sec; // Seconds after the minute [0, 59]


int tm_min; // Minutes after the hour [0, 59]


int tm_hour; // Hours since midnight [0, 23]


int tm_mday; // Day of the month [1, 31]


int tm_mon; // Months since January [0, 11]


int tm_year; // Years since 1900


int tm_wday; // Days since Sunday [0, 6]


int tm_yday; // Days since January 1 [0, 365]


int tm_isdst; // Daylight Saving Time flag


int tm_gmtoff; // Seconds east of UTC


char *tm_zone; // Timezone abbreviation


};


Все эти поля можно использовать. Например, можно зажечь светодиод (или запустить зуммер) в 8 часов утра: