//Libraries
#include <SPI.h>//https://www.arduino.cc/en/reference/SPI
//#include <MFRC522.h>//https://github.com/miguelbalboa/rfid
#include <Adafruit_NeoPixel.h>
//#include <LowPower.h>
//CONSTANTS
//rfid
#define SS_PIN 5
#define RST_PIN 15
//led
#define NUMPIXELS 10 //49
#define LED_PIN 25
//btn
#define BTN_1_PIN 34
#define BTN_2_PIN 13
#define BTN_3_PIN 32
#define BTN_4_PIN 33
#define BTN_MAN_PIN 35
//rotative
#define S1 16
#define S2 17
#define KEY 21
//generic
#define STATUS_OFF "OFF"
#define STATUS_ON "ON"
#define STATUS_IDLE "IDLE"
#define STATUS_TAG_READ "TAG_READ"
//rele
#define RELE_1_PIN 2
#define RELE_2_PIN 26
#define RELE_3_PIN 4
#define RELE_4_PIN 27
//VARIABLES
//rfid
//byte nuidPICC[4] = {0, 0, 0, 0};
//MFRC522::MIFARE_Key key;
//MFRC522 rfid = MFRC522(SS_PIN, RST_PIN);
String tagRead = "";
const int delayReleRead = 10000;
//VARS
unsigned long blockTime;
String pumpStatus = STATUS_IDLE;
//rotative
int rotVal = 0;
bool s1State = LOW;
bool s1Last = HIGH;
bool keyState = HIGH;
bool keyLast = HIGH;
//led
Adafruit_NeoPixel pixels(NUMPIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
//Init Serial USB
Serial.begin(115200);
Serial.println(F("Initialize System"));
/* // RFID
SPI.begin();
rfid.PCD_Init();
Serial.print(F("Reader :"));
rfid.PCD_DumpVersionToSerial();
*/
//RELE
pinMode(RELE_1_PIN, OUTPUT);
pinMode(RELE_2_PIN, OUTPUT);
pinMode(RELE_3_PIN, OUTPUT);
pinMode(RELE_4_PIN, OUTPUT);
digitalWrite(RELE_1_PIN, HIGH);
digitalWrite(RELE_2_PIN, HIGH);
digitalWrite(RELE_3_PIN, HIGH);
digitalWrite(RELE_4_PIN, HIGH);
//LED
pixels.begin();
//BTN
pinMode(BTN_1_PIN, INPUT);
pinMode(BTN_2_PIN, INPUT);
pinMode(BTN_3_PIN, INPUT);
pinMode(BTN_4_PIN, INPUT);
pinMode(BTN_MAN_PIN, INPUT);
//ROTATIVE
pinMode(S1,INPUT);
pinMode(S2,INPUT);
pinMode(KEY,INPUT_PULLUP);
//TMP
pinMode(SS_PIN, INPUT);
blockTime = 0;
}
void loop() {
//Serial.println(pumpStatus);
//TAG LEIDO
if(pumpStatus == STATUS_TAG_READ){
readButtonAndSwitchRele();
readRotary();
}
//ESPERANDO LECTURA
if(timeExpired()){
resetVars();
readRFID();
}
if(pumpStatus == STATUS_IDLE){
//LowPower.powerDown(SLEEP_4S, ADC_OFF, BOD_ON);
//delay(500);
}
}
void resetVars(){
if(blockTime!=0){
setLed(0,0,0);
blockTime = 0;
tagRead = "";
resetReles();
setPumpStatus(STATUS_IDLE);
}
}
bool timeExpired(){
unsigned long actualTime = millis();
//Serial.print(millis());
//Serial.print("(MILLIS) ");
//Serial.print(actualTime);
//Serial.print(" - ");
//Serial.print(blockTime);
//Serial.print(" = ");
//Serial.print(actualTime - blockTime);
//Serial.println();
//Serial.println(millis() + " - " + blockTime + " = " + millis() - blockTime);
if(blockTime == 0 || (actualTime - blockTime)>delayReleRead){
//Serial.println("true");
return true;
}
//Serial.println("false");
return false;
}
void readButtonAndSwitchRele(){
if(digitalRead(BTN_1_PIN) == HIGH){
Serial.print("RELE 1 ON: ");
Serial.println(RELE_1_PIN);
digitalWrite(RELE_1_PIN, LOW);
setPumpStatus(STATUS_ON);
}else if(digitalRead(BTN_2_PIN) == HIGH){
Serial.print("RELE 2 ON: ");
Serial.println(RELE_2_PIN);
digitalWrite(RELE_2_PIN, LOW);
setPumpStatus(STATUS_ON);
}else if(digitalRead(BTN_3_PIN) == HIGH){
Serial.print("RELE 3 ON: ");
Serial.println(RELE_3_PIN);
digitalWrite(RELE_3_PIN, LOW);
setPumpStatus(STATUS_ON);
}else if(digitalRead(BTN_4_PIN) == HIGH){
Serial.print("RELE 4 ON: ");
Serial.println(RELE_4_PIN);
digitalWrite(RELE_4_PIN, LOW);
setPumpStatus(STATUS_ON);
}
}
void setPumpStatus (String status){
pumpStatus = status;
Serial.println(pumpStatus);
}
void switchReleByPosition(int position, bool status){
if(position == 1){
digitalWrite(RELE_1_PIN, status);
}else if(position == 2){
digitalWrite(RELE_2_PIN, status);
}else if(position == 3){
digitalWrite(RELE_3_PIN, status);
}else if(position == 4){
digitalWrite(RELE_4_PIN, status);
}
}
void switchRele(String tagNumber) {
if(tagNumber == "35617813"){
digitalWrite(RELE_1_PIN, LOW);
}else if(tagNumber == "191744248"){
digitalWrite(RELE_2_PIN, LOW);
}else if(tagNumber == "147448916"){
digitalWrite(RELE_3_PIN, LOW);
}else if(tagNumber == "192211912"){
digitalWrite(RELE_4_PIN, LOW);
}
}
/**
Helper routine to dump a byte array as hex values to Serial.
*/
void printHex(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], HEX);
}
}
/**
Helper routine to dump a byte array as dec values to Serial.
*/
void printDec(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], DEC);
}
}
/**
Helper routine to dump a byte array as dec values to Serial.
*/
String DecToString(byte *buffer, byte bufferSize) {
String returnValue = "";
for (byte i = 0; i < bufferSize; i++) {
returnValue = returnValue + buffer[i];
}
return returnValue;
}
void resetReles(){
Serial.println("reset_reles");
digitalWrite(RELE_1_PIN, HIGH);
digitalWrite(RELE_2_PIN, HIGH);
digitalWrite(RELE_3_PIN, HIGH);
digitalWrite(RELE_4_PIN, HIGH);
}
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 < 0 ) {
rotVal = 0;
}
}
else {
rotVal++;
if ( rotVal > 10 ) {
rotVal = 10;
}
}
Serial.println(rotVal);
delay(100);
}
s1Last = s1State;
//gestion bouton
keyState = digitalRead(KEY);
if (keyState == LOW && keyLast == HIGH) {
Serial.println("Rotary pressed");
delay(100);//debounce
}
keyLast = keyState;
}
void setLed(int red, int green, int blue){
for(int i=0; i<NUMPIXELS; i++) {
pixels.setPixelColor(i, pixels.Color(red, green, blue));
pixels.show();
}
}
void tagReaded(String tagRead){
blockTime = millis();
//switchRele(tagRead);
setPumpStatus(STATUS_TAG_READ);
setLed(0,255,0);
//printDec(rfid.uid.uidByte, rfid.uid.size);
}
void readRFID() { /* function readRFID */
if(digitalRead(SS_PIN) == HIGH){
Serial.println("Button ON");
tagReaded("TAG_POL");
}
/* ////Read RFID card
for (byte i = 0; i < 6; i++) {
key.keyByte[i] = 0xFF;
}
// Look for new 1 cards
if ( ! rfid.PICC_IsNewCardPresent())
return;
// Verify if the NUID has been readed
if ( !rfid.PICC_ReadCardSerial())
return;
// Store NUID into nuidPICC array
for (byte i = 0; i < 4; i++) {
nuidPICC[i] = rfid.uid.uidByte[i];
}
//Serial.print(F("RFID In dec: "));
tagRead = DecToString(rfid.uid.uidByte, rfid.uid.size);
Serial.println(DecToString(rfid.uid.uidByte, rfid.uid.size));
tagReaded(tagRead);
// Halt PICC
rfid.PICC_HaltA();
// Stop encryption on PCD
rfid.PCD_StopCrypto1();
*/
}