关于OELD屏显示电池电量的简易方法
如何采集电源电压大家可能都熟悉,stm32的ADC+DMA能很方便迅速的帮我们采集到自己想要的电压数据。使用DMA进行数据搬运也能很好的减轻CPU的一部分压力。但是这样只是第一步——数据。
用户想看到的有时候并不是数据,他们想要更直观方便的看到自己设备的电量。这就要求我们能在显示屏上通过更直观的方法显示电量。(怎么样,下面这样够直观吧。)
这也是现在嵌入式设备中常用的方法,用一个小电池图标表示,不同的电量里面就是不同的填充度。这样可以很直观的看到设备的剩余电量。
其实说是电量,实际就是用采样来的电压除以总电压,得到一个百分比,然后根据这个百分比显示不同的电池模式,就可以实现不同电量的刷新。一开始看到有人用一个小框框,然后框框里面用一个百分数表示当前的电量百分比,但我觉得那种方法不是很好。还是电池的饱和度更直观一点。
关于stm32的ADC采集电源电压可以看我的上一篇博客,或者网上也有很多优秀的文章,这里暂且假设我们已经获取了电源电压了。而获取电源电压只是第一步,还需要对电源电压进行一下简单的均值滤波。这里我每次在DMA中断里面每30个数取一个平均,得到较为稳定的电源电压。
static void ADC_filter(void)
{
int sum = ;
u8 i = ;
for(i = ;i < N;i++)
{
sum+= AD_value[i];
}
after_filter = sum / N; //每一次调用这个函数after_filter就更新一次;
}
上面得到的实际上是ADC的16位原始数据,需要进一步处理成我们需要的实际电压值:
float ADC_cal_aveg(void)
{
float temp = ;
temp = (float)(after_filter) * (3.3 / );//计算电压
return temp;
}
这样就完成了第一阶段。后面就是利用OLED的显示操作把数字显示成更直观的电池图标。
我的OLED屏是128*64分辨率的,我想在右上角显示一个电池小图标,用PCtoLCD2002取模软件进行图片取模。我选取电池规格为8*16的像素,(我不会告诉你上面这些点都是我一点点点上去的。。)
然后在这个电池里面进行填充,每填充一格就取一次模,所以一共可以取14个模型出来,也就是说电池可以14级电量显示。
这是取出来的部分模型:
3.3V的电压用14级显示出来,那么每3.3/14 = 0.24V就可以刷新一次电池。
所以我就想了可以这样处理,就是把采集来的电压,先除以0.24,得数的整数部分就是他的级数,
3.3V / 0.24 = 13 级,也就是满电量。
2.8V / 0.24 = 11 级
这个级数正好可以被显示函数使用,显示函数就是根据不同的电量级数显示不同的电池模型的。
void OLED_Show_RealTime_Battery(u8 x,u8 y)
{
float ADC_Val = ;
unsigned int ADC_Int = ;
ADC_Val = ADC_cal_aveg();
ADC_Int = (int)(ADC_Val / 0.24); //这个0.24为 3.3/14 得来的数,就是每一级的步长,然后采样电压值除以步长就是级数
OLED_Show_Battery(x,y,ADC_Int); //上面的级数直接在这里面使用,配合电池模型顺序即可。
}
最后一个函数为OLED的显示函数,可以在屏上显示自己取出的字模。
最后吧这个函数放在主函数的while循环里,不断采样电池电压,不断根据电压刷新电池模型的显示。目前的问题就是不知道这个方法获得的电压是不是稳定。可能还是需要更精确的ADC滤波算法。
到此,就可以在显示屏上面显示不同的电池图标了
关于OELD屏显示电池电量的简易方法的更多相关文章
- QT5中全屏显示子窗口和取消全屏的方法
问题描述:用QT5做了个MDI多窗体应用程序,想把子窗体全屏显示,用网上的方法,但总是遇到问题. 网上的解决方法原文在这:http://www.cnblogs.com/Rick-w/archive/2 ...
- Android 全屏显示-隐藏Navigation Bar
Sumsung Galaxy Nexus 屏幕分辨率为 1280X 720,但通常的应用都会显示Navigation Bar(Back 键,Home 键等),如下图所示: 但我注意到Youtube应用 ...
- VMware Tools的简易安装---解决Ubuntu 14.10不能满屏显示问题
由于使用的VMware WorkStation是中文破解版,安装时又是简易安装,因此VMware Tools并没有安装上,导致Ubuntu 14.10在VMware中装上之后,并不能满屏显示,如图1所 ...
- 与众不同 windows phone (47) - 8.0 其它: 锁屏信息和锁屏背景, 电池状态, 多分辨率, 商店, 内置协议, 快速恢复
[源码下载] 与众不同 windows phone (47) - 8.0 其它: 锁屏信息和锁屏背景, 电池状态, 多分辨率, 商店, 内置协议, 快速恢复 作者:webabcd 介绍与众不同 win ...
- Android中获取电池电量
/** * * @author chrp * *显示当前电池电量 */ public class MainActivity extends Activity { private TextView tv ...
- RK3288 手动设置电池电量
参考:[RK3288][Android6.0] 调试笔记 --- 电池电量一直显示100% 系统版本:RK3288 android 5.1 (与参考的变量和宏有点区别) 设备没有电池,在进行Fota升 ...
- JavaScript:让浏览器全屏显示
并不是所有人都会按F11让浏览器全屏显示~~~ 一.直接上代码 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xh ...
- 在VC++6.0开发中实现全屏显示
全屏显示是一些应用软件程序必不可少的功能.比如在用VC++编辑工程源文件或编辑对话框等资源时,选择菜单“View\Full Screen”,即可进入全屏显示状态,按“Esc”键后会退出全屏显示状态. ...
- vim 分屏显示
我用vim打开一个文件后,想同时打开另一个文件,就像windows中打开两个记事本一样,因此需要分屏显示 首先用vim打开一个文件 vim file1 输入命令[Esc] :sp file2 分屏打开 ...
随机推荐
- Locust no-web 模式与参数详解
读前参考:<性能测试工具Locust > 熟悉 Apache ab 工具的同学都知道,它是没有界面的,通过命令行执行. Locust 同样也提供的命令行运行,好处就是更节省客户端资源. 命 ...
- 顶点/片元 shader 总结
Cg顶点程序必须在结构中传递顶点数据.几种常用的顶点结构定义在文件UnityCG.cginc中,有如下三种结构体: 1.appdata_base: 包含顶点位置,法线和一个纹理坐标.2.appdata ...
- Java自己动手写连接池二
读取数据库文件,来操作: package com.kama.cn; import java.sql.Connection;import java.sql.DriverManager;import ja ...
- Python网络编程篇之socket
1 socket 插座?呵呵,想多了,翻译过来意思是套接字! A network socket is an internal endpoint for sending or receiving dat ...
- golang 类型断言的学习
在php中有一个 serialize() 函数 可以把数组序列化成字符串进行存储和传输 如果想反序列化这种字符串,在php中只需要一个简单的unserialize() 函数就可以完成了.但是在gola ...
- 迭代器中next()的用法
>>> g = (x ** 2 for x in range(10)) >>> next(g) 0 >>> next(g) 1 >>& ...
- iframe兄弟间和iframe父子间的值传递问题
在网上查了资料.iframe的参数传递问题.有很多答案都是不可行的.现在将收集的资料整理一下.已经验证通过.以下如有问题请及时指正. 1. iframe兄弟之间值传递 举例说明:index页面中有两个 ...
- 软件161A 张慧敏
一.PTA实验作业 题目1:7-11 单向链表3:编程实现:输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:输入一个正整数 n(0<n< ...
- 12、ABPZero系列教程之拼多多卖家工具 拼团提醒功能登录拼多多实现
上篇文章已经完成了整个拼多多拼团提醒功能,本篇继续完成拼多多帐号登录,拼多多帐号登录的目的是为了获取拼团商品的SKU和订单号,便于商家备货. 以下是拼多多官方的后台登录,要实现的功能并不是直接在这里登 ...
- flexbox 弹性盒子
flexbox 弹性盒子 1.基本知识 container(容器)属性 flex-direction: row | row-reverse | column | column-reverse 属性决定 ...