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