我试图让 arduino 中的 millis 工作不知道如何

im trying to make millis in arduino work dont know how

嗨,我正在尝试使用 millis 在我的 arduino 代码中重新启动功能,但我可以让它工作。

这就是我希望它在 3 秒后关闭 switch3 并重新启动它的方式。

  if (readString.indexOf("?b24vb2ZmL2Z1bmN0aW9u") >= 0)
  {
    //What it does.
    actionTransmitter.sendSignal(1, 'C', false);
    switchstatus3 = false;
    delay(3000);
    actionTransmitter.sendSignal(1, 'C', true);
    switchstatus3 = true;
  }

这就是我做事和失败的方式。

  if (readString.indexOf("?b24vb2ZmL2Z1bmN0aW9u") >= 0)
  {
    //What it does.
    actionTransmitter.sendSignal(1, 'C', false);
    switchstatus3 = false;
    timing = true;
    startTime = millis();
    if ((timing) && millis() - startTime >= 3000) {
      actionTransmitter.sendSignal(1, 'C', true);
      switchstatus3 = true;
    }
  }

这是所有的arduino代码。

#include <SPI.h>
#include <String.h>
#include <Ethernet.h>
#include <RemoteReceiver.h>
#include <RemoteTransmitter.h>

byte mac[] = {
  0x90, 0xA2, 0xDA, 0x00, 0x9B, 0x36
}; // MAC address
byte ip[] = {
  192, 168, 0, 200
}; // IP address
EthernetServer server(9090); // Port

//pins
ActionTransmitter actionTransmitter(9);
#define RELAY1  5
#define RELAY2  6
#define RELAY3  7
#define RELAY4  8

// Boolean funtion for state
String readString = String(30);
boolean switchstatus1 = false;
boolean switchstatus2 = false;
boolean switchstatus3 = false;
boolean Relaystatus1 = false;
boolean Relaystatus2 = false;
boolean Relaystatus3 = false;
boolean Relaystatus4 = false;

//timmer
boolean timing = false;
unsigned long startTime;

void setup() {


  //Relay default off
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);

  // Inicia o Ethernet
  Ethernet.begin(mac, ip);


  //enable serial data print
  Serial.begin(115200);
  // RF reciver and transmitter pins
  RemoteReceiver::init(0, 3, showCode);
  // Relay board pins
  pinMode(RELAY1, OUTPUT);
  pinMode(RELAY2, OUTPUT);
  pinMode(RELAY3, OUTPUT);
  pinMode(RELAY4, OUTPUT);


}

void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();

  if (client) {
    while (client.connected())
    {
      if (client.available())
      {
        char c = client.read();
        //read char by char HTTP request
        if (readString.length() < 30)
        {
          //store characters to string
          readString += (c);
        }

        //if HTTP request has ended
        if (c == '\n')
        {
          // Switch triggers by web

          // Remote switch control by web
          //switch 1 on
          if (readString.indexOf("?dW5pdDFPTg==") >= 0)
          {
            // What it does.
            actionTransmitter.sendSignal(1, 'A', true);
            switchstatus1 = true;
          }
          //switch 1 off
          if (readString.indexOf("?dW5pdDFPRkY=") >= 0)
          {
            //What it does.
            actionTransmitter.sendSignal(1, 'A', false);
            switchstatus1 = false;
          }
          //switch 2 on
          if (readString.indexOf("?dW5pdDJPTg==") >= 0)
          {
            //What it does.
            actionTransmitter.sendSignal(1, 'B', true);
            switchstatus2 = true;
          }
          //switch 2 off
          if (readString.indexOf("?dW5pdDJPRkY=") >= 0)
          {
            //What it does.
            actionTransmitter.sendSignal(1, 'B', false);
            switchstatus2 = false;
          }
          if (readString.indexOf("?dW5pdDNPTg==") >= 0)
          {
            //switch 3 on
            actionTransmitter.sendSignal(1, 'C', true);
            switchstatus3 = true;
          }
          //switch 3 off
          if (readString.indexOf("?dW5pdDNPRkY=") >= 0)
          {
            //What it does.
            actionTransmitter.sendSignal(1, 'C', false);
            switchstatus3 = false;
          }

          //switch 3 off deley on function.
          if (readString.indexOf("?b24vb2ZmL2Z1bmN0aW9u") >= 0)
          {
            //What it does.
            actionTransmitter.sendSignal(1, 'C', false);
            switchstatus3 = false;
            timing = true;
            startTime = millis();
            if ((timing) && millis() - startTime >= 3000) {
              actionTransmitter.sendSignal(1, 'C', true);
              switchstatus3 = true;
            }
          }

          // Relay board control by web.
          // Relay 1 on
          if (readString.indexOf("cmVsYXkxb24=") >= 0)
          {
            //What it does.
            Relaystatus1 = true;
            digitalWrite(RELAY1, LOW);

          }
          // Relay 1 off
          if (readString.indexOf("cmVsYXkxb2Zm") >= 0)
          {
            //What it does.
            Relaystatus1 = false;
            digitalWrite(RELAY1, HIGH);
          }
          // Relay 2 on
          if (readString.indexOf("cmVsYXkyb24=") >= 0)
          {
            //What it does.
            Relaystatus2 = true;
            digitalWrite(RELAY2, LOW);

          }
          // Relay 2 off
          if (readString.indexOf("cmVsYXkyb2Zm") >= 0)
          {
            //What it does.
            Relaystatus2 = false;
            digitalWrite(RELAY2, HIGH);
          }
          // Relay 3 on
          if (readString.indexOf("cmVsYXkzb24=") >= 0)
          {
            //What it does.
            Relaystatus3 = true;
            digitalWrite(RELAY3, LOW);
          }
          // Relay 3 off
          if (readString.indexOf("cmVsYXkzb2Zm") >= 0)
          {
            //What it does.
            Relaystatus3 = false;
            digitalWrite(RELAY3, HIGH);
          }
          // Relay 4 on
          if (readString.indexOf("cmVsYXk0b24=") >= 0)
          {
            //What it does.
            Relaystatus4 = true;
            digitalWrite(RELAY4, LOW);
          }
          // Relay 4 off
          if (readString.indexOf("cmVsYXk0b2Zm") >= 0)
          {
            //What it does.
            Relaystatus4 = false;
            digitalWrite(RELAY4, HIGH);


          }
          // Needed to Display Site:
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          client.print("<meta http-equiv='refresh'content='5'>");
          client.print("<font size='20'>");

          // Enabling command line
          client.print("ArduinoOn");
          // Remote switch state indication.
          //Switch state 1
          if (switchstatus1 == true) {
            client.print("Switch1On");
          }
          if (switchstatus1 == false) {
            client.print("Switch1Off");
          }
          //Switch state 2
          if (switchstatus2 == true) {
            client.print("Switch2On");
          }
          if (switchstatus2 == false) {
            client.print("Switch2Off");
          }
          //Switch state 3
          if (switchstatus3 == true) {
            client.print("Switch3On");
          }
          if (switchstatus3 == false) {
            client.print("Switch3Off");
          }

          // Relay state indication.
          // Relay 1
          if (Relaystatus1 == true) {
            client.print("Relay1On");
          }
          if (Relaystatus1 == false) {
            client.print("Relay1Off");
          }
          // Relay 2
          if (Relaystatus2 == true) {
            client.print("Relay2On");
          }
          if (Relaystatus2 == false) {
            client.print("Relay2Off");
          }
          // Relay 3
          if (Relaystatus3 == true) {
            client.print("Relay3On");
          }
          if (Relaystatus3 == false) {
            client.print("Relay3Off");
          }
          // Relay 4
          if (Relaystatus4 == true) {
            client.print("Relay4On");
          }
          if (Relaystatus4 == false) {
            client.print("Relay4Off");
          }
          //clearing string for next read.
          readString = "";

          // close the connection:
          client.stop();
        }
      }
    }
  }
}

//RC Remote control

void showCode(unsigned long receivedCode, unsigned int period) {
  // Note: interrupts are disabled. You can re-enable them if needed.

  // Print the received code.
  Serial.print("Code: ");
  Serial.print(receivedCode);
  Serial.print(", period duration: ");
  Serial.print(period);
  Serial.println("us.");

  // Switch 1 off
  if (receivedCode == 352833)
  {
    switchstatus1 = true;

  }
  // Switch 1 Off
  if (receivedCode == 352829)

  {
    switchstatus1 = false;

  }
  // Switch 2 on
  if (receivedCode == 353805)
  {
    switchstatus2 = true;

  }
  // Switch 2 off
  if (receivedCode == 353801)

  {
    switchstatus2 = false;

  }
  // Switch 3 on
  if (receivedCode == 354129)
  {
    switchstatus3 = true;

  }
  // Switch 3 off
  if (receivedCode == 354125)

  {
    switchstatus3 = false;

  }
}

我不明白使用第一种方法有什么问题。如果你想要 3s,那么只需延迟 3000 就可以了。但是既然你想要第二种形式,你的代码应该是这样的:

if (readString.indexOf("?b24vb2ZmL2Z1bmN0aW9u") >= 0)
  {
    //What it does.
    actionTransmitter.sendSignal(1, 'C', false);
    switchstatus3 = false;
    timing = true;
    startTime = millis();
    if(timing){

        while(millis() - startTime < 3000); // This will wait 3s

        actionTransmitter.sendSignal(1, 'C', true);
        switchstatus3 = true;
    }
  }