// Arduino Coin Jar
// vgmlr
#include "Keypad.h"
#include "Password.h"
#include "VarSpeedServo.h"
VarSpeedServo jar;
// Pins
int piezo = A2;
int red = A3;
int green = A4;
int blue = A5;
int relay = 2;
int jar_pin = 3;
int pir = 4;
// Keypad
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {5, 6, 7, 8};
byte colPins[COLS] = {9, 10, 11, 12};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
// Set Passcode
Password passcode = Password( "947" );
// States
int closed = 88;
int opened = 30;
int open_state = 0;
int pir_state = 0;
int motion;
void setup() {
Serial.begin(9600);
// Pin Placements
jar.attach(jar_pin);
pinMode(piezo, OUTPUT);
pinMode(red, OUTPUT);
pinMode(green, OUTPUT);
pinMode(blue, OUTPUT);
pinMode(relay, OUTPUT);
pinMode(pir, INPUT);
// Keypad Listener
keypad.addEventListener(keypadEvent);
// Close Jar
jar.write(closed, 200, true);
// No Buzz
noTone(piezo);
// No Zap
digitalWrite(relay, LOW);
// Activate
// Form of Coin Jar
while (millis() < 2000)
{
digitalWrite(blue, HIGH);
delay(50);
digitalWrite(blue, LOW);
delay(50);
}
digitalWrite(green, LOW);
digitalWrite(red, HIGH);
pir_state = 1;
}
void loop() {
keypad.getKey();
motion_sensor();
}
void keypadEvent(KeypadEvent eKey) {
switch (keypad.getState()) {
case PRESSED:
Serial.println(eKey);
button();
switch (eKey) {
case '#': check_passcode(); break;
case '*': passcode.reset(); break;
default: passcode.append(eKey);
}
}
}
void check_passcode() {
if (passcode.evaluate()) {
if (open_state == 0) {
open_coin_jar();
passcode.reset();
} else if (open_state == 1) {
close_coin_jar();
passcode.reset();
}
} else {
digitalWrite(blue, LOW);
digitalWrite(green, LOW);
while (millis() < 2000) {
digitalWrite(red, HIGH);
delay(50);
digitalWrite(red, LOW);
delay(50);
}
}
}
void open_coin_jar() {
pir_state = 0;
digitalWrite(green, HIGH);
digitalWrite(red, LOW);
digitalWrite(relay, LOW);
jar.write(opened, 200, true);
open_state = 1;
}
void close_coin_jar() {
jar.write(closed, 200, true);
open_state = 0;
pir_state = 1;
}
void motion_sensor() {
if (pir_state == 1) {
digitalWrite(red, HIGH);
digitalWrite(green, LOW);
motion = digitalRead(pir);
if (motion == HIGH) {
digitalWrite(relay, HIGH);
delay(1000);
digitalWrite(relay, LOW);
}
} else if (pir_state == 0) {
digitalWrite(red, LOW);
digitalWrite(green, HIGH);
digitalWrite(relay, LOW);
}
}
void button() {
digitalWrite(red, LOW);
digitalWrite(green, LOW);
digitalWrite(blue, HIGH);
tone(piezo, 1000);
delay(250);
digitalWrite(blue, LOW);
noTone(piezo);
}