Esp32 find multiple esp-now slave MAC addresses automatically

This is part of a larger project that uses the esp32 as a tank level sensor for a boat. But of course, it could be used in any situation that uses non-metallic tanks. This code handles up to three slave cards, but it could be extended to more than three.

The code that does the job is mainly one function, but some variables are set in other places and the standard esp32 connection code has some flags added to it, but is primarily that provided by Espressif (the people who make the esp32). At present, the MAC address of the master card does need to be hard-coded into the sketch for the slave cards and there must be a variable created in the slave code and a corresponding struct_message value set to send the MAC value from the slave to the master, but other than that all the magic happens in code for the master card, which is below. I have bolded the specific areas where the functionality for this capability takes place. But maybe I missed something.

#include <esp_now.h>
#include <WiFi.h>
#include <Preferences.h>  // library to set up write-to-flash function 

Preferences prefString;  // Assignment to set up write-to-flash function
Preferences prefInteger;
String savedThreshHoldValue1;
String savedThreshHoldValue2;
String savedThreshHoldValue3;

#define CHANNEL 1
byte paddingValue = 10;
int doCalibrate1 = 5;
int doCalibrate2 = 5;
int doCalibrate3 = 5;
byte chooseTank = 2;
String dw_M_SSID; // these vars are to capture the mac addresses of the slaves
String macCapture = "00";
String slaveOneMac = "00";
String slaveTwoMac = "00";
String slaveThreeMac = "00";
unsigned int slaveCountNumber;
bool stopFindingMacs = 0;
int gotMacs = 0;
int saved_DoneWithMacs = 0;

String myMac = WiFi.macAddress() + "AB";

// Pins used 
// 18, 19, 21, 22, 23 for level LEDs  26 for Calibrate switch 04 for calibrate indiscator 
// pins 32 33 inupt_pullup used for setting display to tank 1, 2, or 3/
// tank indicator LED 04 16, 17, 

int macLock1 = 1111; // 1111 is UNlocked 9999 is LOCKED 
int macLock2 = 1111;
int macLock3 = 1111;

// REPLACE WITH THE MAC Address of your receiver - as this is the master it is using the broadcast-to-all 0xFF address
uint8_t broadcastAddress[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
//uint8_t broadcastAddress[] = { 0x30,0xC6,0xF7,0x05,0x9B,0x94 };   

//  MASTER - RECIVES DATA FROM THREE SLAVES AND SORTS THE DATA INTO THREE SERIAL OUTPUT DISPLAYS.
// This recives and labels them ONE  TWO AND THREE
// IT IS DEPENDENT ON PUTTING THE RIGHT IDENTIFIER INTO the right var SUCH AS 949494 OR 707070 OR 787878

//unsigned long previousMillis = 0;        // will store last time LED was updated
//const long interval = 10000;
//const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
String saved_MacValue1;
String saved_MacValue2;
String saved_MacValue3;
unsigned int  count_lookForMacAddr = 0;
char CharFromMstr[32]; // = "123456789 123456789 1234567893";

// Define variables to hold incoming incoming LED status readings
int incomingSlaveNumber;
int incomingSensorVarA1;
int incomingSensorVarA2;
int incomingSensorVarA3;
int incomingSensorVarA4;
int incomingSensorVarA5;
char incomingSlaveMacA;

int incomingSensorVarB1;
int incomingSensorVarB2;
int incomingSensorVarB3;
int incomingSensorVarB4;
int incomingSensorVarB5;

int incomingSensorVarC1;
int incomingSensorVarC2;
int incomingSensorVarC3;
int incomingSensorVarC4;
int incomingSensorVarC5;
String success;  // Variable to store if sending data was successful

void InitESPNow() {  // Init ESP Now with fallback
	WiFi.disconnect();
	if (esp_now_init() == ESP_OK) {
		Serial.println("ESPNow Init Success");
	} else {
		Serial.println("ESPNow Init Failed");
		// Retry InitESPNow, add a counte and then restart?
		// InitESPNow();
		// or Simply Restart
		ESP.restart();
	}
}

// config AP SSID  with indetifying mac
void configDeviceAP() {
	String Prefix = "Master_dw:";
	String Mac = WiFi.macAddress();
	String SSID = Prefix + Mac;
	String Password = "123456789";
	bool result = WiFi.softAP(SSID.c_str(), Password.c_str(), CHANNEL, 0);
	if (!result) {
		Serial.println("AP Config failed.");
	} else {
		Serial.println("AP Config Success. Broadcasting with AP: " + String(SSID));
		dw_M_SSID = String(SSID);
	}
}


//Structure example to send data
//Must match the receiver structure
typedef struct struct_message {
	int slaveNumber;
	int sensor1; // used to send the LED ON/OFF VALUES WE NEED 5 EVEN IN THE ONCE SENSOR VERSION
	int sensor2; // AS THERE ARE STILL 5 LED INDICATORS
	int sensor3;
	int sensor4;
	int sensor5;
  int setEmptyOrFull;
	char CharFromMstr[32];  // used to exchaqnge MAC VALUES
	char CharFromSlave1[32];  // used to exchaqnge MAC VALUES
	char CharFromSlave2[32];// used to exchaqnge MAC VALUES
	char CharFromSlave3[32];// used to exchaqnge MAC VALUES
	byte dw_pad;   // padding value in 5 sensor version, probably obsolete
	int doCalibrate1;  // To send calibration request to slave 
	int doCalibrate2;  // To send calibration request to slave 
	int doCalibrate3;  // To send calibration request to slave 
} struct_message;

// Create a struct_message called BME280Readings to hold VARIABLES TO SEND TO SLAVES
struct_message outgoingMasterToSlave;

// Create a struct_message to hold incoming sensor readings
struct_message incomingFromSlaves;

// Callback when data is sent
void OnDataSent(const uint8_t* mac_addr, esp_now_send_status_t status) {
	Serial.print("\r\nLast Packet Send Status:\t");
	Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
	String macAddress1 = WiFi.macAddress();
	if (status == 0) {
		success = "Delivery Success :)";
		String Mac = WiFi.macAddress();
		Serial.println("AP Config Success. Broadcasting from MASTER with AP: " + String(Mac));
	} else {
		success = " OUTGOING DELIVER FAIL FAIL FAIL FAIL FAIL Delivery Fail :(";
	}
}

// Callback when data is received
void OnDataRecv(const uint8_t* mac, const uint8_t* incomingData, int len) {
	memcpy(&incomingFromSlaves, incomingData, sizeof(incomingFromSlaves));
	char macStr[18];
	snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
			 mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
	Serial.print("Bytes received: ");
	Serial.println(len);
	Serial.print("////////////// LAST PACKET RECV FROM  ///////////: "); Serial.println(macStr);
	Serial.print("Last Packet Recv Data: "); Serial.println(*incomingData);
	Serial.print("Bytes received: ");
	Serial.println(len);
	Serial.print(" Mac address from SLAVE as CHAR  >>>>>>>>>>>>>>>: ");
	Serial.println(incomingFromSlaves.CharFromSlave1);
	delay(2000);
	macCapture = macStr; // capture the MAC id of the current slave being read
	findSave_SlaveMacAddr();// collect slave addresses, assign to a tank and then save to flash memory
	// save_SlaveMacAddr();  // we probably don't need this and it should be eliminated.

	save_FoundAllMacs();

	captureAndDisplaySlave1(); // capture incoming sensor values based on the slave slected 
	captureAndDisplaySlave2();
	captureAndDisplaySlave3();

}

void setup() {
	Serial.begin(115200);
	prefString.begin("macAssign", false);//for nonvolitile memory process  NO ERROR REPORTED IF MISSING!
	prefInteger.begin("allMacsSaved", false);//for nonvolitile memory process  NO ERROR REPORTED IF MISSING!

	pinMode(26, INPUT_PULLUP);  // enable internal pull-up  for calibration pushbutton	

	factoryReset();  // Check if -factory reset- button is pressed during startup
	displaySlaveMacAddr(); // This is for testing 

	pinMode(32, INPUT_PULLUP);  // for chooseTank switch 
	pinMode(33, INPUT_PULLUP); // for chooseTank switch 

	pinMode(4, OUTPUT); // this is for LED that indicates button has been pressed long enough
	pinMode(16, OUTPUT);
	pinMode(17, OUTPUT);
	pinMode(18, OUTPUT);
	pinMode(19, OUTPUT);
	pinMode(21, OUTPUT);
	pinMode(22, OUTPUT);
	pinMode(23, OUTPUT);

	WiFi.mode(WIFI_AP_STA);  // configure device AP mode	
	configDeviceAP();
	if (esp_now_init() != ESP_OK) {  // Init ESP-NOW  Set device as a Wi-Fi Station
		Serial.println("Error initializing ESP-NOW");
		return;
	}
	esp_now_register_send_cb(OnDataSent); // register for Send CB to get the status of Trasnmitted packet
	esp_now_peer_info_t peerInfo;  // Register peer
	memcpy(peerInfo.peer_addr, broadcastAddress, 6);
	peerInfo.channel = 0;
	peerInfo.encrypt = false;
	if (esp_now_add_peer(&peerInfo) != ESP_OK) {  // Add peer
		Serial.println("Failed to add peer");
		return;
	}
	esp_now_register_recv_cb(OnDataRecv);// Register callback function that is called when data is received
}

void loop() { // *************************** start loop *******************************

	Serial.println("*************************** start loop *******************************");
	Serial.println("*************************** start loop *******************************");
	Serial.println("*************************** start loop *******************************");
	Serial.print("VALUE OF  >>var<< DONE - WITH - MACS done collecting mac addresses  : ");
	Serial.println(saved_DoneWithMacs);
	Serial.print("VALUE OF  >>GET<<  DONE - WITH - MACS done collecting mac addresses  : ");
	Serial.println(prefInteger.getUInt("GetStatus", gotMacs));
	delay(2000);

	

	int	saved_GetMacsIsDone = prefInteger.getUInt("GetStatus", gotMacs);
	Serial.print("*******       THIS IS THE  VALUE   >>>>>>>>>>>  saved_GetMacsDone <<< >>>>>>> ");
	Serial.println(saved_GetMacsIsDone);
	Serial.print("         THIS IS  prefInteger.getUInt( 'tempValue2', gotMacs) >>>>>> ");
	Serial.println(prefInteger.getUInt("GetStatus", gotMacs));
	Serial.println("  ");

	//	delay(5000);
	displaySlaveMacAddr(); // this is just for testing 

	chooseTank = selectTank(); 	// part of set mac of slave function 

	pressForCalibrate(); //  read pushbutton to send calibrate request to slave

	valuesToSend();  // collect the values that will be sent to slaves
	//delay(5000);
	sendMessageToSlaves(); // send the message to the slave with esp-now

} // **********************************   end loop  **************************************************


void findSave_SlaveMacAddr() {
	Serial.println(" ***************   ARE LOOKING FOR MAC ADDRESSES ?????   ****************");
	Serial.print("   *********  VALUE OF >  ||| STOP FINDING MACS |||           >>>>>> : ");
	Serial.println(prefInteger.getUInt("GetStatus", gotMacs));
	if (stopFindingMacs == 0 && gotMacs == 0 && prefInteger.getUInt("GetStatus", gotMacs) == 0) {
		Serial.println(" *********  WE >>> ARE <<<< LOOKING FOR MAC ADDRESSES * LOOKING * LOOKING *LOOKING **");
		//	delay(5000);
		if (gotMacs == 0) {
			count_lookForMacAddr++;
		} // increment the counter if we got this far
		if (slaveOneMac == "00") {
			slaveOneMac = macCapture;
			prefString.putString("slaveNum1", slaveOneMac); // SAVE VALUE TO PERMANENT FLASH STORAGE
			saved_MacValue1 = prefString.getString("slaveNum1", slaveOneMac);
			macLock1 = 9999;
		}	// set one 
		if (slaveTwoMac == "00" && macLock1 == 9999 && macCapture != slaveOneMac) {
			slaveTwoMac = macCapture; // set two 
			prefString.putString("slaveNum2", slaveTwoMac); // SAVE VALUE TO PERMANENT FLASH STORAGE
			saved_MacValue2 = prefString.getString("slaveNum2", slaveTwoMac);
			macLock2 = 9999;
		}
		if (slaveTwoMac != "00" && macLock2 == 9999 && macLock1 == 9999 && macCapture != slaveOneMac && macCapture != slaveTwoMac) {
			slaveThreeMac = macCapture; // set three
			prefString.putString("slaveNum3", slaveThreeMac); // SAVE VALUE TO PERMANENT FLASH STORAGE
			saved_MacValue3 = prefString.getString("slaveNum3", slaveThreeMac);
			macLock3 = 9999;
		}
		Serial.println("");
		Serial.print("    value of dw_ssid >>>> ");
		Serial.println(dw_M_SSID);
		Serial.println("     ");
		Serial.print("      Value of XXX  >>>> ");
		Serial.println(macCapture);
		Serial.print("                                  Value of slaveOneMac >>>> ");
		Serial.println(slaveOneMac);
		Serial.print("                                  Value of slaveTwoMac >>>> ");
		Serial.println(slaveTwoMac);
		Serial.print("                                Value of slaveThreeMac >>>> ");
		Serial.println(slaveThreeMac);
		Serial.print("                                         value of counter : ");
		Serial.println(count_lookForMacAddr);

		if (slaveOneMac != "00" && slaveTwoMac != "00" && slaveThreeMac != "00") {
			Serial.println("               ");
			Serial.println("**********************  WE CAN SAVE THIS *******************************");
			Serial.println(" ***************  WE HAVE FOUND ALL THE SLAVES - STOP LOOKING !!!! ************");

			stopFindingMacs = 1; //if we got to here in find_SlaveMacAddr, set flag and stop looking for slaves
			 //if we got to here in find_SlaveMacAddr, set flag and stop looking for slaves
			if (stopFindingMacs == 1); {
				gotMacs = 1;  // this will go to nonvolitle stoage 
				Serial.println("stopFindingMacs = 1  && gotMacs = 1 **** NO LONGER LOOKING FOR MACS !!!!  *****");
				Serial.println("stopFindingMacs = 1  && gotMacs = 1 **** NO LONGER LOOKING FOR MACS !!!!  *****");
				displaySlaveMacAddr();
				//	delay(5000);
				Serial.print("                                                                gotMacs = :  ");
				Serial.println(gotMacs);
				//	delay(9000);
			}
		}
	}  //  stop finding if macs == 0
	if (count_lookForMacAddr >= 7) { gotMacs = 1; }
	// save_SlaveMacAddr();
} // end fuction 

void save_FoundAllMacs() { // Just save the flag that says all macs are found and stored
	Serial.println(" SEE IF WE ARE GOING TO SAVE THE DONE-WITH-MACS FLAG  ");
	saved_DoneWithMacs = prefInteger.getUInt("GetStatus", gotMacs);
	//	saved_DoneWithMacs = 0; // THIS IS FOR TESTING, >> TO RESET <<  SHOULD BE REMOVED FOR PRODUCTION
	if (saved_DoneWithMacs == 0) {
		prefInteger.putUInt("GetStatus", gotMacs);
	}
	saved_DoneWithMacs = prefInteger.getUInt("GetStatus", gotMacs);
}

void save_SlaveMacAddr() {  // this may not be needed as it was included in other function
	Serial.println("  BEFORE saving the macs TO FLASH STORAGE   ");

	Serial.print(" STOP FINDING MACS  =  :   ");
	Serial.println(stopFindingMacs);
	Serial.print("          GOT MACS  =  :   ");
	Serial.println(gotMacs);
	Serial.print("  GET U INIT GOT MACS  :   ");
	Serial.println(prefInteger.getUInt("GetStatus", gotMacs));
	delay(7000);
	if (stopFindingMacs == 0 && gotMacs == 0 && prefInteger.getUInt("GetStatus", gotMacs) == 0) {
		Serial.print("    WE NOW SAVING MAC  ADDRESSES ********************** ");
		delay(5000);
		if (slaveOneMac != "00" && slaveTwoMac != "00" && slaveThreeMac != "00") { // if all have macs, skip
			if (slaveOneMac != "00" && gotMacs == 0) {
				prefString.putString("slaveNum1", slaveOneMac); // if slot one is empty SAVE MAC TO FLASH 
				Serial.print(" SAVING * SAVING * SAVING  KEY SlaveNum1 TO FLASH display   saved_MacValue1   : ");
				saved_MacValue1 = prefString.getString("slaveNum1", slaveOneMac);
				Serial.println(saved_MacValue1);
				delay(9000);
			}
			if (slaveTwoMac != "00" && gotMacs == 0) {
				prefString.putString("slaveNum2", slaveTwoMac); // if slot two is empty SAVE MAC TO FLASH
				Serial.print(" SAVING * SAVING * SAVING  KEY SlaveNum2 TO FLASH display   saved_MacValue2   : ");
				saved_MacValue2 = prefString.getString("slaveNum2", slaveTwoMac);
				Serial.println(saved_MacValue2);
				delay(9000);
			}
			if (slaveThreeMac != "00" && gotMacs == 0) {
				prefString.putString("slaveNum3", slaveThreeMac); // if slot three is empty SAVE MAC TO FLASH
				Serial.print(" SAVING * SAVING * SAVING  KEY SlaveNum3 TO FLASH display   saved_MacValue3   : ");
				saved_MacValue3 = prefString.getString("slaveNum3", slaveThreeMac);
				Serial.println(saved_MacValue3);
				delay(9000);
			}
		} //end     of if to see if the slots are already filled.
	} //end    if stop finding macs  == 0 AND all macs have not been found


	/*
	saved_MacValue1 = prefString.getString("slaveNum1", slaveOneMac);
	delay(20);
	saved_MacValue2 = prefString.getString("slaveNum2", slaveTwoMac);
	delay(20);
	saved_MacValue3 = prefString.getString("slaveNum3", slaveThreeMac);
	*/
	//  prefString.end(); //  I don' know what this does
} // end if

void displaySlaveMacAddr() {
	Serial.println("// *********    this is the start of display  *****************************");
	Serial.println("");
	Serial.print(" saved_MacValue1: ");
	Serial.print(saved_MacValue1 + "  slaveOneMac: ");
	Serial.print(slaveOneMac + "  getString(slaveNum1:   ");
	Serial.println(prefString.getString("slaveNum1", slaveOneMac));

	Serial.print(" saved_MacValue2: ");
	Serial.print(saved_MacValue2 + "  slaveTwoMac: ");
	Serial.print(slaveTwoMac +   "  getString(slaveNum2:   ");
	Serial.println(prefString.getString("slaveNum2", slaveTwoMac));

	Serial.print(" saved_MacValue3: ");
	Serial.print(saved_MacValue3 + "slaveThreeMac: ");
	Serial.print(slaveThreeMac + " getString(slaveNum3:    ");
	Serial.println(prefString.getString("slaveNum3", slaveThreeMac));
	Serial.print(" FLASH SAVED VALUE OF |||| saved_DoneWithMacs ||| >>>: ");
	Serial.println(prefInteger.getUInt("GetStatus", gotMacs));
	Serial.print(" VARIABLE       Value of count_lookForMacAddr : ");
	Serial.println(count_lookForMacAddr);
	delay(5000);

	Serial.println("");
	//	prefInt.putUInt("slaveCounter1", count_lookForMacAddr);
	//	storedLookForMacCounter = prefInt.getUInt("slaveCounter1", count_lookForMacAddr);
	delay(20);
	Serial.print(">>>>>> value of saved_DoneWithMacs >>>>> : ");
	Serial.println(saved_DoneWithMacs);
	Serial.println(prefInteger.getUInt("GetStatus", gotMacs));

}

void captureAndDisplaySlave1() {  // capture incoming sensor values based on the slave slected 
	// if (incomingFromSlaves.slaveNumber == 949494 && chooseTank == 1) {
	if (prefString.getString("slaveNum1", slaveOneMac) == macCapture && chooseTank == 1) {
		incomingSlaveNumber = incomingFromSlaves.slaveNumber;
		incomingSensorVarA1 = incomingFromSlaves.sensor1;
		incomingSensorVarA2 = incomingFromSlaves.sensor2;
		incomingSensorVarA3 = incomingFromSlaves.sensor3;
		incomingSensorVarA4 = incomingFromSlaves.sensor4;
		incomingSensorVarA5 = incomingFromSlaves.sensor5;
		incomingSlaveMacA = incomingFromSlaves.CharFromSlave1[32];
				if (incomingSensorVarA1 == 1) { digitalWrite(18, HIGH); }
		if (incomingSensorVarA1 == 0) { digitalWrite(18, LOW); }
		if (incomingSensorVarA2 == 1) { digitalWrite(19, HIGH); }
		if (incomingSensorVarA2 == 0) { digitalWrite(19, LOW); }
		if (incomingSensorVarA3 == 1) { digitalWrite(21, HIGH); }
		if (incomingSensorVarA3 == 0) { digitalWrite(21, LOW); }
		if (incomingSensorVarA4 == 1) { digitalWrite(22, HIGH); }
		if (incomingSensorVarA4 == 0) { digitalWrite(22, LOW); }
		if (incomingSensorVarA5 == 1) { digitalWrite(23, HIGH); }
		if (incomingSensorVarA5 == 0) { digitalWrite(23, LOW); }
		updateDisplay1();
	}
} // end of read the incoming sensor values 

void captureAndDisplaySlave2() {
	if (prefString.getString("slaveNum2", slaveTwoMac) == macCapture && chooseTank == 2) {
		incomingSlaveNumber = incomingFromSlaves.slaveNumber;
		incomingSensorVarB1 = incomingFromSlaves.sensor1;
		incomingSensorVarB2 = incomingFromSlaves.sensor2;
		incomingSensorVarB3 = incomingFromSlaves.sensor3;
		incomingSensorVarB4 = incomingFromSlaves.sensor4;
		incomingSensorVarB5 = incomingFromSlaves.sensor5;
		if (incomingSensorVarB1 == 1) {
			digitalWrite(18, HIGH);
		}
		if (incomingSensorVarB1 == 0) {
			digitalWrite(18, LOW);
		}
		if (incomingSensorVarB2 == 1) {
			digitalWrite(19, HIGH);
		}
		if (incomingSensorVarB2 == 0) {
			digitalWrite(19, LOW);
		}
		if (incomingSensorVarB3 == 1) {
			digitalWrite(21, HIGH);
		}
		if (incomingSensorVarB3 == 0) {
			digitalWrite(21, LOW);
		}
		if (incomingSensorVarB4 == 1) {
			digitalWrite(22, HIGH);
		}
		if (incomingSensorVarB4 == 0) {
			digitalWrite(22, LOW);
		}
		if (incomingSensorVarB5 == 1) {
			digitalWrite(23, HIGH);
		}
		if (incomingSensorVarB5 == 0) {
			digitalWrite(23, LOW);
		}
		updateDisplay2();
	}
}

void captureAndDisplaySlave3() {
	if (prefString.getString("slaveNum3", slaveThreeMac) == macCapture && chooseTank == 3) {
		incomingSlaveNumber = incomingFromSlaves.slaveNumber;
		incomingSensorVarC1 = incomingFromSlaves.sensor1;
		incomingSensorVarC2 = incomingFromSlaves.sensor2;
		incomingSensorVarC3 = incomingFromSlaves.sensor3;
		incomingSensorVarC4 = incomingFromSlaves.sensor4;
		incomingSensorVarC5 = incomingFromSlaves.sensor5;
		if (incomingSensorVarC1 == 1) {
			digitalWrite(18, HIGH);
		}
		if (incomingSensorVarC1 == 0) {
			digitalWrite(18, LOW);
		}
		if (incomingSensorVarC2 == 1) {
			digitalWrite(19, HIGH);
		}
		if (incomingSensorVarC2 == 0) {
			digitalWrite(19, LOW);
		}
		if (incomingSensorVarC3 == 1) {
			digitalWrite(21, HIGH);
		}
		if (incomingSensorVarC3 == 0) {
			digitalWrite(21, LOW);
		}
		if (incomingSensorVarC4 == 1) {
			digitalWrite(22, HIGH);
		}
		if (incomingSensorVarC4 == 0) {
			digitalWrite(22, LOW);
		}
		if (incomingSensorVarC5 == 1) {
			digitalWrite(23, HIGH);
		}
		if (incomingSensorVarC5 == 0) {
			digitalWrite(23, LOW);
		}
		updateDisplay3();
	}
}

byte selectTank() {// function to choose the active tank (tank being displayed) 
	if (digitalRead(32) == 0 && (digitalRead(33) == 0)) { chooseTank = 1; }
	if (digitalRead(32) == 1 && (digitalRead(33) == 1)) { chooseTank = 3; }
	if (digitalRead(32) == 0 && (digitalRead(33) == 1)) { chooseTank = 2; }
	if (digitalRead(32) == 1 && (digitalRead(33) == 0)) { chooseTank = 2; }
	Serial.print(" chooseTank  value  >>>> :  ");
	Serial.println(chooseTank);
	delay(1000);
	if (chooseTank == 1) {
		digitalWrite(16, LOW);
		digitalWrite(17, LOW);
		digitalWrite(4, HIGH);
	}
	if (chooseTank == 2) {
		digitalWrite(4, LOW);
		digitalWrite(17, LOW);
		digitalWrite(16, HIGH);
	}
	if (chooseTank == 3) {
		digitalWrite(16, LOW);
		digitalWrite(4, LOW);
		digitalWrite(17, HIGH);
	}
	return chooseTank;
}

void blinkLED1() { 	 // blink an LED to show request has be registered
	digitalWrite(4, HIGH); 	delay(300); digitalWrite(4, LOW); 	delay(900);
	digitalWrite(4, HIGH); 	delay(300);
	digitalWrite(4, LOW); delay(300); digitalWrite(4, HIGH); delay(300); digitalWrite(4, LOW); 	delay(300);
	digitalWrite(4, HIGH); 	delay(300);	digitalWrite(4, LOW); digitalWrite(4, HIGH); 	delay(500);
	digitalWrite(4, LOW); 	delay(300);	digitalWrite(4, HIGH); 	delay(300);
	digitalWrite(4, LOW); delay(300); digitalWrite(4, HIGH); delay(300); digitalWrite(4, LOW); 	delay(300);
	digitalWrite(4, HIGH); 	delay(300);	digitalWrite(4, LOW);
}
void blinkLED2() { 	 // blink an LED to show request has be registered
	digitalWrite(16, HIGH); 	delay(300); digitalWrite(16, LOW); 	delay(900);
	digitalWrite(16, HIGH); 	delay(300);
	digitalWrite(16, LOW); delay(300); digitalWrite(16, HIGH); delay(300); digitalWrite(16, LOW); 	delay(300);
	digitalWrite(16, HIGH); 	delay(300);	digitalWrite(16, LOW); digitalWrite(16, HIGH); 	delay(500);
	digitalWrite(16, LOW); 	delay(300);	digitalWrite(16, HIGH); 	delay(300);
	digitalWrite(16, LOW); delay(300); digitalWrite(16, HIGH); delay(300); digitalWrite(16, LOW); 	delay(300);
	digitalWrite(16, HIGH); 	delay(300);	digitalWrite(16, LOW);
}
void blinkLED3() { 	 // blink an LED to show request has be registered
	digitalWrite(17, HIGH); 	delay(300); digitalWrite(17, LOW); 	delay(900);
	digitalWrite(17, HIGH); 	delay(300);
	digitalWrite(17, LOW); delay(300); digitalWrite(17, HIGH); delay(300); digitalWrite(17, LOW); 	delay(300);
	digitalWrite(17, HIGH); 	delay(300);	digitalWrite(17, LOW); digitalWrite(17, HIGH); 	delay(500);
	digitalWrite(17, LOW); 	delay(300);	digitalWrite(17, HIGH); 	delay(300);
	digitalWrite(17, LOW); delay(300); digitalWrite(17, HIGH); delay(300); digitalWrite(17, LOW); 	delay(300);
	digitalWrite(17, HIGH); 	delay(300);	digitalWrite(17, LOW);
}

























void factoryReset() {
	Serial.print("   inside    factory reset  BEFORE BUTTON CHECK  ");
	delay(50);
	if (digitalRead(26) == 0) {
		delay(50);
		blinkLED1();
		gotMacs = 0;
		slaveOneMac = "00";
		saved_MacValue1 = "00";
		saved_MacValue2 = "00";
		slaveThreeMac = "00";
		saved_MacValue3 = "00";
		prefInteger.putUInt("GetStatus", gotMacs);
		prefString.putString("slaveNum1", slaveOneMac);
		prefString.putString("slaveNum2", slaveTwoMac);
		prefString.putString("slaveNum3", slaveThreeMac);
		Serial.print("            inside >>> AFTER <<<  BUTTON IS PUSHEED   factory reset  gotMacs  =  >>>> ");
		displaySlaveMacAddr();
		Serial.println(gotMacs);

		Serial.print("                      the get saved value >  value >>>> ");
		Serial.println(prefInteger.getUInt("GetStatus", gotMacs));
		//	delay(6000); // to be able to read the message
	}
}


void pressForCalibrate() {
	if (digitalRead(26) == 0 && chooseTank == 1) {
		blinkLED1();
		doCalibrate1 = 9999;
		Serial.print("            inside    readPushButton() function  Value of doCalibrate1 >>>> ");
		Serial.println(doCalibrate1);
		delay(500); // to be able to read the message
		Serial.print("                                                  alue of doCalibrate1 >>>> ");
		Serial.println(doCalibrate1);
		delay(2000); // to be able to read the message
	}
	if (digitalRead(26) == 0 && chooseTank == 2) {
		blinkLED2();
		doCalibrate2 = 9999;
		Serial.print("            inside    readPushButton() function  Value of doCalibrate1 >>>> ");
		Serial.println(doCalibrate2);
		delay(500); // to be able to read the message
		Serial.print("                                                 Value of doCalibrate1 >>>> ");
		Serial.println(doCalibrate2);
	}
	if (digitalRead(26) == 0 && chooseTank == 3) {
		blinkLED3();
		doCalibrate3 = 9999;
		Serial.print("            inside    readPushButton() function  Value of doCalibrate1 >>>> ");
		Serial.println(doCalibrate3);
		delay(500); // to be able to read the message
		Serial.print("                                                  Value of doCalibrate1 >>>> ");
		Serial.println(doCalibrate3);
	}

} // end of read pushbutton

void valuesToSend() {    // values TO SEND TO SLAVE
	char StingToChar[32]; // ; // " test one in TO SEND";
	myMac.toCharArray(StingToChar, sizeof(StingToChar));
	strcpy(outgoingMasterToSlave.CharFromMstr, StingToChar);

	outgoingMasterToSlave.CharFromMstr[32]; // = "assign var in To Send";

	outgoingMasterToSlave.dw_pad = paddingValue;
	outgoingMasterToSlave.doCalibrate1 = doCalibrate1;
}

void sendMessageToSlaves() {  // Send the message from Master to Slave via ESP-NOW

	Serial.print("sending padding and doCalibrate >>>>>> : ");
	Serial.print(outgoingMasterToSlave.dw_pad);
	Serial.print("  <<<<<<  >>> ");
	Serial.print(outgoingMasterToSlave.doCalibrate1);
	Serial.println("  <<<<<<  sending char from master 32  ");
	Serial.print(outgoingMasterToSlave.CharFromMstr[32]);
	Serial.println("  <<<<<<   ");


	//delay(5000); // to be able to read the message
	esp_err_t result = esp_now_send(broadcastAddress, (uint8_t*)&outgoingMasterToSlave, sizeof(outgoingMasterToSlave));
	if (result == ESP_OK) { // If the message was recived by the slave, do the following
		Serial.println("***************MESSEGE RECEIVED BY A SLAVE with success  ********************");
		if (outgoingMasterToSlave.doCalibrate1 == 9999) { // if 9999 was recieved SUCCESFULLY, reset the value to 1111 
			doCalibrate1 = 1111;
		}
	} else {
		Serial.println("ERROR SENDING DATA TO THE SLAVE ");
		delay(1000); // allow time to read the message
	}
	delay(150); // allow time to read the message
}

void updateDisplay1() { // create function Display Readings in Serial Monitor
	String Mac = WiFi.macAddress();
	//  Serial.print("MAC OF THE MASTER CARD =====================   :  ");
	// Serial.println(Mac);
	Serial.println("======== THIS IS THE MASTER AND LED DISPLAY   >>111  ONE  111<<  ====== (14)");
	Serial.print("SAVED mac value");
	Serial.println(prefString.getString("slaveNum1", slaveOneMac));
	Serial.print("CURRENT  mac value");
	Serial.println(macCapture);
	Serial.print("TANK 1  TANK 1      TANK 1");


	Serial.print("incomingSensorVarA1:   ");
	Serial.println(incomingSensorVarA1);
	Serial.print("incomingSensorVarA2:   ");

	Serial.println(incomingSensorVarA2);
	Serial.print("incomingSensorVarA3:   ");
	Serial.println(incomingSensorVarA3);
	Serial.print("incomingSensorVarA4  : ");
	Serial.println(incomingSensorVarA4);
	Serial.print("incomingSensorVarA5  : ");
	Serial.println(incomingSensorVarA5);
	Serial.print(" Mac address from SLAVE as CHAR  >>>>>>>>>>>>>>>: ");
	Serial.println(incomingFromSlaves.CharFromSlave1);
	Serial.println(incomingSlaveMacA);

	Serial.print("   //////////            Start of loop -- doCalibrate1 =  : "); Serial.println(doCalibrate1);
	Serial.print(" digitalRead(26) ====  : "); Serial.println(digitalRead(26));

	//Serial.print("                             BUTTON STATUS  IS  >>>>>   : ");  Serial.println(pinValue);
//	Serial.print("    outgoing From Master To Slave.reSetCalFlag IS >>>   : ");
//	Serial.println(outgoingMasterToSlave.requestToCalibrateSensors);
	delay(3000);
}

void updateDisplay2() { // create function to Display Readings in Serial Monitor
	String Mac = WiFi.macAddress();
	Serial.print("MAC OF THE MASTER CARD =====================  :  ");
	Serial.println(Mac);
	Serial.println("== THIS IS THE MASTER AND LED DISPLAY     >>TWO<< ");
	Serial.print("SAVED mac value");
	Serial.println(prefString.getString("slaveNum2", slaveTwoMac));
	Serial.print("CURRENT  mac value");
	Serial.println(macCapture);
	Serial.print("TANK 2  TANK 2      TANK 2");
	Serial.print("incomingSensorVarB1:  ");
	Serial.println(incomingSensorVarB1);
	Serial.print("incomingSensorVarB2:  ");
	Serial.println(incomingSensorVarB2);
	Serial.print("incomingSensorVarB3:  ");
	Serial.println(incomingSensorVarB3);
	Serial.print("incomingSensorVarB4 : ");
	Serial.println(incomingSensorVarB4);
	Serial.print("incomingSensorVarB5 : ");
	Serial.println(incomingSensorVarB5);
}

void updateDisplay3() { // create function  Display Readings in Serial Monitor
	String Mac = WiFi.macAddress();
	Serial.print("MAC OF THE MASTER CARD ===================== :  ");
	Serial.println(Mac);
	Serial.println("== THIS IS THE MASTER AND LED DISPLAY     >>333 THREE  333<< ");
	Serial.print("SAVED mac value");
	Serial.println(prefString.getString("slaveNum3", slaveThreeMac));
	Serial.print("CURRENT  mac value");
	Serial.println(macCapture);
	Serial.print("TANK 3  TANK 3      TANK 3");
	Serial.print("incomingSensorVarC1: ");
	Serial.println(incomingSensorVarC1);
	Serial.print("incomingSensorVarC2: ");
	Serial.println(incomingSensorVarC2);
	Serial.print("incomingSensorVarC3: ");
	Serial.println(incomingSensorVarC3);
	Serial.print("incomingSensorVarC4  ");
	Serial.println(incomingSensorVarC4);
	Serial.print("incomingSensorVarC5: ");
	Serial.println(incomingSensorVarC5);
	delay(5000);
}

Loading

Please share it. Thanks!