Create thread in arduino program

Hello everyone, this is my control program using MQTT and UART but it seems that the functions receiving data from uart and mqtt do not work in parallel. I want to use thread so that these functions work in parallel. Can you help me?

#include <WiFi.h>
#include <PubSubClient.h>
// Khai bao network
const char* ssid = "PhongG_wifi";// tên mạng WIFI
const char* password = "888888889";// Password truy cập
const char* mqtt_server = "91.121.93.94";// Địa chỉ IP của Broker.

WiFiClient espClient;
PubSubClient client(espClient);

#define sub "S"
#define subStatus "getStatus"
#define pub "S_tt"
#define pubFan "isFanOn"
#define pubAir "isAirOn"
#define pubChan "isChanOn"
#define pubTV "isTvOn"
#define pubTem "homeTemperature"
#define GPIO_PIN 3
#define GPIO_PIN1 1
#define GPIO_PIN2 22
#define GPIO_PIN3 23


HardwareSerial SerialUART(1); 

bool isAirOn = false;
bool isChandeOn = false;
bool isFanOn = false;
bool isTvOn = false;

char myData[15];
void setup_wifi() {
  delay(10);
  // Bat dau ket noi voi wifi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("Da ket noi WiFi");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Create a client ID
    String clientId = "ESP8266Client-01";
    if (client.connect(clientId.c_str())) {
      Serial.println("MQTT connected");
      client.subscribe(sub);
      client.subscribe(subStatus);
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}
void receiveData(){
  byte n = Serial2.available();
   if(n != 0)
   {
       byte m = Serial1.readBytesUntil('\n', myData, sizeof(myData) - 1);
       myData[m] = '\0';     //insert null-character
       Serial.println(myData);    //should appear Temp signal coming from Snder
       int data = atoi(myData);
       Serial.println(data);   

       if(data == 0 ){
        if(isAirOn==false){
          isAirOn = true;
          digitalWrite(GPIO_PIN, 1);
          client.publish(pubAir, "1");                   
        }else{
          isAirOn =false;
          digitalWrite(GPIO_PIN, 0);
          client.publish(pubAir, "0");

        }
       } else if(data == 1 ){
          if(isChandeOn==false){
          isChandeOn = true;
          digitalWrite(GPIO_PIN1, 1);
          client.publish(pubChan, "1");
          }else{
          isChandeOn=false;
          digitalWrite(GPIO_PIN1, 0);
          client.publish(pubChan, "0");
        }
      } else if(data == 2 ){
        if(isFanOn==false){
          isFanOn = true;
          digitalWrite(GPIO_PIN2, 1);
          client.publish(pubFan, "1");
          }
        else{
          isFanOn=false;
          digitalWrite(GPIO_PIN2, 0);
          client.publish(pubFan, "0");
        }
      } else if (data == 3){
        if(isTvOn==false){
          isTvOn = true;
          digitalWrite(GPIO_PIN3, 1);
          client.publish(pubTV, "1");
          }
        else{
          isTvOn=false;
          digitalWrite(GPIO_PIN3, 0);
          client.publish(pubTV, "0");
          } 
      } else if( data == 4){
      }else {
        String dataString = String(data);
        const char* dataChar = dataString.c_str();
        client.publish(pubTem, dataChar);
      }
   }
}


void callback(char* topic, byte* payload, unsigned int length) {
  if(strcmp(topic, "S") == 0){  
    Serial.print("Tin nhan[");
    Serial.print(topic);
    Serial.print("] ");
    for (int i = 0; i < length; i++) {
      Serial.print((char)payload[i]);
    }
    Serial.println();
    if ((char)payload[0] == '1') {
      if(isChandeOn==true){
        client.publish(pubChan, "0");
        isChandeOn = false;
        digitalWrite(GPIO_PIN1, 0);
      }else{
        isChandeOn = true;   
        digitalWrite(GPIO_PIN1, 1);     
        client.publish(pubChan, "1");
      }
    } else if ((char)payload[0] =='0'){
        if(isAirOn==true){
          isAirOn = false;
          digitalWrite(GPIO_PIN, 0);
          client.publish(pubAir, "0");
        }else{
          isAirOn = true;
          digitalWrite(GPIO_PIN, 1);
          client.publish(pubAir, "1");
          
      }
    } else if((char)payload[0] == '2')
    {
      if(isFanOn==true){
        isFanOn = false;
        digitalWrite(GPIO_PIN2, 0);
        client.publish(pubFan, "0");
      }else{
        isFanOn = true;
        digitalWrite(GPIO_PIN2, 1);
        client.publish(pubFan, "1");
      }
    }
    else if((char)payload[0] == '3')
    {
      if(isTvOn==true){
        isTvOn = false;
        digitalWrite(GPIO_PIN3, 0);
        client.publish(pubTV, "0");
      }else{
        isTvOn = true;
        digitalWrite(GPIO_PIN3, 1);
        client.publish(pubTV, "1");
      }    
    }
  } else if(strcmp(topic, "getStatus") == 0)
  {
    Serial.print("Tin nhan[");
    Serial.print(topic);
    Serial.print("] ");
    for (int i = 0; i < length; i++) {
      Serial.print((char)payload[i]);
    }
    Serial.println();
    if ((char)payload[0] == '0') {
    if(isAirOn == false){
      client.publish(pubAir, "0");
    } else {client.publish(pubAir, "1");}

    if(isChandeOn == false){
      client.publish(pubChan, "0");
    } else {client.publish(pubChan, "1");}

    if(isFanOn == false){
      client.publish(pubFan, "0");
    } else {client.publish(pubFan, "1");}

    if(isTvOn == false){
      client.publish(pubTV, "0");
    } else {client.publish(pubTV, "1");}
    }
  }
  
}



void setup() {
  Serial.begin(9600);
  Serial2.begin(9600, SERIAL_8N1, 16, 17); 
  pinMode(GPIO_PIN, OUTPUT);
  pinMode(GPIO_PIN1, OUTPUT);
  pinMode(GPIO_PIN2, OUTPUT);
  pinMode(GPIO_PIN3, OUTPUT);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
}


void loop() {
  receiveData();
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
}

I moved your topic to an appropriate forum category @doxuanhieu.

In the future, please take some time to pick the forum category that best suits the subject of your topic. There is an "About the _____ category" topic at the top of each category that explains its purpose.

I have already told you this multiple times, yet you persist in selecting a completely inappropriate category for your topics. Since asking nicely clearly isn't getting your attention, I'm giving you a temporary account suspension. I hope that when you return to our forum you'll act more respectfully.

Thanks in advance for your cooperation.

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