微波EDA网,见证研发工程师的成长!
首页 > 应用设计 > 工业电子 > 使用无字库12864液晶模块制作温湿度计

使用无字库12864液晶模块制作温湿度计

时间:10-29 来源:互联网 点击:

要注意两个锂电池最后安装,安装前必须先检查已经装好其他元器件和接线的电路板,确认VCC和地端没有短路故障。在焊接前电池先不开封,避免不小心正负极短路,以至于“出师未捷身先死”。带引脚的纽扣电池焊好即固定了,充电电池则用较厚的双面胶粘接在电路板反面固定。完工后四角一定要装上垫柱,避免电路板直接与平面接触。

其他就没有什么诀窍了,也就不再搞看图识物。7cm×9cm的洞洞板安装全部元件很宽松,实际上要想使这个小玩意工作起来,还要靠“软功夫”。下面一一分解。

编程之一:AM2301的读写时序

前面说过,温湿度探子输出的是40位的二进数。在探头进行测量并输出数据前,主控单片机M8和探头有个握手过程,步骤是:

M8的PC5空闲时一直为高,数据线处于释放状态。要启动测量,M8就在PC5输出低,使数据线拉低1ms以上(程序中用的10ms),把PC5转为输入状态,外部上拉电阻R2立即使数据线升高。在40μs以内探头发出响应:把数据线拉低80μs。M8读到这个低电平,知道探头回话了,接着探头也释放数据线80μs,M8就明白随后就是数据了。数据总是以50μs低电平先导,随后并不是以电平高低表示1、0,而是以高电平脉冲宽度表示1、0:70μs表示 1,26~28μs表示0。为了识别1和0,M8可在读先导低电平完成后,延时35μs再次读数据线,如果为高,就是1,如果为低,就是0。探头连续送出 40个低-高脉冲后,再次拉低数据线50μs,结束数据送出。脉冲示意图如图4。

实际使用时还要注意,测量应进行两次:第一次测量后,过2s再测一次,这次M8读出的数据是两秒前的测试数据。如果连续测量,间隔2s最好,无论如何不得小于1s。实际上气温和湿度一般也不会变化那么快。现在做的是每分钟测两次:在0s和2s各测一次,2s读出0s的数据,0s读的是上一分钟的数据,就丢弃了。

编程之二:AM2301的数据格式

如果数据正确(通过检查和校验),就需要把高16位湿度数据换算成十进位的3位数:000到999。在个位和十位间加上小数点,就是湿度的百分值。例如 M8读出的高16位是0B0000001100001101=512+256+8+4+1=781。湿度就是78.1%。温度类似,但是如果温度最高位为 1,意味着零下温度。

编程之三:怎样画出记录曲线

要画出一段时间的记录曲线,也就是在液晶上面按照这也就是在液晶上面按照这段时间顺序记录的数值画出对应的点。
在这块图形液晶画点的基本方法前次已经介绍过,就是先设置列坐标x和页坐标y,再写数据,用LCDSetxy(unsigned x,unsigned y)和LCDWriData(unsigned data)两个函数就可以在x列y页点亮任意8个点。但是如果直接用页坐标来画出通常用垂直坐标(行坐标)表示的点则非常不便。


图5 12小时内的温度变化记录曲线 

要按照列坐标x和行坐标h(h从0到63共计64行)来画一个点,而这正是画记录曲线的基础,我们可以变换一下,先用h/8算出h所在的页,例如h为45,那么它就在45/8即5页。而余数h%8就是h在该页的第几位(现在是第5位),让一个数unsigned char tmp=0x01;那把它左移5位得到的数值0x20就是用列坐标和页坐标画点时需要给液晶输入的数值。这些数值对于每次仅仅1个点,从低位到高位只能对应于0x01、0x02、0x04、0x08、0x10、0x20、0x40、0x80这8个数中的一个。这样我们可以捏造一个函数 LCDPutDot(unsigned char x,unsigned h);来在x列,h行画出一个点了,具体代码见后文。形式上用行列坐标参数,实质上还是页列坐标参数,但却方便多了。现在再回到怎样画湿度记录曲线。由于液晶像素的限制,水平只能取128点以下。那么如果每6分钟记录一次,12小时就记录120次,把这120次的湿度数值和液晶的垂直方向点位置(与行坐标成比例)对应起来画一系列点,不就是记录曲线吗?当然垂直方向只有64点,那么我们就取51点,0到50表示0到100。还要提醒的是,液晶的垂直方向,0点在最上面,这和通常的习惯相反。那也没关系,就把(100-h)/2作为垂直坐标就对了,为简单计,可略去小数。

至此几个编程的关键都说完了。按此在程序中加入了新增的函数:
unsigned char DHT21_ReadByte(void);//读探头串行数据
void DHT21_RHT(void);//发起检测,读数
void Show_RHT(void);//显示检测值
void LcdPutDot(unsignedcharx,unsignedcharh);//画点

函数具体内容见附件程序。

为了描绘12小时的记录曲线,还要设立一个120单元的湿度记录数组unsigned charRH_record[120],好在M8的数据区有512字节,还很富裕。
每6分钟往里面顺序填入一个记录,记满后又从0单元开始。
整个程序流程和日历钟基本相同,但有改变:

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top