【自学嵌入式(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:冷启动与多阶段训练的平衡之道 实验验证:推理能力的全方位跃升基准测试:超越顶尖闭源模型蒸馏技术:小模型的…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
