标签存档: OLED

做个基于STM32+QMK的茶轴机械数字小键盘,带编码器和OLED屏幕~

之前为了验证 STM32F103 作为键盘 QMK 固件的主控是否可行,顺便学习一下 QMK 固件的配置和开发,做了个带编码器和 OLED 屏幕的数字小键盘。不过因为一直没搞定在 OLED 上显示动画,就一直没发。

周末花了点时间学习了一下终于把在 QMK 里面显示动画搞定了。

对于在 QMK 固件中怎么使用 STM32F103 当主控,可以看之前的文章:整个带屏数字小键盘吧,先搞定 QMK 固件支持 STM32F103 的 I2C Remap

成品效果

为了充分得用嘉立创免费打样券,PCB 的尺寸直接拉满到 10cm * 10cm 了,刚刚好够数字小键盘 + 2 个 EC11 编码器 + 1 个 12832 OLED 屏幕。

stm32-qmk-numpad-1

原理图设计

USB Type-C 连接及电源

这个数字小键盘用了 …

阅读全文 »

DIY USB 电流表(8):检测按键和绘制功率曲线

在前一篇 《DIY USB 电流表(7):读取和显示 INA219 电流电压数据》 中,我们已经基本完成了这个 DIY USB 电流表的核心功能开发,已经可以在屏幕上显示当前电源输入电压、负载的电流、功率以及累计电量等数据,如果不需要更多功能,已经可以结项了 😃。

但是如果想拿这个 USB 电流表在一些分析场景使用,那么还需要再增加一些功能,例如,是否可以通过这个 USB 电流表来记录给手机充电时的功率曲线,这样可以知道手机的快充是什么样的节奏来完成充电的。

这次我们就来完成这个功能,记录负载的功率历史,并绘制成曲线来显示功率趋势。

PS. 我也还是一个初学者,如果文章中有一些错误或不足,还请多多指教。

准备工作

在开始绘制功率曲线之前,同样有一些准备工作需要进行,例如在多了一个功率曲线页面之后,原来的电压数据页面怎么办,怎么切换多个页面?

在最早的功能设计中,我们已经给这个 DIY USB 电流表添加了两个按键,现在就可以通过这两个按键来完成页面切换操作了。

按键检测

按键原理图

在原理图中可以看到,两个按键已经接到 CH32V003 的 PD2、PD3 引脚,在初始化代码中,加上初始化两个引脚为输入模式。

diy-usb-meter-8-1
diy-usb-meter-8-2

按键状态结构体

为了维护按键的状态,我们先定义一个结构体来维护状态。在 ButtonState 结构体中,定义了一个 ts 字段,这个用来记录按键状态变化时的时间戳,这样可以在状态变化时,例如从低电平变化为高电平时,计算出来按键按下去的持续时间,如果超过 3000 毫秒,就认为是长按事件。

#pragma once

#include "drivers/clock.h"
#include "drivers/gpio.h"

#define BTN_LEFT    0
#define 


阅读全文 »

DIY USB 电流表(7):读取和显示 INA219 电流电压数据

在前一篇 《DIY USB 电流表(6):点个屏,使用 I2C 驱动 0.96 寸 OLED》 中,我们已经完成了屏幕显示驱动的开发,并且根据需求,列出了需要展示的数据项,确定了一下最终显示内容的布局。

在之前,显示的内容都是占位的测试数据,在这一节,就可以开始真正去读取 INA219 传感器的数据,将电路中测量的电压、电流等数据显示在屏幕上,这又是一节枯燥的编码工作 🙈。

PS. 我也还是一个初学者,如果文章中有一些错误或不足,还请多多指教。

准备工作

在开始读取 INA219 的数据之前,同样也要准备一些相关的库,例如 INA219 数据的读取、参数的配置,以及在 CH32V003-GameConsole 中所使用的 I2C 封装并未提供读取 I2C 数据方法,另外,为了计算 USB 电流表运行时间内消耗的电量,也需要有相关的计时方法。

I2C 读取方法

在 CH32V003-GameConsole 的代码中,已经有了 i2c_tx.h,提供了 I2C 写入相关的方法,对于一个游戏机来说,拥有写入方法就足够了,它只需要用 I2C 来刷新屏幕,但是在我们的 USB 电流表项目中,还需要使用 I2C 去读取 INA219 的数据,因此需要去封装一个 I2C 读取方法。

在开始编写 …

阅读全文 »

DIY USB 电流表(6):点个屏,使用 I2C 驱动 0.96 寸 OLED

在前一篇 《DIY USB 电流表(5):使用 VSCode + PlatformIO 搭建固件开发环境》 中,我们已经完成了开发 USB 电流表固件的开发环境搭建,整个开发环境基于 Visual Studio Code + PlatformIO 来完成,并且跑通了一个基本的 Demo,验证了开发环境。

固件开发的第一步,我们先将最终输出数据的显示设备,0.96 寸 OLED 屏幕给点亮,这样在后续开发过程中,也可以通过屏幕来显示一个调试数据信息。

PS. 我也还是一个初学者,如果文章中有一些错误或不足,还请多多指教。

准备工作

在开始开发之前,我们需要做一些准备工作,使用 PlatformIO 创建项目并不包含很多使用示例,例如如何使用 GPIO,如何使用 I2C 总线等,并且使用 platform-ch32v 时,它的函数定义与官方示例也不太相同,因此我们需要找一个类似的开源项目作为参考,从而可以更快速地完成 USB 电流表的固件开发。

参考项目 CH32V003-GameConsole

项目地址:https://github.com/wagiminator/CH32V003-GameConsole

diy-usb-meter-6-1

我就从 CH32V003-GameConsole 这个项目了解到 CH32V003 这款 MCU,并且开始尝试使用的,刚好这个项目本身包含了 0.96 寸 OLED 屏幕的驱动以及 GPIO、ADC …

阅读全文 »

DIY USB 电流表(1):元件选型和原理图绘制

USB 电流表在电子 DIY 中还是比较常用的,可以用它来观察目标设备的实时电流、电压以及功耗。

作为电子 DIY 爱好者,做一个自己的 USB 电流表也是一件顺理成章的事。这里把之前已经开源的一个 USB 电流表的原理图来添加一些详细说明,对于初学者来说可以大概搞明白一个简单设备的原理图该怎么画。

当然我也还是一个初学者,如果文章中有一些错误或不足,还请多多指教。

USB 电流表成品效果

电压、电流、功率、容量界面

ui-1

功率历史图表界面

ui-2

需求分析和元件选型

在最开始搞一个入门 DIY 的产品,还是不要搞太复杂,尽量从简单的开始,先确定一下需求范围,降低整体开发难度,一方面减少原理图绘制之类的工作量,另外一方面,也可以增加成功率,防止半路弃坑 🤣。

需求分析

作为一个 USB 电流表,主要功能就是电流、电压等指标的采集,以及作为现在已经普及度非常高的 USB Type-C 接口和 USB PD 充电都需要支持一下,然后再通过屏幕展示出来采集的数据就可以了。

因此根据需求大概确定以下功能点:

  • USB Type-C 输入与输出
  • PD 协议透传
  • 支持 5~20V 电压检测
  • 支持 0~5A 电流检测
  • 支持功率计算、容量统计
  • 支持功率历史图表显示
  • 支持统计数据记录与清除
  • 按键切换电压电流数据与功率历史图表
  • 使用 12864 OLED


阅读全文 »