Der ESP der es gleichzeitig nutzt ist eher nicht das Problem. Denn durch das verbinden mit dem WiFi stellt sich der Kanal automatisch.
Das Problem liegt eher bei den stromsparenden ESPs mit den Sensoren. Da hilft aber eine kleine Routine, falls keine ESP-now Verbindung aufgebaut werden kann, wird sich kurz ins WLAN verbunden, dadurch stellt sich der Kanal ein, wird ein WiFi San ausgeführt und der Channel, der im Sketch hinterlegten SSID, im nichtdeepsleepflüchtigem RTC Speicher hinterlegt.
Und es passiert eher selten, das sich der WiFi Kanal wechselt, zumindest in meinem Heimnetz. Man könnte auch einen festen Kanal einstellen, aber es ist kein muss.
Edit: Gefunden. Vom 09.10.22. Doch schon so lange her 
//Bibliotheken
#include <Wire.h> // für I2C (BME280, OLED, etc.)
#include <Adafruit_Sensor.h> // für BME280
#include <Adafruit_BME280.h> // für BME280
#include <ESP8266WiFi.h> // ESP8266 WLAN Bibliothek
#include <Adafruit_GFX.h> // OLED GFX Bibliothek
#include <Adafruit_SSD1306.h> // OLED SSD1306 Bibliothek
#include <espnow.h>
//OLED SSD1306
#define OLED_RESET -1 // Reset Pin # (oder -1 zum nutzen des internen Reset Pins)
#define SCREEN_WIDTH 128 // OLED Display Weite, in Pixels
#define SCREEN_HEIGHT 64 // OLED Display Höhe, in Pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // OLED initialisieren
const char* ssid = "YOUR_SSID"; // WLAN Name (SSID)
const char* zimmer = "Kinder"; // Fürs Display
const uint16_t hoehe = 114; // Höhe zur Bestimmung des Luftdrucks auf Meereshöhe
uint8_t gatewayAddress[] = {0xEC, 0xFA, 0xBC, 0x58, 0xA4, 0x76}; // Empfänger-Adresse
String rinfo;
const unsigned long sleepTime = 3e8; // Schlafzeit in µS // Bsp: 3e8 = "3 und 8mal 0" = 300.000.000µs = 300.000ms = 300s = 5Min
// ID 10=Kinder; 11=Schlafen; 12=Bad; 13=Wohnen;
struct PaketStruktur{
uint32_t Loop; // LoopZeit in Microsekunden
uint16_t ID = 10; // (0..65535) - Eindeutige ID des Senders
int16_t Temp = -999; // Temperatur * 10
uint16_t Humi = 0; // Luftfeuchtigkeit % * 10
uint16_t Druck = 0; // Druck hPa
uint16_t Vcc = 0; // Batteriespannung in mV
int16_t NTC = 0; // NTC Temperatur
uint16_t Read = 0; // Magnetkontakt Wert / LinkerRead, RechterRead / 0 = 0b00 beide Reads geschlossen / 1 = 0b01 rechter Read offen / 2 = 0b10 linker Read offen / 3 = 0b11 beider Reads offen
uint16_t NoCC = 0; // Übertragungsversuche seit letzten ACK
};
PaketStruktur payload;
struct { // Struktur zum Speichern des RTC User Memorys (4 Byte Blöcke)
uint32_t WiFiChannel = 0;
} rtcData;
Adafruit_BME280 bme; // Objekt für BME280 erstellen
void setup() {
payload.Loop=micros();
Serial.begin(115200);
ESP.rtcUserMemoryRead(0, (uint32_t*) &rtcData, sizeof(rtcData)); // RTC User Memory auslesen
Serial.print("Ausgelesener RTC Channel: "); Serial.println(rtcData.WiFiChannel);
rinfo = ESP.getResetReason(); // Resetgrund einlesen
Serial.print("Resetgrund: "); Serial.println(rinfo);
bme.begin(0x76); // I2C Adress
bme.setSampling( Adafruit_BME280::MODE_FORCED,
Adafruit_BME280::SAMPLING_X1, // temperature
Adafruit_BME280::SAMPLING_X1, // pressure
Adafruit_BME280::SAMPLING_X1, // humidity
Adafruit_BME280::FILTER_OFF );
WiFi.mode(WIFI_STA);
if(rtcData.WiFiChannel == 0 || rtcData.WiFiChannel > 13){ // Wenn der aus dem RTC User Memory eingelesen Wert ist
rtcData.WiFiChannel = getWiFiChannel(ssid); // liefert den eingestellten Channel der oben hinterlegten SSID // kostet ungefähr 2,5 Sekunden !!
ESP.rtcUserMemoryWrite(0, (uint32_t*) &rtcData, sizeof(rtcData)); // Neu eingelesenen WiFi Channel in den RTC User Memory schreiben
}
// WiFi.printDiag(Serial); // Uncomment to verify channel number before // Serielle Ausgabe der WiFi Einstellungen
// wifi_promiscuous_enable(1); // aus dem Beispiel, wird aber offenbar nciht benötigt.
wifi_set_channel(rtcData.WiFiChannel); // Setzt den Channel. Channel muss der des Empfängers sein. Der Empfänger richtet automatisch seinen Channel nach dem WLAN
// wifi_promiscuous_enable(0); // aus dem Beispiel, wird aber offenbar nciht benötigt.
// WiFi.printDiag(Serial); // Uncomment to verify channel change after // Serielle Ausgabe der WiFi Einstellungen
WiFi.disconnect(); // Wifi wird nicht benötigt
if (esp_now_init() != 0) { // EPS-now starten, und wenn es fehl schlägt schlafen gehen
Serial.println("Error initializing ESP-NOW");
ESP.deepSleep(sleepTime); // Schlafzeit in Nanosekunden, für DeepSleep muss D0 mit Reset verbunden sein, zum aufwecken
delay(100); // soll benötigt werden um korekt schlafen zu gehen
}
esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER); // Sender
esp_now_register_send_cb(OnDataSent); // Funktion für Sendebericht
esp_now_add_peer(gatewayAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0); // Funktion zum verbinden
measureValues(); // Werte einlesen
payload.Loop = micros()-payload.Loop; // Laufzeit berechnen
esp_now_send(0, (uint8_t *) &payload, sizeof(payload)); // Werte senden // braucht ein paar Millisekunden für einen erfolgreichen Sendebericht
delay(500); // Delay für den zweiten Tastendruck für das Display
if (rinfo == "External System"){ // Wenn Resetgrund = Resettaster, Display starten
oled();
}
ESP.deepSleep(sleepTime); // Schlafzeit in Nanosekunden, für DeepSleep muss D0 mit Reset verbunden sein, zum aufwecken
delay(100); // soll benötigt werden um korekt schlafen zu gehen
}
void loop() {} // wird bei DeepSleep nicht benötigt
int32_t getWiFiChannel(const char *ssid) { // Scannen der WLAN-Netze, vergleichen mit der oben eingestellten SSID, und bei Übereinstimmung die ermittlung des Channels des Netzes
if (int32_t n = WiFi.scanNetworks()) {
for (uint8_t i=0; i<n; i++) {
if (!strcmp(ssid, WiFi.SSID(i).c_str())) {
return WiFi.channel(i);
}
}
}
return 0;
}
void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) {
Serial.print("\r\nSende-Status: ");
if (sendStatus == 0){
Serial.println("Zugestellt");
}
else{
Serial.println("Zustellung Fehlgeschlagen, Scanne Channel");
rtcData.WiFiChannel = 0; // WiFiChannel auf 0 setzen
ESP.rtcUserMemoryWrite(0, (uint32_t*) &rtcData, sizeof(rtcData)); // Und in den RTC User Memory schreiben. Beim nächsten Start wird dadurch der Channel neu ermittelt
}
}
void oled() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // I2C address = 0x3C (links) oder 0x3D (rechts) (Aufdruck Rückseite verkehrt) // Kann durch umlöten des Widerstandes verändert werden.
delay(100); // Pause zum Disply initialisieren
display.clearDisplay(); // Display löschen
display.setTextSize(2); // Textgröße
display.setTextColor(WHITE); // Farbe (WHITE/BLACK)
display.setCursor(0, 0);
display.println(zimmer);
display.print(payload.Temp/10.0);
display.println("C");
display.print(payload.Humi/10.0);
display.println("%");
display.print(payload.Vcc/1000.0);
display.println("V");
display.display();
delay(10000);
display.clearDisplay();
display.display();
display.ssd1306_command(SSD1306_DISPLAYOFF);
}
void measureValues() {
bme.takeForcedMeasurement();
delay(10);
payload.Vcc = map(analogRead(A0),0,1023,0,4300);
payload.Temp = (bme.readTemperature()*10);
payload.Humi = (bme.readHumidity()*10);
payload.Druck = ((bme.readPressure()/(pow(1.0 - (hoehe / 44330.0), 5.255)))/100.0); //Luftdruckberechnung auf Merreshöhe
}