pfvidal
Published © MIT

ColorDec

The aim of this project is to help people who are colorblind and those with eye diseases.

IntermediateWork in progress3 hours843
ColorDec

Story

Read more

Custom parts and enclosures

ColorDec STL Thingeverse

sensor_color(2)_VsiocR51CV.stl

Printed with PETG 1.75 using supports

Schematics

ColorDec Schematics

Code

colorview4.ino

Arduino
///////////////////////////////// Versin 4.1
/* Detector de color GY-33 conectado por puerto I2C
 * VCC---5V
 * CT----A5
 * DR----A4
 * GND---GND
 * S0----GND      Configura el GY-33 para ser usado usando el protocolo I2C en lugar del RS232     
 * Bluetooth por puerto RS232
 * RXD----9
 * TXD----8
 * VCC----5V
 * GND----GND
 * Pulsador para leer el color por puerto I2C y enviarlo por RS232
 * GND --Resistencia10K ---PIN2
 *                         |
 *                      Pulsador
 *                         |
 *                         5V
*/
//////////////////////////////////

#include <i2cmaster.h>            // Libreria para gestionar el puerto I2C. Es necesario aadirla desde: Programa->Incluir libreria-> Aadir libreria ZIP
#include <SoftwareSerial.h>       // Libreria para gestionar el puerto serie RS232. Esta incluida en el IDE de Arduino
#include "ColorConverterLib.h"    // Libreria que inclye la conversin de RGB a HSV (Hueco, Saturacin y Valor). Es necesario aadirla desde: Programa->Incluir libreria-> Aadir libreria ZIP

SoftwareSerial BTserial(8, 9); //  Configura los pines 8 y 9 como RX | TX del RS232

#define uint16_t unsigned int    // Estructura de datos para leer completas las seales de RGB  y luminosidad,en numerico entero de 16 bit sin signo. Aunque en este programa solo usemos la de luminosidad
typedef struct
{
    uint16_t Red;
    uint16_t Green;
    uint16_t Blue;
    uint16_t Clear;
} RGB;

RGB rgb;                        // Declaracin de la variable rgb del tipo estructura RGB

byte rgb_data[3]={0};           // Declaracin de un array para almacenar el RGB en Hexadecimal

int botonPin = 2;               // nombrar un pin de entrada para nuestro botn
int val = 0;                    // variable para leer el estado de ese pulsador


void setup() {
       unsigned char data[9]={0}; // Declaramos un  array de 9 elementos para leer en el el registro de configuracin del GY-33
       pinMode(botonPin, INPUT);
       BTserial.begin(9600);      // Inicializamos la clase BTserial para conectar a 9600bps (desde el BT)
       Serial.begin(9600);        // Inicializamos la clase Serial para conectar a 9600bps (desde el terminal de windows)
       i2c_init();                // Inicializamos el puero I2C
       delay(1);                  // Esperamos 1 milisg para que el puero I2C termine de inicializarse
       i2c_start_wait(0xb4);      // Las siguientes instrucciones leen el sensor GY-33 calculando el balance de blanco
       i2c_write(0x10);           //    Al encender el Arduino deberemos poner el GY-33 sobre una superficie blanca
       i2c_write(0x31);           //    para que considere que esa es el blanco puro y tenga mas precisin en las lecturas.
       i2c_write((data[8]|0x01)); //    Sino lo hacemos as considerar com blanco puro el color sobre el que este al iniciarse
       i2c_stop();                //    Y la precisin ser menor.
       delay(500);                // Espera medio segundo para que todo este inicializado antes de empezar el bucle de lecturas. 

}

void loop() {
  int contador=0;
  val = digitalRead(botonPin);    // leer el valor del pulsador (botn)
  if (val == HIGH) {              // comprobamos si el botn est pulsado
   unsigned char data[9]={0};     // Inicializamos el array sobre el que leeremos los datos desde el I2C para obtener los colores en bruto no en RGB.
   iic_read(0x00,data,8);         // Leemos los datos del registro 00 y los pasamos al array. Datos en bruto
   rgb.Clear=(data[6]<<8)|data[7];// Pasamos el byte 7 del array al campo luminosidad de la estructura que habiamos creado antes
   iic_read(0x0c,data,3);         // Leemos los datos del registro 03 y los pasamos al array. Datos ya formateados en RGB
   rgb_data[0]=data[0];           // Pasamos el primer byte del array data al array rgb_data. Es el color Rojo
   rgb_data[1]=data[1];           // Pasamos el segundo byte del array data al array rgb_data. Es el color Verde
   rgb_data[2]=data[2];           // Pasamos el tercer byte del array data al array rgb_data. Es el color Azulo

   // En la variable hexcolor almacenamos la concatenacin de los tres colores en RGB y en hexadecimal
   String hexColor = String(rgb_data[0], HEX)+ String(rgb_data[1], HEX) + String(rgb_data[2],HEX);  

   // Declaramos las variables para almacenar el color en formato HSV para poder ordenar luego los colores en la apliacin movil.
   double hue, saturation, value; 

   // Convertimos los datos en RGB a HSV y lo almacenamos en las variables anteriores.
   ColorConverter::RgbToHsv(static_cast<uint8_t>(rgb_data[0]), static_cast<uint8_t>(rgb_data[1]), static_cast<uint8_t>(rgb_data[2]), hue, saturation, value); 

   // Las siguientes lineas imprimen por el puerto serie (RS232) al terminal del ordenador por USB los datos definitivos: Color como: "RGB|Hueco|Saturacin|Valor" 
   Serial.print(hexColor);
   Serial.print("|");
   Serial.print(hue*360);
   Serial.print("|");
   Serial.print(saturation);
   Serial.print("|");
   Serial.println(value);
   // Las siguientes lineas imprimen por el puerto serie (Bluetooth) al movil los datos definitivos: Color como: "RGB|Hueco|Saturacin|Valor"
   BTserial.print(hexColor);
   BTserial.print("|");
   BTserial.print(hue*360);
   BTserial.print("|");
   BTserial.print(saturation);
   BTserial.print("|");
   BTserial.println(value);
   
   }
   
  delay(200);               // Espera 1/5 de segundo antes de la siguiente lectura
}
/*
 * Lee caracteres del puerto I2C 
 * Tiene tres parametros:
 * add (tipo caracter sin signo): La direccin de memoria del dispositivo I2C desde la que queremos empezar a leer.
 * *data (tipo puntero a caracteres sin signo): El array de catacteres donde se almacenar los leidos desde el puerto I2c
 * len (tipo caracter sin signo): El nmero de caracteres a leer
 * 
 * Esta funcin se ha reutilizado de un ejemplo de la libreria de I2C trabajando con el GY-33
 */
void iic_read(unsigned char add,unsigned char *data,unsigned char len)
{
  i2c_start_wait(0xb4);
  i2c_write(add);
  i2c_start_wait(0xb5);
  while(len-1)
  {
    *data++=i2c_readAck();
    len--;
  }
  *data=i2c_readNak();
  i2c_stop();
}

PaulaVidal4(1).aia

Plain text
AppInventor MIT
No preview (download only).

Credits

Lope de Vega Secundary School's Team

Posted by pfvidal
Thanks to Esther Scott, Irene Yebra, Irene Jiménez, Lucía Gómez, and Paula Vidal.

Comments