Timer Function for two different timer seems wrong

So, I made a timer function for the Arduino to set when a relay will turn off according to the adjusted time. So for relay1 I set it to 10 seconds and relay2 to 5 seconds, but when 5 seconds passed, for some reason all the relays turned off at the same time.

here is the code that i use

#include <WiFiManager.h>
#include <ESP8266WiFi.h>
#include <Ticker.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <Adafruit_BME280.h>
#include <Adafruit_Sensor.h>
#include "NTP.h"
#include <WiFiUdp.h>

String num="";
int input=0;

const int buttonPin = D7;
int buttonState = 0;

#define MQTT_HOST ***********
#define MQTT_PORT ****

#define RelayPin1 D3
#define RelayPin2 D4
//#define RelayPin3 D5
//#define RelayPin4 D6

#define MQTT_SUB_Relay1 "esp-wemos-mini/2/relay1"
#define MQTT_SUB_Relay2 "esp-wemos-mini/2/relay2"
//#define MQTT_SUB_Relay3 "esp-wemos-mini/2/relay3"
//#define MQTT_SUB_Relay4 "esp-wemos-mini/2/relay4"

#define MQTT_PUB "esp-wemos-mini/2/data"

#define SEALEVELPRESSURE_HPA (1013.25)

WiFiUDP wifiUdp;
NTP ntp(wifiUdp);

WiFiManager wm;

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;

Adafruit_BME280 bme;

float temperature = 0;
float humidity = 0;
float barometer = 0;

unsigned long previousTime =0;
unsigned long timeCount =0;
unsigned long currentTime= millis();
unsigned long timer;
unsigned long timer2;
bool timerStart =false;
bool timer2Start =false;

void setup() {
  Serial.begin(115200);

  if (!bme.begin(0x76)) {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }
  setup_wifi();
  client.setServer(MQTT_HOST, MQTT_PORT);
  client.setCallback(callback);

  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(RelayPin1, OUTPUT);
  pinMode(RelayPin2, OUTPUT);
  //pinMode(RelayPin3, OUTPUT);
  //pinMode(RelayPin4, OUTPUT);

  digitalWrite(RelayPin1, LOW);
  digitalWrite(RelayPin2, LOW);
  //digitalWrite(RelayPin3, HIGH);
  //digitalWrite(RelayPin4, HIGH);

  ntp.begin();
  ntp.timeZone(7,0);
}

void setup_wifi() {
  delay(10);
  Serial.println();
  Serial.print("Connecting to ");

  Serial.println("Connecting to Wi-Fi...");
  WiFi.mode(WIFI_STA);

  bool res;

  res = wm.autoConnect("Test","password");

  if(!res) {
        Serial.println("Failed to connect");
    } 
    else {   
        Serial.println("connected");
    }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void configModeCallback(WiFiManager *myWiFiManager)
{
  Serial.println("Entered Configuration Mode");
 
  Serial.print("Config SSID: ");
  Serial.println(myWiFiManager->getConfigPortalSSID());
 
  Serial.print("Config IP Address: ");
  Serial.println(WiFi.softAPIP());
}

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived on topic: ");
  Serial.print(topic);
  Serial.print(". Message: ");
  
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
    num += (String((char)payload[i]));
  }
  Serial.println("num");
  Serial.println(num);
  int datanum=num.toInt();
  Serial.println(datanum);
  num="";
  input = datanum;
/*
  if (String(topic) == MQTT_SUB_Relay3) {
    Serial.print("Changing output to ");
    if(datanum==1){
      Serial.println("RelayPin 3 ON");
      digitalWrite(RelayPin3, LOW);   // Turn the LED on (Note that LOW is the voltage level
    }
    else if(datanum==0){
      Serial.println("RelayPin 3 Off");
      digitalWrite(RelayPin3, HIGH);  // Turn the LED off by making the voltage HIGH
    }
  }
  if (String(topic) == MQTT_SUB_Relay4) {
    Serial.print("Changing output to ");
    if(datanum==1){
      Serial.println("RelayPin4 ON");
      digitalWrite(RelayPin4, LOW);
    }
    else if(datanum==0){
      Serial.println("RelayPin4 OFF");
      digitalWrite(RelayPin4, HIGH);
    }
  }
*/
  
  if (String(topic) == MQTT_SUB_Relay1) {
    Serial.print("Changing output to ");
    if(datanum==1){
      Serial.println("RelayPin 1 ON");
      digitalWrite(RelayPin1, LOW);
    }
    else if(datanum==0){
      Serial.println("RelayPin 1 Off");
      digitalWrite(RelayPin1, HIGH);
    }
    else if(datanum>2){
      timerStart=true;
      Serial.println("RelayPin1 ON");
      digitalWrite(RelayPin1, LOW);
      Serial.print("start");
      if(timerStart==true){
        unsigned long timer = ((millis()/1000) -previousTime);   
        delay(200);
        previousTime = millis()/1000;
      }
    }
  } 
  if (String(topic) == MQTT_SUB_Relay2) {
    Serial.print("Changing output to ");
    if(datanum==1){
      Serial.println("RelayPin 2 ON");
      digitalWrite(RelayPin2, LOW);
    }
    else if(datanum==0){
      Serial.println("RelayPin 2 Off");
      digitalWrite(RelayPin2, HIGH);
    }
    else if(datanum>2){
      timer2Start=true;
      Serial.println("RelayPin2 ON");
      digitalWrite(RelayPin2, LOW);
      Serial.print("start");
      if(timer2Start==true){
        unsigned long timer2 = ((millis()/1000) -previousTime);   
        delay(200);
        previousTime = millis()/1000;
      }
    }
  }   
}
void(* resetFunc) (void) = 0;
void button() {
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
  if(buttonState == LOW) {

    Serial.println("Restarting");
    wm.resetSettings();
    resetFunc();
    delay(1000);
  }
  
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
 Serial.println("MQTT connected");
 if (client.connect("Alphamas")){
    Serial.print("Attempting MQTT connection...");
    
      client.subscribe(MQTT_SUB_Relay1);
      client.subscribe(MQTT_SUB_Relay2);
      //client.subscribe(MQTT_SUB_Relay3);
      //client.subscribe(MQTT_SUB_Relay4);
    }else{
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);

  }
}
}

void relayTimer1() {
  unsigned long timer = ((millis()/1000) -previousTime);   
  Serial.println(timer);
  delay(200);

  if(input==timer) {
    digitalWrite(RelayPin1, HIGH);
    Serial.println("off");
    delay(50); 
    timerStart=false;
  }
}

void relayTimer2() {
  unsigned long timer2 = ((millis()/1000) -previousTime);     
  delay(200);

  if(input==timer2) {
    digitalWrite(RelayPin2, HIGH);
    Serial.println("off");
    delay(50); 
    timer2Start=false;
  }
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
  relayTimer1();
  relayTimer2();
  long now = millis();
  if (now - lastMsg > 20000UL) {
    lastMsg = now; 
    ntp.update();

    temperature = bme.readTemperature();   
    
    char tempString[8];
    dtostrf(temperature, 1, 2, tempString);
    Serial.print("Temperature: ");
    Serial.println(tempString);

    humidity = bme.readHumidity();
    
    char humString[8];
    dtostrf(humidity, 1, 2, humString);
    Serial.print("Humidity: ");
    Serial.println(humString);

    barometer = bme.readPressure() / 100.0F;
    
    char baroString[8];
    dtostrf(barometer, 1, 2, baroString);
    Serial.print("Barometer: ");
    Serial.println(baroString);

    Serial.print("Time: ");
    Serial.println(ntp.formattedTime("%Y/%m/%d %T"));

    char messageData[60];
    sprintf(messageData, "%s, %s, %s, %s",ntp.formattedTime("%Y/%m/%d %T"),tempString,humString,baroString);
    client.publish(MQTT_PUB, messageData, true); 
    
  }
  button();
}

Thank you

You have a single previousTime variable that you use for both. Could that be a problem ?

Please point where in the code you set the 10s time for relay1 and 5s to relay2 ? Or your actual code is different from one that you inserted to forum?

Also take in account that you have a variable scope problems in your code - for example, you have a three different sets of timer and timer2 variables, where the two of them is absolutely useless.

The 5 seconds and 10 seconds come from the MQTT broker

Could you please show the code where you receive them?

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived on topic: ");
  Serial.print(topic);
  Serial.print(". Message: ");
  
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
    num += (String((char)payload[i]));
  }
  Serial.println("num");
  Serial.println(num);
  int datanum=num.toInt();
  Serial.println(datanum);
  num="";
  input = datanum;
  
  if (String(topic) == MQTT_SUB_Relay1) {
    Serial.print("Changing output to ");
    if(datanum==1){
      Serial.println("RelayPin 1 ON");
      digitalWrite(RelayPin1, LOW);
    }
    else if(datanum==0){
      Serial.println("RelayPin 1 Off");
      digitalWrite(RelayPin1, HIGH);
    }
    else if(datanum>2){
      timerStart=true;
      Serial.println("RelayPin1 ON");
      digitalWrite(RelayPin1, LOW);
      Serial.print("start");
      if(timerStart==true){
        unsigned long timer = ((millis()/1000) -previousTime);   
        delay(200);
        previousTime = millis()/1000;
      }
    }
  }

so when the message is more than 2, then it will start the timer

Thanks for the advice, i will try it later.

So for both relay1 and 2 you use the same variable input as an interval value?
Don't you see the problem in that?

so every variable must be different, well thank you, i will try to make another new variable

How did you expected the relays run in different intervals, if you used a single interval variable for both? :slight_smile:

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.