外观
完整源码请在附件查看
BSP 模块
本项目采用 BSP(Board Support Package)板级适配架构.
- display.cpp/.h: OLED屏幕显示部分实现
- input.cpp/.h: 按键控制部分实现
- learning.cpp/.h: 学习部分实现
- storage.cpp/.h: TF存储部分实现
- webserver.cpp/.h: WEB控制端页面及路由实现
- main.cpp/.h: 主程序
- config.h: 板级配置及用户配置文件
config.h
config 配置文件
在这里可以自定义WIFI配置,ADC按键配置及单词数量信息。建议购买高精度电阻,如果电阻精度不高会存在误差,这时就需要在这里修改ADC阈值到实际测量的电压。另外最大单词数量也需要在这里定义,存储的单词越多,单片机处理速度可能会较慢。
#ifndef CONFIG_H
#define CONFIG_H
// WiFi配置 - 使用inline避免重复定义
inline const char* ap_ssid = "EDA-WordCard";
inline const char* ap_password = "12345678";
// OLED 配置
#define OLED_W 128
#define OLED_H 64
#define OLED_ADDR 0x3C
// SD卡SPI引脚配置
#define PIN_CS 15 // D8
// 按键ADC阈值
#define BTN_LEFT_MIN 200 // 不会 (约0.25V)
#define BTN_LEFT_MAX 300
#define BTN_MIDDLE_MIN 500 // 模糊 (约0.57V)
#define BTN_MIDDLE_MAX 650
#define BTN_RIGHT_MIN 750 // 会 (约0.83V)
#define BTN_RIGHT_MAX 1000
// 学习状态
enum StudyResult {
UNKNOWN = 0,
DONT_KNOW = 1,
VAGUE = 2,
KNOW = 3
};
// 单词结构
struct Word {
String name;
String chinese;
int study;
String example;
int frequency; // 出现频率 = 100 - study
};
// 全局变量声明 - 需要在一个.cpp文件中定义
extern Word currentWord;
extern bool showAnswer;
extern int totalWords;
extern int studiedWords;
extern int currentWordIndex;
extern String wordFiles[500]; // 最多支持500个单词文件
#endif
display.h
display 显示功能
在display部分定义了显示功能的函数,屏幕初始化,显示居中,展示信息的UI格式都在这里定义,这里的中文显示采用的u8g2_font_wqy12_t_gb2312字体,无需外挂字库芯片。
#ifndef DISPLAY_H
#define DISPLAY_H
#include <U8g2lib.h>
#include <Wire.h>
#include "config.h"
// OLED显示对象声明
extern U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2;
// 显示功能函数
void initDisplay();
void drawCenteredText(const char* text, int y, const uint8_t* font);
void showMessage(String line1, String line2 = "", String line3 = "", String line4 = "");
void displayCurrentWord();
void showStats();
void processStudyResult(StudyResult result);
#endif
input.h
input 功能按键输入
在这里定义的是功能按键的功能函数,处理按键按下的结果以及ADC电压对应的按键识别部分。
#ifndef INPUT_H
#define INPUT_H
#include "config.h"
// 获取按键结果
StudyResult getButtonResult(int btnValue);
// 处理输入
void handleInput();
#endif
learning.h
learning 单词学习逻辑
这里主要定义的是单词的学习逻辑功能部分。为了确保单片机的处理效率,这里单词选取还是依照的随机数生成。因为如果单词数量多,要读取熟练度的话就意味着单片机要从所有单词数据提取熟练度数据判断,所有这里性能考虑还是随机数生成。
#ifndef LEARNING_H
#define LEARNING_H
#include <Arduino.h>
#include "config.h"
// 学习功能函数
int selectWordByFrequency();
void nextWord();
#endif
storage.h
storage TF存储
TF存储功能则是对TF卡单词数据的增删改查的实现。
#ifndef STORAGE_H
#define STORAGE_H
#include <Arduino.h>
#include <SD.h>
#include <SPI.h>
#include <ArduinoJson.h>
#include "config.h"
// 存储功能函数
bool initStorage();
void scanWordFiles();
void calculateStudiedWords();
void loadConfig();
void saveConfig();
void loadWord(String fileName);
void saveWordProgress();
#endif
webserver.h
webserver WEB管理后台
借助ESP8266的WIFI功能,像往期项目一样,这里添加了一个单词管理后台,你可以通过连接"EDA-WordCard"的WIFI热点,密码是"12345678"。进入后台可以对单词数据进行增删改查,不再需要读卡器插入电脑修改数据。
#ifndef WEBSERVER_H
#define WEBSERVER_H
#include <ESP8266WebServer.h>
#include "config.h"
// Web服务器功能函数
void initWebServer();
void handleWebServer();
#endif
单词json数据示例
json 单词文件
所有单词数据以json形式保存,文件命名格式为"英文.json"
{
"name": "computer",
"chinese": "计算机",
"study": 90,
"example": "I use my computer for work and study."
}