【问题标题】:Nextion Touch Screen Arduino Mega 2560 Turning a relay off and onNextion 触摸屏 Arduino Mega 2560 关闭和打开继电器
【发布时间】:2016-05-16 16:17:20
【问题描述】:

伙计们,我遇到了一些问题。

我正在尝试使用 Nextion 触摸屏来控制我的越野灯。我正在使用 Arduino Mega 2560 板。一个8模块继电器板。和 Nextion 屏幕。我写的草图一切正常,除了在我触发继电器后我无法将其关闭。在草图中,我还在第一个按钮切换中发布了我正在读取引脚的状态,然后根据状态将其关闭或打开。那么它现在什么都不做。它既不会触发继电器也不会将其关闭。

在其余的按钮切换中,我只是让它在按钮切换时触发继电器。

在按钮切换中调用的消息不会根据按钮状态而改变。否则我会用它来关闭继电器。

伙计们,我不知所措。任何指导将不胜感激。

/* 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);
      }

    }

【问题讨论】:

    标签: c++ arduino


    【解决方案1】:

    这有多个问题:

    1) 您对“65 0 1 1 ffff ffff ffff”的第一次检查只是切换 Nextion 屏幕上的按钮,它实际上并没有对 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 垃圾。

    【讨论】:

    • 感谢您的回复。
    • 感谢您的回复。我已经按照您的建议封装了代码。它仍然不能打开和关闭继电器。我表现得好像它根本看不到该代码。继电器的状态永远不会改变。至于没有此代码的后续中继语句,我只是想让一个工作,然后将继续进行其余的。是的,一旦我有一个工作草图,我将使用#define 语句和一些数组来清理代码。我是全新的,正在学习。我以前从未编码过。我参加了一些在线 C++ 课程,因此我了解代码中发生的事情,只是遇到了困难。
    • @Bob 你能用你的电路图更新你的问题吗?
    • 我解决了我的问题。我试图获取按钮的状态并根据按钮的状态切换继电器。我仍在这样做,但记得草图已经知道按钮的状态,因此我不必第二次得到它。在布尔声明中存储状态。所以我只是用它来构建我的 if else 代码。现在它像我想象的那样工作。非常感谢您的帮助
    • //52" 灯条 if (message == "65 0 1 1 ffff ffff ffff") { myNextion.buttonToggle(button1State, "b0", 0, 2); if (button1State == HIGH ) { // 开启继电器:digitalWrite(relayaPin, HIGH); } else { // 关闭继电器:digitalWrite(relayaPin, LOW); } }