最好的电子音响科技diy制作网站

haoDIY_音响电子电脑科技DIY小制作发明

当前位置: 主页 > 电脑DIY > 电脑DIY >

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

时间:2017-07-30 21:38来源:数码之家 作者:2545889167 点击:
18b20倒是好,网上成熟的程序一大堆,弄一个来简单调试下就可以了。 为了防止没焊18b20而造成程序异常,在上电的时候,会先检测18b20是否存在,如果不存在,则以后读取温度都是取ds3231内部的温度为准,虽然精度不
开篇先放效果图
HPDL1414 精致桌面小伴侣 显示时间日历和电脑状态(CPU温度负载,内存占用和网速)
HPDL1414 精致桌面小伴侣 显示时间日历和电脑状态(CPU温度负载,内存占用和网速)
视频

看不了的亲,优酷地址:http://v.youku.com/v_show/id_XMTY5Mjk0MDkyNA

----------------------分割线-----------------
之前看了坛友的帖子,HPDL1414外接屏幕显示电脑状态(温度/使用量)USB外接显示外设|http://bbs.mydigit.cn/read.php?tid=1716073
感觉惠普的这个米字数码管挺漂亮的,可以弄个精致的小东西,然后也去买了几个。
数码管局部特写
HPDL1414 精致桌面小伴侣 显示时间日历和电脑状态(CPU温度负载,内存占用和网速)
个人感觉嘛原作者的那个板子,太大太长了,而且边框有点大,做成两层还要加拼板费。usb口和按键的位置也有点缺乏人性
于是测量计算后,初步决定,弄成三个管子紧凑排列,板子长宽可以控制在5*2.5cm内,也方便拼板什么的。
然后就开始选设计方案,stc的话,感觉有点贵了;然后就看上了一元pos机上的stm32或者gd32,虽然有点杀鸡用牛刀,但是毕竟带usb,空间足够,可以省一个usb-ttl的芯片但是一比划,发现64脚的芯片不能放在数码管的两排排之间,只能放弃;后面看上了esp8266,如果选用esp12e模块的话,引脚上加片74hc595弄数码管,差不多够用了,一比划,发现比stm32更宽,心碎,也是放不下。最后转了一圈只好选stm8+ch340的方案,stm8好就是性价比,秒天秒地的,而且之前一直想学stm8却弄了最小系统放那没动过,那就算是变学着弄stm8边做这货吧,新媳妇上轿了。
因为io占的比较多,发现stm8s003f3有点不够了,那就弄成stm8s003k3,32脚芯片就够玩了。因为003只有8k容量,怕以后不够了,在pcb上就兼容stm8s005吧,16k容量够hi了吧,其实就是加两个电源脚罢了,选焊即可(不过这样说来,io就有少两个了,坑爹st)
主控选好了,其他方面,时钟肯定选ds3231了,温度也是弄个达拉斯的ds18b20好了,毕竟dht11或者22又贵又占空间湿度测出来也不怎么准。
兼顾下物联网思路,那就弄个esp8266吧,至少可以弄联网对时什么的,作为选配部件,就搞esp01模块好了,留好排针位插上去就好。
剩下的,数数也没几个io了,加几个按键,最后剩一个脚,调整下,看到stm8有个beep功能,好新鲜,没玩过,就留个蜂鸣器吧。
好吧,弄这么多,io瓜分完了,然后就弄原理图咯。
HPDL1414 精致桌面小伴侣 显示时间日历和电脑状态(CPU温度负载,内存占用和网速)
接着pcb,这么小的面积,塞这么多东西进去,也是蛮为难的,真的有点紧了,上铜柱的固定孔都弄的很紧张
HPDL1414 精致桌面小伴侣 显示时间日历和电脑状态(CPU温度负载,内存占用和网速)
然后,就拿给板厂了呗,然后手残了,没选颜色就默认了,然后弄的手一看傻眼了,绿油,哎
当然好像绿油也配数码管的底色也还勉强能行
HPDL1414 精致桌面小伴侣 显示时间日历和电脑状态(CPU温度负载,内存占用和网速)
不过嘛,后来又选了黑油,结果板厂又吧走线弄断了,pcb厂家还在给重新补做中,实在等不及,自己拿坏板处理一下先弄着了,就是有点有损pcb完整性。
哎,命途多舛
焊接好但是还没有插数码管的图,建议在焊接排座前就把铜柱给装上,因为空间紧凑,焊了就不好装的
同时装铜柱也要稍微注意一下,不要碰到周围的电路什么的
数码管下有ams117,ch340和stm8,我这里用了排座,是为了方便拆卸调试的,实际上可以直接将管子焊在pcb上,整个东西就更薄了
HPDL1414 精致桌面小伴侣 显示时间日历和电脑状态(CPU温度负载,内存占用和网速)
背面有ds3231,ds18b20,esp8266模块的插座,按键,蜂鸣器焊盘,晶振和usb座
HPDL1414 精致桌面小伴侣 显示时间日历和电脑状态(CPU温度负载,内存占用和网速)
关于3231的备用电池,在板子上放电池座肯定不现实是了,所以只能在正反两面各方了一个电池的焊盘,可以用线引出来接3v电池。
因为我实在没有轻薄的电池了,所以暂时用这种代替一下,等以后有好的电池再换。同时,如果电池足够小,可以把它放在板子正面,也就是数码管下面,这样就美观很多了
HPDL1414 精致桌面小伴侣 显示时间日历和电脑状态(CPU温度负载,内存占用和网速)
如果插上esp8266模块,是这样子的
HPDL1414 精致桌面小伴侣 显示时间日历和电脑状态(CPU温度负载,内存占用和网速)
加了铜柱,立起来看看,还不错
HPDL1414 精致桌面小伴侣 显示时间日历和电脑状态(CPU温度负载,内存占用和网速)
HPDL1414 精致桌面小伴侣 显示时间日历和电脑状态(CPU温度负载,内存占用和网速)
侧视图(带wifi模块)
HPDL1414 精致桌面小伴侣 显示时间日历和电脑状态(CPU温度负载,内存占用和网速)
另一面侧视,usb口
HPDL1414 精致桌面小伴侣 显示时间日历和电脑状态(CPU温度负载,内存占用和网速)
然后第一次点亮,先显示点简单的把
HPDL1414 精致桌面小伴侣 显示时间日历和电脑状态(CPU温度负载,内存占用和网速)
长度尺寸
HPDL1414 精致桌面小伴侣 显示时间日历和电脑状态(CPU温度负载,内存占用和网速)

然后,后面就开始苦逼的编程了
首先先感谢帮忙弄上位机的小伙伴:gavinfree
同时也非常感谢他能给大家开源上位机
编程就是按着上位机发来的数据,接收,储存再显示罢了,也到不难,就是第一次用stm8,踩了好多坑啊
上位机介绍,欢迎围观:配合HPDL1414桌面伴侣使用的上位机程序|http://bbs.mydigit.cn/read.php?tid=1785154

话说啊,这个数码管的,驱动挺简单的,而且可以锁存,不用像普通数码管一样需要扫描,这真是极好的。
驱动时序很简单,就不细说了,几分钟就能点亮

麻烦的主要还是数据接收和显示设计,比较繁琐
首先是商定的串口协议,一秒钟发一次数据包,每次数据包的包头是$,包尾是&,中间发送最多7种数据
每种数据分别以a-g标识,代码cpu占有率,温度,内存总量,余量,内存占用率,网速
每个小数据之后则加@表示结束,数据不带单位字符和符号,但是数据长度不确定,可变
如果在上位机上选择了发送时间(也就是对时),则那一秒不发送电脑状态,而是发生日期和时间,年月日时分秒星期,数据头是h,中间无分割但是长度固定,自动补零
说这么多,是不是感觉,头都大了,其实,这些数据,用Bus Hound可以直接就看懂了,也没有想象中的那么复杂。


所以说啊,其实我弄这东西,最费劲的就是在解析协议上,数据长度不固定这点真的有点神坑啊,变来变去的有点烦。
这里贴一下数据解析的部分程序,写点不是很好,又长又丑,也求大神指正
ps:各种指针弄来弄去的真是扯的蛋疼啊
复制代码
  1. void get_dat_32asc2hex(uint8_t *dat_adr,uint32_t *hex_dat,uint8_t *i)
  2. {
  3.   uint8_t j=0;
  4.   *hex_dat=0;
  5.   for(j=1;j<8;j++)
  6.   {
  7.     (*hex_dat)*=10;*hex_dat+=dat_adr[*i+j]-'0';
  8.     if(dat_adr[*i+j+1]=='@'){*i+=j; break;}  
  9.   }
  10. }
  11.  
  12. void get_dat_8asc2hex(uint8_t *dat_adr,uint8_t *hex_dat,uint8_t *i)
  13. {
  14.     if(dat_adr[*i+2]=='@'){*hex_dat=dat_adr[*i+1]-'0';*i+=1; return;}
  15.     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;}
  16.     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;}
  17. }
  18. void get_2bit_dat_asc2hex(uint8_t *dat_adr,uint8_t *hex_dat,uint8_t *i)
  19. {
  20. *hex_dat=dat_adr[*i+1]-'0';
  21. *hex_dat*=10;
  22. *hex_dat+=dat_adr[*i+2]-'0';
  23. *i+=2;
  24. }
  25.  
  26.  
  27. void data_analysis(void)
  28. {
  29.     uint8_t i;
  30.  
  31.     dat_value = 0;
  32.     for(i = 0; i < ubUart1RxDat; i++)
  33.     {
  34.         if(ubUart1RxBuf[i] == '&')goto end;
  35.         if(ubUart1RxBuf[i] == '$' || ubUart1RxBuf[i] == '@')
  36.         {
  37.             i++;
  38.             switch(ubUart1RxBuf[i])
  39.             {
  40.             case 'A':
  41.             {
  42.                 dat_value = dat_value | 0x01;
  43.                 get_dat_8asc2hex(ubUart1RxBuf, &CO_Adat, &i);
  44.                 break;
  45.             }
  46.             case 'H':
  47.             {
  48.               dat_value = dat_value | 0x80;
  49.               get_2bit_dat_asc2hex(ubUart1RxBuf,&TIMEYY_Hdat,&i);
  50.               get_2bit_dat_asc2hex(ubUart1RxBuf,&TIMEMM_Hdat,&i);
  51.               get_2bit_dat_asc2hex(ubUart1RxBuf,&TIMEDD_Hdat,&i);
  52.               get_2bit_dat_asc2hex(ubUart1RxBuf,&TIMEH_Hdat,&i);
  53.               get_2bit_dat_asc2hex(ubUart1RxBuf,&TIMEM_Hdat,&i);
  54.               get_2bit_dat_asc2hex(ubUart1RxBuf,&TIMES_Hdat,&i);
  55.               TIMEW_Hdat=ubUart1RxBuf[i+1];
  56.               if(TIMEW_Hdat==0)TIMEW_Hdat=7;
  57.               ModifyTime(TIMEYY_Hdat,TIMEMM_Hdat,TIMEDD_Hdat,TIMEH_Hdat,TIMEM_Hdat,TIMES_Hdat,TIMEW_Hdat);
  58.                 break;
  59.             }
  60.             case 'B':
  61.             {
  62.                 dat_value = dat_value | 0x02;
  63.                 get_dat_8asc2hex(ubUart1RxBuf, &CT_Bdat, &i);
  64.                 break;
  65.             }
  66.             case 'C':
  67.             {
  68.               dat_value = dat_value | 0x04;
  69.                 get_dat_32asc2hex(ubUart1RxBuf, &TM_Cdat, &i);
  70.                 break;
  71.             }
  72.             case 'D':
  73.             {
  74.                 dat_value = dat_value | 0x08;
  75.                 get_dat_32asc2hex(ubUart1RxBuf, &AM_Ddat, &i);
  76.                 break;
  77.             }
  78.             case 'E':
  79.             {
  80.                 dat_value = dat_value | 0x10;
  81.                 get_dat_8asc2hex(ubUart1RxBuf, &MO_Edat, &i);
  82.                 break;
  83.             }
  84.             case 'F':
  85.             {
  86.                 dat_value = dat_value | 0x20;
  87.                 get_dat_32asc2hex(ubUart1RxBuf, &DS_Fdat, &i);
  88.                 break;
  89.             }
  90.             case 'G':
  91.             {
  92.                 dat_value = dat_value | 0x40;
  93.                 get_dat_32asc2hex(ubUart1RxBuf, &US_Gdat, &i);
  94.                 break;
  95.             }
  96.             }
  97.         }
  98.     }
  99. end:
  100.     ;
  101. }

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


传感器方面,主要就是读取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)
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
相关文章
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
推荐内容