Hallo

Man kann die LED-Matrix auch als Helligkeitssensor missbrauchen:

Bild hier   Bild hier  
http://www.youtube.com/watch?v=MhpReBX-s7w
http://www.youtube.com/watch?v=2_mNqzsTawU


Vielleicht kann man das später mal nutzen. Arbeitscode der Messfunktion:

Code:
// https://www.roboternetz.de/phpBB2/ze...ag.php?t=39560
// http://cs.nyu.edu/~jhan/ledtouch/index.html
uint16_t get_line(uint8_t y) // Helligkeit der Zeile y als 16Bit-Wert einlesen
{
	uint16_t temp=0;

	clear_line(); 		// Erst alle 120 Kathoden auf high
	PORTB &= ~0x03;   // und 120 Anoden auf low schalten
	DDRB |= 0x03;
	PORTD &= ~0xf0;
	DDRD |= 0xf0;
	PORTC &= ~0x0f;
	DDRC |= 0x0f;
	//_delay_ms(5); 	// und schlieslich alle LEDs "aufladen" (Strom?)
	//asm volatile ("nop");

	switch(y)
	{
	   case 0: 	DDRB &= ~2; 			// Anoden der gewünschten Zeile auf Eingang
					while(!(PINB & 2))   // warten bis Pegel high erreicht ist
						temp++;          	// solange Zähler erhöhen
					return(temp);   		// Messwert zurückgeben

	   case 1: 	DDRB &=  ~1; while(!(PINB &  1)) temp++; return(temp);

	   case 2: 	DDRD &=~128; while(!(PIND &128)) temp++; return(temp);
	   case 3: 	DDRD &= ~64; while(!(PIND & 64)) temp++; return(temp);
	   case 4: 	DDRD &= ~32; while(!(PIND & 32)) temp++; return(temp);
	   case 5: 	DDRD &= ~16; while(!(PIND & 16)) temp++; return(temp);

	   case 6: 	DDRC &=  ~8; while(!(PINC &  8)) temp++; return(temp);
	   case 7: 	DDRC &=  ~4; while(!(PINC &  4)) temp++; return(temp);
	   case 8: 	DDRC &=  ~2; while(!(PINC &  2)) temp++; return(temp);
	   case 9: 	DDRC &=  ~1; while(!(PINC &  1)) temp++; return(temp);
		default: return(0);
	}
}

void clear_line(void) // setzt alle Ausgänge der Schieberegister auf high
{
	uint8_t c;
	PORTB |= (1<<4);
	for(c=0; c<12; c++)
	{
		PORTB |= (1 << 3);        	/* PB3 = 1 (cl) */
		PORTB &= ~(1 << 3);        /* PB3 = 0 (!cl) */
	}
	PORTB |= (1 << 2);         /* PB2 = 1 (str) */
	PORTB &= ~(1 << 2);        /* PB2 = 0 (!str) */
}
Gruß

mic