文章目录
- 0 前言
- 1 简介
- 2 主要器件
- 3 实现效果
- 4 设计原理
- 部分核心代码
- 5 最后
0 前言
🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
🚩 基于单片机的墨水屏阅读器(单词卡)
🥇学长这里给一个题目综合评分(每项满分5分)
- 难度系数:3分
- 工作量:3分
- 创新点:5分
1 简介
基于esp12-f和汉朔213二手价签开发,可实现单词阅读、默写,多词库共存,支持上下翻页,名著阅读模式支持极速上下翻页,支持多书籍进度保存,休眠等等,后续将升级更多功能实现多语种支持等等。
2 主要器件
- ESP12-F
- 汉朔2.13寸电子价签
3 实现效果
4 设计原理
ESP -12F模块整体介绍
该模块核心处理器 ESP8266 在较小尺寸封装中集成了业界领先的 Tensilica L106 超低功耗 32 位微型 MCU,带有 16 位精简模式,主频支持 80 MHz 和160 MHz,支持 RTOS,集成 Wi-Fi MAC/ BB/RF/PA/LNA,板载天线。该模块支持标准的 IEEE802.11 b/g/n 协议,完整的 TCP/IP 协议栈。用户可以使用该模块为现有的设备添加联网功能,也可以构建独立的网络控制器。ESP8266 是高性能无线 SOC,以最低成本提供最大实用性,为 WiFi 功能嵌入其他系统提供无限可能。
接口说明
汉朔2.13寸电子价签
汉朔2.13寸的电子价签,闲鱼上面价格比较便宜,大部分在7块钱一个
内核为MSP4302553,驱动原理图如下:
部分核心代码
#include <LittleFS.h>
//#include <SD.h>
#define key2 0 //中间的按键,也是烧录按键
#define key3 5 //右边的按键,进入默写模式的按键
#define key4 13
#include <U8g2_for_Adafruit_GFX.h>
#include <GxEPD2_BW.h>
#include "gb2312.c"
#include "img.c"
#define SPI_SPEED SD_SCK_MHZ(20)
#define SD_CS 5
#define bat_switch_pin 12 // 电池电压读取开关
#define bat_vcc_pin A0 // 读取电池电压引脚,不能超过1V
//#include "FS.h"
#include <EEPROM.h>
#define RST_PIN 0 // D3(0)
//GxEPD2_BW<GxEPD2_290_T94, GxEPD2_290_T94::HEIGHT> display(GxEPD2_290_T94(/*CS=D8*/ SS, /*DC=D3*/ 0, /*RST=D4*/ 2, /*BUSY=D2*/ 4)); // GDEM029T94
//GxEPD2_BW<GxEPD2_213, GxEPD2_213::HEIGHT> display(GxEPD2_213(/*CS=*/ 16, /*DC=D3*/ 0, /*RST=*/ -1, /*BUSY=*/ 4));
GxEPD2_BW<GxEPD2_213, GxEPD2_213::HEIGHT> display(GxEPD2_213(/*CS*/ 15, /*DC*/ 0, /*RST*/ 2, /*BUSY*/ 4));
U8G2_FOR_ADAFRUIT_GFX u8g2Fonts;
//int dis_count = 0; //判断局刷或全刷
bool f_word = false;
bool flag = true;
float bat_vcc = 0.0; // 电池电压
void power_sleep();//低压休眠
#include "bat_data.h"
#include "displaycode.h"
File story_dataFile;//小说
#include "BookRead.h"
extern const uint8_t chinese_gb2312[253023] U8G2_FONT_SECTION("chinese_gb2312");
/*
8266接线方式:
busy--D2 4
res--D4 2
dc--D3 0
cs--D8 15
clk--D5 14
din--D7 13
gnd--g
vcc--3v3
*/
int x = 10, y = 55;
bool read_state = false; //标记阅读/默写模式
void setup()
{
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("开始");
pinMode(key2, INPUT_PULLUP); //INPUT_PULLUP
pinMode(key3, INPUT_PULLUP); //INPUT_PULLUP
Serial.println("setup");
digitalWrite(RST_PIN, HIGH);
pinMode(RST_PIN, OUTPUT);
delay(20);
digitalWrite(RST_PIN, LOW);
delay(20);
digitalWrite(RST_PIN, HIGH);
delay(200);
display.init();
EEPROM.begin(256);
int f1 = EEPROM.read(0);
int f2 = EEPROM.read(4);
if (f1 == f2 && f1 == 255) {
EEPROM.write(0, 0);
EEPROM.commit();
EEPROM.write(4, 0);
EEPROM.commit();
}
u8g2Fonts.begin(display);//将u8g2连接到display
display.setRotation(3);
display.firstPage();
display.fillScreen(GxEPD_WHITE);
float batVCC = getBatVolNew();
if (batVCC < 3) {
power_sleep();
}
/*判断当前是学习模式还是小说模式 */
int read_mode = EEPROM.read(65);
if (read_mode == 1) {
if (LittleFS.begin()) { //(SD_CS, SPI_SPEED)){
Serial.println("SD 启动成功");
} else {
Serial.println("SD 未能成功启动");
}
Serial.println("小说模式");
display.nextPage();
get_story_name();
} else {
Serial.println("学习正常启动");
init_study();
button();
}
}
void init_read() {
if (!LittleFS.begin()) // mount the file system
{
Serial.println("文件获取失败,请先上传文件!");
return;
}
}
void init_study() {
display.drawInvertedBitmap(0, 0, logo, 250, 122, GxEPD_BLACK);
// display.drawInvertedBitmap(0, 0, logo2, 296, 128, GxEPD_BLACK);
display.nextPage();
display.setPartialWindow(0, 100, 255, 22);//局刷提示字样
u8g2Fonts.setForegroundColor(GxEPD_BLACK); // 设置前景色
u8g2Fonts.setBackgroundColor(GxEPD_WHITE);
if (!LittleFS.begin()) // mount the file system
{
Serial.println("文件获取失败,请先上传文件!");
u8g2Fonts.setCursor(0, 120);
u8g2Fonts.print("文件获取失败,请先上传文件!");
return;
}
display.fillScreen(GxEPD_WHITE);
u8g2Fonts.setFont(chinese_gb2312);
u8g2Fonts.setCursor(0, 120);
Serial.println("文件获取成功!");
u8g2Fonts.print("文件系统启用成功!");
String wordbookname_temp = selectbook();
if (LittleFS.exists(wordbookname_temp)) {
Serial.println("有");
} else {
Serial.println(" 没有.");
display.fillScreen(GxEPD_WHITE);
u8g2Fonts.setFont(chinese_gb2312);
u8g2Fonts.setCursor(0, 120);
u8g2Fonts.print("上次打开文件不存在!将进入文件管理");
display.nextPage();
delay(1000);
display.setFullWindow();
display.fillScreen(GxEPD_WHITE);
draw_word_file_dir();
}
display.nextPage();
}
void power_sleep() {
display.setFullWindow();
display.fillScreen(GxEPD_WHITE);
display.drawInvertedBitmap(0, 0, low_power, 250, 122, GxEPD_BLACK);
display.nextPage();
delay(500);
ESP.deepSleep(0);
}
void loop()
{
}