DETECTOR DE CORES COM LDR E LED RGB

Em breve atualizarei esta página com imagens e um link para o vídeo. Por hora apenas o sketch que usei, o qual está com poucos comentários, e a montagem do circuito, só para que possamos carregar na placa e ver funcionando:





#include <NewTone.h>
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#define I2C_ADOR 0x3F // <<
#define BACKLIGHT_PIN 3
#define En 2
#define Rw 1
#define Rs 0
#define D4 4
#define D5 5
#define D6 6
#define D7 7
LiquidCrystal_I2C lcd(I2C_ADOR, En, Rw, Rs, D4, D5, D6, D7);

int LDR = A0;
int vermelho = 3;
int verde = 6;
int azul = 9;
int variacao = 40;
int espSetup = 5000;
int desligado = 5;
int ligado = 10;
int VMLDR = 0;
int VDLDR = 0;
int AZLDR = 0;

//padrão do Vermelho*********************
int VermelhoVermelho = 610;
int VermelhoVerde = 840;
int VermelhoAzul = 880;

//padrão do Verde************************
int VerdeVermelho = 870;
int VerdeVerde = 805;
int VerdeAzul = 885;

//padrão do Azul*************************
int AzulVermelho = 870;
int AzulVerde = 836;
int AzulAzul = 815;

//padrão do Amarelo*********************
int AmareloVermelho = 515;
int AmareloVerde = 650;
int AmareloAzul = 845;

//padrão do Branco**********************
int BrancoVermelho = 490;
int BrancoVerde = 590;
int BrancoAzul = 720;

//****************************************

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  lcd.begin (16, 2);
  pinMode(3, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(13, OUTPUT);
  lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
  lcd.setBacklight(HIGH);

  lcd.clear();
  lcd.setCursor(2, 0);
  lcd.print("DETECTOR DE");
  lcd.setCursor(5, 1);
  lcd.print("CORES");
  delay(5000);

  lcd.clear();
  lcd.setCursor(2, 0);
  lcd.print("APROXIME UM");
  lcd.setCursor(5, 1);
  lcd.print("OBJETO");

}

void loop() {

  // liga vermelho
  digitalWrite(3, LOW);
  digitalWrite(6, HIGH);
  digitalWrite(9, HIGH);
  delay(ligado);
  VMLDR = analogRead(LDR);

  digitalWrite(3, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(9, HIGH);
  delay(desligado);

  // liga verde
  digitalWrite(6, LOW);
  digitalWrite(3, HIGH);
  digitalWrite(9, HIGH);
  delay(ligado);
  VDLDR = analogRead(LDR);

  digitalWrite(3, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(9, HIGH);
  delay(desligado);

  // liga azul
  digitalWrite(9, LOW);
  digitalWrite(3, HIGH);
  digitalWrite(6, HIGH);
  delay(ligado);
  AZLDR = analogRead(LDR);

  digitalWrite(3, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(9, HIGH);
  delay(desligado);

  Serial.print("--- Vermelho= ");
  Serial.print(VMLDR);

  Serial.print("--- Verde= ");
  Serial.print(VDLDR);

  Serial.print("--- Azul= ");
  Serial.print(AZLDR);
  Serial.println("---");

  if (VMLDR > (VermelhoVermelho - variacao) && VMLDR < (VermelhoVermelho + variacao) && VDLDR > (VermelhoVerde - variacao) && VDLDR < (VermelhoVerde + variacao) && AZLDR > (VermelhoAzul - variacao) && AZLDR < (VermelhoAzul + variacao)) {
    Serial.println(" Cor detectada: VERMELHO");
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("COR DETECTADA:");
    lcd.setCursor(3, 1);
    lcd.print("VERMELHO");

    // liga vermelho
    digitalWrite(3, LOW);
    digitalWrite(6, HIGH);
    digitalWrite(9, HIGH);
    NewTone(13, 500, 500);

    delay(3000);
  }
  if (VMLDR > (AzulVermelho - variacao) && VMLDR < (AzulVermelho + variacao) && VDLDR > (AzulVerde - variacao) && VDLDR < (AzulVerde + variacao) && AZLDR > (AzulAzul - variacao) && AZLDR < (AzulAzul + variacao)) {
    Serial.println(" Cor detectada: AZUL");
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("COR DETECTADA:");
    lcd.setCursor(3, 1);
    lcd.print("AZUL");

    // liga azul
    digitalWrite(9, LOW);
    digitalWrite(3, HIGH);
    digitalWrite(6, HIGH);
    NewTone(13, 500, 500);

    delay(3000);
  }
  if (VMLDR > (VerdeVermelho - variacao) && VMLDR < (VerdeVermelho + variacao) && VDLDR > (VerdeVerde - variacao) && VDLDR < (VerdeVerde + variacao) && AZLDR > (VerdeAzul - variacao) && AZLDR < (VerdeAzul + variacao)) {
    Serial.println(" Cor detectada: VERDE");
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("COR DETECTADA:");
    lcd.setCursor(3, 1);
    lcd.print("VERDE");

    //liga verde
    digitalWrite(6, LOW);
    digitalWrite(3, HIGH);
    digitalWrite(9, HIGH);
    NewTone(13, 500, 500);

    delay(3000);
  }
  if (VMLDR > (AmareloVermelho - variacao) && VMLDR < (AmareloVermelho + variacao) && VDLDR > (AmareloVerde - variacao) && VDLDR < (AmareloVerde + variacao) && AZLDR > (AmareloAzul - variacao) && AZLDR < (AmareloAzul + variacao)) {
    Serial.println(" Cor detectada: AMARELO");
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("COR DETECTADA:");
    lcd.setCursor(3, 1);
    lcd.print("AMARELO");

    // liga amarelo
    digitalWrite(3, LOW);
    digitalWrite(6, LOW);
    digitalWrite(9, HIGH);
    NewTone(13, 500, 500);

    delay(3000);
  }
  if (VMLDR > (BrancoVermelho - variacao) && VMLDR < (BrancoVermelho + variacao) && VDLDR > (BrancoVerde - variacao) && VDLDR < (BrancoVerde + variacao) && AZLDR > (BrancoAzul - variacao) && AZLDR < (BrancoAzul + variacao)) {
    Serial.println(" Cor detectada: BRANCO");
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("COR DETECTADA:");
    lcd.setCursor(3, 1);
    lcd.print("BRANCO");

    // liga amarelo
    digitalWrite(3, LOW);
    digitalWrite(6, LOW);
    digitalWrite(9, LOW);
    NewTone(13, 500, 500);

    delay(3000);
  }
  else
  {
    lcd.clear();
    lcd.setCursor(2, 0);
    lcd.print("APROXIME UM");
    lcd.setCursor(5, 1);
    lcd.print("OBJETO");
    //lcd.scrollDisplayLeft();

  }
}


*********************************************************************************
*********************************************************************************
*********************************************************************************


sketch melhorado. Este realiza um setup inicial que permite que o sistema se adapte à luminosidade de cada ambiente, mas o programa ficou muito grande e a memória do arduino uno ficou pequena de mais, por isso tive que retirar a cor branca:

// DETECTOR DE CORES COM AUTO AJUNTE V1

#include <NewTone.h>
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#define I2C_ADOR 0x3F // <<
#define BACKLIGHT_PIN 3
#define En 2
#define Rw 1
#define Rs 0
#define D4 4
#define D5 5
#define D6 6
#define D7 7
LiquidCrystal_I2C lcd(I2C_ADOR, En, Rw, Rs, D4, D5, D6, D7);

int LDR = A0;
int vermelho = 3;
int verde = 6;
int azul = 9;
int variacao = 40;
int espSetup = 5000;
int desligado = 5;
int ligado = 10;
int texto = 3000;
int contador = 0;
int VMLDR = 0;
int VDLDR = 0;
int AZLDR = 0;

//padrão do Vermelho*********************
int VermelhoVermelho = 0;
int VermelhoVerde = 0;
int VermelhoAzul = 0;

//padrão do Verde************************
int VerdeVermelho = 0;
int VerdeVerde = 0;
int VerdeAzul = 0;

//padrão do Azul*************************
int AzulVermelho = 0;
int AzulVerde = 0;
int AzulAzul = 0;

//padrão do Amarelo*********************
int AmareloVermelho = 0;
int AmareloVerde = 0;
int AmareloAzul = 0;

//padrão do Branco**********************
int BrancoVermelho = 0;
int BrancoVerde = 0;
int BrancoAzul = 0;

//****************************************

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  lcd.begin (16, 2);
  pinMode(3, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(13, OUTPUT);
  lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
  lcd.setBacklight(HIGH);

  lcd.clear();
  lcd.setCursor(2, 0);
  lcd.print("DETECTOR DE");
  lcd.setCursor(5, 1);
  lcd.print("CORES");
  delay(5000);
  // Inicio do set-up ********************************************************************************
  /* Verifique as seguintes funções. Elas estão no fim do sketch. Cada uma delas solicita o
    posicionamento do objeto com a respectiva cor, e registra a mesma de forma automática. Esta preparação inicial é
    muito importante, pois em diferentes ambientes, devido a diferença de luminosidade, a leitura do sensor pode variar;*/
   
  calib (); 

  setAmarelo();
  setVermelho();
  setVerde();
  setAzul();
 
  // Fim do set-up **********************************************************************************
  /* Inicio da apresentação. Esta função faz algumas observações sobre o funcionamento do detector */
 
  apresentacao();

  lcd.clear();
  lcd.setCursor(2, 0);
  lcd.print("APROXIME UM");
  lcd.setCursor(5, 1);
  lcd.print("OBJETO");
}

void loop() {

  // liga vermelho
  digitalWrite(3, LOW);
  digitalWrite(6, HIGH);
  digitalWrite(9, HIGH);
  delay(ligado);
  VMLDR = analogRead(LDR);

  digitalWrite(3, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(9, HIGH);
  delay(desligado);

  // liga verde
  digitalWrite(6, LOW);
  digitalWrite(3, HIGH);
  digitalWrite(9, HIGH);
  delay(ligado);
  VDLDR = analogRead(LDR);

  digitalWrite(3, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(9, HIGH);
  delay(desligado);

  // liga azul
  digitalWrite(9, LOW);
  digitalWrite(3, HIGH);
  digitalWrite(6, HIGH);
  delay(ligado);
  AZLDR = analogRead(LDR);

  digitalWrite(3, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(9, HIGH);
  delay(desligado);

  Serial.print("--- Vermelho= ");
  Serial.print(VMLDR);

  Serial.print("--- Verde= ");
  Serial.print(VDLDR);

  Serial.print("--- Azul= ");
  Serial.print(AZLDR);
  Serial.println("---");

  if (VMLDR > (VermelhoVermelho - variacao) && VMLDR < (VermelhoVermelho + variacao) && VDLDR > (VermelhoVerde - variacao) && VDLDR < (VermelhoVerde + variacao) && AZLDR > (VermelhoAzul - variacao) && AZLDR < (VermelhoAzul + variacao)) {
    Serial.println(" Cor detectada: VERMELHO");
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("COR DETECTADA:");
    lcd.setCursor(3, 1);
    lcd.print("VERMELHO");

    // liga vermelho
    digitalWrite(3, LOW);
    digitalWrite(6, HIGH);
    digitalWrite(9, HIGH);
    NewTone(13, 500, 500);

    delay(3000);
  }
  if (VMLDR > (AzulVermelho - variacao) && VMLDR < (AzulVermelho + variacao) && VDLDR > (AzulVerde - variacao) && VDLDR < (AzulVerde + variacao) && AZLDR > (AzulAzul - variacao) && AZLDR < (AzulAzul + variacao)) {
    Serial.println(" Cor detectada: AZUL");
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("COR DETECTADA:");
    lcd.setCursor(3, 1);
    lcd.print("AZUL");

    // liga azul
    digitalWrite(9, LOW);
    digitalWrite(3, HIGH);
    digitalWrite(6, HIGH);
    NewTone(13, 500, 500);

    delay(3000);
  }
  if (VMLDR > (VerdeVermelho - variacao) && VMLDR < (VerdeVermelho + variacao) && VDLDR > (VerdeVerde - variacao) && VDLDR < (VerdeVerde + variacao) && AZLDR > (VerdeAzul - variacao) && AZLDR < (VerdeAzul + variacao)) {
    Serial.println(" Cor detectada: VERDE");
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("COR DETECTADA:");
    lcd.setCursor(3, 1);
    lcd.print("VERDE");

    //liga verde
    digitalWrite(6, LOW);
    digitalWrite(3, HIGH);
    digitalWrite(9, HIGH);
    NewTone(13, 500, 500);

    delay(3000);
  }
  if (VMLDR > (AmareloVermelho - variacao) && VMLDR < (AmareloVermelho + variacao) && VDLDR > (AmareloVerde - variacao) && VDLDR < (AmareloVerde + variacao) && AZLDR > (AmareloAzul - variacao) && AZLDR < (AmareloAzul + variacao)) {
    Serial.println(" Cor detectada: AMARELO");
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("COR DETECTADA:");
    lcd.setCursor(3, 1);
    lcd.print("AMARELO");

    // liga amarelo
    digitalWrite(3, LOW);
    digitalWrite(6, LOW);
    digitalWrite(9, HIGH);
    NewTone(13, 500, 500);

    delay(3000);
  }
  if (VMLDR > (BrancoVermelho - variacao) && VMLDR < (BrancoVermelho + variacao) && VDLDR > (BrancoVerde - variacao) && VDLDR < (BrancoVerde + variacao) && AZLDR > (BrancoAzul - variacao) && AZLDR < (BrancoAzul + variacao)) {
    Serial.println(" Cor detectada: BRANCO");
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("COR DETECTADA:");
    lcd.setCursor(3, 1);
    lcd.print("BRANCO");

    // liga amarelo
    digitalWrite(3, LOW);
    digitalWrite(6, LOW);
    digitalWrite(9, LOW);
    NewTone(13, 500, 500);

    delay(3000);
  }
  else
  {
    lcd.clear();
    lcd.setCursor(2, 0);
    lcd.print("APROXIME UM");
    lcd.setCursor(5, 1);
    lcd.print("OBJETO");
    //lcd.scrollDisplayLeft();

  }
}
void calib (){
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Preparesse para");
  lcd.setCursor(0, 1);
  lcd.print("calibrar o sist.");
  NewTone(13, 500, 500);
  delay(texto);

   lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("***** 3 ******");
  lcd.setCursor(0, 1);
  lcd.print("calibrar o sist.");
  NewTone(13, 500, 500);
  delay(1000);

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("***** 2 ******");
  lcd.setCursor(0, 1);
  lcd.print("calibrar o sist.");
  NewTone(13, 500, 500);
  delay(1000);

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("***** 1 ******");
  lcd.setCursor(0, 1);
  lcd.print("calibrar o sist.");
  NewTone(13, 500, 500);
  delay(1000);
 
}
// Inicio das funções de setup *********************************************************************

//AMARELO
void setAmarelo() {
  lcd.clear();
  lcd.setCursor(2, 0);
  lcd.print("APROXIME UM");
  lcd.setCursor(0, 1);
  lcd.print("OBJETO AMARELO");
  NewTone(13, 500, 500);
  contador = millis() + espSetup;
  while (contador > millis()) {
    // liga vermelho
    digitalWrite(3, LOW);
    digitalWrite(6, HIGH);
    digitalWrite(9, HIGH);
    delay(ligado);
    AmareloVermelho = analogRead(LDR);

    digitalWrite(3, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(9, HIGH);
    delay(desligado);

    // liga verde
    digitalWrite(6, LOW);
    digitalWrite(3, HIGH);
    digitalWrite(9, HIGH);
    delay(ligado);
    AmareloVerde = analogRead(LDR);

    digitalWrite(3, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(9, HIGH);
    delay(desligado);

    // liga azul
    digitalWrite(9, LOW);
    digitalWrite(3, HIGH);
    digitalWrite(6, HIGH);
    delay(ligado);
    AmareloAzul = analogRead(LDR);

    digitalWrite(3, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(9, HIGH);
    delay(desligado);
  }

}
//VERMELHO
void setVermelho() {
  lcd.clear();
  lcd.setCursor(2, 0);
  lcd.print("APROXIME UM");
  lcd.setCursor(0, 1);
  lcd.print("OBJETO VERMELHO");
  NewTone(13, 500, 500);
  contador = millis() + espSetup;
  while (contador > millis()) {
    // liga vermelho
    digitalWrite(3, LOW);
    digitalWrite(6, HIGH);
    digitalWrite(9, HIGH);
    delay(ligado);
    VermelhoVermelho = analogRead(LDR);

    digitalWrite(3, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(9, HIGH);
    delay(desligado);

    // liga verde
    digitalWrite(6, LOW);
    digitalWrite(3, HIGH);
    digitalWrite(9, HIGH);
    delay(ligado);
    VermelhoVerde = analogRead(LDR);

    digitalWrite(3, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(9, HIGH);
    delay(desligado);

    // liga azul
    digitalWrite(9, LOW);
    digitalWrite(3, HIGH);
    digitalWrite(6, HIGH);
    delay(ligado);
    VermelhoAzul = analogRead(LDR);

    digitalWrite(3, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(9, HIGH);
    delay(desligado);
  }

}
//VERDE
void setVerde() {
  lcd.clear();
  lcd.setCursor(2, 0);
  lcd.print("APROXIME UM");
  lcd.setCursor(0, 1);
  lcd.print("OBJETO VERDE");
  NewTone(13, 500, 500);
  contador = millis() + espSetup;
  while (contador > millis()) {
    // liga vermelho
    digitalWrite(3, LOW);
    digitalWrite(6, HIGH);
    digitalWrite(9, HIGH);
    delay(ligado);
    VerdeVermelho = analogRead(LDR);

    digitalWrite(3, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(9, HIGH);
    delay(desligado);

    // liga verde
    digitalWrite(6, LOW);
    digitalWrite(3, HIGH);
    digitalWrite(9, HIGH);
    delay(ligado);
    VerdeVerde = analogRead(LDR);

    digitalWrite(3, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(9, HIGH);
    delay(desligado);

    // liga azul
    digitalWrite(9, LOW);
    digitalWrite(3, HIGH);
    digitalWrite(6, HIGH);
    delay(ligado);
    VerdeAzul = analogRead(LDR);

    digitalWrite(3, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(9, HIGH);
    delay(desligado);
  }

}
//AZUL
void setAzul() {
  lcd.clear();
  lcd.setCursor(2, 0);
  lcd.print("APROXIME UM");
  lcd.setCursor(0, 1);
  lcd.print("OBJETO AZUL");
  NewTone(13, 500, 500);
  contador = millis() + espSetup;
 while (contador > millis()) {
    // liga vermelho
    digitalWrite(3, LOW);
    digitalWrite(6, HIGH);
    digitalWrite(9, HIGH);
    delay(ligado);
    AzulVermelho = analogRead(LDR);

    digitalWrite(3, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(9, HIGH);
    delay(desligado);

    // liga verde
    digitalWrite(6, LOW);
    digitalWrite(3, HIGH);
    digitalWrite(9, HIGH);
    delay(ligado);
    AzulVerde = analogRead(LDR);

    digitalWrite(3, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(9, HIGH);
    delay(desligado);

    // liga azul
    digitalWrite(9, LOW);
    digitalWrite(3, HIGH);
    digitalWrite(6, HIGH);
    delay(ligado);
    AzulAzul = analogRead(LDR);

    digitalWrite(3, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(9, HIGH);
    delay(desligado);
  }
}

void apresentacao() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Fim do setup.");
  lcd.setCursor(0, 1);
  lcd.print("Obrigado.");
  NewTone(13, 500, 500);
  delay(texto);
  //*************************
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("O circuito esta");
  lcd.setCursor(0, 1);
  lcd.print("configurado...");
  NewTone(13, 500, 500);
  delay(texto);
  //*************************
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("para reconhecer");
  lcd.setCursor(0, 1);
  lcd.print("4 cores:");
  NewTone(13, 500, 500);
  delay(texto);

  //*************************
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("  Amarelo:");
  lcd.setCursor(0, 1);
  lcd.print(" ");
  digitalWrite(3, LOW);
  digitalWrite(6, LOW);
  digitalWrite(9, HIGH);
  NewTone(13, 500, 500);
  delay(texto);
  //*************************
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("  Vermelho:");
  lcd.setCursor(0, 1);
  lcd.print(" ");
  digitalWrite(3, LOW);
  digitalWrite(6, HIGH);
  digitalWrite(9, HIGH);
  NewTone(13, 500, 500);
  delay(texto);
  //*************************
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("  Verde:");
  lcd.setCursor(0, 1);
  lcd.print(" ");
  digitalWrite(3, HIGH);
  digitalWrite(6, LOW);
  digitalWrite(9, HIGH);
  NewTone(13, 500, 500);
  delay(texto);
 
  //*************************
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("  Azul:");
  lcd.setCursor(0, 1);
  lcd.print(" ");
  digitalWrite(3, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(9, LOW);
  NewTone(13, 500, 500);
  delay(texto);
}

Nenhum comentário:

Postar um comentário