Please help me to correct the below code for color sensor. I want to add a push button program so when it is ask for the "Reading value for Black calibration and white calibration", I'll press push button and program move ahead. But data(RGB) it will read continuously. Please help me.
#include <MD_TCS230.h>
#include <FreqCount.h>
#include <LiquidCrystal.h>
#define BLACK_CAL 0
#define WHITE_CAL 1
#define READ_VAL 2
// Pin definitions
#define S2_OUT 9
#define S3_OUT 10
#define OE_OUT 13 // LOW = ENABLED
MD_TCS230 CS(S2_OUT, S3_OUT, OE_OUT);
const int rs = 8, en = 7, d4 = 6, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup()
{
Serial.begin(57600);
lcd.begin(16, 2);
lcd.setCursor(1, 0);
Serial.print(F("\n[Sensor Calibration]"));
lcd.print(F("Sensor Values"));
CS.begin();
}
char getChar()
{
while (Serial.available() == 0)
;
return(toupper(Serial.read()));
}
void clearInput()
{
while (Serial.read() != -1)
;
}
uint8_t fsmReadValue(uint8_t state, uint8_t valType, uint8_t maxReads)
{
static uint8_t selChannel;
static uint8_t readCount;
static sensorData sd;
switch(state)
{
case 0: // Prompt for the user to start
Serial.print(F("\n\nReading value for "));
switch(valType)
{
case BLACK_CAL: Serial.print(F("BLACK calibration")); break;
case WHITE_CAL: Serial.print(F("WHITE calibration")); break;
case READ_VAL: Serial.print(F("DATA")); break;
default: Serial.print(F("??")); break;
}
Serial.print(F("\nPress any key to start ..."));
state++;
break;
case 1:
getChar();
clearInput();
state++;
break;
case 2:
CS.read();
state++;
break;
case 3:
if (CS.available())
{
sensorData sd;
colorData rgb;
switch(valType)
{
case BLACK_CAL:
CS.getRaw(&sd);
CS.setDarkCal(&sd);
break;
case WHITE_CAL:
CS.getRaw(&sd);
CS.setWhiteCal(&sd);
break;
case READ_VAL:
CS.getRGB(&rgb);
Serial.println("RGB [");
lcd.setCursor(0, 1);
lcd.print("RGB [");
Serial.print(rgb.value[TCS230_RGB_R]);
lcd.print(rgb.value[TCS230_RGB_R]);
Serial.print(",");
lcd.print(",");
Serial.print(rgb.value[TCS230_RGB_G]);
lcd.print(rgb.value[TCS230_RGB_G]);
Serial.print(",");
lcd.print(",");
Serial.print(rgb.value[TCS230_RGB_B]);
lcd.print(rgb.value[TCS230_RGB_B]);
Serial.println("]");
lcd.print("]");
delay(2000);
lcd.print(" ");
//lcd.clearLine(0);
//lcd.clear();
//lcd.noDisplay();
delay(10);
lcd.setCursor(0, 1);
//lcd.display();
break;
}
state++;
}
break;
default: // reset fsm
state = 0;
break;
}
return(state);
}
void loop()
{
static uint8_t runState = 0;
static uint8_t readState = 0;
switch(runState)
{
case 0: // calibrate black
readState = fsmReadValue(readState, BLACK_CAL, 2);
if (readState == 0) runState++;
break;
case 1: // calibrate white
readState = fsmReadValue(readState, WHITE_CAL, 2);
if (readState == 0) runState++;
break;
case 2: // read color
readState = fsmReadValue(readState, READ_VAL, 1);
break;
default:
runState = 0;
}
}