Hallo

Ich hoffe, dieser Beitrag ist nicht zu sehr offtopic:

Man kann auch normale LEDs als Fotosensor verwenden. Das funktioniert, weil eine in Sperrichtung geschaltete LED eine von der Beleuchtungsstärke abhängige Kapazität besitzt (~5pF?). Nur mit einem Mikrokontroller und einer LED (ohne zusätzliche Bauteile!) ist die Auswertung, auch in Bascom, sehr einfach:

Die LED wird zwischen Vcc (Kathode) und einem Pin (Anode) angeschlossen. Im normalen Zustand wird der Pin auf Eingang-High geschaltet, die LED liegt dann beidpolig an Vcc. Um die Messung einzuleiten setzt man den Pin kurz auf Ausgang-Low um die LED "aufzuladen", dann schaltet man den Pin auf Eingang (ohne PullUp) und misst die Zeit die vergeht bis die LED über den Pin soweit entladen ist dass am Pin ein High erkannt wird. Diese Zeit ist direkt abhängig von der Beleuchtungsstärke mit der die LED bestrahlt wird.

Hier zwei Beispiele in Bascom:
http://www.b-kainka.de/kosmos/microelec3.htm
http://www.franzis.de/elo-das-magazi...ed-lichtsensor
(weitere Beispiele bei google)

Möglicherweise beeinflußt die Wellenlänge der LED auch ihre Empfindlichkeit für Lichtquellen unterschiedlicher Wellenlängen. Das habe ich aber noch nicht untersucht. Die Auswertung der zwei eingebauten ACS-IR-LEDs als Lichtsensoren bei meinem RP6 sieht in C so aus:
Code:
// LED-Sensor Die ACS-LEDs werden kurz in Sperrichtung "geladen"    4.4.2008 mic
// und dann wird die Entladezeit gemessen. (Anode gegen GND geschaltet)

#include "RP6RobotBaseLib.h"

int main(void)
{
	initRobotBase();

// Beide ACS-LEDs allpollig auf 5V legen
 	DDRB |= ACS_PWRH | ACS_L;						// Pins als Ausgang
	DDRC |= ACS_R;
	DDRD |= ACS_PWR;
	PORTB |= (ACS_PWRH | ACS_L);					// alle auf 5V
	PORTC |= ACS_R;
	PORTD |= ACS_PWR;
	while(1)
	{

		DDRD |= ACS_PWR;                       // Pins als Ausgang
		DDRB |= ACS_PWRH;
		PORTD &= ~ACS_PWR;                     // Anoden gegen GND schalten
		PORTB &= ~ACS_PWRH;
		sleep(10);                             // Kurz warten und Stopuhren starten
		setStopwatch1(0);
		setStopwatch2(0);
		startStopwatch1();
		startStopwatch2();
		DDRD &= ~ACS_PWR;                  		// Anoden als Eingang
		DDRB &= ~ACS_PWRH;
// Entladung messen
		while((!(PIND & ACS_PWR)) || (!(PINB & ACS_PWRH)))
		{
			if(PIND & ACS_PWR) stopStopwatch1();
			if(PINB & ACS_PWRH) stopStopwatch2();
		}
		stopStopwatch1();                      // sicher ist sicher!
		stopStopwatch2();
// Debug
		writeInteger(getStopwatch1(), 10);
		writeString_P(" - ");
		writeInteger(getStopwatch2(), 10);
		writeString_P("\n\r");
		mSleep(300);
	}
	return(0);
}
Gruß

mic