Hallo ehenkes,
du hast einen wichtigen Teil:

FrontLED(OFF);
LineData(lineData); // Messung mit LED OFF
doff = (lineData[0] - lineData[1]); // zur Kompensation des Umgebungslicht
FrontLED(ON);
LineData(lineData); // Messung mit LED ON
don = (lineData[0] - lineData[1]);
x = don - doff; // Regelabweichung

in deinem Sourse eleminiert.
Damit verlierst du schon mal die Umgebungslicht-Unabhängigkeit. Zwar hast du in deinem main() am Anfang einen ADOffset-Wert ermittelt, aber der ist auch schon bei eingeschalteter Front-LED berechnet worden, und wird auch nicht mehr angepasst.
Nun hatte waste seine PID-Werte aber für Sensorwerte ermittelt, bei denen das 'x = don - doff; // Regelabweichung' aber eben nach genau diesem Prinzip berechnet wird. (Somit wird x bei waste immer kleiner sein als bei dir, was zur Folge hat, dass die Abweichung vom Sollwert bei dir immer anders 'aussieht')
Ausserdem hatte waste einen Zeitwert in dem Regler berücksichtigt, der vor allem durch die Sensorabfrage (ADC-Wandler) vorgegeben war. In wastes Lösung aber werden 4 ADC-Messwerte ermittelt, somit ist alleine schon der Zeitfaktor der Schleife komplett anders als nun bei dir.
Dein Versuch nun, die von waste ermittelten PID-Werte anzupassen
kp = 3; ki = 10; kd = 70; <-- deine
kp = 10; ki = 4; kd = 70; <-- waste-Original
sehen mir nun wirklich danach aus, dass du die Frage nach diesen Werten hier stellen musst. Die Werte sind doch empirisch ermittelt, und nicht berechnet. (Dann wäre ja die Frage überflüßig.)

Um nun nicht so auszusehen, als ob ich die Berechnungen und Gründe was da nun alles ermittelt und in Betracht gezogen werden muss, aus dem Thread von waste verstanden zu haben, hier mein Geständniss: Das Prinzip ist mir klar, aber nicht der Weg zur Lösung (kp,ki,kd). Somit kann ich nun nicht mehr weiterhelfen.