Muy buenas a todos, estoy elaborando un prototipo de un instrumento llamado anomaloscopio que en teoría es capaz de distinguir si una persona es daltónica o no, utilizando Arduino. El funcionamiento del sistmea es sencillo, 3 led RGB se mueven con un potenciometro entre unos valores predefinidos y otros 3 led se mueven en intervalos pulsando dos pulsadores para subir o bajar gradualmente el valor R y V para tratar de conseguir igualar el colo que emiten los otros tres led RGB. mi problema viene cuando quiero que en el intervalo de subir y bajar el rojo y verde, por cada 4 numeros de R V varía 0,25 y que R solo pueda variar entre 45 y 255 ya que he conseguido que V se mueva entre 0 y 18.
Por otro lado quiero que cuando el sujeto vea en su cabeza los colores iguales pulse otro pulsador y en pantalla aparezca segun el valor de R y V si es daltonico de tipo protanope (+ rojo- verde), tipo deuteranope (- rojo + verde) o normal, pero solo consigo que se quede en el primer tipo sea cual sea el valor o que parpadee la pantalla. Se que es un poco complejo de entendimiendo pero os agraceria que me ayudarais con estas dos dudas.
Un saludo M.Huerga
El código es el siguiente:
//Librerías necesarias
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
//Configuración de lcd
LiquidCrystal_I2C lcd (0x3F, 16, 2);
//Potenciómetro anomaloscopio
#define pot A0
//LED Variables
int R = 6;
int V = 5;
int A = 3;
//LED de referencia
int Rf = 11;
int Vf = 10;
int Af = 9;
//Pulsadores de modo
int P1 = 13;
int P2 = 12;
//Pulsadores de variación de color
int PUP = 8;
int PDOWN = 7;
//variables para boton 1
int modo = 0;
const int N = 3;
//variables para boton 2
int val = 0;
int state = 0;
int old_val = 0;
const int H = 2;
//Variables de variacion de color
int colorR = 255;
int colorV = 0;
//Variables para boton 3
int P3 = 2;
int lect = 0;
int vers = 0;
int old_lect = 0;
const int K = 2;
//Valores para resultados
int resultado;
int norm;
int prot;
int deut;
void setup() {
//Funciones de cada PIN
Wire.begin();
pinMode(R, OUTPUT);
pinMode(V, OUTPUT);
pinMode(A, OUTPUT);
pinMode(Rf, OUTPUT);
pinMode(Vf, OUTPUT);
pinMode(Af, OUTPUT);
pinMode(pot, INPUT);
pinMode(P1, INPUT);
pinMode(P2, INPUT);
pinMode(P3, INPUT);
pinMode(PUP, INPUT);
pinMode(PDOWN, INPUT);
//Mensaje inicial en pantalla
lcd.clear();
lcd.begin(16, 2);
lcd.backlight();
lcd.setCursor(2, 0);
lcd.print("Prototipo de");
lcd.setCursor(1, 1);
lcd.print("Anomaloscopio");
}
void reinicioleds() {// Función de apagado de LED
if (digitalRead(Rf) == HIGH) {
digitalWrite(Rf, LOW);
}
if (digitalRead(Vf) == HIGH) {
digitalWrite(Vf, LOW);
}
if (digitalRead(Af) == HIGH) {
digitalWrite(Af, LOW);
}
if (digitalRead(R) == HIGH) {
digitalWrite(R, LOW);
}
if (digitalRead(V) == HIGH) {
digitalWrite(V, LOW);
}
if (digitalRead(A) == HIGH) {
digitalWrite(A, LOW);
}
}
void INCR() { //datos para subir valor rojo
colorR ++;
colorR = (colorR + 2) % 255;
}
void DECR() { //datos para disminuir valor rojo
colorR --;
colorR = (colorR - 2) % 255;
}
void INCV() { //datos para subir valor verde
colorV ++;
colorV = colorV % 255;
}
void DECV() { //datos para disminuir valor verde
colorV --;
colorV = colorV % 255;
}
void fijarCursorModo() { //modos de boton 1
switch (modo) {
case 0:
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("PARA EMPEZAR");
lcd.setCursor(2, 1);
lcd.print("Pulse B1");
reinicioleds();
break;
case 1:
vers = 0;
state = 0;
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("EMPEZAR:B2");
lcd.setCursor(2, 1);
lcd.print("TERMINAR:B3");
if (vers = 1) {
if (resultado == norm) {
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("RESULTADO");
lcd.setCursor(0, 1);
lcd.print("OBS. NORMAL");
}
if (resultado == deut) {
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("RESULTADO");
lcd.setCursor(0, 1);
lcd.print("OBS. DEUTERANOPE");
}
if (resultado == prot) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("RESULTADO");
lcd.setCursor(4, 1);
lcd.print("OBS. PROTANOPE");
}
}
break;
case 2:
state = 0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("TFGOODO-1718_A36");
lcd.setCursor(2, 1);
lcd.print("2017-2018");
reinicioleds();
break;
}
}
void loop () {
val = digitalRead(P2); //P2 a B2
if ((val == HIGH) && (old_val == LOW)) {
state++;
state = state % H;
while (digitalRead(P2) == HIGH);
}
if (digitalRead(P1) == HIGH) { //P1 a B1
modo++;
modo = modo % N;
fijarCursorModo();
while (digitalRead(P1) == HIGH);
}
lect = digitalRead(P3); //P3 a B3
if ((lect == HIGH) && (old_lect == LOW)) {
vers++;
vers = vers % K;
while (digitalRead(P3) == HIGH);
}
switch (modo) {
case 0: break;
case 1:
if (state == 1) {
//intensidad colores de referencia
analogWrite(Af, 0);
analogWrite(A, 0);
analogRead(A0);
map (analogRead(A0), 0, 1023, 175, 225);
analogWrite(Rf, map (analogRead(A2), 0, 1023, 35, 132));
map (analogRead(A0), 0, 1023, 60, 90);
analogWrite(Vf, map (analogRead(A0), 0, 1023, 4, 14));
//variación de los colores R y V
if (digitalRead(PUP) == HIGH) { //funcion de B3
DECR();
INCV();
analogWrite(R, colorR);
analogWrite(V, colorV);
while (digitalRead(PUP) == HIGH);
}
if (digitalRead(PDOWN) == HIGH) { //funcion de B4
INCR();
DECV();
analogWrite(R, colorR);
analogWrite(V, colorV);
while (digitalRead(PDOWN) == HIGH);
}
if (vers == 1) {
if ((((colorR >= 124) && (colorR <= 140)) ((colorV >= 10) && (colorV <= 12)))) {
resultado = norm;
}
if ((((colorR > 45) && (colorR < 124)) && ((colorV > 12) && (colorV <= 18)))) {
resultado = deut;
}
if ((((colorR > 140) && (colorR <= 255)) && ((colorV >= 0) && (colorV < 10)))) {
resultado = prot;
}
}
}
else {
reinicioleds();
}
break;
case 2: break;
}
}