当前位置: 首页 > article >正文

基于电子纸与ESP32的物联网桌面日历制作指南

1. 项目概述打造一个永不掉电的桌面物联网日历如果你和我一样喜欢在桌面上放点既实用又有科技感的小玩意儿那么这个基于电子纸的物联网日历绝对能让你眼前一亮。它不像普通屏幕那样需要一直插着电显示完日历后你甚至可以直接拔掉电源画面依然清晰可见就像一张真正的纸质日历。这背后的核心就是电子纸ePaper技术。简单来说你可以把它想象成无数个微小的、带正电或负电的“颜料胶囊”。通过施加不同方向的电场我们能控制黑色或红色的颗粒移动到表面从而“画”出文字和图形。一旦画面形成电场撤去颗粒就卡在那里不动了所以它几乎不耗电。这个项目我们用Adafruit的Metro M4 Express Airlift开发板作为大脑它内置了ESP32 WiFi协处理器让这个小小的单片机可以直接联网。再给它配上Adafruit的三色电子纸扩展板一个能显示黑、白、红三色的2.7英寸屏幕。整个系统的逻辑很清晰开发板启动后通过WiFi连接到Adafruit IO这个物联网平台获取精确的网络时间然后计算出当月的日历布局最后驱动电子纸屏幕将其显示出来。四个物理按键则提供了翻阅上月、下月、回到本月以及切换年份的人机交互功能。它非常适合那些想入门物联网硬件开发、对低功耗显示技术感兴趣或者单纯想做一个酷炫桌面摆件的朋友。整个制作过程无需焊接代码结构清晰你不仅能得到一个实用的工具更能透彻理解从联网、数据处理到硬件驱动的完整嵌入式开发流程。接下来我就带你从硬件拆箱开始一步步把它做出来。2. 硬件选型与核心组件解析2.1 主控板Adafruit Metro M4 Express Airlift (WiFi)选择这块板子作为核心是经过深思熟虑的。市面上常见的ESP8266或ESP32开发板虽然也能联网但它们在处理复杂图形计算和驱动特定外设时可能稍显吃力。Metro M4 Express Airlift则是一个“强强联合”的方案。它的主处理器是一颗Microchip的ATSAMD51这是一颗基于Arm Cortex-M4F内核的芯片运行频率高达120MHz并带有硬件浮点运算单元FPU。这意味着在进行日历的日期计算、图形坐标转换时速度会快很多代码执行更流畅。更重要的是它板载了一颗独立的ESP32模块专门负责处理所有的WiFi连接和网络协议栈。这种“主控网络协处理器”的架构优势明显主控MCU可以专心处理应用逻辑和驱动屏幕网络任务完全交给ESP32两者通过高速SPI通信互不干扰稳定性和效率都比单芯片方案要好。板载的NeoPixel LED在这个项目中被巧妙地用作了状态指示灯。蓝色代表正在联网或获取数据绿色代表正在更新屏幕红色则代表网络错误。这种视觉反馈对于调试和了解设备运行状态至关重要。此外板子预留了丰富的GPIO口并通过标准的Arduino引脚排列与各种扩展板Shield兼容这是我们能直接插上电子纸扩展板的前提。2.2 显示核心Adafruit 2.7英寸三色电子纸扩展板为什么是电子纸又为什么是这款扩展板这是本项目体验的灵魂。首先电子纸的双稳态特性决定了它超低的功耗。只有在刷新画面即电场变化的瞬间需要用电一旦显示完成无论断电几天还是几周画面都依然存在。这完美契合了日历这种信息变化频率低一天或一月一次、但需要持续观看的应用场景。这款2.7英寸的三色黑、白、红扩展板分辨率是264x176像素。对于显示日历和星期文字来说清晰度完全足够。它集成了驱动芯片和一片静态随机存储器SRAM。这个SRAM是关键所在。电子纸刷新需要一整帧的显示数据如果让主控MCU实时生成并通过SPI发送过程会非常缓慢。SRAM的作用就是作为显示缓存MCU可以快速地将计算好的整月日历图像数据写入这片SRAM然后给驱动芯片一个指令让它自己从SRAM里读取数据去刷新屏幕。这样MCU就解放出来了用户可以马上进行下一次按键操作体验上不会有卡顿感。扩展板采用Shield形态引脚与Metro M4完美对齐直接插拔即可省去了繁琐的连线工作。板载的A、B、C、D四个按键我们通过一个模拟引脚A3配合电阻分压电路来读取仅用一个引脚就实现了四个按键的检测节省了宝贵的IO资源。2.3 辅助材料与电源方案除了核心的两件套你还需要一根Micro-USB数据线用于给设备供电和上传程序。对于长期摆放的桌面设备一直连着电脑USB口显然不美观。这里有两个升级方案供你选择USB电源适配器Micro-USB线最简单的方式找一个手机充电头和一个长一点的Micro-USB线插在插座上即可。确保电源适配器能提供5V/1A以上的稳定输出。移动电源方案如果你想让它彻底摆脱线缆束缚实现“无线化”可以购买一个扁平的、容量在5000mAh左右的USB充电宝塞在开发板和扩展板之间的空隙如果有的话或者用双面胶固定在背面。由于电子纸待机几乎不耗电仅在每小时联网同步和按键刷新时消耗少量电力一个充电宝可以支撑数周甚至数月。注意在考虑电池方案时务必确认你的移动电源在输出电流极小时不会自动关机。有些移动电源有“小电流模式”或需要短按按钮激活需要提前测试。3. 软件开发环境搭建与核心库剖析3.1 Arduino IDE配置与板卡支持安装一切从Arduino IDE开始。你需要去Arduino官网下载并安装最新版本的IDE。安装完成后打开它我们需要为Metro M4这块特殊的板子添加支持。点击菜单栏的文件 - 首选项在“附加开发板管理器网址”中输入https://adafruit.github.io/arduino-board-index/package_adafruit_index.json然后点击“好”。这一步是告诉Arduino IDE去Adafruit的服务器上查找板卡定义。接着点击工具 - 开发板 - 开发板管理器...在弹出的窗口中搜索“SAMD”。你应该会找到由Adafruit提供的“Adafruit SAMD Boards”。点击并安装它。这个包包含了Adafruit所有基于SAMD系列芯片包括Metro M4的板卡支持文件、核心库以及相关的驱动工具链。安装过程可能会下载一些编译工具如arm-none-eabi-gcc请保持网络通畅。安装完成后在工具 - 开发板菜单下你就能找到“Adafruit Metro M4 Express Airlift (WiFi)”了选中它。同时在“工具”菜单下将“端口”设置为你的Metro M4所连接的COM口Windows或/dev/tty.usbmodemXXXMac/Linux。3.2 关键库文件的安装与作用解析这个项目依赖于几个重要的库它们各自承担着不可替代的角色。我们将通过库管理器来安装它们这是最不容易出错的方式。点击工具 - 管理库...打开库管理器。Adafruit EPD Library这是驱动电子纸屏幕的核心库。搜索“Adafruit EPD”并安装。它封装了与屏幕驱动芯片如IL91874通信的底层细节提供了诸如clearBuffer()、drawPixel()、print()、display()等高阶函数让我们可以像操作一个普通图形库一样操作电子纸。它内部会处理好向SRAM写入数据、发送刷新指令等复杂时序。Adafruit GFX Library图形基础库。搜索“Adafruit GFX”并安装。EPD库依赖于它。GFX库定义了图形上下文、坐标系统、绘图原语画线、画圆、填充矩形和字体渲染的通用接口。正是有了它我们才能调用gfx.print(“Hello”)这样的简单命令来显示文字。Adafruit BusIO Library这是一个底层通信辅助库。新版本的Arduino IDE在安装上述库时会自动将其作为依赖安装。它统一了I2C、SPI等总线设备的读写操作提高了代码的兼容性和稳定性。Adafruit NeoPixel Library用于控制板载的那个RGB LED。搜索“Adafruit NeoPixel”并安装。它通过特定的时序脉冲来控制WS2812系列LED的颜色我们用它来显示蓝、绿、红三种状态光。Adafruit WiFiNINA Library这是最关键也最容易出错的一步。必须安装Adafruit修改过的版本。因为原版的Arduino WiFiNINA库是针对内置NINA-W10系列模块的板卡如Nano 33 IoT编写的与Metro M4 Airlift上ESP32协处理器的通信方式不完全兼容。你需要手动安装。先去这个链接下载ZIP文件https://adafru.it/Evm。然后在Arduino IDE中点击项目 - 加载库 - 添加.ZIP库...选择你刚下载的ZIP文件。实操心得库版本冲突是嵌入式开发中最常见的问题。如果你之前安装过原版WiFiNINA库建议先通过“管理库”将其卸载再安装Adafruit的修改版。否则编译时可能会遇到关于WiFiSSLClient等类的未定义错误。3.3 Adafruit IO账户配置与密钥获取我们的日历需要联网获取时间时间源就是Adafruit IO。你需要先去io.adafruit.com注册一个免费账户。登录后点击右上角个人头像进入“My Key”页面。这里你会看到两串重要的信息Username和Active Key。这个Active Key就像一把密码钥匙你的设备需要通过它来向Adafruit IO服务证明身份从而获取数据。Adafruit IO提供了一个名为“集成”Integrations的功能其中就有一个“时间服务”Time。它能够返回结构化的日期和时间信息并且支持时区。我们的代码正是通过向这个服务的特定API地址发送HTTP请求来获取当前的年月日时分秒。免费账户的调用频率完全足够这个每小时同步一次的项目使用。4. 代码深度解析与定制化修改4.1 核心文件结构secrets.h与主程序项目代码主要由两个文件构成这是一种良好的工程实践将敏感配置与主逻辑分离。secrets.h文件这是一个头文件用于存放你的WiFi密码和Adafruit IO密钥。你绝对不应该把这些敏感信息直接写在主程序里尤其是当你打算公开分享代码时。你需要创建一个名为secrets.h的新文件并填入以下内容#ifndef _SECRETS_H #define _SECRETS_H #define WIFI_SSID 你的WiFi名称 #define WIFI_PASSWORD 你的WiFi密码 #define AIO_USERNAME 你的Adafruit IO用户名 #define AIO_KEY 你的Adafruit IO Active Key #endif将双引号内的内容替换成你自己的信息。请确保你的WiFi是2.4GHz网络ESP32模块目前对5GHz WiFi的支持可能不稳定。主程序文件 (adafruit_airlift_calendar.ino)这是项目的大脑。它包含了初始化、联网、获取时间、计算日历、绘制图形和响应按键的所有逻辑。代码虽然看起来长但结构清晰。我们接下来会拆解几个关键函数。4.2 时间获取机制getDate()函数详解设备如何知道现在几点核心就在getDate()函数里。它执行了一次HTTPS GET请求访问的URL类似于https://io.adafruit.com/api/v2/你的用户名/integrations/time/strftime?x-aio-key你的密钥fmt%Y-%m-%d %H:%M:%S.%L %j %u %z %Z这个请求会从Adafruit IO服务器返回一个字符串例如2024-06-03 14:45:57.123 155 1 0800 CST。代码通过substring函数将这个字符串“切”开2024-tm_year06-tm_mon03-tm_mday14-tm_hour45-tm_min57-tm_sec1(星期几1代表星期一) -tm_wday注意事项代码中tm_mon的范围是1-12tm_wday的范围是1-71周一这与C标准库中struct tm的定义月份0-11星期0-6不同是作者为了方便理解而做的调整。在后续计算日期时需要特别注意这个差异。4.3 日历绘制引擎drawCalendar()函数拆解这是整个项目最核心的图形逻辑。它接收一个tm结构体指针pickdate表示要绘制哪年哪月以及today用于高亮当前日期。布局计算首先它通过getDayOfWeek()函数计算出目标月份1号是星期几。这个函数实现了Zeller公式或类似算法根据年月日返回星期索引。知道了1号的位置就能推算出日历表格中第一个格子应该显示几号可能是上个月的最后几天。绘制月/年标题在屏幕顶部使用大号加粗字体绘制月份名称在角落绘制年份。绘制星期栏绘制一条横线并在下方标注“Sun”“Mon”等星期的缩写。循环绘制日期用一个双重循环外层循环行内层循环列来填充日历网格。对于每一个格子判断日期是否在目标月份内1号到该月最后一天。如果在范围内则计算该数字的文本宽度和高度使其在格子中居中显示。高亮逻辑这是可定制的部分。通过检查(today pickdate) (curday today-tm_mday)如果正在绘制当前月份的今天则根据currentday枚举变量的值进行高亮RedCircle/BlackCircle在日期数字下面画一个红色或黑色的实心圆并将文字颜色设为反色白色形成突出效果。Bold仅将字体切换为粗体。None不做任何特殊处理。刷新屏幕所有图形元素都先在内存缓冲区即SRAM中画好最后调用gfx.display()。这个命令会触发电子纸的完整刷新流程清屏、写入新帧数据、施加电压序列驱动粒子移动。这个过程需要几秒钟期间屏幕会快速闪烁黑白数次这是正常现象。4.4 按键扫描与交互逻辑readButtons()与loop()四个按键A, B, C, D通过一个模拟引脚A3读取。原理是电阻分压每个按键被按下时会将一个不同阻值的电阻连接到电路从而在A3引脚上产生一个不同的电压值。readButtons()函数通过analogRead(A3)读取这个电压0-1023然后根据预设的阈值范围判断哪个按键被按下。在loop()主循环中定时同步每过一小时1000*60*60毫秒自动调用getDate()更新一次当前时间并刷新当前月份的日历如果当前正显示本月。按键响应按钮Apickdate的月份减1。如果减到0一月之前则年份减1月份设为12十二月。按钮B将pickdate重置为从网络获取的today即跳回当前月。按钮Cpickdate的月份加1。如果加到13十二月之后则年份加1月份设为1一月。按钮D根据上一次按的是A还是B/C决定年份是加1还是减1。这是一个巧妙的设计长按D键可以快速向前或向后翻年。避坑技巧代码中有一个while (readButtons()) { delay(10); }的循环这是为了“等待按键释放”。如果不加这个一次短按可能会被误判为多次按下因为主循环运行得非常快。这种“消抖”和“释放检测”在嵌入式按键处理中非常重要。5. 完整构建、烧录与调试流程5.1 硬件组装与物理连接组装过程非常简单但顺序有讲究。首先确保你的Metro M4 Express Airlift和2.7英寸电子纸扩展板都处于断电状态。将扩展板金属排针孔位与Metro M4板上的排针对齐注意方向通常USB接口在同一侧。然后轻轻地将扩展板垂直按下确保所有引脚都牢固接触。听到轻微的“咔哒”声或感觉完全插到底即可。不要使用蛮力如果感觉不顺畅检查是否有针脚弯曲。组装完成后通过Micro-USB线将Metro M4连接到电脑。此时扩展板上的电源指示灯可能会亮起电子纸屏幕可能会闪动一下或保持原有图案如果是全新的可能是全白或全黑。这是正常的。5.2 代码烧录与首次运行在Arduino IDE中确保你已经正确选择了开发板和端口。打开我们提供的adafruit_airlift_calendar.ino主程序文件。在同级目录下创建并保存好我们之前编辑的secrets.h文件。在烧录前我们还需要进行一项关键设置。点击工具 - 编译器警告级别选择“全部”。这有助于在编译时发现更多潜在问题。然后点击左上角的“验证”对勾图标来编译代码。第一次编译可能会花费一两分钟因为需要编译所有依赖的库。如果编译成功点击“上传”向右箭头图标。IDE会将编译好的程序通过USB线烧录到Metro M4的闪存中。上传完成后板子会自动重启。观察启动过程板载的NeoPixel LED首先可能会亮起蓝色表示正在尝试连接WiFi。如果WiFi连接成功LED会短暂闪烁蓝色然后向Adafruit IO发起时间请求。获取时间成功后LED变为绿色表示开始绘制日历。电子纸屏幕开始闪烁刷新这个过程大约持续5-10秒。刷新完成后LED熄灭屏幕上显示出当前月份的日历并且今天的日期被一个红圈高亮出来。至此一个基本的物联网日历就已经运行起来了你可以尝试按下A、C键来切换月份按B键回到当前月体验一下它的交互。5.3 深度定制修改高亮样式与显示逻辑默认的高亮样式是红圈。如果你想要黑色圆圈、加粗字体或者不高亮修改起来非常简单。在主程序文件开头的枚举变量定义附近你会看到四行被注释掉的dayhighlight currentday ...语句。默认是dayhighlight currentday RedCircle;生效。如果你想改为加粗字体显示今天只需将这行注释掉并取消下一行的注释//dayhighlight currentday RedCircle; //dayhighlight currentday BlackCircle; dayhighlight currentday Bold; //dayhighlight currentday None;保存并重新上传代码即可。你还可以修改drawCalendar()函数中的绘图细节比如改变星期几的缩写默认是英文前三个字母或者调整日历网格的间距和字体大小。注意修改图形布局可能需要一些调试因为坐标计算是手动完成的。6. 故障排除与性能优化指南6.1 常见问题与解决方案速查表在实际制作和运行中你可能会遇到以下问题。这里是一个快速排查清单现象可能原因解决方案编译错误WiFiNINA.h未找到安装了错误的WiFiNINA库版本。卸载原版库通过ZIP安装Adafruit修改版库。编译错误Adafruit_EPD.h未找到EPD库未安装或安装不完整。通过库管理器重新安装“Adafruit EPD”。上传失败端口选择错误开发板未进入烧录模式。1. 确认工具-端口选对了。2. 快速双击Metro M4板上的复位按钮使板载LED呈现呼吸灯效果进入引导程序再尝试上传。NeoPixel长亮红色WiFi连接失败。1. 检查secrets.h中的SSID和密码。2. 确认WiFi是2.4GHz。3. 检查路由器是否限制了新设备接入。NeoPixel长亮蓝色后变红连接Adafruit IO失败。1. 检查secrets.h中的AIO用户名和密钥。2. 确认电脑或手机能正常访问io.adafruit.com。3. 检查Adafruit IO账户是否活跃。屏幕刷新后全白/全黑无内容屏幕初始化失败或SPI通信问题。1. 断电重新插拔扩展板确保接触良好。2. 检查代码中gfx.begin()是否被执行且无报错查看串口监视器。按键无反应按键扫描逻辑问题或硬件接触不良。1. 打开串口监视器波特率115200查看按下按键时是否有“Button X pressed”输出。2. 检查扩展板按键区域的焊接是否完好。时间显示错误如时区不对Adafruit IO时间服务未设置时区。登录Adafruit IO在“Settings” - “地点与时间”中设置正确的时区。6.2 串口调试你的“透视眼”当设备行为异常时串口监视器是你最强大的调试工具。在Arduino IDE中点击右上角的放大镜图标打开它将波特率设置为115200与代码中Serial.begin(115200)一致。重启设备你会看到详细的启动日志“Adafruit Airlift ePaper Calendar” – 程序开始。“Connecting to WiFi…” – 尝试连接WiFi。“Connected to wifi” – WiFi连接成功。“ePaper display initialized” – 屏幕初始化成功。“today is 6/3/2024” – 从网络获取到的日期。“drawing calendar for June 2024” – 开始绘制某年某月的日历。“display update completed” – 屏幕刷新完成。通过观察这些信息你可以精确定位问题发生在哪个环节。例如如果卡在“Connecting to WiFi”那肯定是网络配置问题如果根本没看到这些信息可能是板子没启动或串口没选对。6.3 功耗分析与续航估算这是一个低功耗项目但了解其功耗构成有助于规划电池方案。功耗主要来自三个部分ESP32 WiFi模块在连接WiFi和进行HTTPS请求时峰值电流可能达到100mA以上但每次连接和数据传输仅在毫秒级完成。每小时同步一次平均电流贡献极小。SAMD51主控运行在120MHz进行日历计算和图形渲染时电流约在20-40mA。大部分时间处于空闲状态功耗较低。电子纸刷新刷新瞬间电流较大可达几十mA但持续时间仅2-3秒。刷新完成后电流降至几乎为零。核心耗电大户是屏幕刷新过程。假设使用一块2000mAh的锂电池忽略待机漏电。每次刷新消耗约50mA * 3秒 ≈ 0.042 mAh。每小时同步刷新一次每天消耗约1 mAh。仅考虑显示刷新这块电池理论上可以支撑2000小时约83天。如果加上主控和WiFi模块待机及偶尔运行的功耗实际续航可能会缩短到1-2个月这依然是一个非常可观的数字。你可以通过修改代码将时间同步频率从每小时一次降低到每天一次从而进一步延长续航。6.4 扩展思路与进阶玩法这个项目是一个完美的起点你可以基于它进行无数扩展显示更多信息电子纸下方还有空白区域。你可以修改drawCalendar()函数在底部添加区域显示天气信息需要调用其他天气API、待办事项或励志语录。美化界面尝试使用不同的字体需要将字体文件加入项目或者在月份标题周围画上装饰性边框。甚至可以尝试绘制简单的像素画图标来表示季节。离线时钟模式添加一个便宜的DS3231高精度RTC模块。设备首次启动时从网络同步时间并写入RTC之后可以断开网络依靠RTC维持走时和日历显示真正实现零网络依赖。多视图切换利用第四个按键D或长按等操作切换不同的显示视图比如周视图、年度概览图等。外壳设计用3D打印或亚克力板为它制作一个精致的外壳让它从开发板原型变成一个真正的桌面艺术品。这个项目的魅力在于它清晰地演示了如何将物联网的“云”、嵌入式系统的“端”和独特的显示技术“屏”结合起来解决一个具体的需求。希望你在复现的过程中不仅能收获一个实用的工具更能享受到动手创造的乐趣和知识串联的成就感。

相关文章:

基于电子纸与ESP32的物联网桌面日历制作指南

1. 项目概述:打造一个永不掉电的桌面物联网日历如果你和我一样,喜欢在桌面上放点既实用又有科技感的小玩意儿,那么这个基于电子纸的物联网日历绝对能让你眼前一亮。它不像普通屏幕那样需要一直插着电,显示完日历后,你甚…...

CodeWeaver:多仓库聚合分析工具的设计、部署与实战指南

1. 项目概述与核心价值最近在折腾一个老项目,需要把一堆陈年的、用不同语言和框架写的代码仓库整合到一个统一的视图里进行管理和分析。手动去每个仓库里翻看提交记录、统计代码行数、检查依赖关系,这活儿想想就头大。就在我准备硬着头皮写脚本的时候&am…...

046、PCIE桥设备与交换:当拓扑开始复杂起来

046、PCIE桥设备与交换:当拓扑开始复杂起来 最近在调一块自定义的PCIE扩展板,系统里突然出现了几个“神秘”的端点设备。在lspci列表里,它们出现在一个我从未配置过的总线号上,而且设备ID全对不上。折腾了两天才发现,原…...

基于MCP协议构建Naver搜索服务器,为AI智能体赋能实时信息获取

1. 项目概述:一个连接AI与实时信息的桥梁最近在折腾AI应用开发,特别是围绕OpenAI的Assistant API和Claude的Tool Use功能时,我一直在思考一个问题:如何让这些强大的AI模型摆脱其知识库的“时间枷锁”,获取到最新、最实…...

用Circuit Playground Express制作可穿戴互动闪光T恤:零焊接图形化编程入门

1. 项目概述:一件会“跳舞”的闪光T恤几年前,当我第一次把微控制器缝进衣服里时,那感觉既兴奋又麻烦——满桌子的电线、烙铁,还有对洗衣机深深的恐惧。但现在,像Adafruit的Circuit Playground Express(后面…...

陕西省ICPC省赛总结

个人反思 我个人感觉还是练的少,学的不够系统。具体反应到题上,表现在看到题没有思路,并且也不知道这道题用到什么算法思想,导致拿的书和本子几乎用不上。其次是思考不够深入,我的队友都能进行深入的思考,但…...

ubantu安装vscode

在火狐浏览器中搜索vscode官网,找到.deb文件下载,下载完成后文件所在的位置为 主文件夹/下载 文件夹内。...

FastAPI快速入门:环境搭建+第一个接口

FastAPI快速入门:环境搭建第一个接口文章信息 标题:FastAPI快速入门:环境搭建第一个接口字数:4200字预估阅读时间:18分钟难度:⭐☆☆☆☆一、为什么选择FastAPI? 在2026年的Python Web框架生态中…...

小智聊天机器人的本地化部署。

前天到了,小智机器人ESP32-S2的套件(非焊接版的那一款),找王同学,学了学怎么焊接。昨天,使用面包板搭建电路,安装元器件,服务器端注册设置,刷程序,很快就完成…...

RK3288嵌入式开发实战:硬件架构、软件定制与典型应用场景解析

1. 项目概述:为什么RK3288至今仍是嵌入式开发的“硬通货”? 在嵌入式开发这个行当里,选型是个技术活,更是个经验活。你既要考虑当下的性能需求,又要掂量未来的扩展可能,还得平衡成本、功耗和开发周期。从业…...

记一次在双 RTX 3090 工作站上部署 vLLM 与 Qwen3.6-35B-AWQ 的实战记录

记一次在双 RTX 3090 工作站上部署 vLLM 与 Qwen3.6-35B-AWQ 的实战记录 1. 升级目的 最近需要本地部署大模型推理服务,目标是运行 Qwen3.6-35B 的 INT4 量化版本(AWQ 格式),并使用高性能推理引擎 vLLM 提供服务。由于模型采用 …...

Verilog时钟分频实战:从偶数、奇数到小数分频的设计与实现

1. 项目概述:从零开始掌握Verilog时钟分频 在数字电路和FPGA设计中,时钟信号是驱动整个系统同步运行的“心跳”。然而,一个系统往往需要多种不同频率的时钟来驱动不同的模块,比如高速的处理器核心和低速的外设接口。直接使用多个外…...

(最新版)GitGitHub实操图文详解教程(01)—Git的起源

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 在现代软件开发过程中,版本控制工具已经成为代码管理与团队协作的重要基础设施。随着软件项目规模不断扩大以及多人协作需求日益复杂,开发团队不仅需…...

改进极限学习机的电池健康状态估计(WOA-ELM)附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。 🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室 👇 关注我领取海量matlab电子书和数学建模资料 &…...

绿色AI能耗优化:从模型架构到MLOps实践

1. 绿色AI能耗研究的现实意义在深度学习模型参数量呈指数级增长的今天,AI系统的能源消耗已成为不可忽视的环境负担。根据最新研究,训练一个大型语言模型的碳排放量相当于五辆汽车整个生命周期的排放总量。这种惊人的能源消耗与全球减碳目标形成了尖锐矛盾…...

Arm Ethos-U NPU架构解析与性能优化实战

1. Arm Ethos-U NPU架构概述Arm Ethos-U系列神经网络处理器(NPU)是专为边缘计算和物联网设备设计的高效能AI加速器。作为Arm Cortex-M处理器的配套加速单元,它能够在极低功耗下提供强大的机器学习推理能力。Ethos-U采用高度优化的张量处理架构,支持8位、…...

容器镜像深度解析与生产级部署实战指南

1. 项目概述:从容器镜像名到高效部署实践的深度解析最近在梳理内部容器镜像仓库时,一个名为containers/ramalama的镜像引起了我的注意。这个名字乍一看有些无厘头,甚至带点戏谑,但在容器化部署的实践中,这类看似随意的…...

4.AI大模型-幻觉、记忆、参数-大模型底层运行机制

内容参考于:图灵AI大模型全栈 幻觉: 大模型的幻觉主要有两种,一种是回答的答案和问的问题不搭边,就是说回答的答案是乱编的,是没有真实性的,另一种是给了AI正确的资料,但是AI并没有根据我们给的…...

G-Helper终极指南:3分钟让你的华硕笔记本性能翻倍!

G-Helper终极指南:3分钟让你的华硕笔记本性能翻倍! 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zen…...

Spring Kafka监听多个Topic时,如何避免消费者‘摸鱼’?聊聊Range和RoundRobin分配策略的选择

Spring Kafka多Topic监听场景下消费者分配策略深度优化 1. 问题背景:当消费者开始"摸鱼" 在分布式消息系统中,Kafka凭借其高吞吐、低延迟的特性成为众多企业的首选。然而在实际开发中,不少团队遇到过这样的尴尬场景:明明…...

LeetCode102:二叉树层序遍历详解(附图解)

题目LeetCode102给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。输入:root [3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]Python解法代码示例(广…...

pgui:轻量级跨平台C++ GUI框架的设计与集成实践

1. 项目概述:一个轻量级、跨平台的现代GUI框架如果你是一名C开发者,并且厌倦了Qt的臃肿、MFC的古老,或者觉得Dear ImGui虽然强大但需要自己管理太多渲染细节,那么你很可能和我一样,一直在寻找一个“刚刚好”的GUI解决方…...

矩阵Zig-Zag遍历:对角线路径的优雅实现

矩阵Zig-Zag遍历:对角线路径的优雅实现 最近刷题遇到一个很有意思的矩阵遍历问题:如何以Zig-Zag(之字形)的方式打印一个二维矩阵? 什么是Zig-Zag遍历? 简单来说,就是从矩阵的左上角开始&#…...

Java——定时任务

定时任务1、Timer和TimerTask1.1、基本用法1.2、基本示例1.3、基本原理1.4、死循环1.5、异常任务1.6、总结2、ScheduledExecutorService2.1、基本用法2.2、基本示例2.3、基本原理在Java中,主要有两种方式实现定时任务: 使用java.util包中的Timer和Timer…...

555定时器深度解析:从RC电路到三种工作模式的原理与应用

1. 项目概述在电子设计的工具箱里,有那么几颗芯片,你几乎可以在任何时代的电路板上找到它们的身影。它们可能不是性能最强的,但一定是应用最广、最经久不衰的。今天要聊的555定时器,就是这样一个“活化石”级别的存在。自上世纪70…...

AI 越火,存储越关键:一颗存储藏着设备稳定运行的秘密

很多人看芯片,第一眼喜欢看“大件”。CPU、GPU、主控、屏幕、电池、无线模组,好像这些才是产品的主角。但真正做过硬件的人都知道:一个设备能不能稳定开机,程序能不能快速读取,系统能不能在复杂环境下长期跑得住&#…...

终极虚拟显示器解决方案:ParsecVDisplay完全指南

终极虚拟显示器解决方案:ParsecVDisplay完全指南 【免费下载链接】parsec-vdd ✨ Perfect virtual display for game streaming 项目地址: https://gitcode.com/gh_mirrors/pa/parsec-vdd ParsecVDisplay是一款基于Parsec虚拟显示驱动(VDD&#x…...

FTDI Friend:从USB转串口到AVR编程的嵌入式开发利器

1. 项目概述:为什么你需要一个FTDI Friend?在嵌入式开发和单片机玩家里,串口通信就像空气和水一样基础且不可或缺。无论是给Arduino上传代码,还是让树莓派和传感器模块“说上话”,亦或是调试一个自己焊的STM32最小系统…...

Harness 中的请求标识染色:端到端追踪

1. 标题选项(核心关键词:Harness、请求标识染色、端到端追踪、可观测性、CI/CD) 「Harness 可观测性实战:请求标识染色实现全链路端到端追踪」 「从0到1搞定Harness请求染色:让微服务调用链路+变更链路无所遁形」 「告别排查黑洞:Harness请求标识染色的端到端追踪落地指南…...

codex features

这份列表是 OpenAI Codex 内部的功能开关,每个功能都处于特定的开发阶段。下面按稳定程度对这些功能进行了分类说明。 🟢 稳定版 (Stable) - 可以放心使用 这些功能已经过充分测试,适合在日常工作流中启用。功能名称功能说明apps支持 AI 直接…...