仅供参考
原版链接
贴上原文连接:https://www.bilibili.com/video/BV12g411b7A6/
贴上立创开源连接:https://oshwhub.com/lxu0423/xiao-yuan-sheng-huo-zhu-shou-7-0
(以及我的B站视频在这里,如果你认为这篇文章帮助到你的话,在视频里点赞会让我感到我做的事情意义更大了)
自用修改版链接
已经将硬件修改版本的内容移动到这里,包括原版一些bug和自己修改之后踩的坑,也包括修改之后的文件等等
这里是软件修改版本,这里所有的Bug、改进以及相关注释都在这里,而在这个帖子里面会逐步减少软件的更新,如果需要最新的功能,应该在这里面寻找而不是在这个帖子里面
以上两个链接的ReadMe可能都不会更新,因此注意看上传日志
第一次接触ESP32,如有错漏请指正
开始前的准备
基本需求:
嵌入式系统
基础程序开发
一般焊接技能
300人民币左右的预算
特化需求:
ESP32开发
软硬件知识
部分零件价目表
ESP32-S3 —— 30
触摸屏幕 —— 50
芯片杂费 ——30
基本接口座——10
外设制造——40
外壳制造——20
能源供给——30
避坑指南正文
程序编译
基本需求:
VSC(VSCode)
Espreiff-IDE(乐鑫开发包)
乐鑫开发包避坑
建议使用在线下载包,因为它会尝试对你的系统环境进行改造,当然,使用离线下载包也是完全可行的
当进行安装的时候如果报错退出代码1检查以下操作
ESP32C6仅支持5.1以上的版本,如果版本不是5.1以上的会报错
因为下载速度很慢,因此建议勾选
如果软件频繁的报错网络有问题的话可以使用华为手机(目前似乎就只有华为支持这样做)使用USB进行连接,并在“个人热点”下找到“USB共享网络”选项
连接成功后,系统会提示
可以解决大部分断线问题
python使用清华源比较靠谱,也可以提速
Platformio(注意!不是CMake!)
修改文件
首先,尝试直接编译(不会成功)
在初次编译的时候程序会下载开发包——不必担心
‘’注意!这会花很长时间进行预配置(大约6小时左右)‘’
在第一次编译的时候程序会在编译到
报错会给出在哪里报的错,根据提示知道是缺少文件
找到缺失的文件在目录下,分别是A_Config.h,Config_Local.h和ESPNowConfig.h其中ESPNowConfig,cofig_local原本文件名是有_example的,需要删掉
文件在:schoolassistant7-master\include
复制这两个文件到报错的文件目录下
目录是:schoolassistant7-master\src
复制粘贴后如下所示
然后根据作者的提示
改成这样
就是修改文件名
当然,如果依然报错可以尝试:
之后再次尝试编译
点击进行编译
需要花很长时间——中途修改文件可能会导致程序重新编译!
随后就是编译器成功的编译了程序
使用这种方法会出现类似于以下的警告,但它并不影响编译,对于是否会影响程序正常运作是未知的
等待一段时间后即可看见编译成功
1029秒约等于17.1分钟
烧录到上图所示就OK了
屏幕颜色出错(全新配色)
有些屏幕有可能会出现以下情况(如果一切正常不建议修改)
红蓝翻转,黑白对调
但是开机瞬间有白屏
如图
颜色翻转VS正常颜色
找到
找到第49-50行,修改为如下:
cfg.invert = true; // パネルの明暗が反転してしまう場合 trueに設定 如果亮度翻转则为true true 作者在Panel_Device.cpp里的注释是如果是IPS屏幕就得为真cfg.rgb_order = true; // パネルの赤と青が入れ替わってしまう場合 trueに設定 蓝色和红色对调为真 默认为false
会有新配色)
如果需要原版配色,请进行如此更改
cfg.invert = false; // パネルの明暗が反転してしまう場合 trueに設定 如果亮度翻转则为true true 作者在Panel_Device.cpp里的注释是如果是IPS屏幕就得为真cfg.rgb_order = false; // パネルの赤と青が入れ替わってしまう場合 trueに設定 蓝色和红色对调为真 默认为false
结构体参数的详细定义在:
焊接时钟之后无法启动
不焊接一样可以正常启动,这个是应该是没有硬件锁的
但是,注意!!!
引脚不一样的!
虽然程序有考虑到兼容PCF8563
硬件接口不一样
因此你可以尝试通过以下方法改造
注意一下,PCF8563需要外部32.768khz晶振以及晶振起振电路
CP2104没有或者损坏
那就只能赌一把了
因为TinyUSB固件会占用自带的CH343下载接口也就是说,只有一次机会。
中文输入法(未解决)
如果打不出来一些汉字,可以在这里添加:
适用于打不出自己名字的情况
但是依然还是打不出来的
还需要对字库进行编辑(以后补上
找到了一些可能有用的解决方案,不过还没尝试
方案1
方案2
文件系统
特别注意:买大厂的卡,不然会装载失败还不知道哪里有问题!
小米手环连接
注意:小米手环得要是4才行,如果不是小米手环4会提示你更新软件,就算连上了手环也会拒收
因为没找到第一作者的版权文件,因此也找不到更换为小米手环6的方法
获取密钥教程详见:这里
获取小米手环的密钥之后需要修改引导文件
连接地址直接填入就可以了
但是密钥是16进制编码(有时候也叫作二进制编码)
填入密钥操作如下
0;先剔除获取的密钥中的“0x”头
1;将密钥编码拆分为每两个字符的形式
2;依次替换原版的123456……
3;在每一位前面添加“0x”(不然编译器会报错)
蓝牙地址直接填入就可以了
GIF替换
这是修改显示角度,但是不会修改操作角度
如果要修改gif
第一步,获取gif
使用该软件快捷的制作gif文件(别的也ok)
注意尺寸应该在128x128左右
制作并导出gif文件
比如这个
然后使用gif转二进制网站,配置如下
注意红框内容
上传之后修改为想要替换的文件名
点击转换,网站会自动生成.c文件,替换就行了
替换之前记得备份)
比如这个文件对应着扫描wifi的时候加载的动图
天气地址修改
原版的天气定位是北京的
可以在这里获取你所在地区的地址
在这里进行设置
参见
原版程序优化
电压显示
原版当中如果不连接依然会显示电流的数值,目前已经被修复
点击关于本机无显示
这个的作用是插入一个全屏弹窗,标题是制作信息,原工程等位于左下方,如果回车行太多下面的不会显示。
库仑计修复&更准确的电量显示
原版本存在以下问题:
库仑计复位到0,导致原本的功能也无法使用,除非将电池电池放电到0再进行复位
因此修改如下:
因此需要在充满电之后才能复位库仑计
(否则会显示负数)
原版的电量显示并不准确,因为它是基于电压比较产生的大概值
因为锂离子电池存在一个放电平台期
在这个期间电池的放电对电压影响不大
因此可能会发现电池在一开始用的很快,然后中间的时候可以用很久,快没电的时候掉电掉的特别快
这里是将库仑计应用于电池电压比较
1300是我电池的电压,按照实际进行修改
UI优化
缩小了栏的尺寸之后整个的操作手感会更好,原版的排版相当糟糕……
高考倒计时-点击显示
点击这里查看高考倒计时
在如图所示的位置插入以下代码
int8_t years;
int8_t month; //不能是unsigned类型
int16_t days;
const char *dTS;static void event_obj_clocks_press(lv_event_t *e)
{years = hal.rtc.year;month = hal.rtc.month; //获取时间days = hal.rtc.day;//高考时间6月8日years = 24 - years; //24高考,如果今年高考就设定为23或者屏蔽这一行if(years <= 0 ){years = 0;}month = month -6; //相差月份if (month <= 0){month = month * -1; //如果在6月前则取反}days = 30- days +8; //大月的时候会出错if (days <= 0){days = days * -1;}days = years* 360 + month*30 + days; //按照30天计算dTS = std::to_string(days).c_str();lv_obj_fade_out(lblTime, 300, 100);lv_label_set_text(lblTime, dTS); //最多能显示三位数lv_obj_fade_in(lblTime, 300, 100); //移除了也要移回来,不然会不显示
}
static void event_obj_clocks_press_lost(lv_event_t *e)
{lv_obj_fade_out(lblTime, 300, 100); //更柔滑的转换lv_label_set_text(lblTime, "等待开始"); lv_obj_fade_in(lblTime, 300, 100);
}
第二步
第三步
因为赶时间,因此这个高考倒计时并不准的,仅供参考
以后可能会优化逻辑(大概是大小月检测+2月以及闰年补差)
新添功能:应用-计算器
源代码(直接复制粘贴进去即可)
20230416版本V1
#include "A_Config.h"
class AppCalculator : public AppBase
{
private:bool Calculator = false;/* data */
public:AppCalculator(){name = "calculator";title = "计算器";description = "可以进行四则运算";image = "\xEF\x84\x9C" ;//LV_SYMBOL_PASTE; 需要对其进行显示的是16进制编码}void setup();void loop();void destruct();
};
//20230406开发 当前版本V1
///*
/*
lv_obj_t *btn_add;
lv_obj_t *btn_reduce;
lv_obj_t *btn_ride;//乘
lv_obj_t *btn_remove;//除
//应该有个退位按钮
lv_obj_t *btn_d0; //注意0不能放在首位
lv_obj_t *btn_d1;
lv_obj_t *btn_d2;
lv_obj_t *btn_d3;
lv_obj_t *btn_d4;
lv_obj_t *btn_d5;
lv_obj_t *btn_d6;
lv_obj_t *btn_d7;
lv_obj_t *btn_d8;
lv_obj_t *btn_d9;
*/
float NUM1 = 0.00;
float NUM2 = 0.00;
float NUM3 = 0.00;//输出 在运行阶乘的时候很容易爆掉 应该加一个限制
unsigned int mode = 0;
/*
码表:
0---输出结果1---加
2---减
3---乘
4---除
以后添加的功能
5---次方模式
6---统计模式(A33 C43那种)
*/
bool addPS;
bool revPS;
bool mixPS;
bool wptPS;
bool factorialPS;
bool facwfacPS;bool PS1;
bool PS2;
bool PS3;
bool PS4;
bool PS5;
bool PS6;
bool PS7;
bool PS8;
bool PS9;
bool PS0;bool RSG;//开始运算标志char * RUNDAT;
/*
static void btn_add_press(lv_event_t *e) //回调函数
{lv_toast("+");mode = 1;// msgbox("测试","+号输入");
}
static void btn_reduce_press(lv_event_t *e)
{lv_toast("-");mode = 2;
}
static void btn_ride_press(lv_event_t *e)
{lv_toast("*");mode = 3;
}
*/
//*/
static lv_obj_t * ARCES;
static lv_obj_t * NUNSHOW;
void AppCalculator::setup()
{LOCKLV();//必须要有LOCKLV和UNLOCKLV,否则在应用列表里面无法显示应用图标//也就是说,例程实际上是不能被直接应用的button(scr, "加", 10, 60, &addPS);button(scr, "减", 60, 60, &revPS);button(scr, "乘", 110, 60, &mixPS);button(scr, "除", 160, 60, &wptPS);//这里的坐标系和之前的不大一样,以屏幕左上角作为原点// button(scr, "A", 210, 60, &factorialPS);//阶乘模式
// button(scr, "C", 260, 60, &facwfacPS);//阶乘/阶乘 即为Cxy 还没做好,先Ban掉///*button(scr, "1", 10, 120, &PS1);button(scr, "2", 60, 120, &PS2);button(scr, "3", 110, 120, &PS3);button(scr, "4", 160, 120, &PS4);button(scr, "5", 210, 120, &PS5);button(scr, "6", 260, 120, &PS6);button(scr, "7", 10, 180, &PS7);button(scr, "8", 60, 180, &PS8);button(scr, "9", 110, 180, &PS9);button(scr, "0", 160, 180, &PS0);button(scr, "=", 160, 180, &RSG);//*/// lv_obj_center(button(scr, "添加计算", 0, 0, &Calculator));
/*btn_add = lv_btn_create(scr);lv_obj_set_size(btn_add, 50, 25);lv_obj_align(btn_add, LV_ALIGN_CENTER, -125, 0); //x轴正方向 》》 y轴正方向 ↓ ↓ 数字是像素点lv_obj_add_event_cb(btn_add, btn_add_press, LV_EVENT_RELEASED, NULL);//设置触发模式是松开之后lv_obj_t* label1 = lv_label_create(btn_add); // 创建一个子项和按钮关联lv_label_set_text(label1, "+"); // 设置显示内容lv_obj_center(label1); btn_reduce = lv_btn_create(scr);lv_obj_set_size(btn_reduce, 50, 25);lv_obj_align(btn_reduce, LV_ALIGN_CENTER, -65, 0); //每次+60lv_obj_add_event_cb(btn_reduce, btn_reduce_press, LV_EVENT_RELEASED, NULL);lv_obj_t* label2 = lv_label_create(btn_reduce); lv_label_set_text(label2, "-"); lv_obj_center(label2); btn_ride = lv_btn_create(scr);lv_obj_set_size(btn_ride, 50, 25);lv_obj_align(btn_ride, LV_ALIGN_CENTER, -5, 0); lv_obj_add_event_cb(btn_ride, btn_ride_press, LV_EVENT_RELEASED, NULL);lv_obj_t* label3 = lv_label_create(btn_ride); lv_label_set_text(label3, "*"); lv_obj_center(label3); //调用太复杂,就删掉了*/UNLOCKLV();//msgbox()
}
/*
String IPT;
char* MEM;
char* FY,NY,FCP,NCP;
const char *d = " *";
*/
void AppCalculator::loop()
{AppBase::loop();char OPnum[40];//lv_obj_t *label = lv_label_create(lv_scr_act());//lv_scr_act() //创建一个子,但是会卡死//lv_label_set_text_fmt(label, "%.3f", 1213.135); // 需要修改设置否则只会显示“f“ 在lv_conf.h的262行//lv_obj_align(label, LV_ALIGN_CENTER, 60, -60);//sprintf(OPnum, "%.3f", NUM1);//转换函数//lv_label_set_text(label,OPnum);if (addPS){lv_toast("加");addPS = 0;mode = 1; }if (revPS){lv_toast("减");revPS = 0;mode = 2; } if (mixPS){lv_toast("乘");mixPS = 0;mode = 3; } if (wptPS){lv_toast("除");wptPS = 0;mode = 4; }if (factorialPS){lv_toast("阶乘模式:Axy");factorialPS = 0;mode = 5; }if (facwfacPS){lv_toast("组合数模式:Cxy");facwfacPS = 0;mode = 5; }//数字输入if (PS1){if(mode ==0){NUM1 = NUM1 *10 +1;sprintf(OPnum, "%.0f", NUM1);//转换函数lv_toast(OPnum);//lv_obj_fade_out(label,300,100);//lv_label_set_text_fmt(label, "%.0f", NUM1);//lv_obj_fade_in(label,300,100);}else{NUM2 = NUM2 *10 +1;sprintf(OPnum, "%.0f", NUM2);lv_toast(OPnum);}PS1 = 0;}if (PS2){if(mode ==0){NUM1 = NUM1 *10 +2;sprintf(OPnum, "%.0f", NUM1);lv_toast(OPnum);}else{NUM2 = NUM2 *10 +2;sprintf(OPnum, "%.0f", NUM2);lv_toast(OPnum);}PS2 = 0;}if (PS3){if(mode ==0){NUM1 = NUM1 *10 +3;sprintf(OPnum, "%.0f", NUM1);lv_toast(OPnum);}else{NUM2 = NUM2 *10 +3;sprintf(OPnum, "%.0f", NUM2);lv_toast(OPnum);}PS3 = 0;}if (PS4){if(mode ==0){NUM1 = NUM1 *10 +4;sprintf(OPnum, "%.0f", NUM1);lv_toast(OPnum);}else{NUM2 = NUM2 *10 +4;sprintf(OPnum, "%.0f", NUM2);lv_toast(OPnum);}PS4 = 0;}if (PS5){if(mode ==0){NUM1 = NUM1 *10 +5;sprintf(OPnum, "%.0f", NUM1);lv_toast(OPnum);}else{NUM2 = NUM2 *10 +5;sprintf(OPnum, "%.0f", NUM2);lv_toast(OPnum);}PS5 = 0;}if (PS6){if(mode ==0){NUM1 = NUM1 *10 +6;sprintf(OPnum, "%.0f", NUM1);lv_toast(OPnum);}else{NUM2 = NUM2 *10 +6;sprintf(OPnum, "%.0f", NUM2);lv_toast(OPnum);}PS6 = 0;}if (PS7){if(mode ==0){NUM1 = NUM1 *10 +7;sprintf(OPnum, "%.0f", NUM1);lv_toast(OPnum);}else{NUM2 = NUM2 *10 +7;sprintf(OPnum, "%.0f", NUM2);lv_toast(OPnum);}PS7 = 0;}if (PS8){if(mode ==0){NUM1 = NUM1 *10 +8;sprintf(OPnum, "%.0f", NUM1);lv_toast(OPnum);}else{NUM2 = NUM2 *10 +8;sprintf(OPnum, "%.0f", NUM2);lv_toast(OPnum);}PS8 = 0;}if (PS9){if(mode ==0){NUM1 = NUM1 *10 +9;sprintf(OPnum, "%.0f", NUM1);lv_toast(OPnum);}else{NUM2 = NUM2 *10 +9;sprintf(OPnum, "%.0f", NUM2);lv_toast(OPnum);}PS9 = 0;}if (PS0){if(mode ==0){NUM1 = NUM1 *10;sprintf(OPnum, "%.0f", NUM1);lv_toast(OPnum);}else{NUM2 = NUM2 *10;sprintf(OPnum, "%.0f", NUM2);lv_toast(OPnum);}PS0 = 0;}if (RSG){if(mode == 1){NUM3 = NUM1 +NUM2;sprintf(OPnum, "%.0f + %.0f = %.0f", NUM1,NUM2,NUM3);}if(mode == 2){NUM3 = NUM1 -NUM2;sprintf(OPnum, "%.0f - %.0f = %.0f", NUM1,NUM2,NUM3);}if(mode == 3){NUM3 = NUM1 *NUM2;sprintf(OPnum, "%.0f * %.0f = %.0f", NUM1,NUM2,NUM3);}if(mode == 4){NUM3 = NUM1 /NUM2;sprintf(OPnum, "%.0f / %.0f = %.3f", NUM1,NUM2,NUM3);//只有除法运算才有可能考虑,因为没有小数点输入}if(mode == 5){if(NUM1<=NUM2){/*if(NUM1 == 0){NUM3 = 1.00;}//一些防呆逻辑似乎并不需要……*/for(NUM1;NUM1--;NUM1==2){NUM2 = NUM2* (NUM2 - 1);}sprintf(OPnum, "阶乘运算结果 %.0f", NUM2);}else{sprintf(OPnum, "列式错误!");}}if(mode == 6){if(NUM1<=NUM2){float NUM4 = 0.00;//分母float NUM5 = 0.00;//临时寄存NUM1的数据float NUM6 = 0.00;//临时寄存NUM2的数据NUM5 = NUM1;NUM4 = NUM2;NUM6 = NUM2;for(NUM6;NUM6--;NUM6==2){NUM4 = NUM4* (NUM4 - 1);}NUM1 = NUM5;for(NUM1;NUM1--;NUM1==2){NUM2 = NUM2* (NUM2 - 1);}NUM3 = NUM2 / NUM4;sprintf(OPnum, "组合运算结果 %.3f", NUM3);}else{sprintf(OPnum, "列式错误!");}}lv_toast(OPnum);NUM1 = 0.00;//或许可以保留NUM1作为下次输入的头,不过先实现功能再说NUM2 = 0.00;NUM3 = 0.00;mode = 0;RSG = 0;}/*if (Calculator){IPT = msgbox_string("请输入算式",true,false,false);MEM = new char[strlen(IPT.c_str())+1];FY = strtok(MEM,d);while(FY){msgbox("计算结果",FY);FY=strtok(NULL,d);//一直有问题,因此不得不抛弃这个方案}}*/
}void AppCalculator::destruct()
{hal.DoNotSleep = false;
}static AppCalculator app;
就可以有一个计算器了
目前还没解决的问题是:
1:大的数字显示
2;比较高级的逻辑运算
3;小数点自定义
以上问题全部解决
添加了高中生常用的运算,预计可以覆盖高中90%的运算
比如用来计算的概率的阶乘,计算体积的乘方等等
详情建更新,这里的是超级远古版
应用创建教程
创建一个应用需要几步?
第一步 使能程序
因为CSDN吞图片,因此我不会更新了
IIS音响制作教程
打印机制造
程序修改
//在这里进行修改就可以测试了while(1){// sendDebugPrint(); //模拟测试,取消注释即为启用测试模式
目前在做补充注释工作,原版的注释比较少,不方便修改
软件预备
这是一款基于STC开发的8051单片机
因此需要
两者兼备之后打开工程
删掉.uvopt文件
否则会导致UV4程序卡死,无法编辑
添加头文件到UV4否则无法编译
但其实如果不改程序的话也可以不经过编译直接烧录,这就不需要UV4,只需要一个STCISP就可以了(你需要购买下载器)
单片机烧录需要冷启动(在指示灯亮,程序处于烧录状态之后开关复位,指示灯灭,等待约0.5秒左右重新打开开关,指示灯亮,单片机开始烧录程序)
OK!
摄像制造(暂未解决——ESP32CAM烧录)
需要安装
第二步,安装esp32包
在首先项将源更改如下
https://dl.espressif.com/dl/package_esp32_index.json
https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json
挂了
再多试几次就差不多了
如何获得更稳定的连接参考开头的“乐鑫开发包避坑”
固件获取
使用ESP-CAM进行制作,打印机电路去掉升压模块就可以塞进下载器的缝隙里了
找不到文件就复制一份过去,一开始以为是占用,但是后来发现压根没有这个软件
开发板选择AI Thinker ESP32-CAM
软件开发(暂未解决——Java语言)
手机软件使用
开发
电脑端软件使用
开发(使用其他软件也是可以的,甚至于使用txt编辑也是可行的)
避坑指南(欢迎补充)
硬件
AXP192根本买不到,卖家和我说没货了 有群友买到正版和盗版的了
CH340E似乎无法正确的引导ESP32进入下载模式,还会导致蓝屏! 不用就是了
USB的焊盘一定要焊好,我就这样报废了一块板和一个ESP32-S3! 记得加焊锡
插头不是XH,是PH,立创EDA的BOM是不准的
电容别把nf买成pf的 不使用原版的电路
电感得要是功率电感
FPC插座得要用翻盖的,抽屉的有一些用不了
打印机头接口用的是JX-2R-01
打印机似乎功率太大以至于连程序也可能因为断电而无法正常运行——难道是因为使用SC66K替换下来了体积较大的AMS1117-33作为步进电机电源?
软件
使用的是VSCode的插件,不是默认的配置,我调了好久才意识到这一点,并且使用默认的编译器(CMake)会编译不了
不使用ARDUINO IDE进行编译
下载安装包别选离线安装包,要选在线安装包,在线安装包会检测你的环境并进行一些配置
使用platform io进行的开发
一定要给VSC给够位置
原版的程序是默认检测AXP192,如果没有,则会进入一个死循环! 详细参见内容关于程序修改部分
复刻难度
高密度焊盘:☆☆
双面元件焊接:☆☆
软件开发:☆☆☆(组织度:☆-环境:☆-多语言:☆)
外壳重设计:☆外壳文件一些3D软件无法编辑)
资料缺乏:☆☆(datasheet得自己寻找对校)
缺乏技术支持:☆☆☆☆开学之后就没回复了)
相对等级:☆☆☆
多配件:☆
价格高昂:☆☆