近期跟着网上一些教学视频,编写了一个天气时钟,本篇及往后数篇都将围绕天气时钟的制作过程展开。本文先解决硬件准备、软件准备、串口模块开发等问题。
软硬件准备
此次实验中,我使用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模块的开发