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

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

当前位置: 主页 > 最新DIY >

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

时间:2017-07-30 21:38来源:数码之家 作者:2545889167 点击:
开篇先放效果图视频http://player.youku.com/player.php/sid/XMTY5Mjk0MDkyNA==/v.swf看不了的亲,优酷地址:http://v.youku.com/v_show/id_XMTY5Mjk0MDkyNA----------------------分割线-----------------之前看了坛友的帖子,HPDL1414外接屏幕显示电脑状态(
开篇先放效果图
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

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

所以说啊,其实我弄这东西,最费劲的就是在解析协议上,数据长度不固定这点真的有点神坑啊,变来变去的有点烦。
这里贴一下数据解析的部分程序,写点不是很好,又长又丑,也求大神指正
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了。
(责任编辑:admin)
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
相关文章
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
推荐内容