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

|
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)
下面是我做的一些改进:
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]
LCD用的库:http://www.dfrobot.com/image/data/DFR0091/LCD12864RSPI%20v1.0.zip
我把“Serial.begin(9600);”删掉了,使得relay = 0(继电器接在PIN0)时, 继电器是正常工作了,但是代码中if(data>25)程序段中,digitalWrite是执行了,但是LCDA.DisplayString没有执行啊,不显示“温度过高”。当使得relay = 3(继电器接在PIN3)时,继电器工作也正常,if(data>25)程序段执行同样正常,但是LCD上逐字显示,能看到字是从左边一个一个出现的,这是怎么回事啊???