资讯详情

HPDL1414 精致桌面小伴侣 显示时间日历和电脑状态(CPU温度负载

效果图先开始

图片:IMG_20160820_171321.jpg

图片:IMG_20160820_171317.jpg

视频

优酷地址:http://v.youku.com/v_show/id_XMTY5Mjk0MDkyNA

----------------------分割线-----------------

之前看了坛友的帖子,HPDL1414外部屏幕显示计算机状态(温度/用量)USB外接显示外设|http://bbs.mydigit.cn/read.php?tid=1716073

感觉惠普的这个米字数码管挺漂亮的,可以弄个精致的小东西,然后也去买了几个。

局部特写数字管

b423aca8600642a34bac4247c5ba76cb.png

图片:45.jpg

就我个人而言,我觉得原作者的板子太大太长,边框有点大拼板费。usb口和键的位置也有点缺乏人性

因此,经过测量和计算,初步决定将三根管道排列紧凑,板的长度和宽度可控制在5*2.5cm也方便拼板什么的。

然后开始选择设计方案,stc感觉有点贵;然后我看上了一元pos机上的stm32或者gd32.虽然用牛刀杀鸡,但毕竟是带的usb,足够的空间可以节省一个usb-ttl但是一个比划,发现64脚的芯片不能放在数字管的两排之间,只能放弃;后面看esp8266,如果选用esp12e模块的话,引脚上加片74hc595弄数码管,差不多够了,一个比划,发现比较stm32更宽,心碎,也放不下。最后转了一圈,不得不选择stm8 ch340的方案,stm8好是性价比,秒天秒地,以前一直想学stm但是8得到了最小系统,没有动过,即使是变学了stm八边做这个货,新媳妇上轿。

因为io多占,发现stm8s003f3有点不够,那就做成了。stm8s003k3.32脚芯片就够玩了。因为003只有8个k容量,怕以后不够,在pcb上就兼容stm8s005吧,16k容量够hi嗯,其实只是加两个电源脚,可以选择焊接(但这样说,io就有少两个了,坑爹st)

选择主控,其他方面,必须选择时钟ds3231,温度也是达拉斯ds18b20好了,毕竟dht11或22又贵又占空间湿度测量不准确。

兼顾物联网的思路,那就弄个吧esp8266吧,至少可以得到互联网对时什么的,作为选配部件,esp01模块好了,留好排针插上去就好了。

剩下的数量很少io加几个按钮,最后剩下一只脚,调整,看stm8有个beep功能,好新鲜,没玩过,留个蜂鸣器吧。

嗯,这么多,io瓜分后,然后得到原理图。

图片:5654.JPG

接着pcb,这么小的区域,塞这么多东西,也很尴尬,真的有点紧,铜柱的固定孔很紧

图片:546.JPG

然后,拿给板厂,然后手残了,默认没有选择颜色。然后手看起来很傻,绿色,啊

当然,似乎绿油也配备了数码管的底色,勉强可行

图片:4555.JPG

然而,后来选择了黑油,板厂又断了线,pcb厂家还在重做,真的等不及了。先拿坏板处理,有点损坏pcb完整性。

啊,命运多舛

焊接良好但未插入数字管图,建议在焊接排座前安装铜柱,由于空间紧凑,焊接不易安装

同时,安装铜柱时安装,不要碰周围的电路什么的

数码管下有ams117,ch340和stm8.我在这里拆卸和调试,我在这里使用排座。事实上,我可以直接焊接管道pcb上面,整个东西会更薄。

图片:IMG_20160807_205402.jpg

背面有ds3231,ds18b20,esp8266模块的插座,按键,蜂鸣器焊盘,晶振和usb座

图片:IMG_20160807_205413.jpg

至于3231的备用电池,把电池座放在板上肯定是不现实的,所以电池的焊盘只能在前后两侧放一个,可以用线拉出来接3v电池。

因为我真的没有轻电池,所以我暂时用它代替它,然后在将来有一个好电池时更换它。同时,如果电池足够小,你可以把它放在板的前面,即数字管下面,这样它就会更漂亮

图片:IMG_20160820_171100.jpg

如果插上esp8266模块是这样的

图片:IMG_20160820_171044.jpg

加铜柱,站起来看看,还不错

图片:IMG_20160807_205423.jpg

图片:IMG_20160807_210347.jpg

侧视图(带wifi模块)

图片:IMG_20160820_171018.jpg

另一边侧视,usb口

图片:IMG_20160820_171009.jpg

然后第一次点亮,先简单显示点

图片:IMG_20160807_210619.jpg

长度尺寸

图片:IMG_20160820_204016.jpg

然后,编程开始被迫在后面编程。

首先,感谢帮弄上位机的朋友:gavinfree

同时,我也非常感谢他能为你开源上位机

编程只是根据上位机发送的数据进行接收、存储和显示,这并不难。这是第一次使用stm8.踩了很多坑

欢迎观看上位机介绍:配合HPDL1414桌面伴侣使用的上位机程序|http://bbs.mydigit.cn/read.php?tid=1785154

话说啊,这个数码管的,驱动挺简单的,而且可以存,不用像普通数码管一样需要扫描,这真是极好的。

驱动时间很简单,就不细说了,几分钟就能点亮

麻烦主要是数据接收和显示设计,比较麻烦

首先是约定的串口协议,每秒发送一次数据包,每次数据包的包头是$,包尾是&,中间最多发送7个数据

每个数据分别以a-g标识,代码cpu占有率、温度、内存总量、余量、内存占用率、网速

添加每个小数据@数据没有单位字符和符号,但数据长度不确定,可变

如果在上位机上选择发送时间(即对时),那一秒不会发送计算机状态,而是发生日期和时间,数据头是h,中间没有分割,但长度固定,自动补零

说了这么多,你觉得头很大吗?事实上,使用这些数据Bus Hound可以直接理解,没有想象的那么复杂。

所以,其实我做这件事最难的就是在分析协议上,数据长度不固定真的有点神坑,变得有点烦。

这里贴一些数据分析程序,写得不是很好,又长又丑,也请大神指正

ps:各种指针弄来弄去真是扯蛋疼啊

复制代码

void get_dat_32asc2hex(uint8_t *dat_adr,uint32_t *hex_dat,uint8_t *i)

{

uint8_t j=0;

*hex_dat=0;

for(j=1;j<8;j )

{

(*hex_dat)*=10;*hex_dat =dat_adr[*i j]-'0';

if(dat_adr[*i j 1]=='@'){*i =j; break;}

}

}

void get_dat_8asc2hex(uint8_t *dat_adr,uint8_t *hex_dat,uint8_t *i)

{

if(dat_adr[*i 2]=='@'){*hex_dat=dat_adr[*i 1]-'0';*i =1; return;}

if(dat_adr[*i 3]=='@'){*hex_dat=dat_adr[*i 1]-'0';*hex_dat*=10;*hex_dat =dat_adr[*i 2]-'0';*i =2; return;}

if(dat_adr[*i 4]=='@'){*hex_dat=dat_adr[*i 1]-'0';*hex_dat*=10;*hex_dat =dat_adr[*i 2]-'0';*hex_dat*=10;CO_Adat =dat_adr[*i 3]-'0';*i =3; return;}

}

void get_2bit_dat_asc2hex(uint8_t *dat_adr,uint8_t *hex_da,uint8_t *i)

{

*hex_dat=dat_adr[*i+1]-'0';

*hex_dat*=10;

*hex_dat+=dat_adr[*i+2]-'0';

*i+=2;

}

void data_analysis(void)

{

uint8_t i;

dat_value = 0;

for(i = 0; i < ubUart1RxDat; i++)

{

if(ubUart1RxBuf[i] == '&')goto end;

if(ubUart1RxBuf[i] == '$' || ubUart1RxBuf[i] == '@')

{

i++;

switch(ubUart1RxBuf[i])

{

case 'A':

{

dat_value = dat_value | 0x01;

get_dat_8asc2hex(ubUart1RxBuf, &CO_Adat, &i);

break;

}

case 'H':

{

dat_value = dat_value | 0x80;

get_2bit_dat_asc2hex(ubUart1RxBuf,&TIMEYY_Hdat,&i);

get_2bit_dat_asc2hex(ubUart1RxBuf,&TIMEMM_Hdat,&i);

get_2bit_dat_asc2hex(ubUart1RxBuf,&TIMEDD_Hdat,&i);

get_2bit_dat_asc2hex(ubUart1RxBuf,&TIMEH_Hdat,&i);

get_2bit_dat_asc2hex(ubUart1RxBuf,&TIMEM_Hdat,&i);

get_2bit_dat_asc2hex(ubUart1RxBuf,&TIMES_Hdat,&i);

TIMEW_Hdat=ubUart1RxBuf[i+1];

if(TIMEW_Hdat==0)TIMEW_Hdat=7;

ModifyTime(TIMEYY_Hdat,TIMEMM_Hdat,TIMEDD_Hdat,TIMEH_Hdat,TIMEM_Hdat,TIMES_Hdat,TIMEW_Hdat);

break;

}

case 'B':

{

dat_value = dat_value | 0x02;

get_dat_8asc2hex(ubUart1RxBuf, &CT_Bdat, &i);

break;

}

case 'C':

{

dat_value = dat_value | 0x04;

get_dat_32asc2hex(ubUart1RxBuf, &TM_Cdat, &i);

break;

}

case 'D':

{

dat_value = dat_value | 0x08;

get_dat_32asc2hex(ubUart1RxBuf, &AM_Ddat, &i);

break;

}

case 'E':

{

dat_value = dat_value | 0x10;

get_dat_8asc2hex(ubUart1RxBuf, &MO_Edat, &i);

break;

}

case 'F':

{

dat_value = dat_value | 0x20;

get_dat_32asc2hex(ubUart1RxBuf, &DS_Fdat, &i);

break;

}

case 'G':

{

dat_value = dat_value | 0x40;

get_dat_32asc2hex(ubUart1RxBuf, &US_Gdat, &i);

break;

}

}

}

}

end:

;

}

这只是一堆文件中的一段代码,完整的代码和工程见楼下的资料内

传感器方面,主要就是读取ds3231和ds18b20了。#p#分页标题#e#

18b20倒是好,网上成熟的程序一大堆,弄一个来简单调试下就可以了。

为了防止没焊18b20而造成程序异常,在上电的时候,会先检测18b20是否存在,如果不存在,则以后读取温度都是取ds3231内部的温度为准,虽然精度不行一点,但是也还勉强能用。

关于ds3231,就让我任性一点吧,既然stm8有硬件iic,(stc没有也没玩过硬件的),但是大部分人都在骂说意法的IIC简直就是败笔,stm8和32的iic,都是难用到爆,所以,网上的IIC例程,基本都是软件模拟。最后弄了风驰的历程,又结合其他的经验改了下,终于调通了,哈哈。(调不通的感觉大部分情况都是卡在哪个while过不去)

iic通了以后,后面ds3231的驱动内容,就是从之前自己在51上弄的移植过来了。不过提醒一点,温度数据不是bcd码而是直接的hex,直接用就好了。

关于蜂鸣器,暂时没想好用来干啥,感觉弄闹钟也不怎么现实,所以,目前程序里,对应的是直接将蜂鸣器换成led(三极管保持原样),然后接到上位机的数据后会自动反转灯的电平,也算个装饰吧。

至于esp8266,那算是远期打算,目前只预留接口,目前精力和芯片程序空间暂时还是有限的

剩余不到1k的空间,估计弄个软件模拟串口就没有了,不过也倒是可以把远程获取时间的程序烧录到esp8266上,到时候仅串口直接传输有效数据即可。

还有一点要提,目前的程序里,如果数据前面有0,是自动隐藏的,当然如果有人喜欢那种数据前面的0吧显示位塞满的玩法,也是可以的

只要在"HPDL1414.h"文件下解除那个define的屏蔽然后重新编译下载就可以了

然后就开始展示显示效果了

首先,上位机可以选择要显示的内容,但是时间,日期和星期是不可关闭的,就是不开上位机,只供电也会显示

时间

日期

星期(sat,星期六,昨天拍的,今天是sun)和环境温度

cpu占用率和温度

上位机关闭了一个数据,所以只显示了一个数据,如果cpu的两个数据都关闭,则不显示cpu页面了

内存,余量和总量

内存占用率

不同的网速显示模式,只要在上位机处设置,程序可自动调整显示,自动变换单位

ps:这是真实网速,我真的不是在秀网速,表打我

仅显示下载

[ 此帖被2545889167在2016-08-23 17:18重新编辑 ]

关于上位机设置和使用

看帖子:配合HPDL1414桌面伴侣使用的上位机程序|http://bbs.mydigit.cn/read.php?tid=1785154

或者围观下面的视频

关于时间设置

在上位机正常运行的过程中,点击更新时间,会读取系统时间,并发送,收到后,会自动更新ds3231中的数据,算是对时成功

如果在系统中开始自动对时,那时间是蛮准的

关于显示循环

如果有上位机且设置完整数据流:循环显示:时间3s,日期1s,星期温度1s,cpu 1s,ram 2s,net 1s

无上位机:循环显示:时间3s,日期1s,星期温度1s

关于指示灯,目前没有使用蜂鸣器

所以在蜂鸣器焊盘那里可以加led

该led指示灯的效果是在有数据传输过来且符合协议的话,进行一次翻转。锁定状态会快闪

关于tim4:

程序使用定时器4 time4作为整个运行的系统时钟

设定1ms中断一次,中断服务函数会对各个参数进行加减处理

关于ds3231:

使用硬件iic通讯,初始化是会开启1hz方波输出,输出脚接io设置为下降沿中断

关于中断优先级:

实验是发现如果不调整优先级,则会出现严重的数据丢包。原因是io的中断的入口排在串口接收中断之前,遂调整串口接收中断为优先级2,gpioc中断为优先级1

关于按键使用

按键分左键(key1)和右键(key2)

1、短按左键,从任意屏幕立刻跳转到显示时间,并持续显示5s后,继续循环

2、长按左键,从任意屏幕立刻跳转到显示时间,锁定显示时间,直到再次短按左键或按右键解锁。

3、按右键,锁定当前屏幕,直到再次短按左键或按右键解锁。

4、屏幕锁定后,按左右键均可解锁;左键短按按下后解锁到显示时间界面,显示5s再恢复正常循环;右键按下后,立刻解锁并显示下一屏。

5、屏幕如果锁定在电脑状态界面,指示灯会快闪,如果锁定在时间 日期 星期界面,指示灯正常

6、屏幕如果锁定在电脑状态界面,若5秒内数据未更新或者上位机断开,自动解除锁定,进入循环

第三颗(key3)按键暂时没用,没想到该用来干嘛

后期:上位机下位机的程序是开源的,欢迎大家交流,如果有感兴趣的坛友,也欢迎来给这玩意增加一些功能

以后的方向:增加更多的电脑状态显示,如gpu状态等

增加蜂鸣器

增加使用sep8266

这楼剩下的空间就放一些效果图吧

就不详细介绍了

(责任编辑:admin)

标签: 传感器翻转插座

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台