Hoe het werkt:
de sensor bestaat uit LDR sensor en RGB LED, dus als het object putted op de sensor het licht dat zal uitstoten van RGB LED weerkaatst door het object aan LDR sensor en lezen door ADC van ATMEGA16 als onderstaande volgorde:
1-zet blauw in de RGB LED en wachten.
2-lezen ADC en op te slaan in het register als blauw.
3-turn op groen in RGB LED en wachten.
4-lezen ADC en op te slaan in het register als green.
5-turn on Red in RGB LED en wachten.
6-lezen ADC en op te slaan in het register als rood.
7-als rode > groene > blauwe inschakelen rode LED-display.
als groene > rode > blauwe inschakelen groen LED-display.
als blauwe > rode > groene beurt op blauwe Led display.
Kalibratie:
De RGB LED uitstoten van rood, blauw en groen in verschillende intensiteit zo te egaliseren hen, moeten variabele weerstanden worden gebruikt met onderstaande stappen:
1-zet een wit object op de sensor.
2-zet blauw in RGB LED en lees de spanning over de LDR-sensor met voltmeter.
3-Draai op groen in RGB LED en lees de spanning over de LDR-sensor met voltmeter.
4-zet rood weergegeven in RGB LED en lees de spanning over de LDR-sensor met voltmeter.
5-aanpassen van de variabele weerstanden te maken van alle de spanning vereffend wanneer wit object putted op de sensor.
Software (AVR studio 4):
#define F_CPU 1000000UL
#include < avr/io.h >
#include < util/delay.h >
ongeldig InitADC() //Initiate ADC
{
ADMUX = (1 << REFS0); Voor Aref = AVcc;
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); Rrescalar div factor = 128
}
uint16_t ReadADC (uint8_t ch)
{
ch = ch & 0b00000111;
ADMUX| = ch;
Start conversie
ADCSRA| = (1 << ADSC);
Wacht tot de conversie te voltooien
terwijl (! () ADCSRA & (1 << ADIF)));
ADCSRA| = (1 << ADIF);
Return(ADC);
}
VOID Wait()
{
uint8_t i;
voor (ik = 0; ik < 1; i ++)
_delay_loop_2(0);
}
void main()
{
DDRB = 0XFF; Uitvoer voor het RGB LED definiëren
DDRD = 0XFF; Definiëren van de uitvoer voor weergave LEDs
uint16_t rood;
uint16_t groen;
uint16_t blauw;
Initialiseren van de ADC
InitADC();
while(1)
{
PORTD = 0b11111111; uitschakelen van de weergave van alle LEDs
PORTB = 0b11111110; Blauwe RGB inschakelen
_delay_ms(2000); wachten 2s
Blue=ReadADC(0); Lees analoge waarde en sla het in blauw
PORTB = 0b11111101; Inschakelen van groene RGB;
_delay_ms(2000); wachten 2s
groen = ReadADC(0); Analoge waarde te lezen en op te slaan in het groen
PORTB = 0b011111011; Rode RGB;
_delay_ms(2000); wachten 2s
rood = ReadADC(0); Analoge waarde te lezen en op te slaan in het rood
Als ((red > green) & (rode > blauwe)) {PORTD = 0b11111110; _delay_ms(4000); PORTD = 0b11111111;} Rode Display
Als ((green > red) & (groene > blauwe)) {PORTD = 0b11111011; _delay_ms(4000); PORTD = 0b11111111;} Groene Display
Als ((blue > green) & (blauwe > rode)) {PORTD = 0b11111101; _delay_ms(4000); PORTD = 0b11111111;} Blauwe Display
}
}