#include "esp32/rom/rtc.h"
#include <FS.h>
#include <LittleFS.h>
#include <HTTPClient.h>
#include <Adafruit_NeoPixel.h> // https://github.com/adafruit/Adafruit_NeoPixel
#include <DigitalSignals.h> // https://github.com/cotestatnt/DigitalSignal
#include <Keypad.h>
#include "variables.h"
bool error = false;
const char* audio_success = "/success.mp3";
const char* audio_click = "/click.mp3";
const char* audio_error = "/error.mp3";
DigitalOut apri_porta(OutType::TOFF, PIN_EM_OUT, 10000, true);
DigitalIn apri_manuale(PIN_APRI_MANUALE, INPUT_PULLUP, 100);
Adafruit_NeoPixel strip(STRIP_LED, STRIP_OUT, NEO_GRB + NEO_KHZ800);
const byte ROWS = 4; // rows
const byte COLS = 3; // columns
byte rowPins[ROWS] = {5, 4, 15, 19}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {18, 17, 2}; //connect to the column pinouts of the keypad
//define the symbols on the buttons of the keypads
char keys[ROWS][COLS] = {
{'1', '2', '3'},
{'4', '5', '6'},
{'7', '8', '9'},
{'*', '0', '#'}
};
// initialize an instance of class NewKeypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS);
void setPixelColor (byte pixel, uint32_t color) {
strip.setPixelColor(pixel, color);
strip.show();
}
void playTrack(const char* track) {
Serial.printf("Play traccia %s\n", track);
}
void apri_porta_cb() {
apri_porta.run(true);
playTrack(audio_success);
resetTime = millis();
aperto = true;
}
void setup() {
Serial.begin(115200);
strip.begin();
strip.setBrightness(100);
strip.clear();
for (int i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, 50, 50, 50);
strip.show();
delay(50);
}
delay(250);
strip.clear();
strip.show();
apri_manuale.onPressed([](void* arg){
Serial.printf("%s", "Apertura manuale da pulsante\n");
apri_porta.setTime(2000);
apri_porta.run(true);
aperto = true;
});
strip.fill(BLACK, 0, 5);
strip.show();
wait_time = millis() - WAIT_TIME - 100;
}
void loop() {
delay(1);
// strip.show();
apri_manuale.update();
// Basta un fronte di salita (attivato nelle funzioni di callback pulsante_apri_cb() e pulsante_emergenza_cb)
// per far partire il timer, quindi riporto subito a false il segnale di controllo dell'uscita temporizzata
apri_porta.run(false);
if (millis() - resetTime > 10000 && aperto) {
Serial.printf("%s\n", "Reset tastierino");
aperto = false;
strip.fill(BLACK, 0, 5);
strip.show();
}
if (millis() - wait_time > WAIT_TIME && !aperto) {
char key = keypad.getKey();
if (key) {
playTrack(audio_click);
setPixelColor(key_index, BLUE);
codice_inserito[key_index++] = key;
// Serial.println(key);
if (key_index >= 5) {
key_index = 0;
Serial.printf("Codice inserito %c %c %c %c %c\n",
codice_inserito[0],
codice_inserito[1],
codice_inserito[2],
codice_inserito[3],
codice_inserito[4]
);
bool result = true;
for (int i = 0; i < 5; i++) {
if (codice_corretto[i] != codice_inserito[i])
result = false;
}
if (result) {
Serial.printf("%s\n", "Codice corretto!");
memset(codice_inserito, '*', 5);
aperto = true;
strip.fill(GREEN, 0, 5);
strip.show();
apri_porta.setTime(10000);
apri_porta_cb();
} else {
Serial.printf("%s\n", "Codice errato!");
strip.fill(RED, 0, 5);
strip.show();
playTrack(audio_error);
wait_time = millis();
error = true;
}
}
}
}
if (millis() - wait_time < WAIT_TIME && !aperto) {
static uint32_t blinkTime = millis();
static bool blink = true;
if (millis() - blinkTime > 500) {
// Serial.println("error");
blinkTime = millis();
blink = !blink;
if (blink) {
strip.fill(RED, 0, 5);
strip.show();
} else {
strip.fill(BLACK, 0, 5);
strip.show();
}
}
// Sblocco manuale del master
char key = keypad.getKey();
if (key) {
codice_inserito[key_index++] = key;
// Serial.println(key);
if (key_index >= 5) {
key_index = 0;
Serial.printf("Codice inserito %c %c %c %c %c\n",
codice_inserito[0],
codice_inserito[1],
codice_inserito[2],
codice_inserito[3],
codice_inserito[4]
);
bool override = true;
for (int i = 0; i < 5; i++) {
if (codice_servizio[i] != codice_inserito[i])
override = false;
}
if (override) {
playTrack(audio_click);
override = false;
contServizio++;
memset(codice_inserito, '*', 5);
if (contServizio > 1) {
Serial.printf("%s\n", "Sblocco manuale eseguito!");
aperto = true;
apri_porta_cb();
contServizio = 0;
resetTime = millis() - 25000;
wait_time = millis() - WAIT_TIME;
strip.fill(GREEN, 0, 5);
strip.show();
}
}
}
}
}
else if (!aperto && error) {
Serial.println("Spengo led dopo errore");
error = false;
strip.fill(BLACK, 0, 5);
strip.show();
}
}