Höhere ADW-Auflösung - Oversampling?

Oversampling um künstliche die Auflösung zu erhöhen gibt es schon. Siehe Atmel Application Notes:
http://www.atmel.com/images/doc8003.pdf
Das hängt mit der Frequenz des Signals zusammen. Die Sampling-Rate muss mehrfach über der normalen Nyquist-Frequenz liegen. Und zwar um einen Faktor von 4 pro Bit.

Wenn ich das mal grob betrachte triggerst du den ADC jetzt wahrscheinlich über den Timer, so dass er ständig misst. Du hast einen Puffer mit 16 Werten der ständig beschrieben wird. Das könnte soweit passen

Das hier sieht aber nicht gut aus:

if(i==0)
{
    sum = sum>>2;
    Serial.println(sum,DEC);
}

Serial hat in einem Interrupt nichts verloren! Setze statt dessen einen boolean (auch als volatile deklarieren!) den du in ständig loop() abfragst. So kannst du aus der ISR der Loop mitteilen, dass sie was erledigen soll.

Alle 5 Sekunden eine Messung kannst du auch mit millis() machen. Indem du einfach den Wert (sum) nur alle 5 Sekunden ausliest.

void loop()
{
     static unsigned long lastMillis;

     if(millis() - lastMillis > 5000)
     {
          Serial.println(sum);
          lastMillis = millis();
     }
}

Gemessen wird dann immer noch ständig. Wenn du wirklich tatsächlich nur alle 5 Sekunden 16 Messungen machen willst kann man den ADC auch über das ADEN Bit deaktivieren. Oder man schaltet den Timer an und aus (über die CS Bits). Dann wird der ADC auch nicht mehr getriggert. Dann brauchst du aber noch Statusvariablen um zu wissen was gerade gemacht wird.