Receiving data from multiple nodes using ESP-NOW

I want to ask about ESP-NOW, i want to use this protocol for my project. My project is about WSN with 3 nodes and 1 receiver. I'm using ESP8266 for this project. The nodes has 3 sensors in it which is a flame sensor, DHT22, and MQ5.
My problem with it is when i turn all of my nodes on, the receiver only updates 1 node data, and the other 2 nodes data is not updating in real-time. My question is how to make the receiver, updates all 3 nodes data in real time. Thank you for the help

Receiver code :

#include <ESP8266WiFi.h>
#include <espnow.h>
#include "CTBot.h"
CTBot myBot;

float incomingTemp;
float incomingHum;
float incomingHic;
float incomingflame;
float incominggas;

// Updates DHT readings every 10 seconds
const long interval = 3000;
unsigned long previousMillis = 0;    // will store last time DHT was updated

typedef struct struct_message {
  int id;
  float temp;
  float hum;
  float hic;
  float gas;
  float Flame;
} struct_message;

struct_message incomingReadings;

//structure to hold the readings from board 1 and 2//
struct_message board1;
struct_message board2;
struct_message board3;

//structure array//
struct_message boardsStruct[3] = {board1, board2, board3};


//Define Telegram BOT==============================================
String ssid  = "Sardefa23"    ; // REPLACE mySSID WITH YOUR WIFI SSID
String pass  = "AUDI13mei99"; // REPLACE myPassword YOUR WIFI PASSWORD, IF ANY
String token = "2101223933:AAFBdkD6VnExdWevYeHWZtyEYaSXfE6xcRk"   ; // REPLACE myToken WITH YOUR TELEGRAM BOT TOKEN
const int id = 1283765532;

void OnDataRecv(uint8_t * mac_addr, uint8_t *incomingData, uint8_t len) {
  char macStr[18];
  Serial.print("Packet received from: ");
  snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
           mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
  Serial.println(macStr);
  memcpy(&incomingReadings, incomingData, sizeof(incomingReadings));
  Serial.printf("Board ID %u: %u bytes\n", incomingReadings.id, len);
  // Update the structures with the new incoming data
  boardsStruct[incomingReadings.id - 1].temp = incomingReadings.temp;
  boardsStruct[incomingReadings.id - 1].hum = incomingReadings.hum;
  boardsStruct[incomingReadings.id - 1].hic = incomingReadings.hic;
  boardsStruct[incomingReadings.id - 1].Flame = incomingReadings.Flame;
  boardsStruct[incomingReadings.id - 1].gas = incomingReadings.gas;
  Serial.print("Bytes received: ");
  Serial.println(" ");

}

void printIncomingReadings() {
  // Display Readings in Serial Monitor
  Serial.println("Titik 1");
  Serial.print("Temperature: ");
  Serial.print(boardsStruct[0].temp);
  Serial.println(" ºC");
  Serial.print("Humidity: ");
  Serial.print(boardsStruct[0].hum);
  Serial.println(" %");
  Serial.print("Heat Index: ");
  Serial.print(boardsStruct[0].hic);
  Serial.println(" ºC");
  Serial.print("Kadar Gas: ");
  Serial.print(boardsStruct[0].gas);
  Serial.println(" ppm");
  Serial.println(boardsStruct[0].Flame);
  Serial.println("-----------------------------------------");
  Serial.println("Titik 2");
  Serial.print("Temperature: ");
  Serial.print(boardsStruct[1].temp);
  Serial.println(" ºC");
  Serial.print("Humidity: ");
  Serial.print(boardsStruct[1].hum);
  Serial.println(" %");
  Serial.print("Heat Index: ");
  Serial.print(boardsStruct[1].hic);
  Serial.println(" ºC");
  Serial.print("Kadar Gas: ");
  Serial.print(boardsStruct[1].gas);
  Serial.println(" ppm");
  Serial.println(boardsStruct[1].Flame);
  Serial.println("-----------------------------------------");
  Serial.println("Titik 3");
  Serial.print("Temperature: ");
  Serial.print(boardsStruct[2].temp);
  Serial.println(" ºC");
  Serial.print("Humidity: ");
  Serial.print(boardsStruct[2].hum);
  Serial.println(" %");
  Serial.print("Heat Index: ");
  Serial.print(boardsStruct[2].hic);
  Serial.println(" ºC");
  Serial.print("Kadar Gas: ");
  Serial.print(boardsStruct[2].gas);
  Serial.println(" ppm");
  Serial.println(boardsStruct[2].Flame);
  Serial.println("-----------------------------------------");

}

void setup() {

  // Set device as a Wi-Fi Station
  WiFi.mode(WIFI_AP_STA);
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  // Init ESP-NOW
  if (esp_now_init() != 0) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }

  // Initialize Serial Monitor
  // initialize the Serial
  Serial.begin(115200);
  Serial.println("Starting TelegramBot...");

  // connect the ESP8266 to the desired access point
  myBot.wifiConnect(ssid, pass);

  // set the telegram bot token
  myBot.setTelegramToken(token);

  // check if all things are ok
  if (myBot.testConnection()) {
    Serial.println("\ntestConnection OK");
  }
  else {
    Serial.println("\ntestConnection NOK");
  }

  // Once ESPNow is successfully Init, we will register for recv CB to
  // get recv packer info
  esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
  esp_now_register_recv_cb(OnDataRecv);
}


void loop() {
  // Print incoming readings

  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    // save the last time you updated the DHT values
    previousMillis = currentMillis;

    printIncomingReadings();
    TBMessage msg;


    String kondisi = "Kondisi Gedung \n";
    kondisi += "Kondisi Ruangan 1 \n";
    kondisi += "Temperature : ";
    kondisi += String(boardsStruct[0].temp);
    kondisi += " °C\n";
    kondisi += "Humidity : ";
    kondisi += String(boardsStruct[0].hum);
    kondisi += " %\n";
    kondisi += "Heat Index : ";
    kondisi += String(boardsStruct[0].hic);
    kondisi += " °C\n";
    kondisi += "Kadar Gas : ";
    kondisi += String(boardsStruct[0].gas);
    kondisi += " ppm\n";
    kondisi += "Kondisi Ruangan 2 \n";
    kondisi += "Temperature : ";
    kondisi += String(boardsStruct[1].temp);
    kondisi += " °C\n";
    kondisi += "Humidity : ";
    kondisi += String(boardsStruct[1].hum);
    kondisi += " %\n";
    kondisi += "Heat Index : ";
    kondisi += String(boardsStruct[1].hic);
    kondisi += " °C\n";
    kondisi += "Kadar Gas : ";
    kondisi += String(boardsStruct[1].gas);
    kondisi += " ppm\n";
    kondisi += "Kondisi Ruangan 3 \n";
    kondisi += "Temperature : ";
    kondisi += String(boardsStruct[2].temp);
    kondisi += " °C\n";
    kondisi += "Humidity : ";
    kondisi += String(boardsStruct[2].hum);
    kondisi += " %\n";
    kondisi += "Heat Index : ";
    kondisi += String(boardsStruct[2].hic);
    kondisi += " °C\n";
    kondisi += "Kadar Gas : ";
    kondisi += String(boardsStruct[2].gas);
    kondisi += " ppm\n";

    if (myBot.getNewMessage(msg)) {
      if (msg.messageType == CTBotMessageText)
        if (msg.text.equalsIgnoreCase("cek kondisi")) {
          myBot.sendMessage(id, kondisi, "");
       
        }
    }

    if (boardsStruct[0].Flame == LOW ) {
      myBot.sendMessage(id, "");
      String suhu = "Intensitas suhu : ";
      suhu += String(incomingflame);
      suhu += "Suhu maksimal gaes!\n";
      myBot.sendMessage(id, suhu, "");
    }

    if (boardsStruct[1].Flame == LOW ) {
      myBot.sendMessage(id, "");
      String suhu = "Intensitas suhu : ";
      suhu += String(incomingflame);
      suhu += "Suhu maksimal gaes!\n";
      myBot.sendMessage(id, suhu, "");
    }
    if (boardsStruct[2].Flame == LOW ) {
      myBot.sendMessage(id, "");
      String suhu = "Intensitas suhu : ";
      suhu += String(incomingflame);
      suhu += "Suhu maksimal gaes!\n";
      myBot.sendMessage(id, suhu, "");
    }
  }
}

Sender (nodes) code :

const int RELAY_PIN = D8;
const int pinApi = D3;
const int pinBuzzer = D0;
int apiState;
#include "DHT.h"
#define DHTPIN D4     //
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
#include <ESP8266WiFi.h>
#include <espnow.h>
float sensor=A0;
float gas_value;
float ppm1;
float ppm;
#define BOARD_ID 2

// REPLACE WITH RECEIVER MAC Address
uint8_t unicastAddress[] = {0xE0, 0x98, 0x06, 0xB6, 0x99, 0x78};

// Updates DHT readings every 10 seconds
const long interval = 3000; 
unsigned long previousMillis = 0;    // will store last time DHT was updated 

// Variable to store if sending data was successful
String success;

//Structure example to send data
//Must match the receiver structure
typedef struct struct_message {
    int id;
    float temp;
    float hum;
    float hic;
    float gas;
    String Flame;
} struct_message;
struct_message node2Readings;

DHT dht(DHTPIN, DHTTYPE);

// Callback when data is sent
void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) {
  Serial.print("Last Packet Send Status: ");
  if (sendStatus == 0){
    Serial.println("Delivery success");
  }
  else{
    Serial.println("Delivery fail");
  }
}

void setup() {
  Serial.begin(115200);
  pinMode(pinApi, INPUT);
  Serial.println(F("DHTxx test!"));
  dht.begin();

  //koding relay//
  pinMode(RELAY_PIN, OUTPUT);

   // Set device as a Wi-Fi Station
  WiFi.mode(WIFI_AP_STA);
  WiFi.disconnect();

  // Init ESP-NOW
  if (esp_now_init() != 0) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }

  // Set ESP-NOW Role
  esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);

  // Once ESPNow is successfully Init, we will register for Send CB to
  // get the status of Trasnmitted packet
  esp_now_register_send_cb(OnDataSent);

   //register peer//
  esp_now_add_peer(unicastAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);


  //kode mq5
  pinMode(sensor,INPUT);
}

void loop() {

  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    // save the last time you updated the DHT values
    previousMillis = currentMillis;
    
  //sensor flame dan water pump//
  apiState = digitalRead(pinApi);
  if(apiState == LOW){
     digitalWrite(RELAY_PIN, HIGH);
     Serial.println("Kebakaran gais!!");
    }else{
     digitalWrite(RELAY_PIN, LOW); 
     Serial.println("Aman dan adem gais!!");
  }

  //sensor mq5//
  gas_value=analogRead(sensor);  
  ppm1 = ((gas_value/4095)*9800 );
  float ppm = ppm1 + 200;
  Serial.print("Kadar Gas : ");
  Serial.print(ppm);
  Serial.println(" ppm");
    
  // sensor dht22//
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  if (isnan(h) || isnan(t)) {
    Serial.println(F("Failed to read from DHT sensor!"));
  }
  float hic = dht.computeHeatIndex(t, h, false);
  Serial.print(F("Humidity: "));
  Serial.print(h);
  Serial.println(F("%"));
  Serial.print(F("Temperature: "));
  Serial.print(t);
  Serial.println(F("°C "));
  Serial.print(F("Heat index: "));
  Serial.print(hic);
  Serial.println(F("°C "));

  //Set values to send
    node2Readings.id = BOARD_ID;
    node2Readings.temp = t;
    node2Readings.hum = h;
    node2Readings.hic = hic;
    node2Readings.Flame = apiState;
    node2Readings.gas = ppm;

        // Send message via ESP-NOW
    esp_now_send(unicastAddress, (uint8_t *) &node2Readings, sizeof(node2Readings));
}
}

I thought (??) that ESP-NOW requires disabling WiFi - it's the one or the other.
Maybe it's possible for the ESP-NOW receiver ('S') to switch between that and being a SoftAP (pretty advanced).

should i add another esp8266 to use wifi?, or should I do that SoftAP method?

This guy presents ESP-Now as thoroughly as I've seen.
ESP8266 NodeMCU: ESP-NOW Web Server Sensor Dashboard | Random Nerd Tutorials
My foray into ESP-NOW, a simple sender-to-receiver arrangement, required disabling WiFi.
I think he presented this WebServer + ESP-Now project afterward. For me it's Advanced.
(And he's really into typedef structs, and I would prefer things were more - basic.)