1820|0

85

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【零知ESP8266教程】快速入门21 世界时钟demo [复制链接]

上次分享了一个本地时钟,小伙伴觉得不fashion,所以思前想后,做一个世界时钟,来撑撑场面,也算是一个小拓展。这次,我们一起制作世界时钟!
一、硬件
电脑,windows系统
零知ESP8266开发板
OLED SSD1306模块
micro-usb线
杜邦线若干
二、连线

三、软件库的查找安装
(1)查找:可以在零知实验室查看“无线”下载安装,也可在github查找安装。
(亦可评论留言,私发给你)

OLEDWeatherStation

(2)安装:可以在零知实验室搜索:本地库,即可出现安装教程。
(3)安装完成后,打开零知开源软件,选择对应的开发板,如图:

(4)我们新建工程,烧写以下代码:

  • #include <ESP8266WiFi.h>
  • #include <ESP8266HTTPClient.h>
  • #include <Ticker.h>
  • #include <JsonListener.h>
  • #include <SSD1306Wire.h>
  • #include <OLEDDisplayUi.h>
  • #include <Wire.h>
  • #include <WorldClockClient.h>
  • #include "icons.h"
  • #include "fonts.h"
  • /***************************
  • * Begin Settings
  • **************************/
  • // WIFI
  • const char* WIFI_SSID = "xx";//在这里写入你的WIFI名字
  • const char* WIFI_PWD = "xx"; //写WIFI密码
  • // Setup
  • const int UPDATE_INTERVAL_SECS = 10 * 60; // Update every 10 minutes
  • // Display Settings
  • const int I2C_DISPLAY_ADDRESS = 0x3c;
  • const int SDA_PIN = D3; //
  • const int SDC_PIN = D4;
  • // TimeClient settings
  • // Initialize the oled display for address 0x3c
  • // sda-pin=14 and sdc-pin=12
  • SSD1306Wire display(I2C_DISPLAY_ADDRESS, SDA_PIN, SDC_PIN);
  • OLEDDisplayUi ui ( &display );
  • /***************************
  • * End Settings
  • **************************/
  • //String timeZoneIds [] = {"America/New_York", "Europe/London", "Europe/Paris", "Australia/Sydney", ""};
  • //WorldClockClient worldClockClient("de", "CH", "E, dd. MMMMM yyyy", 4, timeZoneIds);
  • //
  • String timeZoneIds [] = {"America/New_York", "Europe/London", "Europe/Paris", "Australia/Sydney", "Asia/Shanghai"};
  • WorldClockClient worldClockClient("zh", "CN", "E, dd. MMMMM yyyy", 5, timeZoneIds);
  • // flag changed in the ticker function every 10 minutes
  • bool readyForUpdate = false;
  • String lastUpdate = "--";
  • Ticker ticker;
  • void updateData(OLEDDisplay *display) {
  • drawProgress(display, 50, "Updating Time...");
  • worldClockClient.updateTime();
  • drawProgress(display, 100, "Done...");
  • readyForUpdate = false;
  • delay(1000);
  • }
  • void drawProgress(OLEDDisplay *display, int percentage, String label) {
  • display->clear();
  • display->setTextAlignment(TEXT_ALIGN_CENTER);
  • display->setFont(ArialMT_Plain_10);
  • display->drawString(64, 10, label);
  • display->drawProgressBar(10, 28, 108, 12, percentage);
  • display->display();
  • }
  • void drawClock(OLEDDisplay *display, int x, int y, int timeZoneIndex, String city, const uint8_t* icon) {
  • display->setTextAlignment(TEXT_ALIGN_LEFT);
  • display->setFont(ArialMT_Plain_10);
  • display->drawString(x + 60, y + 5, city);
  • display->setFont(Crushed_Plain_36);
  • display->drawXbm(x, y, 60, 60, icon);
  • display->drawString(x + 60, y + 15, worldClockClient.getHours(timeZoneIndex) + ":" + worldClockClient.getMinutes(timeZoneIndex));
  • }
  • void drawFrame1(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) {
  • drawClock(display, x, y, 0, "New York", new_york_bits); //纽约
  • }
  • void drawFrame2(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) {
  • drawClock(display, x, y, 1, "London", london_bits); //伦敦
  • }
  • void drawFrame3(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) {
  • drawClock(display, x, y, 2, "Paris", paris_bits); //巴黎
  • }
  • void drawFrame4(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) {
  • drawClock(display, x, y, 3, "Sydney", sydney_bits); //悉尼
  • }
  • void drawFrame5(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) {
  • drawClock(display, x, y, 4, "Beijing", beijing_bits); //北京
  • }
  • void setReadyForWeatherUpdate() {
  • Serial.println("Setting readyForUpdate to true");
  • readyForUpdate = true;
  • }
  • // this array keeps function pointers to all frames
  • // frames are the single views that slide from right to left
  • FrameCallback frames[] = { drawFrame1, drawFrame2, drawFrame3, drawFrame4, drawFrame5};
  • int numberOfFrames = 5;
  • void setup() {
  • Serial.begin(115200);
  • Serial.println();
  • Serial.println();
  • // initialize dispaly
  • display.init();
  • display.clear();
  • display.display();
  • //display.flipScreenVertically();
  • display.setFont(ArialMT_Plain_10);
  • display.setTextAlignment(TEXT_ALIGN_CENTER);
  • display.setContrast(255);
  • WiFi.begin(WIFI_SSID, WIFI_PWD);
  • int counter = 0;
  • while (WiFi.status() != WL_CONNECTED) {
  • delay(500);
  • Serial.print(".");
  • display.clear();
  • display.drawString(64, 10, "Connecting to WiFi");
  • display.drawXbm(46, 30, 8, 8, counter % 3 == 0 ? activeSymbol : inactiveSymbol);
  • display.drawXbm(60, 30, 8, 8, counter % 3 == 1 ? activeSymbol : inactiveSymbol);
  • display.drawXbm(74, 30, 8, 8, counter % 3 == 2 ? activeSymbol : inactiveSymbol);
  • display.display();
  • counter++;
  • }
  • ui.setTargetFPS(30);
  • // You can change this to
  • // TOP, LEFT, BOTTOM, RIGHT
  • ui.setIndicatorPosition(BOTTOM);
  • // Defines where the first frame is located in the bar.
  • ui.setIndicatorDirection(LEFT_RIGHT);
  • // You can change the transition that is used
  • // SLIDE_LEFT, SLIDE_RIGHT, SLIDE_TOP, SLIDE_DOWN
  • ui.setFrameAnimation(SLIDE_LEFT);
  • // Add frames
  • ui.setFrames(frames, numberOfFrames);
  • ui.setTimePerFrame(2*1000); // Setup frame display time to 10 sec
  • // Inital UI takes care of initalising the display too.
  • ui.init();
  • Serial.println("");
  • updateData(&display);
  • ticker.attach(UPDATE_INTERVAL_SECS, setReadyForWeatherUpdate);
  • }
  • void loop() {
  • if (readyForUpdate && ui.getUiState()->frameState == FIXED) {
  • updateData(&display);
  • }
  • int remainingTimeBudget = ui.update();
  • if (remainingTimeBudget > 0) {
  • // You can do some work here
  • // Don't do stuff if you are below your
  • // time budget.
  • delay(remainingTimeBudget);
  • }
  • }

(5)验证代码,然后上传

四、结果

同时OLED就可以显示世界时钟的效果:

也有视频效果,可以一览哦

此帖出自stm32/stm8论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播 | AI之眼——安森美图像传感器 报名中
直播时间:2025年4月25日(周五)上午10:00-11:30
直播主题:AI之眼——安森美图像传感器
报名观看直播、直播间提问、填写问卷均有机会获得精美礼品!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 5

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表