Ja, die Sub Main ansich muss drin bleiben, nur der Inhalt nicht*.
Also 9mA, das kommt hin. Angegeben sind typisch 11mA (ATmega8).
Die Main Loop läuft ja trotzdem kontinuierlich. Das ändern wir jetzt.
Dazu braucht man etwas Hintergrundwissen.
Die AVRs haben mehrere Sleep Modes. Je nachdem welche Hardware man nutzt - oder eben nicht - kann man den Controller tiefer schlafen legen. Je tiefer desto weniger Stromverbrauch. Was du nutzt weißt du ja. INT0, Timer1 und Uart. Vielleicht später noch ADC.
Hier ein Beispiel aus dem Datenblatt des ATmega8:
Hier zu sehen, es gibt 5 Sleep Modes. INTx weckt immer auf. ADC würde nur noch im ADC Noise Reduction und im Idle Mode laufen. Nutzt man diesen also, fallen schon 3 der 5 raus. Da du den Timer nutzt fallen Power Down und Standby raus. Da aber der Uart verwendet wird kommt nur noch der Idle Mode in Frage.
Die "Kollegen" haben es auch recht schön beschrieben:
www.mikrocontroller.net
Also. Jetzt muss man den Controller sagen wie tief er schlafen darf.
CodeBox BascomAVR
Config Powermode = Idle
Genaue Befehlsreferenz:
Technisch gesehen sagt man ihm das eigentlich (in Assembler und C) in der Init Phase und dann wenn er schlafen darf (also in der Main Loop) mittels Sleep Befehl.
Bascom sieht das scheinbar etwas anders. Da ist der Config Befehl gleichzeitig der Sleep Befehl. Sprich: Die Config Powermode ist jetzt die einzige Zeile in deiner Main Loop. Die CPU läuft dann nur noch bei Bedarf, also wenn eine der Interrupt Routinen läuft.
Im Idle ist er angegeben mit typisch 4,5mA, also immerhin rund ein Drittel.
Im PowerDown Mode wären es sogar unter 30µA, ohne Watchdog unter 3µA.
Klingt nicht nach viel, ist aber für Batteriebetriebene Anwendungen sehr wichtig.
Sollte man sich generell angewöhnen
Zum Lichtsensor, es kommt auf den Typ drauf an und wie du ihn verwenden möchtest. Ich verweise hier mal wieder auf die "Kollegen", da ich sowas noch nie selber gemacht habe. Vielleicht jemand anders hier?
www.mikrocontroller.net
*) Es gibt natürlich Situationen wo es durchaus sinnvoll ist Code in der Main abzuarbeiten, vor allem wenn man Routinen hat die Wartezeiten voraussetzen, wie das Beschreiben eines LCDs. Haben wir hier aber nicht.