- 博客(72)
- 问答 (1)
- 收藏
- 关注
原创 ESP32-S3开发教程12:WIFI扫描与连接
在 ESP32-S3 开发中,WiFi 是最常用的功能之一。本文将详细解析一个完整的 WiFi 封装模块,包括头文件、源文件和主程序的每一行代码,帮助你深入理解 ESP-IDF WiFi 编程。
2026-04-01 10:32:18
468
原创 ESP32-S3开发教程11:日志系统
在嵌入式开发中,日志系统是调试和监控程序运行状态的。ESP-IDF 为 ESP32-S3 提供了一套功能强大、配置灵活的日志库esp_log,远比简单的printf更适合专业开发。本文将结合一份完整的示例代码,带你系统性地掌握 ESP32-S3 日志系统的所有高级特性。
2026-03-23 18:21:21
415
原创 ESP32-S3开发教程10:I2C与MPU6050
所有硬件相关、可修改、有明确含义的参数,都用大写宏定义,方便后续修改和维护。// -------------------------- 1. I2C硬件配置宏(来自你的硬件接线) --------------------------// 使用的I2C总线号,ESP32-S3有2个I2C总线,选I2C_NUM_0// SDA引脚,对应你接的GPIO8// SCL引脚,对应你接的GPIO9// I2C时钟频率,MPU6050最大支持400kHz,来自datasheet。
2026-03-17 10:16:45
557
原创 ESP32-S3开发教程9:扣子智能体快速搭建与API调用例程使用讲解
这个例程的主要功能是:在GPIO11处接一个按钮,按钮按下后,读取DHT11的温湿度数据,并上传到扣子智能体上,并得到回复。如果不会使用git指令,点击下载为.zip再解压也可以。
2026-03-11 21:15:59
716
原创 ESP32-S3开发教程8:UART串口通信
异步通信:不需要时钟线,仅用 TX(发送)、RX(接收)、GND(地线)三根线就能通信;全双工:可以同时发送和接收数据;广泛兼容:几乎所有单片机、USB 转 TTL 模块、蓝牙模块都支持 UART。#define UART_PORT_NUM UART_NUM_0 // 选择UART端口#define TXD_PIN GPIO_NUM_43 // UART TX引脚#define RXD_PIN GPIO_NUM_44 // UART RX引脚。
2026-03-04 20:00:57
517
原创 ESP32-S3开发教程7:PWM呼吸灯
/ PWM配置宏定义#define LEDC_HS_TIMER LEDC_TIMER_0 // 选择LEDC定时器#define LEDC_HS_MODE LEDC_LOW_SPEED_MODE // 速度模式(ESP32-S3仅支持低速)#define LEDC_HS_CH0_CHANNEL LEDC_CHANNEL_0 // 选择LEDC通道#define LEDC_HS_CH0_GPIO 18 // LED连接的GPIO引脚。
2026-03-02 16:26:41
683
原创 Godot扫雷游戏制作记录6——右键插旗功能与胜负判定
生活类比:切换就像 “按开关灯”—— 按一下开灯(true),再按一下关灯(flase),再按一下又开灯…… 循环往复。# 【阶段6新增】核心功能:切换插旗状态# 已翻开不能插旗return# 切换状态:true变false,false变trueis_flagged# 更新显示else:# 发送信号,通知Main更新状态保护逻辑,已翻开和被插旗的格子都不能被翻开切换形态,用!逻辑非来取反更新显示,插旗显示🚩,拔旗显示空发送信号,通知Main更新状态。
2026-02-26 18:59:41
801
原创 Godot扫雷游戏制作记录5——空白区域自动递归展开
阶段四,我们已经能够显示数字了,但是有一个很麻烦的问题,如果点击一个周围地雷数为0的空白格子,它只会翻开自己这一个,周围的空白格子和数字格子还得我们一个个去点,非常累!现在,我们来修改main.gd,使其可以在点击到白色格子时,自动翻开相邻的所有白格子和数字格子。
2026-02-26 00:48:36
616
原创 Godot扫雷游戏制作记录4——计算周围地雷数并显示
现在,想象我们的10×10网格是一个教室座位表,i是座位号,从0~99,从第一排第一列开始数。这里的地雷图标,我们直接使用的Windows系统自带的emoji,这样避免了使用额外的美术素材,但会产生一个问题,在不同系统、不同设备上,可能存在显示问题。这个没什么好说的,定义了一个整型变量adjacent_mines,用于存储该地块周围的地雷数量。比如i = 99(最后一个格子):x = 9,y = 9 → 右下角(9,9)。比如i = 0(第一个格子):x = 0,y = 0 → 左上角(0,0);
2026-02-24 17:41:31
771
原创 Godot扫雷游戏制作记录2——鼠标交互
在Godot中,信号是一个重要概念,是节点内部、节点与节点之间互相通信的桥梁。现在来想象这样一个场景:你在房间里写代码,外卖员在楼下按门铃。
2026-02-19 17:04:59
885
1
原创 Godot扫雷游戏制作记录1——基础场景搭建
const GRID_SIZE = 10 # 网格大小为10x10const:关键字,表示这是 “常量”,一旦定义就不能修改(比如后续代码里不能写GRID_SIZE = 15),适合存储固定的配置参数。GRID_SIZE:变量名(大写是行业惯例,区分常量和普通变量),代表网格的行数 / 列数(10×10)。为什么用常量:如果后续想改成 9×9 或 16×16,只需要改这一行,不用改所有用到 “10” 的地方,方便维护。
2026-02-16 18:06:12
881
1
原创 ESP32-S3开发教程6:硬件定时器
这里的成员变量只有on_alarm一个,配置为gptimer_isr_callback,这个是函数名,代表了中断触发后要去找到这个gptimer_isr_callback函数执行。最后,使用gptimer_register_event_callbacks完成配置,第一个参数是定时器句柄,第二个参数是回调结构体,第三个参数自定义参数,在这里填NULL即可。最后,使用gptimer_set_alarm_action完成配置,第一个参数是定时器句柄,第二个参数是时钟结构体。没什么好说的,就是字面意思。
2026-02-16 00:22:58
831
原创 ESP32-S3开发教程五-按键中断2(使用FreeRTOS)
在上节中,我们满足了简单的中断函数编写与中断引脚配置。但还记得上一节中留下的一点小疑问吗?能不能直接把输出信息的代码放进中断处理函数?这样做会导致什么样的后果?接下来,我们来试验一下。
2026-02-13 23:42:46
709
原创 ESP32-S3开发教程五-按键中断1
中断,是嵌入式中的一个重要概念,是一种由硬件设备或软件程序主动触发的、异步的事件通知机制。app_main这个场景中,“电话响” 就是,“接电话” 就是,整个过程的核心就是那么,在ESP32-S3中,要如何完成这一过程呢?
2026-02-01 21:45:01
727
原创 ESP32-S3开发教程二:LED流水灯(基于VS Code+ESP-IDF)
这里不再赘述,创建一个名为“LED_blink”的工程文件夹,选择项目路径,芯片型号选择esp32s3:模板依然选择空白模板:打开新的工程:首先,我们还是添加上driver头文件,分别修改CMakeList.txt和main.c文件:现在,我们来一次性初始化三个GPIO口,作为三个LED的输出引脚。在ESP32中,多个引脚的初始化是通过按位或运算实现的,把多个引脚对应的二进制位 “合并” 为 1,最终生成一个标记了多个引脚的位掩码。具体过程如下:1ULL指无符号长整形数字1,64位,这里以20位
2026-01-16 10:14:50
869
1
原创 ESP32-S3开发教程一:点亮一个LED(基于VS Code+ESP-IDF环境)
有关开发环境的搭建,可以查看本人的上一篇博文,这里不再赘述。
2026-01-15 10:31:41
1030
原创 ESP32_S3开发环境搭建教程(VS Code+ESP-IDF)
本文详细介绍了VSCode的安装配置全流程:首先指导如何下载安装VSCode并设置中文界面;接着说明如何配置C/C++开发环境;然后重点讲解ESP-IDF插件的安装方法,包括版本选择和路径设置;最后可选安装AI编程助手Trae,并演示登录使用步骤。整个教程包含具体操作图示和注意事项,适合新手快速搭建开发环境。
2025-11-05 12:02:47
1479
原创 OpenCV学习笔记5——图像的数值计算
对比前后输出的两个二维列表可以发现,列表中的每一个值都加了10,但有的直接变成了个位数。这个报错的意思是,在执行img1+img2的代码时,程序发现用来相加的两个数组高度、宽度不一样,所以没有办法相加。但是很明显,这样的图像相加并没有满足我们的要求,得到的图像都没法看。这里,前面的步骤与上面一样,这里多读进来一张图片,并将两张图片直接相加,结果赋值给img3,并将img3显示出来。这256个值中选择一个,但254+10=264,已经超出了255的范围,所以在求余256后得到了新的图像值。
2024-10-18 06:53:27
1121
原创 FL studio1——手把手教你写歌,从作曲到发布一条龙服务
FL Studio编曲软件即“Fruity Loops Studio”,简称FL,也就是国人众所熟知的水果编曲软件,圈内用户习惯叫它“水果”。它是一个全能音乐制作环境或数字音频工作站(DAW)。FL Studio可以进行编曲、剪辑、录音、混音,让你的计算机变成全功能录音室,帮助你制作出属于自己的原创音乐。
2024-09-13 21:57:20
8525
1
原创 机器学习1——手把手教你用Python跑一个线性回归模型
其中,“x_train”代表训练数据的输入特征,“y_train”代表输入数据的目标值,与前一个“x_train”对应。这个函数最少需要传入两个函数,“start”是序列的起始值,“stop”是序列结束值,如果后面的“endpoint”参数为True,则将结束值包含在序列中,否则不包含。“回归模型”其实就是指通过一个给定的数据集来预测值的模型,比较类似于初中时的给几对(x,y)数据求函数表达式,并依据表达式预测出剩余x所对应的y。而且,问号的值也不会是确定的,而是需要根据结果不断调整参数,达到预测的目的。
2024-09-08 11:03:33
4983
原创 Arduino学习笔记3——LED闪烁
点击“文件”——“示例”——“Basics”——“Blink”打开Blink示例程序。Blink有眨眼、闪亮之意,程序实现的功能也与之类似,可以让板子上的L灯以1秒为间隔点亮熄灭。
2024-08-07 18:43:43
1202
原创 Arduino学习笔记2——初步认识Arduino程序
在Arduino中,存在多种不同的数据类型,我们需要创建不同类型的变量来存储。变量类型有整型、浮点型、字符型等等,变量的声明语法与C语言相同。在Arduino中,变量的命名不能出现空格,必须是连贯的字符组成,如有需要使用空格的地方可以使用下划线代替。变量开头的只能是字母或者下划线,组成变量的元素只能是字母、数字、下划线。变量命名不能使用保留字(即敲出来后自动变为青绿色的字)。在Arduino中,如果一开始不为变量赋初始值,那么默认为0。变量的命名要尽可能体现变量的作用。
2024-08-07 16:32:03
940
原创 Godot学习笔记8——PONG游戏制作
PONG是1972年由雅达利公司推出的游戏,主要玩法为玩家控制两个可以上下移动的板子击打屏幕中不断运动的球。
2024-08-06 19:20:42
2305
原创 Godot学习笔记7——Input单例与自定义单例
我们也可以在项目中自定义一个单例,只需要在项目文件中新建一个脚本,并写入如下代码:接着,我们来到“项目”-“项目设置”-“自动化加载”,将我们的脚本加入进去:点击路径右侧的文件夹按钮即可选择脚本,在节点名称处可以自定义名称。接着,我们在刚才“Sprite2D”挂载脚本下写下如下代码:运行后可以看到,它将a变量所代表的值和b函数都执行了一遍。
2024-07-30 17:53:14
954
原创 Godot学习笔记6——数组和for
在Godot中,定义一个数组的关键字也是“var”,数组里面的内容使用方括号括起来。在没有限定类型时,我们可以放入任何类型的数据:我们甚至可以将另一个数组放入此数组中:和其他类型的变量类似,我们可以将变量强制定义为数组,不允许存放其他数据,只需要在变量名后加冒号和数据类型即可:我们也可以规定数组中只能存放的数据类型,比如这里我只想让数组中存在整型,那么就在后面加上方括号,里面写“int”:可以看到此时出现了报错,因为数组中存放了不是“int”型的数据。
2024-07-29 23:09:41
2319
原创 Arduino学习笔记1——IDE安装与起步
快捷钮, 将鼠标放在每个钮上即可获知当前按钮的名称,分别是“验证”(运行代码并翻译为电脑能读懂的内容)、“上传”(将代码传到开发板)、“调试”(Uno不支持调试)、“串口绘图仪”、“串口监视器”程序编辑区域信息面板如果刚打开的IDE没有上述界面,那么点击一下验证钮,即可出现该界面。
2024-07-21 16:35:01
5918
原创 Godot学习笔记5——if和while
使用if可以在函数中设置情况分支,起到控制数据处理流程的作用。在Godot中,语法为if(条件):代码块例如:在这里,我们定义了两个变量,并在节点加载完成后判断两变量相加是否等于0.4,运行后可以看到,程序输出了“yes”。Godot与大多数编程语言一样,赋值为一个等于号,等于为两个等于号。我们修改一下两个变量的数字,再次运行,发现结果并不如我们期待的那样:可以看到,运行后,“yes”并没有被输出。这是由于计算器存储小数时会有一定误差导致的。
2024-07-21 10:09:30
1532
原创 Matlab 2023b学习笔记2——变量与数据类型
Matlab中数据类型分为数字、字符与字符串、矩阵、元胞数组以及结构体。如果超出63为会被自动截断为63位,可能会造成一些不必要的麻烦。2.randn生成标准正态分布的伪随机数(均值为0,方差为1)可以看到,E矩阵前两维还是0矩阵,第三维变成了随机矩阵。1.rand生成均匀分布的伪随机数,分布在(0~1)之间。在Matlab中, 字符串或单个字符都用单引号括住。
2024-07-20 20:58:23
1617
原创 Godot学习笔记4——函数
在Godot中,我们使用“func”来定义函数,后面跟函数名、括号和冒号,下面一行缩进跟一个“pass”,这个“pass”并无任何意义,只是一个函数的结构。函数的命名规则与变量的命名规则一致,打头的必须是字母或下划线,组成元素必须为字母、数字、下划线。函数有三个关键信息,分别是输入信息、处理流程和处理结果。
2024-07-20 19:08:22
3625
原创 Godot学习笔记3——GDScript变量间的转换规则
在GDS中,我们使用“Vector2”来定义二维向量,用小括号括起来的两个浮点值,更改时对变量名.x或.y赋值即可:运行后可看到,v的值已经变为了(16,1),证明修改成功。
2024-07-20 10:54:50
3499
原创 OpenMV学习笔记4——二维码识别
在主函数中,我们依然是将捕获到的图像命名为img,“lmg.lens_corr”是执行镜头矫正,防止图像变形影响识别结果。函数原型为“img.lens_corr([strength=1.8[,zoom=1.0[,x_corr=0.0[,y_corr=0.0]]]])”,“img.find_qrcodes()”函数是在规定区域内寻找二维码,函数原型为“img.find_qrcodes([roi])”之后便是在寻找到的图像上画框,并将捕获到的“code”对象打印出来。
2024-06-03 17:42:06
1928
原创 OpenMV学习笔记3——画图函数汇总
画图,即在摄像头对应位置画出图形,对于需要反馈信息的程序来说很直观。就如上一篇文章颜色识别当中的例子一样,我们在识别出的色块上画出矩形方框,并在中间标出十字,可以直观的看到OpenMV现在识别出的色块。
2024-06-02 22:02:54
1496
原创 OpenMV学习笔记2——颜色识别
img.draw_cross(blob.cx(), blob.cy())”意思是在色框中间画一个十字,blob.cx()与blob.cy()指的是色块的中心位置坐标。如果这个色块是红色,那么它的code就是0001,如果是蓝色,那么它的code就是0010。需要注意的是,在颜色识别中一定要关闭白平衡和自动增益,如果打开的话会影响颜色识别的效果,可能会使颜色的阈值发生改变。比如,识别一个红色的圆,返回的blob.pixels()是目标圆的像素点数,blob.area()是圆的外接正方形的面积。
2024-05-29 21:35:26
4308
原创 OpenMV学习笔记1——IDE安装与起步
打开我的电脑可以看到,有一个新的U盘,这个就是OpenMV的Flash空间,打开后可以看到main.py,此时就是我们下载进去的程序。OpenMV的镜头是可以调整对焦的,只需要将镜头下方的锁焦环拧松,然后调整摄像头位置即可,一般最清晰的位置在底部偏上一些。它的下方是直方图,可以显示不同颜色的阈值,点击该窗口右上方的下拉三角即可切换不同的数据,包括RGB、灰度、LAB、YUV四种。跳过一些帧,跳过n张照片,在更改设置后,跳过一些帧,等待感光元件变稳定。左边最大的是代码编写框,需要在这里写代码。
2024-05-24 22:15:00
9396
4
空空如也
如何使用opencv识别空心矩形
2024-10-27
关于#opencv#的问题:识别空心图形总是出错
2024-10-21
else后面的一大串是啥意思?
2023-10-28
关于#c语言#的问题:编译错误提醒我break不在循环里面(相关搜索:for循环)
2023-10-28
关于#c语言#的问题:为什么必须输入五个数才能输出最大的数啊
2023-10-23
对两个不相等列表使用sort排序之后为何会相等?(语言-python)
2023-07-27
python海龟绘图的setup()在结束时告诉我有错误
2022-01-27
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅