NodeMCU项目(一)天气时钟

2023-11-20

weather-clock

概述

首先使NodeMCU模块连接WiFi,接入互联网;然后连接阿里的NTP服务器,获取网络授时,向心知天气服务器发送HTTP请求,对返回的天气信息进行解析,获得今天、明天、后天的天气信息;最后通过OLED屏幕显示获得的信息。

硬件

  • NodeMCU(CH340)
  • 0.96英寸I2C接口OLED显示屏(SSD1306)

在这里插入图片描述

软件

  • Arduino IDE
  • PCtoLCD2002 取模软件

设计

连接WiFi

NodeMCU连接WiFi方式有很多种:

  1. 使用ESP8266WiFi库,在程序中写入一个WiFi信息,并连接到该WiFi。

  2. 使用ESP8266WiFiMulti库,在程序中写入多个WiFi信息,并自动连接到信号最强的WiFi(本项目使用该方式)。

  3. 使用WiFiManager库,不需要在程序中写入WiFi信息。使用WiFiManager库,当NodeMCU上电时,会在闪存中读取曾经连接并被保存的WiFi信息,然后连接到WiFi。如果连接失败,NodeMCU会创建一个热点,用手机或电脑连接该热点,然后扫描附近的WiFi,选择WiFi后输入密码进行连接(类似于路由器的配置)。

实时时间获取
NTP服务

NTP(Network Time Protocol),网络时间协议,是用来使计算机时间同步化的一种协议。

NTPClient库

An NTPClient to connect to a time sever Get time from a NTP sever and keep it in sync.

使用NTPClient库连接NTP服务器获取网络时间并保持时间同步。

实例化NTPClient对象,选择服务器(阿里)、偏移量(时区)及更新间隔(单位为毫秒)

NTPClient timeClient(ntpUDP, "ntp.aliyun.com", 60 * 60 * 8, 30 * 60 * 1000);

获取时间

timeClient.update();
nowTime = timeClient.getFormattedTime();
天气信息获取
心知天气API

心知天气通过标准的RestfulAPI接口,提供标准化的数据访问。拥有许多丰富的功能,本项目仅使用了天气类中逐日天气预报和昨日天气这一个子类,由于是普通用户,该接口只能只返回 3 天天气预报。

请求地址示例

北京今天和未来 4 天的预报 https://api.seniverse.com/v3/weather/daily.json?key=your_api_key&location=beijing&language=zh-Hans&unit=c&start=0&days=5

北京的昨日天气、今天和未来 3 天的预报(昨日天气独立于逐日天气预报,需要单独购买) https://api.seniverse.com/v3/weather/daily.json?key=your_api_key&location=beijing&language=zh-Hans&unit=c&start=-1&days=5

请求天气数据

按照心知天气官网介绍的API使用方式,建立HTTP请求信息。

//WiFiClient对象
WiFiClient client;
//建立心知天气API天气请求资源地址
String reqRes = "/v3/weather/daily.json?key=" + privateKey +
                + "&location=" + requireCity + "&language=en&unit=" +
                temperatureUnit + "&start=0&days=3";
//建立http请求信息
String httpRequest = String("GET ") + reqRes + " HTTP/1.1\r\n" +
                     "Host: " + host + "\r\n" +
                     "Connection: close\r\n\r\n";

连接服务器,发送HTTP请求。

if (client.connect(host, 80)) {
    client.print(httpRequest);
    ......
  }
Json数据解析
ArduinoJson库

A simple and efficient JSON library for embedded C++. ArduinoJson supports seriaization, deserialization, MessagePack, fixed allcation, zero-copy, streams, fitering, and more.

ArduinoJson库是解析JSON格式信息的第三方库,可以很简单地解析json数据(反序列化)和构造序列化json(序列化)。在ArduinoJson官网里还提供了在线生成程序的工具ArduinoJson Assistant,十分便捷。

天气信息解析

利用ArduinoJson官网的在线工具ArduinoJson Assistant,首先选择处理器、模式和输入类型,接着输入心知天气服务器返回的json数据,然后选择DynamicJsonDocument对象所占的空间(按照推荐即可),最后点击生成程序。

在这里插入图片描述

生成的程序修改参数后选择需要的信息,可以直接使用(不同的ArduinoJson版本生成的程序会有些许不同)。

多任务实现
Ticker库

The Arduino Ticker Library allows you to create easily Ticker callbacks, which can call a function in a predetermined interval. You can change the number of repeats of the callbacks, if repeats is 0 the ticker runs in endless mode. Works like a “thread”, where a secondary function will run when necessary. The library use no interupts of the hardware timers and works with the micros() / millis() function. You are not (really) limited in the number of Tickers.

正常情况esp8266执行任务时是自上而下的,最终在 loop() 函数中无限循环。为了实现向服务器发送请求、显示时间、显示天气等任务并行进行,可以借助Ticker库,让esp8266间隔固定时间调用任务函数,这里的定时调用不同于delay延时,它不受程序运行的的影响也不对程序的运行造成影响,达到了类似多线程(thread)的效果。

attach函数

attach函数有两个参数,第一个参数是调用函数的时间间隔,单位是秒,第二个参数是被调用的函数,需要注意的是被调用的函数必须执行地很快。

//向服务器请求定时器(实例化Ticker对象)
Ticker requestTicker;
//向服务器请求时间间隔
int requestInterval = 0;
//开启服务器请求定时
requestTicker.attach(1, tickerRequestInterval);

这里对变量 requestInterval 进行加1操作,在 loop() 函数里对变量 requestInterval 进行判断,当其达到预定值后就去执行任务函数,这里是执行 getWeather() 函数。

void tickerRequestInterval() {
  requestInterval++;
}

最后将变量 requestInterval 重新置为0,程序继续循环。

//每隔60s向服务器发起一次请求
if (requestInterval >= 60) {
  //获取天气数据
  getWeather();
  //重新计时
  requestInterval = 0;
}
显示
U8g2库

U8g2 is a monochrome graphics library for embedded devices. U8g2 supports monochrome OLEDs and LCDs, which include the following controllers: SSD1305, SSD1306, SSD1309, SSD1322, SSD1325, SSD1327, SSD1329, SSD1606, SSD1607, SH1106, SH1107, SH1108, SH1122, T6963, RA8835, LC7981, PCD8544, PCF8812, HX1230, UC1601, UC1604, UC1608, UC1610, UC1611, UC1701, ST7565, ST7567, ST7588, ST75256, NT7534, IST3020, ST7920, LD7032, KS0108, SED1520, SBN1661, IL3820, MAX7219 (see here for a full list).

U8g2是一个用于嵌入式设备的单色图形库,支持许多单色OLED和LCD显示控制器,如SSD1306。U8g2库集成了大多数显示屏的底层驱动,拥有许多字库,而且支持中文,API众多,功能十分强大。

函数的使用

关于U8g2库相关函数的使用,网上有很多详细的资料,U8g2库也提供了丰富的示例程序(运行时需要取消构造函数的注释),可供研究使用。本项目里绘制所使用的比较重要的函数有:

  1. u8g2.drawStr()

绘制字符串。该函数有三个参数,前两个参数是待绘制的字符串首字符的坐标,第三个参数是待绘制的字符串。

u8g2.drawStr(0, 0, "Connecting to WiFi");
  1. u8g2.print()

在入指定光标位置打印内容,支持变量。该函数只有一个参数,就是需要打印的内容。

//设置光标位置  
u8g2.setCursor(65, 32);
//打印最低温度到最高温度
u8g2.print("T: " + dayWeather.low + "~" + dayWeather.high + "°C");
  1. u8g2.drawXBMP()

绘制FLASH中位图图像。该函数有五个变量,前两个参数是待绘制的位图图像的坐标,第三、四个参数是位图的宽高,最后一个参数是位图资源。

//晴天图标
u8g2.drawXBMP(0, 0, 64, 64, Sunny);
图片取模

借助PS和画图等软件,制作好图标的单色位图(bmp格式)图片,将图片导入到PCtoLCD2002中,在字模选项中调整设置,然后生成字模,生成的字模可以直接复制到程序中使用。

在这里插入图片描述

展示

启动界面

在这里插入图片描述

启动界面的汉字是图片取模制作成的,不是直接使用函数打印的。

连接WiFi界面

在这里插入图片描述

WiFi连接过程中 “.” 会逐个增加,以提示连接的过程,连接成功后会打印 “Successfully!” 提示连接成功。然后到下一个界面显示连接到的WiFi名称以及分配的IP地址。

时间日期界面

在这里插入图片描述

这里周几的计算用到了蔡勒公式。从心知天气解析的Json数据里可以得到当天的日期,将这个日期的年、月、日取出,应用蔡勒公式即可解出当天为周几。时间日期界面显示10s后变为天气界面。

天气界面

在这里插入图片描述

今天、明天、后天的天气信息轮流显示3s,显示信息包括天气图标,日期,天气文字、温度和湿度。

源代码

GitHub链接

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NodeMCU项目(一)天气时钟 的相关文章

随机推荐

  • 解决火狐首次启动太慢的方法

    众所周知 火狐浏览器有一定的优越性 现在众多的网站都采用了jquery技术 而ie在加载jquery上效果实在太差 尤其是配置稍低的情况下 ie很容易被卡死 这就体现出了火狐的优势 但火狐唯一不足的就是第一次启动的速度非常的慢 下面就是解决
  • 世界芯中国芯RISC-V相关资源及进展

    目录 1 RISC V介绍 RISC V为何会在最近两年迅速崛起 RISC V处理器生态 RISC V商业模式 2 RISC V发展历程 3 RISC V国际协会 4 中国RISC V产业联盟 5 RISC V相关资源 1 指令集规范 2
  • kotlin 之于 java 的差异

    一 变量声名 赋值和访问 kotlin 变量是空安全的 一般要求声明时就赋值 声名变量有两个关键字var和val 其中val相当于 java 的中的final 变量类型可显式给出 也可隐式推断 变量也可分可空类型和非空类型 以下给出几种声名
  • ROS1 ROS2学习

    ROS1 ROS2学习 安装 ROS ROS1 ROS2 命令行界面 ROS2 功能包相关指令 ROS 命令行工具 ROS1 CLI工具 ROS2 CLI工具 ROS 通信核心概念 节点 Node 节点相关的CLI 话题 Topic 编写发
  • Altium Designer 20 常见错误

    记录学习过程中出现的错误及解决方法 1 off grid pin问题和Off grid Net Label问题 Off grid Net Label问题解决 只需要选中出现警告的元件 然后按A再按G即可 或者按Shift Ctrl D也行
  • 【网络通信】TCP网络编程

    TCP网络编程 一 面向连接的TCP流模式 二 server程序 三 client程序 四 相关文章 1 TCP网络编程 2 sockaddr和sockaddr in详解 3 socket编程为什么需要htons ntohl ntohs h
  • huggingfacer QuestionAnswerig问答模型调用方式

    huggingface网站提供了大量深度学习预训练模型及其调用方式 本文主要介绍问答模型调用方式 主要是针对问答结果输出完整上下文的问题 其现象在于问题答案为输入的上下文 而不是答案部分 出现该问题主要原因是transformers版本过低
  • Linux流行的发行版本

    Linux是一种广泛使用的自由开源操作系统 具有高度的可定制性 可靠性和安全性 在Linux世界中 存在着许多流行的发行版本 这些版本针对不同的用户需求和技能水平提供了不同的特性和功能 下面将介绍几个流行的Linux发行版本 一 Ubunt
  • 独家解读丨2019,技术传播去向何方?

    如果您是 Technical writer 关于2019年技术传播的发展一定有独到见解 欢迎拉到文末参加有奖活动 小编说 三年一晃而过 The Content Wrangler 再度重磅发布2019技术传播基准调研报告 今天小编要带大家好好
  • 替换JSONObject某个对象的值

    有时候我们只想替换JSONObject某个对象的值 不想把所有对象的值都列出来 那就用for循环把所有的值重新赋值一遍 再单独给需要赋值的对象重新赋值 JSONObject itemObject new JSONObject sJson S
  • 已解决 Request execution error. endpoint=DefaultEndpoint{ serviceUrl=‘http://localhost:8761/eureka/}

    Requestexecutionerror endpoint DefaultEndpoint serviceUrl http localhost 8761 eureka 注册中心报错 问题原因 可能就是yml文件有一步写错了然后照成报错 报
  • 多线程中如何去保证线程安全

    http www cnblogs com qingche p 5695743 html 一 前言 前段时间看了几个开源项目 发现他们保持线程同步的方式各不相同 有 synchronized NSLock dispatch semaphore
  • 12.29练习总结

    第一题 迷宫 题目描述 给定一个N M 方格的迷宫 迷宫里有 T处障碍 障碍处不可通过 在迷宫中移动有上下左右四种方式 每次只能移动一个方格 数据保证起点上没有障碍 给定起点坐标和终点坐标 每个方格最多经过一次 问有多少种从起点坐标到终点坐
  • [C++]外观模式

    外观模式 Facade Pattern 隐藏系统的复杂性 并向客户端提供了一个客户端可以访问系统的接口 这种类型的设计模式属于结构型模式 它向现有的系统添加一个接口 来隐藏系统的复杂性 这种模式涉及到一个单一的类 该类提供了客户端请求的简化
  • Bridge Champ举办人机对战赛:NFT游戏与传统竞技共生发展编织新格局

    概要 现在 NFT与体育竞技正日益紧密地联系在一起 一些体育项目开始推出与赛事或球队相关的NFT 同时也有部分NFT游戏开始举办电子竞技赛事 这种共生发展正在改变体育竞技的生态 笔者采访了桥牌冠军项目相关负责人 探讨NFT游戏与传统体育竞技
  • Visual Studio 2019 详细安装和使用教程

    简介 此处省略很多字 下载 社区版本下载网址 https visualstudio microsoft com zh hans downloads 选择安装路径 建议为VS2019新建一个专属的文件夹 用于存储安装包 安装信息等 在这里你可
  • 什么是loader?

    什么是loader 我们使用webpack 来处理我们写的js代码 并且webpack 会自动处理js之间的相关依赖 在实际项目中 不仅有js文件 还有css 图片 ES6转ES5 tpyescript转ES5 将less scss转化cs
  • js逆向-国家某智慧教育平台登录参数

    目标网址 aHR0cHM6Ly93d3cuenh4LmVkdS5jbi91Yz9zZHAtYXBwLWlkPWU1NjQ5OTI1LTQ0MWQtNGE1My1iNTI1LTUxYTJmMWM0ZTBhOCZyZWRpcmVjdF91cmk
  • 【C++】语法小课堂 --- auto关键字 & typeid查看实际类型 & 范围for循环 & 空指针nullptr

    文章目录 一 auto关键字 C 11 1 auto的简介 2 auto的使用细则 auto与指针和引用结合起来使用 在同一行定义多个变量 3 auto不能推导的场景 1 auto不能作为函数的参数 2 auto不能直接用来声明数组 4 a
  • NodeMCU项目(一)天气时钟

    weather clock 概述 首先使NodeMCU模块连接WiFi 接入互联网 然后连接阿里的NTP服务器 获取网络授时 向心知天气服务器发送HTTP请求 对返回的天气信息进行解析 获得今天 明天 后天的天气信息 最后通过OLED屏幕显