关于LCD12864显示问题

2014-05-132.6万
AI 快速预览详细 收起
本文介绍了一个温度显示装置,使用LM35温度传感器检测温度并通过LCD12864显示。当继电器端口接DigitalPin0时,继电器一直吸合但LCD显示正常;而接其他DigitalPin时,继电器正常工作但LCD出现逐字显示的问题。通过调整继电器端口配置,可以解决这个问题。硬件清单包括LM35温度传感器、LCD12864显示屏和继电器。最终效果是实现稳定的温度显示和继电器控制。


做了一个温度显示装置。
用LM35温度传感器检测温度,然后通过LCD12864显示出来。当温度>25时继电器吸合,LED灯亮,继电器断开。
问题:当继电器的端口接DigitalPin0时,继电器一直吸合,LCD显示正常。当继电器的端口接其他DigitalPin时,继电器可以正常工作,但是LCD会出现逐字显示的问题。请问这是怎么回事啊?
代码如下:
  1. #include <LCD12864RSPI.h>
  2. #define AR_SIZE( a ) sizeof( a ) / sizeof( a[0] )
  3. unsigned long tepTimer;
  4. unsigned char tempTitle[] = {0xCE,0xC2,0xB6,0xC8};//温度
  5. unsigned char line11[] = ":";
  6. unsigned char tempHigh[] = {0xCE,0xC2,0xB6,0xC8,0xB9,0xFD,0xB8,0xDF};//温度过高
  7. unsigned char tempLow[] = {0xCE,0xC2,0xB6,0xC8,0xB9,0xFD,0xB5,0xCD};//温度过低
  8. char temp[4];
  9. int relay = 1; //此处端口为0时,LCD显示正常,但继电器不正常;端口为其他时,LCD逐字显示(不正常),继电器正常
  10. void setup(){
  11.   Serial.begin(9600);
  12.   pinMode(relay,OUTPUT);
  13.   LCDA.initDriverPin(2,7,10);
  14.   LCDA.Initialise();
  15.   delay(100);
  16. }
  17. void loop(){
  18.   int val;
  19.   double data;
  20.   val = analogRead(0);
  21.   data = (double)val * 5 / 10.24;
  22.   if(millis() - tepTimer > 2000){
  23.     tepTimer = millis();
  24.      
  25.     LCDA.CLEAR();
  26.     if(data>25){
  27.       digitalWrite(relay, HIGH);
  28.       LCDA.DisplayString(1,0,tempHigh,AR_SIZE(tempHigh));
  29.     }
  30.     else{
  31.       digitalWrite(relay, LOW);
  32.       LCDA.DisplayString(1,0,tempLow,AR_SIZE(tempLow));
  33.     }
  34.     LCDA.DisplayString(0,0,tempTitle,AR_SIZE(tempTitle));//
  35.     LCDA.DisplayString(0,2,line11,AR_SIZE(line11));
  36.     dtostrf(data,0,1,temp);
  37.     LCDA.DisplayString(0,3,(unsigned char*)temp,AR_SIZE(temp));
  38.   }
  39. }
复制代码

连接图如下:
关于LCD12864显示问题图1

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(5)
20060606
20060606
是不是处理器速度太慢?试试u8gilb库
Leotower
Leotower
图画的不错:) 这个现象确实奇怪,总的来说是继电器在吸合状态则不太正常; 建议分别做以下尝试:
1、可能继电器有干扰, 给继电器单独供电尝试一下 或者 用9v电源给UNO供电。
2、下面的代码加上delay
digitalWrite(relay, HIGH);
delay(200);
LCDA.DisplayString(1,0,tempHigh,AR_SIZE(tempHigh));
3、LCDA.initDriverPin(2,7,10); 更换为(8,10,12)
云水尧
云水尧
作者
回复Leotower
第一次画这种图就被夸奖了,谢谢你对我的鼓励:)!!!
下面是我做的一些改进:
1:继电器接在PIN0,LCD接在PIN2、7、10,增加了delay(200);,果然有了效果,继电器工作正常,LCD显示正常。但是由于延时过长,LCD闪的很厉害,所以我改成了delay(1);,结果同样可以,但LCD从下侧看仍有细微的闪烁,从正面看没有问题(不好意思哈,有点小强迫症:-)),这似乎没有办法,可能是处理器处理速度不够吧。这加了个delay就能执行“LCDA.DisplayString(1,0,tempHigh,AR_SIZE(tempHigh));”,这似乎不太科学啊???
后来我又将delay(200);加在了LCDA的后面[font=Helvetica, Tahoma, Arial, STXihei, ����ϸ��, Heiti, ����, Microsoft YaHei, ΢���ź�, SimSun, ����, sans-serif]digitalWrite(relay, LOW);[/font][font=Helvetica, Tahoma, Arial, STXihei, ����ϸ��, Heiti, ����,]LCDA.DisplayString(1,0,tempLow,AR_SIZE(tempLow));[/font][font=Helvetica, Tahoma, Arial, STXihei, ����ϸ��, Heiti, ����,] delay(200);[/font][font=Helvetica, Tahoma, Arial, STXihei, ����ϸ��, Heiti, ����,]就出现了如下的画面。显示在了同一行上。我改成delay(1);后,温度过低几个字就不再显示了,一直只显示“温度:XX.X”。[/font][font=Helvetica, Tahoma, Arial, STXihei, ����ϸ��, Heiti, ����,] [/font]
[font=Helvetica, Tahoma, Arial, STXihei, ����ϸ��, Heiti, ����,]
[/font]
[font=Helvetica, Tahoma, Arial, STXihei, ����ϸ��, Heiti, ����,]

[/font]
2:继电器接在PIN5(PIN1也试过),LCD接在PIN8、10、12,结果有点小失望,尝试了继电器用另一块UNO板单独供电,结果依旧是继电器工作正常,LCD显示不正常,逐字显示,如下图。不知道是不是处理器速度的关系。好神奇啊!

虽然仍有很多小问题让我感到困扰,但还是非常感谢[font=Helvetica, Tahoma, Arial, STXihei, ����ϸ��, Heiti, ����,][font=Helvetica, Tahoma, Arial, STXihei, ����ϸ��, Heiti, ����,][/font]耐心的为我解答,非常非常感谢:)!!![/font]
Leotower
Leotower
现象很有意思,建议将连线图提供一下, 使用lcd的库的链接提供一下。 估计和lcd库的实现有关。
云水尧
云水尧
作者
回复Leotower
Leotower
Leotower
请问问题是否解决了? 如果用的是UNO,则Serial使用的是0和1, 继电器不能接在这两个pin上。
云水尧
云水尧
作者
回复Leotower
不对啊,还是有问题诶。
我把“Serial.begin(9600);”删掉了,使得relay = 0(继电器接在PIN0)时, 继电器是正常工作了,但是代码中if(data>25)程序段中,digitalWrite是执行了,但是LCDA.DisplayString没有执行啊,不显示“温度过高”。当使得relay = 3(继电器接在PIN3)时,继电器工作也正常,if(data>25)程序段执行同样正常,但是LCD上逐字显示,能看到字是从左边一个一个出现的,这是怎么回事啊???
云水尧
云水尧
作者
回复Leotower
恩,好像是这个问题,把Serial.begin删掉就好了,谢谢!!!
phoebe.wang40
phoebe.wang40
看看你的LCD12864和继电器有没有使用了一个口,导致了冲突,也有可能是供电问题
- 没有更多了 -