De lichtgevoelige weerstand komt van
Sparkfun 
. Samen met de 10K weerstand vormt de LDR een spanningsdeler. De spanning, die door de ADC van de AVR wordt gemeten, is afhankelijk van de hoeveelheid licht. Veel licht staat gelijk aan een lage ADC waarde.
#define F_CPU 8000000
#define LCD_LINES 4
#define LCD_DISP_LENGTH 20
#include "s/g.h"
#include "s/rprintf.c"
#include "s/lcd.c"
#include "s/adc.c"
#include "util/delay.h"
//! main functie, start programma, moet altijd aanwezich zijn
int main(void){
PORTC = 0xFF;
DDRC = 0xFF;
uartInit(UART_FULL, 19200);
rprintfInit(uartSendByte);
rprintf("UART present\n");
lcdInit(LCD_DISP_ON);
lcdGotoXY(0,0);
lcdPuts("ok");
// prescale op 128, en AVCC (5V) als referentie
adcInit(ADC_P128, ADC_AVCC);
u08 buff[5];
// variabelen die de ADC-waarden bijhouden
// adc waarden zijn 10bits, dus u16 gebruiken
u16 adcCell, adcSetpoint;
while(1){
// photoCell hangt aan PA0
adcCell = adcGet(0);
lcdGotoXY(0,1);
lcdPuts("cell: ");
lcdPuts( itoa(adcCell, buff, 10) );
// setpoint pot staat op het adev board op PA7
adcSetpoint = adcGet(7);
lcdGotoXY(0,2);
lcdPuts("setp: ");
lcdPuts( itoa(adcSetpoint, buff, 10) );
// als de gemeten lichtsterkte lager is dan het setpoint
// leds PC0..PC3 aan
if(adcCell >= adcSetpoint){
outb(PORTC, (inb(PINC) & 0xF0));
}
// anders doen we ze uit
else{
outb(PORTC, ((inb(PINC) & 0xF0) | 0x0F));
}
_delay_ms(500);
}
return 0;
}
De waarde die de ADC voor de lichtsterkte en het setpoint worden op een LCD getoont, als de ADC waarde van de lichtsterkte hoger is (donker) dan het setpoint, gaan de leds op PC0..PC3 aan.