Simplificar código

Como eu poderia simplificar o código abaixo, especialmente a parte que chama a função ping e imprime o resultado? Pensei em concatenar parte da variável a ser tratada com um contador, exemplo external_ip+contador porém não sei como fazer.

#include <SPI.h>
#include <Ethernet.h>
#include <ICMPPing.h>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192,168,1, 177);
byte external_ip1[] = {72,21,215,232};
byte external_ip2[] = {8,8,8,8};
byte external_ip3[] = {200,154,56,80};
unsigned long initial_time = millis();

void setup() 
{
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}

int ping(byte use_ip[]){
  SOCKET pingSocket = 0;
  char buffer [256];
  int contador = 1;
  int contaOK = 0;
  boolean pingRet;
  ICMPPing ping(pingSocket);
  pingRet = ping(4, use_ip, buffer);
  return pingRet;
}

void loop() {
  int test;
  unsigned long current_time = millis();
  while ((current_time - initial_time) > 20000){
    initial_time = current_time;  
    test = ping(external_ip1);
    Serial.print (external_ip1 [0]);
    Serial.print (".");
    Serial.print (external_ip1 [1]);
    Serial.print (".");
    Serial.print (external_ip1 [2]);
    Serial.print (".");
    Serial.print (external_ip1 [3]);
    if (test == 0)
      Serial.println(" Não responde");
    else
      Serial.println(" Respondendo");
    test = ping(external_ip2);
    Serial.print (external_ip2 [0]);
    Serial.print (".");
    Serial.print (external_ip2 [1]);
    Serial.print (".");
    Serial.print (external_ip2 [2]);
    Serial.print (".");
    Serial.print (external_ip2 [3]);
    if (test == 0)
      Serial.println(" Não responde");
    else
      Serial.println(" Respondendo");
    test = ping(external_ip3);
    Serial.print (external_ip3 [0]);
    Serial.print (".");
    Serial.print (external_ip3 [1]);
    Serial.print (".");
    Serial.print (external_ip3 [2]);
    Serial.print (".");
    Serial.print (external_ip3 [3]);
    if (test == 0)
      Serial.println(" Não responde");
    else
      Serial.println(" Respondendo");
  }
}

Isto provavelmente funciona…

Mas estás a cometer um erro grave de standard. Se existe a função ping definida na biblioteca, não definas outra função ping. Hoje o código funciona, mas amanhã pode não funcionar.
Se pretendes meter a função ping dentro de algo criado por ti, chama a função de MyPing, _Ping, MeuPing, etc… mas nunca com o mesmo nome de algo que já existe.

Estou também a ver que o teu while deve ficar empancado… Se o teu initial_time é igual ao current time, só se esse pedaço de código demorar 20 segundos é que salta fora do loop.

Relativamente à tua dúvida, crias uma variável…

byte external_IP[3][4] = {{72,21,215,232},{8,8,8,8},{200,154,56,80}};

void loop() {
unsigned long num_testes = 0; //conta o numero de testes. 
 int test = 0;
  unsigned long current_time = millis();
  while ((current_time - initial_time) > 20000){
    initial_time = current_time;  
    for (int IPs = 0; IPS < 3; IPs++) {
        Serial.print("Teste # ");
        Serial.println(num_testes++);
        test = ping(external_ip[IPs]);
        for (int octetos = 0; octetos < 4; octetos++){
            Serial.print(external_IP[IPs][octetos]);
            if (octetos < 3) Serial.print(".");  //o útlimo não leva ponto. 
        } //end for octetos
    if (test == 0)
      Serial.println(" Não responde");
    else
      Serial.println(" Respondendo");
    } //end for IPs
  } //end while

Simplificado assim?

O código ficou ótimo, também já corrigi o restante conforme suas recomendações.

Obrigado!