admin管理员组

文章数量:1531499

仅供参考

原版链接

贴上原文连接:https://www.bilibili/video/BV12g411b7A6/
贴上立创开源连接:https://oshwhub/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); //每次+60
    lv_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/dl/package_esp32_index.json
https://m5stack.oss-cn-shenzhen.aliyuncs/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得自己寻找对校)
缺乏技术支持:☆☆☆☆开学之后就没回复了)
相对等级:☆☆☆
多配件:☆
价格高昂:☆☆

本文标签: 校园生活助手指南