| 开篇先放效果图 
   
   视频
 
 
	 看不了的亲,优酷地址:http://v.youku.com/v_show/id_XMTY5Mjk0MDkyNA
 
 ----------------------分割线-----------------
 之前看了坛友的帖子,HPDL1414外接屏幕显示电脑状态(温度/使用量)USB外接显示外设|http://bbs.mydigit.cn/read.php?tid=1716073
 感觉惠普的这个米字数码管挺漂亮的,可以弄个精致的小东西,然后也去买了几个。
 数码管局部特写
 
   个人感觉嘛原作者的那个板子,太大太长了,而且边框有点大,做成两层还要加拼板费。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瓜分完了,然后就弄原理图咯。
 
   接着pcb,这么小的面积,塞这么多东西进去,也是蛮为难的,真的有点紧了,上铜柱的固定孔都弄的很紧张
 
   然后,就拿给板厂了呗,然后手残了,没选颜色就默认了,然后弄的手一看傻眼了,绿油,哎
 当然好像绿油也配数码管的底色也还勉强能行
 
   不过嘛,后来又选了黑油,结果板厂又吧走线弄断了,pcb厂家还在给重新补做中,实在等不及,自己拿坏板处理一下先弄着了,就是有点有损pcb完整性。
 哎,命途多舛
 焊接好但是还没有插数码管的图,建议在焊接排座前就把铜柱给装上,因为空间紧凑,焊了就不好装的
 同时装铜柱也要稍微注意一下,不要碰到周围的电路什么的
 数码管下有ams117,ch340和stm8,我这里用了排座,是为了方便拆卸调试的,实际上可以直接将管子焊在pcb上,整个东西就更薄了
 
   背面有ds3231,ds18b20,esp8266模块的插座,按键,蜂鸣器焊盘,晶振和usb座
 
   关于3231的备用电池,在板子上放电池座肯定不现实是了,所以只能在正反两面各方了一个电池的焊盘,可以用线引出来接3v电池。
 因为我实在没有轻薄的电池了,所以暂时用这种代替一下,等以后有好的电池再换。同时,如果电池足够小,可以把它放在板子正面,也就是数码管下面,这样就美观很多了
 
   如果插上esp8266模块,是这样子的
 
   加了铜柱,立起来看看,还不错
 
   
   侧视图(带wifi模块)
 
   另一面侧视,usb口
 
   然后第一次点亮,先显示点简单的把
 
   长度尺寸
 
   
 然后,后面就开始苦逼的编程了
 首先先感谢帮忙弄上位机的小伙伴: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_dat,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了。
   (责任编辑:admin) |  
						
					haoDIY创好电子 版权所有,电话微信13977534587 |