云水尧 发表于 2014-5-13 15:18:35

关于LCD12864显示问题

本帖最后由 云水尧 于 2014-5-22 14:09 编辑


做了一个温度显示装置。
用LM35温度传感器检测温度,然后通过LCD12864显示出来。当温度>25时继电器吸合,LED灯亮,继电器断开。
问题:当继电器的端口接DigitalPin0时,继电器一直吸合,LCD显示正常。当继电器的端口接其他DigitalPin时,继电器可以正常工作,但是LCD会出现逐字显示的问题。请问这是怎么回事啊?
代码如下:
#include <LCD12864RSPI.h>
#define AR_SIZE( a ) sizeof( a ) / sizeof( a )


unsigned long tepTimer;
unsigned char tempTitle[] = {0xCE,0xC2,0xB6,0xC8};//温度
unsigned char line11[] = ":";
unsigned char tempHigh[] = {0xCE,0xC2,0xB6,0xC8,0xB9,0xFD,0xB8,0xDF};//温度过高
unsigned char tempLow[] = {0xCE,0xC2,0xB6,0xC8,0xB9,0xFD,0xB5,0xCD};//温度过低
char temp;
int relay = 1; //此处端口为0时,LCD显示正常,但继电器不正常;端口为其他时,LCD逐字显示(不正常),继电器正常

void setup(){
Serial.begin(9600);
pinMode(relay,OUTPUT);
LCDA.initDriverPin(2,7,10);
LCDA.Initialise();
delay(100);
}

void loop(){
int val;
double data;
val = analogRead(0);
data = (double)val * 5 / 10.24;
if(millis() - tepTimer > 2000){
    tepTimer = millis();
   
    LCDA.CLEAR();
    if(data>25){
      digitalWrite(relay, HIGH);
      LCDA.DisplayString(1,0,tempHigh,AR_SIZE(tempHigh));
    }
    else{
      digitalWrite(relay, LOW);
      LCDA.DisplayString(1,0,tempLow,AR_SIZE(tempLow));
    }
    LCDA.DisplayString(0,0,tempTitle,AR_SIZE(tempTitle));//
    LCDA.DisplayString(0,2,line11,AR_SIZE(line11));
    dtostrf(data,0,1,temp);
    LCDA.DisplayString(0,3,(unsigned char*)temp,AR_SIZE(temp));
}
}
连接图如下:



Phoebe 发表于 2014-5-14 10:23:04

看看你的LCD12864和继电器有没有使用了一个口,导致了冲突,也有可能是供电问题

Leotower 发表于 2014-5-19 10:18:45

请问问题是否解决了?   如果用的是UNO,则Serial使用的是0和1, 继电器不能接在这两个pin上。

云水尧 发表于 2014-5-20 10:19:14

Leotower 发表于 2014-5-19 10:18
请问问题是否解决了?   如果用的是UNO,则Serial使用的是0和1, 继电器不能接在这两个pin上。 ...

恩,好像是这个问题,把Serial.begin删掉就好了,谢谢!!!

云水尧 发表于 2014-5-20 10:42:20

Leotower 发表于 2014-5-19 10:18
请问问题是否解决了?   如果用的是UNO,则Serial使用的是0和1, 继电器不能接在这两个pin上。 ...

不对啊,还是有问题诶。
我把“Serial.begin(9600);”删掉了,使得relay = 0(继电器接在PIN0)时, 继电器是正常工作了,但是代码中if(data>25)程序段中,digitalWrite是执行了,但是LCDA.DisplayString没有执行啊,不显示“温度过高”。当使得relay = 3(继电器接在PIN3)时,继电器工作也正常,if(data>25)程序段执行同样正常,但是LCD上逐字显示,能看到字是从左边一个一个出现的,这是怎么回事啊???

Leotower 发表于 2014-5-21 09:05:42

现象很有意思,建议将连线图提供一下, 使用lcd的库的链接提供一下。 估计和lcd库的实现有关。

云水尧 发表于 2014-5-22 14:10:41

Leotower 发表于 2014-5-21 09:05
现象很有意思,建议将连线图提供一下, 使用lcd的库的链接提供一下。 估计和lcd库的实现有关。 ...

连接图已将附上了
LCD用的库:http://www.dfrobot.com/image/data/DFR0091/LCD12864RSPI%20v1.0.zip

Leotower 发表于 2014-5-24 13:04:17

图画的不错:)这个现象确实奇怪,总的来说是继电器在吸合状态则不太正常; 建议分别做以下尝试:
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)

云水尧 发表于 2014-5-27 09:46:49

本帖最后由 云水尧 于 2014-5-27 09:49 编辑

Leotower 发表于 2014-5-24 13:04
图画的不错:)这个现象确实奇怪,总的来说是继电器在吸合状态则不太正常; 建议分别做以下尝试:
1、可 ...
第一次画这种图就被夸奖了,谢谢你对我的鼓励:)!!!

下面是我做的一些改进:
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的后面digitalWrite(relay, LOW);LCDA.DisplayString(1,0,tempLow,AR_SIZE(tempLow)); delay(200);就出现了如下的画面。显示在了同一行上。我改成delay(1);后,温度过低几个字就不再显示了,一直只显示“温度:XX.X”。




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




虽然仍有很多小问题让我感到困扰,但还是非常感谢Leotower耐心的为我解答,非常非常感谢:)!!!







20060606 发表于 2020-8-24 05:38:27

是不是处理器速度太慢?试试u8gilb库
页: [1]
查看完整版本: 关于LCD12864显示问题