#include <TM1637Display.h>
//rele
#define RELE_1_PIN 2
//DISPLAY
#define CLK 17
#define DIO 4
//ROTATIVE
#define S1 14
#define S2 12
#define KEY 13
//RFID
#define RFID_BTN 33
//BTN
#define START_BTN 24
//generic
const char STATUS_A_ON = 'O';
const char STATUS_IDLE = 'I';
const char STATUS_TAG_READ = 'R';
const char STATUS_MENU = 'M';
const char STATUS_WAITING_NEXT = 'W';
const char STATUS_SET_QUANTITY = 'Q';
const char STATUS_SET_GAME = 'G';
const char GAME_RULETE = 'R';
const char GAME_SIMPLE = 'S';
#define MENU_QUIT 0
#define MENU_QTY 1
#define MENU_GAME 2
#define MENU_RULETE 0
#define MENU_SIMPLE 1
#define MAX_POSITION_MENU 2
//VARS
int rotVal = 0;
int oldRotVal;
bool s1State = LOW;
bool s1Last = HIGH;
bool keyState = HIGH;
bool keyLastRotary = HIGH;
TM1637Display display(CLK, DIO);
// A
// ---
// F | | B
// -G-
// E | | C
// ---
// D
const uint8_t SEG_RES[] = {
NULL,
SEG_E | SEG_G, // R
SEG_E | SEG_F | SEG_A | SEG_G | SEG_D, // E
SEG_A | SEG_F | SEG_G | SEG_C | SEG_D // S
};
const uint8_t SEG_QTY[] = {
NULL,
SEG_A | SEG_F | SEG_B | SEG_G | SEG_C, // Q
SEG_F | SEG_E | SEG_D | SEG_G, // T
SEG_D | SEG_F | SEG_G | SEG_B | SEG_C // Y
};
const uint8_t SEG_GAME[] = {
SEG_E | SEG_F | SEG_A | SEG_G | SEG_D | SEG_C, // G
SEG_E | SEG_F | SEG_A | SEG_G | SEG_B | SEG_C, // A
SEG_E | SEG_F | SEG_A | SEG_B | SEG_C, // M
SEG_E | SEG_F | SEG_A | SEG_G | SEG_D // E
};
const uint8_t SEG_PLAY[] = {
SEG_E | SEG_F | SEG_A | SEG_B | SEG_G, // P
SEG_F | SEG_E | SEG_D, // L
SEG_E | SEG_F | SEG_A | SEG_G | SEG_B | SEG_C, // A
SEG_D | SEG_F | SEG_G | SEG_B | SEG_C // Y
};
const uint8_t SEG_SAVE[] = {
SEG_A | SEG_F | SEG_G | SEG_C | SEG_D, // S
SEG_E | SEG_F | SEG_A | SEG_G | SEG_B | SEG_C, // A
SEG_F | SEG_E | SEG_D | SEG_C | SEG_B, // V
SEG_E | SEG_F | SEG_A | SEG_G | SEG_D // E
};
const uint8_t SEG_RULE[] = {
SEG_E | SEG_G, // R
SEG_F | SEG_E | SEG_D | SEG_C | SEG_B, // U
SEG_F | SEG_E | SEG_D, // L
SEG_E | SEG_F | SEG_A | SEG_G | SEG_D // E
};
const uint8_t SEG_SIMP[] = {
SEG_A | SEG_F | SEG_G | SEG_C | SEG_D, // S
SEG_E | SEG_F, // I
SEG_E | SEG_F | SEG_A | SEG_B | SEG_C, // M
SEG_E | SEG_F | SEG_A | SEG_B | SEG_G, // P
};
const uint8_t SEG_QUIT[] = {
SEG_A | SEG_F | SEG_B | SEG_G | SEG_C, // Q
SEG_F | SEG_E | SEG_D | SEG_C | SEG_B, // U
SEG_E | SEG_F, // I
SEG_F | SEG_E | SEG_D | SEG_G // T
};
const uint8_t SEG_LINE[] = {
SEG_G, SEG_G, SEG_G, SEG_G
};
const uint8_t SEG_BLANK[] = {
NULL,
NULL,
NULL,
NULL
};
char status;
char game;
int players;
unsigned long pumpTimer;
int pumpRunningTime;
int remainingQty;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
//Init Rotary
pinMode(S1,INPUT);
pinMode(S2,INPUT);
pinMode(KEY,INPUT_PULLUP);
//Init BTN
pinMode(RFID_BTN,INPUT);
//RELE
pinMode(RELE_1_PIN, OUTPUT);
display.setBrightness(5);
setStatus(STATUS_IDLE);
}
void loop() {
switch (status){
case STATUS_IDLE:
readRFID();
break;
case STATUS_MENU:
readRotary();
if(rotatoryPositionChange(MAX_POSITION_MENU)){
setDisplayMenu();
}
if(readClickRotary()){
enterMenu();
}
break;
case STATUS_TAG_READ:
if(readClickRotary()){
startMenu();
keyLastRotary == LOW;
}
if(digitalRead(START_BTN) == HIGH){
startPump();
}
break;
case STATUS_WAITING_NEXT:
if(digitalRead(START_BTN) == HIGH){
startPump();
}
break;
case STATUS_A_ON:
if(pumpTimeExpired()){
digitalWrite(RELE_1_PIN, HIGH);
pumpTimer = 0;
}
break;
case STATUS_SET_QUANTITY:
readRotary();
if(rotatoryPositionChange(25)){
display.showNumberDec(rotVal);
}
if(readClickRotary()){
setPlayers();
startMenu();
}
break;
case STATUS_SET_GAME:
readRotary();
if(rotatoryPositionChange(1)){
setDisplayGames();
}
if(readClickRotary()){
setGame();
startMenu();
}
break;
}
//display.setSegments(SEG_PLAY);
//readRotary();
//delay(10); // this speeds up the simulation
}
void startMenu(){
setStatus(STATUS_MENU);
rotVal = 0;
display.setSegments(SEG_LINE);
}
void setPlayers(){
//SET PLAYERS
//players = Firebase.setInt("players");
players = rotVal;
}
void setDisplayGames(){
switch (rotVal){
case MENU_RULETE:
display.setSegments(SEG_RULE);
break;
case MENU_SIMPLE:
display.setSegments(SEG_SIMP);
break;
}
}
void setGame(){
switch (rotVal){
case MENU_RULETE:
game = GAME_RULETE;
break;
case MENU_SIMPLE:
game = GAME_SIMPLE;
break;
}
}
void enterMenu(){
Serial.print("rot val");
Serial.println(rotVal);
switch (rotVal){
case MENU_QUIT:
display.setSegments(SEG_BLANK);
setStatus(STATUS_TAG_READ);
break;
case MENU_QTY:
display.showNumberDec(players);
rotVal = players;
setStatus(STATUS_SET_QUANTITY);
break;
case MENU_GAME:
display.setSegments(SEG_SIMP);
setStatus(STATUS_SET_GAME);
break;
}
}
bool rotatoryPositionChange(int max_pos){
if(rotVal > max_pos){
rotVal = max_pos;
}else if(rotVal < 0){
rotVal = 0;
}
if(rotVal != oldRotVal){
oldRotVal = rotVal;
Serial.println(rotVal);
return true;
}
return false;
}
void setDisplayMenu(){
switch (rotVal){
case MENU_QUIT:
display.setSegments(SEG_QUIT);
break;
case MENU_QTY:
display.setSegments(SEG_QTY);
break;
case MENU_GAME:
display.setSegments(SEG_GAME);
break;
}
}
bool pumpTimeExpired(){
unsigned long actualTime = millis();
if(pumpTimer == 0 || (actualTime - pumpTimer) > pumpRunningTime){
return true;
}
return false;
}
void stopPump(){
switch (game){
case GAME_SIMPLE:
setStatus(STATUS_IDLE);
break;
case GAME_RULETE:
if(remainingQty > 0){
setStatus(STATUS_WAITING_NEXT);
} else {
setStatus(STATUS_IDLE);
}
break;
}
}
void startPump(){
switch (game){
case GAME_SIMPLE:
setStatus(STATUS_A_ON);
break;
case GAME_RULETE:
setStatus(STATUS_A_ON);
remainingQty -= 1;
break;
}
digitalWrite(RELE_1_PIN, LOW);
pumpTimer = millis();
}
void reset(){
setStatus(STATUS_IDLE);
remainingQty = NULL;
oldRotVal = NULL;
pumpTimer = NULL;
}
void setStatus(char newStatus){
status = newStatus;
Serial.println(status);
}
void readRFID(){
if(digitalRead(RFID_BTN) == HIGH){
setStatus(STATUS_TAG_READ);
updateFirebaseValues();
}
}
void updateFirebaseValues(){
//game = Firebase.getString("game");
//players = Firebase.getInt("players");
players = 6;
//pumpRunningTime = Firebase.getInt("pumpRunningTime");
}
void readRotary() { /* function readRotary */
////Test routine for Rotary
// gestion position
s1State = digitalRead(S1);
if ((s1Last == LOW) && (s1State == HIGH)) {//rotary moving
//Serial.print("Rotary position ");
if (digitalRead(S2) == HIGH) {
rotVal = rotVal - 1;
if ( rotVal < -10 ) {
rotVal = -10;
}
}
else {
rotVal++;
if ( rotVal > 1000 ) {
rotVal = 1000;
}
}
//display.showNumberDec(rotVal);
delay(5);
}
s1Last = s1State;
//gestion bouton
//readClickRotary();
}
bool readClickRotary() {
keyState = digitalRead(KEY);
if (keyState == LOW && keyLastRotary == HIGH) {
Serial.println("Rotary pressed");
display.setSegments(SEG_LINE);
delay(500);//debounce
return true;
}
keyLastRotary = keyState;
return false;
}