- 2024-10-30
-
回复了主题帖:
【2024 DigiKey创意大赛】+基于大语言模型的智能家居平台+大语言模型学习分享
wangerxian 发表于 2024-10-30 09:26
在我的认知里,大模型做不了这么精细的活才对。
怎么给他训练嘞。
基于prompt工程引导他的输出,是可以达到这种效果的,当然最好能结合Function Call技术实现
- 2024-10-29
-
发表了主题帖:
【2024 DigiKey创意大赛】+基于大语言模型的智能家居平台+最终提交贴
本帖最后由 SeasonMay 于 2024-10-29 22:55 编辑
基于大语言模型的智能家居平台
作者:SeasonMay
一、作品简介
本作品以乐鑫的ESP32-S3-LCD-EV-BOARD为家居平台的核心主控,搭配以DFROBOT的TCS3200颜色传感器(SEN0101)以及Adafruit的15x7矩阵灯板作为家居平台的主要演示场景平台,并以Adafruit的Feather TFT ESP32-S3作为协控中心,处理器件与上位机等的通信服务等任务。全家福如下:
1.ESP32-S3-LCD-EV-Board 是一款基于 ESP32-S3 芯片的屏幕交互开发板,通过搭配不同类型的 LCD 子板,可以驱动 IIC、SPI、8080 以及 RGB 接口的 LCD 显示屏。同时它还搭载双麦克风阵列,支持语音识别和近/远场语音唤醒,具有触摸屏交互和语音交互功能,满足用户对多种不同分辨率以及接口的触摸屏应用产品的开发需求。
2. TCS3200颜色传感器(SEN0101)是一款全彩的颜色检测器,包括了一块TAOS TCS3200RGB感应芯片和4个白色LED灯,TCS3200能在一定的范围内检测和测量几乎所有的可见光。TCS3200有大量的光检测器,每个都有红绿蓝和清除4种滤光器。每6种颜色滤光器均匀地按数组分布来清除颜色中偏移位置的颜色分量。内置的振荡器能输出方波,其频率与所选择的光的强度成比例关系。
3.Adafruit的两个板卡,自然不用多说,在此前得捷的Follow Me等活动就有过出场,性能强大,功能丰富,作为本次任务的辅助器件,也起到了非常关键的作用。
二、系统框图
本项目的设计框图如下所示,其中大致可以分为三部分,首先是PC机上的云端服务,负责提供flask的总体通信交互框架,用于不同板卡间以及与上位机的通信交互,同时也在上位机上部署了大语言模型的推理服务,在通过ESP32-S3-LCD-EV-BOARD的LVGL界面完成与用户的人机交互,收集到用户的意向(比如通过文本输入等)后,经由GPT-4o模型的分析,通过Function Call等技术完成推理,进行决策,下发需要完成的任务,如开灯、开启空调等,而这些细节任务的执行则由Adafruit的ESP32板辅助完成。
三、各部分功能说明
首先在上位机pc上启动flask服务以及大语言模型推理服务的接口,启动成功如图所示:
然后将Adafruit的ESP32S3板卡与矩阵灯板以及SEN0101传感器相连(本项目主要使用其4个闪亮的白色LED灯,用以模拟家庭环境中的开灯如白炽灯场景),连接对应引脚,配置完I2C地址后,上电,可以看到默认情况下,灯板以及LED灯都是熄灭状态,而ESP32由于烧录的CPY固件,因此板载的小屏幕上会显示输出信息,可以看到板子上电后连接到wifi,并且自动显示地址,并且已经在监听5005端口,等待大语言模型下发的指令传递至此,从而继续操作其他两个外设。
将ESP32的EV板上电,可以看到基于LVGL构建的交互界面,最上方显示连接wifi后分配的IP地址,中间则是一个文本输入框,用来接收用户输入的文字文本信息,下方一个按钮,用来确认用户输入的信息。
点击文本输入框,界面会自动弹出一个软键盘,方便用户直接输入信息,免去要外接键盘的麻烦。
然后用户可以自由输入感受、想法等等一切文本信息,借由大语言模型的出色的理解能力,可以与用户共情,懂你所想,从而完成用户需要的任务。比如这里输入“it is night already”,并点击确认,首先会回显确认信息,然后借由flask服务将文本信息转发至PC机,基于Function Call技术进行大语言模型处理。
这里查看大语言模型输出可以发现,模型成功意识到现在天色已晚,潜台词需要开灯照明了
然后查看“白炽灯”状态,果然已经由大语言模型智能处理,打开了灯泡开始照明,“Enjoy your brightness”!
同理,可以输入如“I am hot”之类的主观感受,大语言模型也会懂你意思,指挥开启空调服务
而且也可以输入比如“I am so bored”让大模型帮忙找点乐子,然后就会发现大模型用灯板摆了些字符图案什么的逗你开心
具体细节可以通过视频观看了解,总体来说,智能性以及可拓展性还是很强的。
四、作品源码
https://download.eeworld.com.cn/detail/SeasonMay/634838
五、作品功能演示视频
六、项目总结
最后,首先还是要感谢EEWorld和得捷电子举办这个活动,让我能够学习到这么多知识,也可以将之前计划许久的项目付诸实践,虽然有些许地方不太完美,还有不少优化空间,但我也会继续学习,早日将这些不足进行完善 ,下面是一些学习过程中整理的知识分享链接,供参考,感谢观看!
项目中学习知识分享链接:
1.开箱贴:https://bbs.eeworld.com.cn/thread-1291486-1-1.html
2.ESP32学习分享贴:https://bbs.eeworld.com.cn/thread-1297569-1-1.html
3.大语言模型学习分享贴:https://bbs.eeworld.com.cn/thread-1297572-1-1.html
-
回复了主题帖:
【2024 DigiKey创意大赛】+基于大语言模型的智能家居平台+大语言模型学习分享
wangerxian 发表于 2024-10-29 19:20
用大模型搭建积木?这应该不是大模型的功能吧
也可以做,也有很多方法实现了
-
上传了资料:
基于大语言模型的智能家居平台源码
-
发表了主题帖:
【2024 DigiKey创意大赛】+基于大语言模型的智能家居平台+大语言模型学习分享
## 大语言模型介绍
大语言模型(Large Language Model,LLM),也称大型语言模型,是一种人工智能模型,旨在理解和生成人类语言。它们在大量的文本数据上进行训练,可以执行广泛的任务,包括文本总结、翻译、情感分析等等。LLM的特点是规模庞大,包含数十亿的参数,帮助它们学习语言数据中的复杂模式。
在实际生活或者项目中融入大语言模型,可以进一步提高智能性以及项目的可拓展性,能够实现许多新功能。而需要在实际项目中部署使用大模型服务,一般可以通过Function Call等技术结合使用,会更加便利。
## Function Call应用说明
首先可以参考下面两个视频链接:
【基于chatgpt实现简单的机器人抓取仿真】 https://www.bilibili.com/video/BV16u411x7Vy/?share_source=copy_web&vd_source=173bfb5e5cb20afa5371691cd1151515
【用文心一言驱使机械臂搭积木,从感知到理解到编排与生成,探索CV+大语言模型的落地开发】 https://www.bilibili.com/video/BV1UN411M7q4/?share_source=copy_web&vd_source=173bfb5e5cb20afa5371691cd1151515
不难发现,上面的两个视频中都有提到”函数调用“以及”using function“这类关键词,而诸如这种将预先实现的函数作为工具并且将函数的描述一起传给大模型,供大模型进行使用就是简单的工具调用(Function Call/Tool Call)。
在人类历史的长河中,对工具的创造和使用无疑展现了我们的智慧与创新能力。自人类文明出现以来,工具一直是我们生存的本质所不可或缺的一部分。工具是人类能力的扩展,旨在提高人类活动的生产力、效率和解决问题的能力。随着工具的进步,我们可以轻松高效地完成日益复杂的任务,从而解放时间和资源,以追求更宏伟的目标。
大语言模型拥有丰富的社会经验与基础知识,在理解和生成自然语言文本方面表现优异,但由于大模型预训练数据的滞后性以及私域数据的使用限制,再加上大语言模型存在的幻觉问题,有时基于RAG也很难满足所有需求,因此类似于人类发展,大模型也需要借助工具来与外部世界交互或者实现动态功能
借助工具,不仅可以打破传统静态文本处理的限制,使得模型能够根据实时数据和信息来生成更加准确和有用的输出,还能够与其他先进技术进行无缝集成,例如机器学习算法、图像处理或数据分析工具等,从而提供更加全面和深入的服务。总的来说,工具调用为大语言模型赋予了更强的交互性和实用性,使其能够成为真正意义上的智能助手,帮助人类解决各种复杂问题。
因此,在本次大赛项目中,我也基于Function Call的理念对大语言模型进行应用部署。
## 示例代码框架
实际使用,我个人基于Langchain框架进行开发,也推荐初学者采用此框架。Langchain是一个流行的开源大语言模型操作框架,为开发者提供了一系列的工具和组件,使得与语言模型中的各种数据(如SQL、PDF、CSV)等的连接、语言模型的应用和优化直接简洁。
下面代码主要部分有两处,一处是@tool下的Function的功能定义说明以及具体实现,另一处则是基于OpenAI的chat框架,应用langchain提供的Agent进行Function Call的效果实现。
```
import httpx
from langchain import hub
from langchain.agents import AgentExecutor, create_react_agent, create_tool_calling_agent
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI
from langchain_core.prompts import PromptTemplate
api_key = "Your_API_Key"
# Define tools to be used with the agent
@tool
def call_ambulance(position: str) -> str:
"""Call ambulance in terms of emergency like accident to the given position """
return "Ambulance called successfully."
@tool
def call_police(position: str) -> str:
"""Call police in terms of heavy emergency to maintain situation to the given position"""
return "Police called successfully."
tools = [call_ambulance, call_police]
llm = ChatOpenAI(
openai_api_key=api_key,
model="gpt-4o")
question = "发生交通事故了"
prompt = hub.pull("hwchase17/react")
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, handle_parsing_errors=True)
# Invoke the agent with the combined input
result = agent_executor.invoke(
{"input": question, "tools": tools}).values()
```
运行结果如图所示,可以发现,大语言模型在得到输入的query后,会搜寻自带的先验知识,得出Thought想法,然后会进行推理决策,利用可以使用的工具进行具体决策以及行动,相比传统方法融入了更多社会常识以及智能性,也有望为未来的具身智能、机器人开发等提供更多选择。
## 其他
当然了,Function Call的使用只是大模型应用部署中微小的一部分,初学上手体验后,可以继续研究开发诸如RAG、微调、Agent智能体等更多技术,从而能够更好地应用大模型的开发。
-
发表了主题帖:
【2024 DigiKey创意大赛】+基于大语言模型的智能家居平台+ESP32S3 EV BOARD上手指引
开发ESP32的环境选择有很多很多,我个人尝试过MicroPython、Arduino、VScode+ESP idf以及VScode+PlatformIO等环境,综合来看,Arduino上手比较快,mpy驱动配置有点复杂,PlatformIO上手有一些基础后最为推荐,因此本篇记录下初学者入门使用的一些开发过程,基于Arduino进行开发,由于本人也是摸着石头过河,可能存在说的不对的地方,也麻烦指出。
## 配置Arduino开发环境
首先参考官方的arduino使用说明,安装依赖,参考链接:[ESP32_Display_Panel/README_CN.md at v0.1.6 · esp-arduino-libs/ESP32_Display_Panel](https://github.com/esp-arduino-libs/ESP32_Display_Panel/blob/v0.1.6/README_CN.md)
我安装的版本如下:
```
arduino-esp32:3.0.5
ESP32_IO_Expander:0.0.4
ESP32_Display_Panel:0.18.0
lvgl:8.4.0
```
初次安装lvgl需要配置一下环境,本机环境为win11,首先定位到类似C:\Users\SeasonMay\Documents\Arduino\libraries路径下,可以看到lvgl的文件夹
刚开始是没有lv_conf.h文件的,需要去lvgl文件夹下,将lv_conf_template.h文件复制一份放到上图中的文件夹内,并修改文件中第15行来使能文件
```
#if 0 -> #if 1
```
打开示例项目,点击示例->ESP32_Display_Panel -> LVGL ->v8->Porting,打开的项目文件组织如图所示
基于EV Board使用,需要修改几处地方代码,使能对应功能代码
```
# ESP_Panel_Board_Supported.h
line 10 0>1
line44 取消注释(注意是v1.5那行)
```
其他地方按具体需求修改或者注释即可
## 编译使用
点击工具,配置下方参数,这里我修改的地方主要如下
```
# 修改Flash大小 从4MB->16MB
# 修改分区,Partition Scheme,从默认改为16M Flash(3+9.9),实际只用默认,LVGL+WIFI等功能就能把控件挤爆了,推荐改下分区大小
# 使能PSRAM,使用OPI PSRAM,否则烧录程序会不断重启,这个我看别的博主也提到了
# 其他按需修改
```
## 效果初试
在编辑完参数列表后,就可以编写修改示例代码或者直接用示例代码运行了,这里提供一个我修改后的demo,放入了一个按钮控件和文本输入框控件,其中点击文本输入框,会弹出软键盘可以输入文字,再点击按钮,就会显示所输入的文字
```c
#include
#include
#include
#include "lvgl_port_v8.h"
// 定义全局变量存储文本框和键盘对象
lv_obj_t *textarea;
lv_obj_t *keyboard;
/* 按钮事件处理函数 */
static void btn_event_cb(lv_event_t * e)
{
// 获取文本框的内容
const char * text = lv_textarea_get_text(textarea);
// 在串口输出文本框中的内容
Serial.print("Text input: ");
Serial.println(text);
// 弹出提示框
lv_obj_t *msg = lv_msgbox_create(NULL, "Input", text, NULL, true);
lv_obj_align(msg, LV_ALIGN_CENTER, 0, 0);
}
/* 文本框事件处理函数,点击文本框时弹出键盘 */
static void textarea_event_cb(lv_event_t * e)
{
// 显示虚拟键盘
lv_keyboard_set_textarea(keyboard, textarea); // 关联键盘和文本输入框
lv_obj_clear_flag(keyboard, LV_OBJ_FLAG_HIDDEN); // 显示键盘
}
/* 键盘事件处理函数 */
static void keyboard_event_cb(lv_event_t * e)
{
lv_event_code_t code = lv_event_get_code(e);
lv_obj_t *kb = lv_event_get_target(e);
if(code == LV_EVENT_CANCEL) {
lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN); // 隐藏键盘
}
}
void setup()
{
String title = "LVGL porting example with button, text area, and keyboard";
Serial.begin(115200);
Serial.println(title + " start");
Serial.println("Initialize panel device");
ESP_Panel *panel = new ESP_Panel();
panel->init();
#if LVGL_PORT_AVOID_TEAR
// 如果启用避免撕裂功能,配置RGB总线
ESP_PanelBus_RGB *rgb_bus = static_cast(panel->getLcd()->getBus());
rgb_bus->configRgbFrameBufferNumber(LVGL_PORT_DISP_BUFFER_NUM);
rgb_bus->configRgbBounceBufferSize(LVGL_PORT_RGB_BOUNCE_BUFFER_SIZE);
#endif
panel->begin();
Serial.println("Initialize LVGL");
lvgl_port_init(panel->getLcd(), panel->getTouch());
Serial.println("Create UI");
lvgl_port_lock(-1);
// 创建一个简单的标签
lv_obj_t *label = lv_label_create(lv_scr_act());
lv_label_set_text(label, title.c_str());
lv_obj_align(label, LV_ALIGN_TOP_MID, 0, 20);
// 创建一个文本输入框
textarea = lv_textarea_create(lv_scr_act());
lv_obj_set_width(textarea, 200);
lv_obj_align(textarea, LV_ALIGN_CENTER, 0, -40); // 让文本输入框居中
lv_obj_add_event_cb(textarea, textarea_event_cb, LV_EVENT_CLICKED, NULL); // 点击文本框时弹出键盘
// 创建一个按钮
lv_obj_t *btn = lv_btn_create(lv_scr_act());
lv_obj_align(btn, LV_ALIGN_CENTER, 0, 40); // 让按钮位于文本输入框的下方
lv_obj_set_size(btn, 100, 50);
// 创建按钮的标签(按钮上的文字)
lv_obj_t *btn_label = lv_label_create(btn);
lv_label_set_text(btn_label, "Submit");
lv_obj_center(btn_label);
// 为按钮设置事件回调函数
lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_CLICKED, NULL);
// 创建虚拟键盘,并设置为初始隐藏状态
keyboard = lv_keyboard_create(lv_scr_act());
lv_obj_add_flag(keyboard, LV_OBJ_FLAG_HIDDEN); // 默认隐藏键盘
lv_obj_add_event_cb(keyboard, keyboard_event_cb, LV_EVENT_CANCEL, NULL); // 设置键盘取消事件
lvgl_port_unlock();
Serial.println(title + " end");
}
void loop()
{
Serial.println("IDLE loop");
delay(1000);
}
```
## 其他
其他不说,Arduino确实配置环境起来比较方便,但编译实在太慢了,塞个LVGL,编译在我电脑上起码十分钟左右,后面我又尝试了一下VSCode+PlatformIO进行开发,编译速度快了好几倍,也推荐大家可以尝试一下,arduino入门完后就可以试试看PlatformIO开发了。此外我也看到有Circuitpython的支持,做完比赛后也会尝试用一用,效果好再发个帖子上来。
- 2024-09-09
-
回复了主题帖:
【2024 DigiKey创意大赛】基于大语言模型的智能家居平台开箱贴
wangerxian 发表于 2024-8-27 14:16
语言大模型准备接谁家的?
感觉都可以,glm的,qwen的balabala,或者直接找个开源的丢orin上本地跑拉api
- 2024-08-25
-
发表了主题帖:
【2024 DigiKey创意大赛】基于大语言模型的智能家居平台开箱贴
首先感谢EEWorld和得捷联合举办的这次活动,让作为小白的我又可以跟着各位大佬学习啦~
这次我选用的是一块ESP32-S3的带触摸屏的开发板,一块颜色传感器以及一个Matrix灯阵,晒一个全家福
然后去掉包装,再看看板子以及传感器的细节
最后再给ESP32的主控板一个单独的特写,彰显c位特质hhh
板卡在手,接下来就是认真研究技术,争取做出好的作品了,和大家一起加油!
- 2024-06-24
-
加入了学习《基于STM32F401RE开发板的X-NUCLEO-IKS01A3传感器测试之一 》,观看 基于STM32F401RE开发板的X-NUCLEO-IKS01A3传感器测试之一STTS751温度传感器测试
- 2024-01-17
-
回复了主题帖:
领取审核名单(第五批): 辞旧,年底清仓,100+板卡来袭,有缘来领
个人信息无误,已知晓需自己支付邮费
- 2024-01-11
-
加入了学习《石头剪刀布之AI时代》,观看 石头剪刀布之AI时代--结项视频
-
发表了主题帖:
【DigiKey创意大赛】基于Badger 2040的个人便携小助手作品最终提交
作品名称:基于Badger 2040的个人便携小助手
作者:SeasonMay
## 一、作品简介
本作品名称为基于Badger 2040的个人便携小助手,顾名思义,可以记录展示某些特定信息,作为个人的小助手使用,实现了如备忘录、天气播报员、时间提示等功能。
下图为作品的概览图,如图所示,可以提示当前地区如南京地区的温湿度等天气信息,同时也可以显示当前日期时间以及个人寄语之类的信息,当然这都是可以用户自定义的,同时这个界面也只是本作品众多界面中的其中一个页面展示。
## 二、系统框图
整个项目系统框图以及使用的主要物料图的全家福如下所示
由于用的是Badger 2040不是Badger 2040 W版本(当时W版本也尚未上架得捷),因此板卡上没有WIFI模块功能,需要联网获取的信息需要通过其他设备来转接发送。如图所示,获取天气等信息时候,需要调用API,因此使用PC机或者服务器来调用API获取对应的数据流,再由上位机本地或者中继节点对信息处理,然后发送给Badger 2040设备,完成信息的获取。其中上位机、中继节点以及Badger几个设备间通信通过无线UART串口模块实现。
## 三、各部分功能说明
### 1.通信设备
(本来准备在得捷购买LORA模块的,奈何看中的型号缺货了,转而去看了看无线串口模块,不巧也在排货期,就后面自己购买了两个nRF24L01无线串口和一个USB转nRF24L01模块)
通过预先设定好工作方式以及各模块的地址,再规定一下通讯的协议等格式,和正常的有线UART串口使用起来没有什么区别,实测室内环境下传输效果还是可以的。
### 2.中继节点
考虑到有时候上位机发送的数据流可能过大,而rp2040的芯片性能可能不足以实时处理那么多数据,所以增加了一个中继节点将部分处理较麻烦的数据进行预处理,再进行传输发送。中继节点采用了一块STM32的NUCLEO板实现(官方的板卡确实颜值高),设定好通信地址后,就可以和上位机和Badger板通信,将处理好的数据按格式发送。
### 3.Badger 2040
Badger 2040是一个基于树莓派RP2040的板子。配备了2.9英寸的黑白E-Ink显示屏,分辨率为296 x 128,可使用C/C++、MicroPython和CircuitPython等多种方式进行编程,板载了5个按钮以及可扩展焊盘(这里我是直接焊接了排针)。
规格特性:
• MCU – 树莓派RP2040双核Arm Cortex M0+,运行频率高达133Mhz,具有 264kB SRAM
• 存储 – 2MB QSPI闪存
• 显示 – 2.9英寸黑白电子墨水显示屏,分辨率为296 x 128像素、超宽可视角、超低功耗;点距 – 0.227 x 0.226mm
• USB – 1个用于供电和编程的USB Type-C端口
• 扩展
• Qwiic/STEMMA QT连接器
• 10个带I2C的焊盘、一个中断引脚、UART、SWC/SWD、3V、GND
• 其他
• 5个前置用户按钮
• 重置和启动按钮(启动按钮也可以用作用户按钮)
• 白色LED灯
• 电源供应
• 通过USB-C端口提供5V电源
• 用于连接电池的JST-PH连接器(输入范围2.7V – 6V)
• 用于电池电量监测的高精度电压基准
• 尺寸 – 85 x 48 x 9 mm
因为RP2040可以直接刷cpy或者mpy的固件,秉持着“人生苦短,我用Python”的原则,本项目中使用了MicroPython进行开发,下面对一些实现的主要功能进行解释。
(1)首先是封面的天气界面,可以看到图上的文字为地区、温度、湿度、日期以及小寄语的信息,左侧有一个小太阳的LOGO,这个也是随着天气可变化的,比如下雨就是一朵雨云等。经由PC机调用OpenWeatherMap的API获取天气信息后,经由STM32进行简单的处理后将数据发送到Badger 2040进行显示。
给出一个调用OpenWeatherMap的API的代码
```
import requests
import json
def get_weather(api_key, city):
base_url = "http://api.openweathermap.org/data/2.5/weather"
params = {
'q': city,
'appid': api_key,
'units': 'metric' # 单位可以是 'metric'(摄氏度)或 'imperial'(华氏度)
}
try:
response = requests.get(base_url, params=params)
response.raise_for_status() # 检查请求是否成功
data = response.json()
# 打印解析后的数据
print("City:", data['name'])
print("Temperature:", data['main']['temp'], "°C")
print("Weather:", data['weather'][0]['description'])
print("Humidity:", data['main']['humidity'], "%")
print("Wind Speed:", data['wind']['speed'], "m/s")
print("Pressure:", data['main']['pressure'], "hPa")
print("Min Temperature:", data['main']['temp_min'], "°C")
print("Max Temperature:", data['main']['temp_max'], "°C")
print("Visibility:", data.get('visibility', 'N/A'))
print("Sunrise:", data['sys']['sunrise'])
print("Sunset:", data['sys']['sunset'])
print("Cloudiness:", data['clouds']['all'], "%")
except requests.exceptions.HTTPError as errh:
print("HTTP Error:", errh)
except requests.exceptions.ConnectionError as errc:
print("Error Connecting:", errc)
except requests.exceptions.Timeout as errt:
print("Timeout Error:", errt)
except requests.exceptions.RequestException as err:
print("OOps: Something went wrong", err)
# 用你的 OpenWeatherMap API 密钥替换 'your_api_key',并指定城市名称
api_key = ''
city_name = ''
get_weather(api_key, city_name)
```
(2)备忘录&电子书
买不起Kindle,拥有墨水屏一样可以小小体验一下,如图就是喊ChatGPT写的一个小故事,同样是通过串口上传到设备里。板卡上的标有上下箭头的小按钮可以完美来控制电子书的上下滑,实际显示效果还是不错的。当然了,可以存小故事,也可以用来当做备忘录记载要做的事情,比如可以通过上下箭头控制备忘录事件的上下滑,再通过a键点击确认某事已完成。
(3)小时钟
这个界面的场景我想是比如在看书或者干活时候,想抬头看一下时间但又不想拿手机,刚好可以整一个挂在工作台旁,随时看一眼,也方便。类似地,更新时间信息也可以通过上位机获取时间来实现。效果如下:
PS:在实际操作中,可以通过abc三个按钮组合按键来切换界面,或者按照官方的写一个菜单界面来切换,都是可行的方式。
## 四、作品源码
## 五、作品功能演示视频
[localvideo]c5969045aeae68b8c4c6ed154bd896a3[/localvideo]
## 六、项目总结
通过这个比赛,确实开拓了眼界,特别是见识到同样参赛的其他大佬的作品,令人叹为观止,后续我也会继续在这个项目上优化,比如使用Lora模块或者WIFI模块来破除UART带来的诸多限制,同时目前的板卡连接模块还不够优雅,后续也会学习画点外壳或者连接件来美化一下,继续加油吧。
最后首先感谢一下金主得捷电子,新的一年祝生意红火,能够开展更多这样的活动哈哈。然后也要感谢一下电子工程世界社区的工作人员的辛苦付出,在大赛的过程中也是不厌其烦地耐心解答各种问题,新的一年也祝愿身体健康、诸事顺遂!
附件:
- 2024-01-09
-
回复了主题帖:
辞旧:年底清仓,100+板卡来袭,有缘来领
首先感谢论坛举办这样的活动,新的一年祝愿越办越好!
申请板卡:29 STM32L011 Nucleo-32
申请理由:之前使用的stm32开发板大多都是使用高性能系列的处理器比如F4、F7以及H7系列的芯片,这次申请一块st引以为豪的低功耗系列的开发板研究学习一下。我打算基于这块板子小巧的尺寸、不俗的性能以及ST官方在线的审美做一个类似于手表或者MP4形式的个人随身便携小提醒设备,驱动外设比如最近很流行的1.69寸圆角矩形屏、蓝牙等可开发设备,实现比如备忘录提醒,天气查看等实用功能,同时低功耗的优势也可以发挥出来。希望可以申请成功,感谢!
- 2023-12-14
-
加入了学习《follow me 3演示视频》,观看 follow me 3演示视频
-
回复了主题帖:
【DigiKey“智造万物,快乐不停”创意大赛】STM32H7B3的LVGL初体验
看到屏幕能亮起来会很兴奋开心哈哈,博主加油呀,期待后续作品
-
上传了资料:
follow me3代码
-
发表了主题帖:
【得捷Follow me第3期】项目最终汇总贴
本帖最后由 SeasonMay 于 2023-12-14 23:41 编辑
## 演示视频链接
https://training.eeworld.com.cn/video/38615
## 1.固件烧录使用MicroPython系统(必做任务)
熟悉Seeed Studio XIAO ESP32C3开发板基本操作,安装esptool,并给开发板刷写MicroPython系统,完成入门程序的运行
这里采用Thonny环境搭建micropython
下载安装Thonny,我这里是直接下载的最新版本的IDE
链接:https://thonny.org/
进入IDE,用A2C的线连接开发板和电脑,右下角会出现mpy的解释器选项
要烧录固件,需要进入烧录模式,我采用的方法为上电前按住boot键(板载丝印B旁边的按钮),然后上电后松开按键,即可进入。
在烧录前,先在官网下载esp32-c3 micropython固件,我这里下载的是最新的1.21.0版本的固件
链接:https://micropython.org/download/ESP32_GENERIC_C3/
点击“三”按钮,点击select local micropython image
然后勾选target port和解释器的路径一致,再点击安装即可,等到“Done!”出现,没有报错时,固件烧录即为完成。
拔掉数据线,重新连接电脑,不再进入烧录模式。注意右下角解释器选择esp32的而非本机的
跑一个经典例程,至此mpy环境搭建完成
## 2.驱动扩展板上的OLED屏幕(必做任务)使用扩展板上的OLED屏幕显示文字和图形
seeed xiao micropython官方文档链接:
https://wiki.seeedstudio.com/XIAO_ESP32C3_MicroPython/
在做显示任务的时候,一开始我按照官方文档打算直接在Thonny里配置并使用SSD1306
但是搜索到SSD1306的库后安装时,一直报错如下:
尝试了降低Thonny或者MicroPython的版本后,也还是不行,于是我就直接去复制了一份SSD1306的库文件直接放到ESP32的设备上,不过很多方法还是欠缺,因此我加了几个要用到的:
SSD1306.py:
```python
#MicroPython SSD1306 OLED driver, I2C and SPI interfaces created by Adafruit
import time
import framebuf
# register definitions
SET_CONTRAST = const(0x81)
SET_ENTIRE_ON = const(0xa4)
SET_NORM_INV = const(0xa6)
SET_DISP = const(0xae)
SET_MEM_ADDR = const(0x20)
SET_COL_ADDR = const(0x21)
SET_PAGE_ADDR = const(0x22)
SET_DISP_START_LINE = const(0x40)
SET_SEG_REMAP = const(0xa0)
SET_MUX_RATIO = const(0xa8)
SET_COM_OUT_DIR = const(0xc0)
SET_DISP_OFFSET = const(0xd3)
SET_COM_PIN_CFG = const(0xda)
SET_DISP_CLK_DIV = const(0xd5)
SET_PRECHARGE = const(0xd9)
SET_VCOM_DESEL = const(0xdb)
SET_CHARGE_PUMP = const(0x8d)
class SSD1306:
def __init__(self, width, height, external_vcc):
self.width = width
self.height = height
self.external_vcc = external_vcc
self.pages = self.height // 8
# Note the subclass must initialize self.framebuf to a framebuffer.
# This is necessary because the underlying data buffer is different
# between I2C and SPI implementations (I2C needs an extra byte).
self.poweron()
self.init_display()
def init_display(self):
for cmd in (
SET_DISP | 0x00, # off
# address setting
SET_MEM_ADDR, 0x00, # horizontal
# resolution and layout
SET_DISP_START_LINE | 0x00,
SET_SEG_REMAP | 0x01, # column addr 127 mapped to SEG0
SET_MUX_RATIO, self.height - 1,
SET_COM_OUT_DIR | 0x08, # scan from COM[N] to COM0
SET_DISP_OFFSET, 0x00,
SET_COM_PIN_CFG, 0x02 if self.height == 32 else 0x12,
# timing and driving scheme
SET_DISP_CLK_DIV, 0x80,
SET_PRECHARGE, 0x22 if self.external_vcc else 0xf1,
SET_VCOM_DESEL, 0x30, # 0.83*Vcc
# display
SET_CONTRAST, 0xff, # maximum
SET_ENTIRE_ON, # output follows RAM contents
SET_NORM_INV, # not inverted
# charge pump
SET_CHARGE_PUMP, 0x10 if self.external_vcc else 0x14,
SET_DISP | 0x01): # on
self.write_cmd(cmd)
self.fill(0)
self.show()
def poweroff(self):
self.write_cmd(SET_DISP | 0x00)
def contrast(self, contrast):
self.write_cmd(SET_CONTRAST)
self.write_cmd(contrast)
def invert(self, invert):
self.write_cmd(SET_NORM_INV | (invert & 1))
def show(self):
x0 = 0
x1 = self.width - 1
if self.width == 64:
# displays with width of 64 pixels are shifted by 32
x0 += 32
x1 += 32
self.write_cmd(SET_COL_ADDR)
self.write_cmd(x0)
self.write_cmd(x1)
self.write_cmd(SET_PAGE_ADDR)
self.write_cmd(0)
self.write_cmd(self.pages - 1)
self.write_framebuf()
def fill(self, col):
self.framebuf.fill(col)
def pixel(self, x, y, col):
self.framebuf.pixel(x, y, col)
def scroll(self, dx, dy):
self.framebuf.scroll(dx, dy)
def text(self, string, x, y, col=1):
self.framebuf.text(string, x, y, col)
# 下面几个方法自加,非官方提供
def rect(self,x,y,w,h,c):
self.framebuf.rect(x, y, w, h, c)
def fill_rect(self,x,y,w,h,c):
self.framebuf.fill_rect(x, y, w, h, c)
def hline(self,x,y,w,c):
self.framebuf.hline(x,y,w,c)
def vline(self,x,y,h,c):
self.framebuf.hline(x,y,h,c)
def line(self,x1,y1,x2,y2,c):
self.framebuf.line(x1,y1,x2,y2,c)
def circle(self, center_x, center_y, radius, color):
"""Draw a circle at the given midpoint location, radius and color.
The ```circle```method draws only a 1 pixel outline."""
x = radius - 1
y = 0
d_x = 1
d_y = 1
err = d_x - (radius = y:
self.pixel(center_x + x, center_y + y, color)
self.pixel(center_x + y, center_y + x, color)
self.pixel(center_x - y, center_y + x, color)
self.pixel(center_x - x, center_y + y, color)
self.pixel(center_x - x, center_y - y, color)
self.pixel(center_x - y, center_y - x, color)
self.pixel(center_x + y, center_y - x, color)
self.pixel(center_x + x, center_y - y, color)
if err 0:
x -= 1
d_x += 2
err += d_x - (radius
- 2023-12-05
-
发表了主题帖:
【玄铁杯第三届RISC-V应用创新大赛】基于Lichee Pi 4A的智能烟柜管理系统
本帖最后由 SeasonMay 于 2023-12-6 13:08 编辑
## 基于Lichee Pi 4A的智能烟柜管理系统
### 作者:SeasonMay
## 一、问题背景
随着烟草行业的发展,烟柜管理变得越来越重要。传统的烟柜管理方式通常需要人工巡检和记录,效率低下且难以及时监测和管理。同时,烟柜中的烟盒可能被盗或销售情况无法准确掌握,给企业带来损失和管理困难。而市面上针对此的产品相对较少,且成本较高或者不易于操作,需要有一种价格相对低廉且效果良好的解决方案。
## 二、作品简介
因此,基于Lichee Pi 4A的智能烟柜管理系统应运而生,利用计算机视觉技术,通过自动检测和识别烟柜中的烟盒,实现了烟柜的自动化管理和监测,提供了更高效、便捷和安全的方式管理烟柜,同时可以基于视觉的识别结果进行语音播报提醒等智能后处理,拥有极大的扩展空间。
## 三、系统框图
如上是整个系统的框架说明,其中集成的功能主要包括有烟盒检测功能、数据统计功能以及语音播报提醒功能,项目中心主控为LicheePi 4A,使用的其它外设组件包括一个USB免驱摄像头(如罗技C270)以及SYN8266语音合成播报模块。
## 四、各部分功能说明
### 1.烟盒检测
考虑到卷烟货柜往往存在不同种类、不同位置、不同光线的多个烟盒,并且在复杂环境中存在大量干扰,需要准确的从货柜上进行检测与分类。因此项目主要使用的是目前准确率和速度综合较好的One Stage的目标检测算法,即YOLOv5算法。附一个YOLOv5算法框架图:
首先通过labelimg工具在PC机上进行数据集标注(共搜集了网上的400多张图片,初步统计大概1k个烟盒左右),然后丢到服务器上训练得到pt模型后,转化得到onnx模型。再按照官方提供的docker以及文档指示,交叉编译生成对应的hhb_out以及.c文件,然后部署到荔枝派开发板即可成功运行。
在目标检测以及分类的时候,假如类别较少,可以直接在标注YOLO数据集时候分类别标注,但如果类别较多,从个人经验来看,可能还是统一一个类别标注YOLO数据集,然后加入一个vgg16之类的分类模型做下游处理会更方便些,并且官方文档也有常见分类模型如resnet50、vgg16等模型编译部署的教程,还是比较方便的。
### 2.数据统计
在烟盒总数目不太大的时候,可以直接输出结果,但如果总数较多且需要分行分列统计数据以及类别,可以通过DBSCAN等聚类方法,根据行列数目来聚类,从而将每个烟盒的结果按行列独立输出。
### 3.语音播报
项目使用的是SYN8266语音合成播报模块,有pyserial的串口支持理论上就可以运行,我也基于官方给的C的例程,重构了一个python版本的,方便项目总体运行,具体代码示例以及效果可以查看我之前发的博文(链接在最后),目前感觉还是够用的。
## 五、视频演示
视频演示效果如下,为了视频小一点,中间截去了一段等待时间
https://training.eeworld.com.cn/course/68275
## 六、项目源码
[SeasonMay/LicheePi-SmartCiga (github.com)](https://github.com/SeasonMay/LicheePi-SmartCiga)
## 七、发布的博文
1.【玄铁杯第三届RISC-V应用创新大赛】LicheePi 4A+语音模块&官方外壳:[【玄铁杯第三届RISC-V应用创新大赛】LicheePi 4A+语音模块&官方外壳-平头哥芯片开放社区-平头哥 (xrvm.cn)](https://www.xrvm.cn/community/post/detail?spm=a2cl5.27438731.0.0.31d4qTOYqTOYEp&id=4245707806944071680)
2.LicheePi 4A 迟来的开箱(第二批):[【玄铁杯第三届RISC-V应用创新大赛】LicheePi 4A 迟来的开箱(第二批)-平头哥芯片开放社区-平头哥 (xrvm.cn)](https://www.xrvm.cn/community/post/detail?spm=a2cl5.27438731.0.0.31d4qTOYqTOYEp&id=4237364030945169408)
## 八、项目总结
总体来说,基本上达到了当初创意方案的功能需求,只是可惜RISC-V上python生态目前还不太全面,所以大模型的支持暂时还不太方便开展。经过这次比赛,我也是第一次体验到了RISC-V架构的开发板,非常新奇也收获很多,项目主要融合了视觉与听觉进行综合应用,其中语音播报更是对无基础用户比如商户友好,只需根据语音提示就可得知状况。本项目主要创新点在于场景的应用创新以及视听的综合应用,并且基于官方文档,使用HHB进行NPU的加速,充分利用了板卡的性能,同时也积极探索了板卡的外设拓展性,也开发了语音模块的支持。
最后,还是很感谢赛事官方以及社区的支持,能让我这样的小白菜可以体验学习RISC-V架构的开发板,并且能够跟随其他大佬学习项目开发,积累了许多实际经验,同时也非常感谢官方技术人员的关心与耐心答疑解惑,再次感谢!
-
上传了资料:
基于Lichee Pi 4A的智能烟柜管理系统演示视频
- 2023-11-22
-
回复了主题帖:
【得捷电子Follow me第3期】基于ESP32-C3的阅读光线提示器设计
lugl4313820 发表于 2023-11-11 10:14
ssd1306,你的库可以下载到吗,我是试了N次都不行。
可以试试看更新Thonny到4.1.4版本或者直接拷贝个ssd1306.py文件丢进去