//Serial.begin(115200);
//Serial.println("Hello, ESP32!");
int openInput = 22;
int closeInput = 23;
int unlockInput = 27;
int lockInput = 26;
int led = 32;
bool openLast = false;
bool closeLast = false;
bool unlockLast = false;
bool lockLast = false;
int openActuator = 12;
int closeActuator = 14;
unsigned long openTimer = 0;
unsigned long closeTimer = 0;
unsigned long answerTimer = 0;
unsigned long statusTimer = 0;
bool locked = true;
int count = 0;
int target = 0;
bool statusColor = false;
void setup() {
pinMode(openInput, INPUT);
pinMode(closeInput, INPUT);
pinMode(unlockInput, INPUT);
pinMode(lockInput, INPUT);
pinMode(openActuator, OUTPUT);
pinMode(closeActuator, OUTPUT);
pinMode(led, OUTPUT);
digitalWrite(led, true);
delay(100);
digitalWrite(led, false);
delay(100);
//pinMode(LED_BUILTIN, OUTPUT);
//digitalWrite(LED_BUILTIN, false);
}
void loop() {
checkInput();
checkTimers();
showStatus();
}
void checkInput(){
if(!locked){
bool open = digitalRead(openInput);
//check greeting change
if(openLast!=open){
openLast = open;
//on release button
if(!open){
openLock();
}
}
bool close = digitalRead(closeInput);
//check greeting change
if(closeLast!=close){
closeLast = close;
//on release button
if(!close){
closeLock();
}
}
bool lock = digitalRead(lockInput);
//check greeting change
if(lockLast!=lock){
lockLast = lock;
//on release button
if(!lock){
locked = true;
}
}
}else{
bool unlock = digitalRead(unlockInput);
//check greeting change
if(unlockLast!=unlock){
unlockLast = unlock;
//on release button
if(!unlock){
onUnlockPush();
}
}
bool open = digitalRead(openInput);
//check greeting change
if(openLast!=open){
openLast = open;
//on release button
if(!open){
errorMsg();
}
}
bool close = digitalRead(closeInput);
//check greeting change
if(closeLast!=close){
closeLast = close;
//on release button
if(!close){
errorMsg();
}
}
bool lock = digitalRead(lockInput);
//check greeting change
if(lockLast!=lock){
lockLast = lock;
//on release button
if(!lock){
digitalWrite(led, true);
delay(500);
digitalWrite(led, false);
delay(500);
}
}
}
}
void openLock(){
digitalWrite(openActuator, true);
openTimer = millis();
}
void closeLock(){
digitalWrite(closeActuator, true);
closeTimer = millis();
}
void checkTimers(){
if(millis()-openTimer>500 ){
digitalWrite(openActuator, false);
}
if(millis()-closeTimer>500 ){
digitalWrite(closeActuator, false);
}
if(target!=0 && millis()-answerTimer>1500 ){
checkAnswer();
}
}
void onUnlockPush(){
//ask
if(target==0){
// else reset message, send cue
count = 0;
target = random(2, 6);
for(int i=0;i<target;i++){
digitalWrite(led, true);
delay(300);
digitalWrite(led, false);
delay(300);
}
answerTimer = millis();
}else{
count++;
digitalWrite(led, true);
delay(200);
digitalWrite(led, false);
delay(100);
answerTimer = millis();
}
}
void checkAnswer(){
if(count==target){
target = 0;
locked = false;
openLock();
}else{
target = 0;
errorMsg();
}
}
void errorMsg(){
digitalWrite(led, true);
delay(100);
digitalWrite(led, false);
delay(100);
digitalWrite(led, true);
delay(100);
digitalWrite(led, false);
delay(100);
digitalWrite(led, true);
delay(100);
digitalWrite(led, false);
delay(100);
}
void showStatus(){
if(locked && target==0){
if(millis()-statusTimer>1000){
digitalWrite(led, true);
delay(100);
digitalWrite(led, false);
statusTimer = millis();
}
}
}