message...
message...
//
// colorSensor.ino - Color sensor prototype using artificial neural networks
// Developed by Caio Benatti Moretti <www.moretticb.com>
// More details at:
// http://www.moretticb.com/blog/color-sensor-prototype-using-neural-networks/
//
/////////////////////////////////////////////////////////////////////////////////
#include <Neurona.h>
#include <LiquidCrystal.h>
#define BACKLIGHT 7
#define BTN_PIN 6
#define LDR_PIN 0
#define THRESHOLD 2000
#define LED_DELAY 500
#define RECOGNIZE 1
#define CALIBRATE 2
#define CALIBRATE_B 3
#define CALIBRATE_W 4
#define NET_INPUTS 3
#define NET_OUTPUTS 10
#define NET_LAYERS 2
MLP mlp(NET_INPUTS,NET_OUTPUTS,layerSizes,MLP::LOGISTIC,initW,true);
void setup(){
lcd.begin(16, 2);
pinMode(BACKLIGHT, OUTPUT);
pinMode(BTN_PIN, INPUT);
for(int i=0;i<3;i++){
pinMode(rgb[i], OUTPUT);
digitalWrite(rgb[i], HIGH);
}
digitalWrite(BACKLIGHT, HIGH);
lcd.setCursor(0, 0);
lcd.print("- Color Sensor -");
lcd.setCursor(0, 1);
lcd.print("Caio B. Moretti");
delay(2000);
}
void loop(){
checkListeners();
lcd.setCursor(0, 0);
if(op==CALIBRATE){
lcd.print("- CALIBRATION -");
lcd.setCursor(0, 1);
lcd.print("Show BLACK color");
for(int i=0;i<3;i++){
calib[i][0] = -1;
calib[i][1] = -1;
}
} else if(op==CALIBRATE_W || op==CALIBRATE_B){
if(calib[0][0]==-1 && op==CALIBRATE_B || calib[0][1]==-1 && op==CALIBRATE_W){
getRGB(1);
for(int i=0;i<3;i++)
calib[i][op-CALIBRATE_B] = input[i];
lcd.setCursor(0, 1);
lcd.print("Show WHITE color");
}
}else if(op==RECOGNIZE){
lcd.print("Recognizing... ");
lcd.setCursor(0, 1);
lcd.print(" ");
getRGB(0);
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
for(int i=0;i<3;i++){
lcd.print(input[i]);
if(i<2)
lcd.print(" / ");
netInput[i+1] = (double)input[i]/255.0;
}
lcd.setCursor(0, 1);
lcd.print(colors[mlp.getActivation(netInput)]);
delay(5000);
} else {
lcd.setCursor(0, 0);
lcd.print("PRESS- Recognize");
lcd.setCursor(0, 1);
lcd.print("HOLD - Calibrate");
}
if(op==4 || op == 1)
op=0;
}
void checkListeners(){
int pressed = digitalRead(BTN_PIN);
if(lastState != pressed){
lastState = pressed;
if(pressed)
onPress();
else
onRelease();
}
}
void onPress(){
pressTime = millis();
}
void onRelease(){
pressTime = millis()-pressTime;
if(op==0){
if(pressTime < THRESHOLD){
op=RECOGNIZE;
}else{
op=CALIBRATE;
}
} else if(op==CALIBRATE){
op=CALIBRATE_B;
} else if(op==CALIBRATE_B){
op=CALIBRATE_W;
}
}
input[i] = analogRead(LDR_PIN);
if(!calibration){
input[i] = map(input[i], calib[i][0], calib[i][1], 0, 255);
input[i] = input[i]<0?0:input[i]>255?255:input[i];
}