![](/img/trans.png)
[英]Porting FreeRTOS to Arduino MEGA 2560 Rev3 (ATmega2560)
[英]Nextion Touch Screen Arduino Mega 2560 Turning a relay off and on
伙计们,我有点问题。
我正在尝试使用Nextion触摸屏来控制我的越野灯。 我正在使用Arduino Mega 2560开发板。 8个模块的中继板。 和下一步屏幕。 我写的草图一切正常,除了触发继电器后无法将其关闭。 在草图中,我还发布了第一个按钮切换,我已读取引脚的状态,然后根据状态将其关闭或打开。 好吧,它现在什么也不做。 它既不会触发继电器也不会关闭继电器。
在按钮切换的其余部分中,我只是让它在按钮切换时触发继电器。
在按钮切换中要求的消息不会根据按钮状态而改变。 否则我会用它来关闭继电器。
伙计们,我很茫然。 任何指导将不胜感激。
/* This is my Sketch for the Touch Screen interface for the relay box that will be installed in my Jeep
Robert L. Wardecker
This code is in public domain
*/
#include <SoftwareSerial.h>
#include <doxygen.h>
#include <Nextion.h>
const int relayaPin = 52;
const int relaybPin = 53;
const int relaycPin = 50;
const int relaydPin = 51;
int val = 0;
SoftwareSerial nextion(10, 11);// Nextion TX to pin 10 and RX to pin 11 of Arduino
Nextion myNextion(nextion, 9600); //create a Nextion object named myNextion using the nextion serial port @ 9600bps
boolean button1State;
boolean button2State;
boolean button3state;
boolean button4state;
boolean button5state;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
myNextion.init(); // send the initialization commands for Page 0
pinMode(relayaPin, OUTPUT);
pinMode(relaybPin, OUTPUT);
pinMode(relaycPin, OUTPUT);
pinMode(relaydPin, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
String message = myNextion.listen(); //check for message
if (message == "65 0 1 1 ffff ffff ffff") {
myNextion.buttonToggle(button1State, "b0", 0, 2);
}
val = digitalRead(relayaPin);
Serial.print(val);
if (val == HIGH) {
// turn Relay on:
digitalWrite(relayaPin, HIGH);
} else {
// turn Relay off:
digitalWrite(relayaPin, LOW);
}
if (message == "65 0 2 1 ffff ffff ffff") {
myNextion.buttonToggle(button2State, "b1", 0, 2);
digitalWrite(relaybPin, HIGH);
}
if (message == "65 0 3 1 ffff ffff ffff") {
myNextion.buttonToggle(button3state, "b2", 0, 2);
digitalWrite(relaycPin, HIGH);
}
if (message == "65 0 4 1 ffff ffff ffff") {
myNextion.buttonToggle(button3state, "b3", 0, 2);
digitalWrite(relaydPin, HIGH);
}
if (message == "65 0 5 1 ffff ffff ffff") {
myNextion.buttonToggle(button3state, "b4", 0, 2);
digitalWrite(relayaPin, HIGH);
digitalWrite(relaybPin, HIGH);
digitalWrite(relaycPin, HIGH);
digitalWrite(relaydPin, HIGH);
}
}
这有多个问题:
1)您对“ 65 0 1 1 ffff ffff ffff”的第一次检查只是在Nextion屏幕上切换按钮,实际上对relayaPin
没有任何relayaPin
。 一旦检查完成,则无论检查如何,您的代码都会切换您的中继a,因为它没有封装在if
语句中。 您要做的是:
if (message == "65 0 1 1 ffff ffff ffff") {
myNextion.buttonToggle(button1State, "b0", 0, 2);
val = digitalRead(relayaPin);
Serial.print(val);
if (val == HIGH) {
// turn Relay on:
digitalWrite(relayaPin, HIGH);
} else {
// turn Relay off:
digitalWrite(relayaPin, LOW);
}
}
如果您按下按钮,这只会切换继电器A。
2)对于所有其他中继检查语句,您并没有像上述那样检查其当前状态。 仅将其再次设置为HIGH不会切换它,如果它已经打开,则只会一直停留在该点上。 没有退出标准。 您需要像第一个一样进行检查。
3)为了爱上帝,请使用#define RELAY_A_MESSAGE "65 0 1 1 ffff ffff ffff"
这样的处理来提高可读性。 然后,您可以只使用if( message == RELAY_A_MESSAGE )
语句来代替此怪异的ascii垃圾。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.