[PROJEKT] Czujnik koloru KPS-5130
Przejdźmy teraz do programu. Chcemy, aby czujnik odczytywał wartości z poszczególnych kanałów (R, G, B) i zapisywał je do zmiennych. Następnie program ma sprawdzić, wartość którego koloru jest największa i zasygnalizować zmierzony kolor odpowiednią diodą RGB.
Kod programu zaprezentowany jest poniżej (pliki projektowe znajdują się również w sekcji do pobrania):
// [PROJEKT] KAmduino UNO oraz czujnik koloru KPS-5130 // Program 1 // Autor: Patryk Mądry // Mikrokontroler 2017 r. #define LED_Czerwona 2 #define LED_Zielona 3 #define LED_Niebieska 4 int czerwony = 0; int zielony = 0; int niebieski = 0; void setup() { Serial.begin(9600); pinMode(LED_Zielona,OUTPUT); pinMode(LED_Niebieska,OUTPUT); pinMode(LED_Czerwona,OUTPUT); } void loop() { czerwony = analogRead(A0); zielony = analogRead(A1); niebieski = analogRead(A2); Serial.println(""); Serial.print("Czerwony: "); Serial.println(czerwony); Serial.print("Zielony: "); Serial.println(zielony); Serial.print("Niebieski: "); Serial.println(niebieski); if ((czerwony > niebieski) && (czerwony > zielony)) { Serial.println("Czerwony!"); digitalWrite(LED_Czerwona,HIGH); digitalWrite(LED_Zielona,LOW); digitalWrite(LED_Niebieska,LOW); } else if ((niebieski >zielony) && (niebieski > czerwony)) { Serial.println("Niebieski!"); digitalWrite(LED_Czerwona,LOW); digitalWrite(LED_Zielona,LOW); digitalWrite(LED_Niebieska,HIGH); } else if ((zielony >niebieski) && (zielony > czerwony)) { Serial.println("Zielony!"); digitalWrite(LED_Czerwona,LOW); digitalWrite(LED_Zielona,HIGH);; digitalWrite(LED_Niebieska,LOW); } //delay(1000); }
Na początku programu deklarujemy numery pinów, do których są dołączone poszczególne kanały diody RGB:
#define LED_Czerwona 2 #define LED_Zielona 3 #define LED_Niebieska 4
Następnie tworzymy zmienne, w których są przechowywane dane z czujnika koloru dla poszczególnych barw: czerwonej, zielonej oraz niebieskiej.
int czerwony = 0; int zielony = 0; int niebieski = 0;
Ustawiamy prędkość portu szeregowego oraz piny, do których podłączona jest dioda RGB jako wyjścia.
void setup() { Serial.begin(9600); pinMode(LED_Zielona,OUTPUT); pinMode(LED_Niebieska,OUTPUT); pinMode(LED_Czerwona,OUTPUT); }
W pętli głównej programu, do zmiennych są przypisywane wartości pinów analogowych, do których jest podłączony czujnik koloru. Następnie te wartości są przesyłane do portu szeregowego.
void loop() { czerwony = analogRead(A0); zielony = analogRead(A1); niebieski = analogRead(A2); Serial.println(""); Serial.print("Czerwony: "); Serial.println(czerwony); Serial.print("Zielony: "); Serial.println(zielony); Serial.print("Niebieski: "); Serial.println(niebieski); (...)
W dalszej części programu porównywalne są wartości zmiennych dla poszczególnych kolorów odczytanych z czujnika koloru. W zależności od tego która wartość zmiennej jest największa, zostaje zapalony odpowiedni kanał diody RGB. Dodatkowo przez port szeregowy jest przesyłana informacja, jaki kolor został wykryty.
(...) if ((czerwony > niebieski) && (czerwony > zielony)) { Serial.println("Czerwony!"); digitalWrite(LED_Czerwona,HIGH); digitalWrite(LED_Zielona,LOW); digitalWrite(LED_Niebieska,LOW); } else if ((niebieski >zielony) && (niebieski > czerwony)) { Serial.println("Niebieski!"); digitalWrite(LED_Czerwona,LOW); digitalWrite(LED_Zielona,LOW); digitalWrite(LED_Niebieska,HIGH); } else if ((zielony >niebieski) && (zielony > czerwony)) { Serial.println("Zielony!"); digitalWrite(LED_Czerwona,LOW); digitalWrite(LED_Zielona,HIGH);; digitalWrite(LED_Niebieska,LOW); } }
Podczas testowania opisywanego projektu wykorzystano sześcian o ścianach zabarwionych na kolor czerwony, zielony oraz niebieski. Najlepsze wyniki uzyskuje się, gdy czujnik jest w odległości około 5 mm od badanej powierzchni. Widok monitory portu szeregowego podczas pracy został przedstawiony na rysunku 4.
Rysunek 4. Monitor portu szeregowego podczas działania programu
Działanie programu zostało pokazane na poniższym filmie: