【自学嵌入式(6)天气时钟:软硬件准备、串口模块开发】
天气时钟:软硬件准备、串口模块开发
- 软硬件准备
- 接线及模块划分
- ESP8266开发板引脚图
- 软件准备
- 串口模块编写
- 串口介绍
- Serial库介绍
近期跟着网上一些教学视频,编写了一个天气时钟,本篇及往后数篇都将围绕天气时钟的制作过程展开。本文先解决硬件准备、软件准备、串口模块开发等问题。
软硬件准备
此次实验中,我使用ESP8266开发板、0.96寸四针OLED屏幕、micro USB线及若干杜邦线。
接线及模块划分


ESP8266开发板引脚图

① 如上图所示,在很多介绍ESP8266以及NodeMCU的资料里会出现两种引脚命名方法。一种是GPIO编号,一种是NodeMCU引脚名。但这两者是不同的,千万不要混淆:
- GPIO编号指的是ESP8266芯片的引脚编号,通常不会因为生产厂家不同而不同
- NodeMCU引脚名指的是电路板上印刷的引脚名称,这通常会因为生产厂家不同而有所区别
② ESP8266芯片一共有17个GPIO引脚(GPIO0 ~ GPIO16),其中存在一些较为特殊的引脚:
- GPIO6 ~ GPIO11通常被用于连接开发板的闪存(Flash Memory),在实际编写代码时,应当尽量避免使用这些引脚
- GPIO2引脚在NodeMCU开发板启动时是不能连接低电平的
- GPIO15引脚在开发板运行中一直保持低电平状态
- GPIO0引脚在开发板运行中需要一直保持高电平状态,否则ESP8266将进入程序上传工作模式,无法正常工作,因此通常情况下,无需对GPIO0做任何改动
软件准备
本次实验需要使用Arduino IDE、CH340驱动以及u8g2库、ArduinoJson库、NTPClient库等。其中Arduino IDE和CH340驱动已经配置好,剩下三个库,只需在Arduino的库管理中搜索并下载相应的库文件包即可,我原先有库文件压缩包,因此使用添加.ZIP库的形式导入




串口模块编写
串口模块主要用于方便程序员调试功能,无需过于复杂,因此只需要封装用于初始化的函数 serialInit() 和用于输出信息的函数 serialPrint()即可。在之前的文章中,专门介绍过串口和Serial库,此处再来温习一下
串口介绍
串口,也称为串行接口或串行通信接口(通常指COM接口),是一种采用串行通信方式的扩展接口。它实现了数据一位一位地顺序传送,具有通信线路简单、成本低但传送速度慢的特点。只要一对传输线,串口就可以实现双向通信。

- 起始位(Start Bit):起始位为低电平时,告诉接收方数据传输即将开始,准备接收。在通信开始时,发送端首先会发送一个起始位,它是一个逻辑0(低电平)的信号,用于同步发送和接收设备之间的时钟。接收端在检测到起始位后,会开始准备接收后续的数据位。
- 有效数据位(Data Bits):数据位是由一系列二进制值组成,用于传输或接收实际的数据。数据位的数量决定了可以传输的不同二进制值的数量,常见的有5位、6位、7位、8位,LSB在前,MSB在后。数据位紧随起始位之后,包含了要传输的实际信息。
- 校验位(Parity Bit):校验位用于验证数据的完整性,以确保传输过程中没有出现错误。常见的校验位选项有None(无校验位)、Odd(奇校验位)和Even(偶校验位)。在发送数据时,校验位会根据数据位中1的个数进行计算,并加入到数据中一起传输。接收端则会根据校验位的值进行校验,以判断数据是否存在错误。
- 停止位(Stop Bit):停止位是一个逻辑高电平,用于指示数据传输的结束。当停止位出现时,接收端知道数据传输已经完成,并且可以开始处理接收到的数据。停止位位于数据位和校验位之后,它的作用是确保接收端有足够的时间来识别数据帧的结束,并为下一个数据帧的到来做好准备。
比特率:每秒能传输的二进制位数;
波特率:每秒传送的码元的个数;
二进制系统中,波特率数值上等于比特率。
Serial库介绍
-
初始化串口通信:
Serial.begin(baud_rate): 初始化串口通信,baud_rate是波特率,常用的波特率有9600、115200等。
-
发送数据:
Serial.print(data): 发送数据到串口,不会自动换行。Serial.println(data): 发送数据到串口,并在数据后添加换行符。
-
接收数据:
Serial.available(): 返回串口缓冲区中可读取的字节数。Serial.read(): 读取串口缓冲区中的一个字节。Serial.readString(): 读取串口缓冲区中的字符串,直到超时或没有更多数据。
-
其他功能:
Serial.flush(): 等待所有传输的数据发送完毕。Serial.end(): 结束串口通信。
头文件
// serial.h头文件
#ifndef SERIAL_H // 防止头文件被多次包含
#define SERIAL_H#include <Arduino.h>
void serialInit(int baud_rate); // 初始化函数,输入波特率
void serialPrint(String message); // 串口输出信息#endif
cpp文件
#include "serial.h"// 初始化串口模块(指定波特率)
void serialInit(int baud_rate) {Serial.begin(baud_rate);
}// 打印调试信息
void serialPrint(String message) {// 打印出来的效果是 [时间戳] 消息内容Serial.print("[");Serial.print(millis()); // 打印从开始运行到现在的时间Serial.print("]");Serial.println(message);
}
millis()函数用于返回自程序开始运行以来经过的时间(以毫秒为单位),方便我们了解信息输出的时间
下一篇文章,我们将着重讨论WiFi模块和OLED模块的开发
相关文章:
【自学嵌入式(6)天气时钟:软硬件准备、串口模块开发】
天气时钟:软硬件准备、串口模块开发 软硬件准备接线及模块划分ESP8266开发板引脚图软件准备 串口模块编写串口介绍Serial库介绍 近期跟着网上一些教学视频,编写了一个天气时钟,本篇及往后数篇都将围绕天气时钟的制作过程展开。本文先解决硬件…...
macbook安装go语言
通过brew来安装go语言 使用brew命令时,一般都会通过brew search看看有哪些版本 brew search go执行后,返回了一堆内容,最下方展示 If you meant "go" specifically: It was migrated from homebrew/cask to homebrew/core. Cas…...
代码随想录算法训练营第三十八天-动态规划-完全背包-322. 零钱兑换
太难了 但听了前面再听这道题感觉递推公式也不是不难理解 动规五部曲 dp[j]代表装满容量为j(也就是目标值)的背包最少物品数量递推公式:dp[j] std::min(dp[j], dp[j - coins[i]] 1)当使用coins[i]这张纸币时,要向前找到容量为…...
小阿卡纳牌
小阿卡纳牌 风:热湿 火:热干 水:冷湿 土:冷干 火风:温度相同,但是湿度不同,二人可能会在短期内十分热情,但是等待热情消退之后,会趋于平淡。 湿度相同、温度不同&#x…...
DDD 和 TDD
领域驱动设计(DDD) DDD 是一种软件开发方法,强调通过与领域专家的密切合作来构建一个反映业务逻辑的模型。其核心思想是将业务逻辑和技术实现紧密结合,以便更好地解决复杂的业务问题。 DDD 的关键概念: 1. 领域模型 …...
Java学习教程,从入门到精通,JDBC插入记录语法及案例(104)
JDBC插入记录语法及案例 一、JDBC插入记录语法 在JDBC中,插入记录主要通过执行SQL的INSERT语句来实现。其基本语法如下: INSERT INTO 表名 (列1, 列2, ..., 列n) VALUES (值1, 值2, ..., 值n);表名:需要插入记录的表的名称。列1, 列2, …,…...
Linux文件基本操作
Linux 的设计哲学 在 Linux 中,一切皆文件! 什么是文件? 文件是具有永久存储性,按特定字节顺序组成的命名数据集 文件可分为:文本文件,二进制文件 文本文件:每个文件存放一个 ASCII 码 存储…...
React 路由导航与传参详解
随着单页面应用(SPA)已经成为主流。React 作为最流行的前端框架之一,提供了强大的路由管理工具 react-router-dom,帮助开发者轻松实现页面导航和传参。本文将详细介绍如何使用 react-router-dom 构建路由导航、传参以及嵌套路由的…...
C#面试常考随笔6:ArrayList和 List的主要区别?
在 C# 中,ArrayList和List<T>(泛型列表)都可用于存储一组对象。推荐优先使用List<T>,因为它具有更好的类型安全性、性能和语法简洁性,并且提供了更丰富的功能。只有在需要与旧代码兼容或存储不同类型对象的…...
C#分页思路:双列表数据组合返回设计思路
一、应用场景 需要分页查询(并非全表查载入物理内存再筛选),返回列表1和列表2叠加的数据时 二、实现方式 列表1必查,列表2根据列表1的查询结果决定列表2的分页查询参数 三、示意图及其实现代码 1.示意图 黄色代表list1的数据&a…...
中科大:LLM检索偏好优化应对RAG知识冲突
📖标题:RPO: Retrieval Preference Optimization for Robust Retrieval-Augmented Generation 🌐来源:arXiv, 2501.13726 🌟摘要 🔸虽然检索增强生成(RAG)在利用外部知识方面表现出…...
知识库管理系统提升企业知识价值与工作效率的实践路径分析
内容概要 知识库管理系统在企业发展中的重要性日益凸显,尤其是在信息爆炸的时代。现代企业需要有效地管理和利用自身知识资产,以提升整体效率和竞争力。本文旨在探讨知识库管理系统的应用实践,围绕其在信息整理、知识共享及决策支持等方面的…...
中文输入法方案
使用了三年的自然码双拼,毫无疑问是推荐使用双拼输入法。 三年积累下来的习惯是: 1 自然码方案 2 空格出字 字母选字 直到如今,想要做出改变,是因为这样的方案带来的痛点: 1 使用空格出字就无法使用辅助码&#…...
《AI芯片:如何让硬件与AI计算需求完美契合》
在人工智能飞速发展的今天,AI芯片已成为推动这一领域前行的关键力量。从智能语音助手到自动驾驶汽车,从图像识别技术到复杂的自然语言处理,AI芯片的身影无处不在。它就像是人工智能的“超级大脑”,以强大的计算能力支撑着各种复杂…...
AlertDialog组件的功能与用法
文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了Dismissible Widget相关的内容,本章回中将介绍AlertDialog Widget.闲话休提,让我们一起Talk Flutter吧。 概念介绍 我们介绍的AlertDialog是指程序中弹出的确认窗口,其实我们在上一章回中删除…...
【Python百日进阶-Web开发-FastAPI】Day813 - FastAPI 响应模型
文章目录 一、返回与输入相同的数据二、添加输出模型三、在文档中查看四、响应模型编码参数4.1 使用 response_model_exclude_unset 参数4.1.1 默认值字段有实际值的数据4.1.2 具有与默认值相同值的数据4.2 response_model_include 和 response_model_exclude4.2.1 使用 list 而…...
洛谷U525376 信号干扰 (判断多个区间是否有重叠)
U525376信号干扰 题目描述 有 n n n 座信号塔,第 i i i 座信号塔的信号将覆盖区间 [ l i , r i ] [l_i,r_i] [li,ri]。 若某个点被超过一座信号塔的信号覆盖,则在该点会产生信号干扰。 对于信号塔区间 [ a , b ] [a,b] [a,b],若建…...
ESP32-S3模组上跑通esp32-camera(35)
接前一篇文章:ESP32-S3模组上跑通esp32-camera(34) 一、OV5640初始化 2. 相机初始化及图像传感器配置 上一回继续对reset函数的后一段代码进行解析。为了便于理解和回顾,再次贴出reset函数源码,在components\esp32-camera\sensors\ov5640.c中,如下: static int reset…...
Java进阶(二):Java设计模式
目录 设计模式 一.建模语言 二.类之间的关系 1.依赖关系 2.关联关系 3.聚合关系 4.组合关系 5.继承关系 6.实现关系 三.面向对象设计原则 单一职责原则 开闭原则 里氏替换原则 依赖倒置 接口隔离原则 迪米特原则 组合/聚合(关联关系)复用原则 四.23种设计模式…...
DeepSeek R1:中国AI黑马的崛起与挑战
文章目录 技术突破:从零开始的推理能力进化DeepSeek R1-Zero:纯RL训练的“自我觉醒”DeepSeek R1:冷启动与多阶段训练的平衡之道 实验验证:推理能力的全方位跃升基准测试:超越顶尖闭源模型蒸馏技术:小模型的…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
AD学习(3)
1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分: (1)PCB焊盘:表层的铜 ,top层的铜 (2)管脚序号:用来关联原理图中的管脚的序号,原理图的序号需要和PCB封装一一…...
海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》
近日,嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,海云安高敏捷信创白盒(SCAP)成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解…...
RabbitMQ 各类交换机
为什么要用交换机? 交换机用来路由消息。如果直发队列,这个消息就被处理消失了,那别的队列也需要这个消息怎么办?那就要用到交换机 交换机类型 1,fanout:广播 特点 广播所有消息:将消息…...
华为云Flexus+DeepSeek征文 | 基于Dify构建具备联网搜索能力的知识库问答助手
华为云FlexusDeepSeek征文 | 基于Dify构建具备联网搜索能力的知识库问答助手 一、构建知识库问答助手引言二、构建知识库问答助手环境2.1 基于FlexusX实例的Dify平台2.2 基于MaaS的模型API商用服务 三、构建知识库问答助手实战3.1 配置Dify环境3.2 创建知识库问答助手3.3 使用知…...
生产管理系统开发:专业软件开发公司的实践与思考
生产管理系统开发的关键点 在当前制造业智能化升级的转型背景下,生产管理系统开发正逐步成为企业优化生产流程的重要技术手段。不同行业、不同规模的企业在推进生产管理数字化转型过程中,面临的挑战存在显著差异。本文结合具体实践案例,分析…...
