LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
SoM / SBC

[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:

Autor: Patryk Mądry