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):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
// [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:
1 2 3 |
#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.
1 2 3 |
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.
1 2 3 4 5 6 7 8 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
(...) 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: