Newer
Older
#include <Arduino.h>
#define tiltEnterPin 2
#define tiltLeavePin 3
#define greenPin 4
#define redPin 5
#define initCatsInside 1
bool tiltOneHigh, tiltTwoHigh;
long lastEnteredAt, lastLeftAt, lastSwitchedAt;
pinMode(switchLockPin, INPUT );
pinMode(tiltEnterPin, INPUT);
pinMode(tiltLeavePin, INPUT);
pinMode(greenPin, OUTPUT);
pinMode(redPin, OUTPUT);
digitalWrite(greenPin, HIGH);
digitalWrite(redPin, LOW);
attachInterrupt(digitalPinToInterrupt( tiltEnterPin ), catEntered, HIGH );
attachInterrupt(digitalPinToInterrupt( tiltLeavePin ), catLeft, HIGH );
volatile bool clicked = false;
if(digitalRead(switchLockPin) == HIGH) lockUnlock();
}
void printStatus() {
String status = "{\"locked\": " + (locked ? String("true") : String("false")) + ", \"catsInside\": " + String(catsInside) + "}";
Serial.println(status);
}
void catEntered() {
long now = millis();
if(now - lastEnteredAt < 1000) return;
++catsInside;
lastEnteredAt = now;
printStatus();
while(digitalRead(tiltEnterPin) == HIGH) {
lastEnteredAt = millis();
}
if(now - lastLeftAt < 1000) return;
lastLeftAt = now;
printStatus();
while(digitalRead(tiltLeavePin) == HIGH) {
lastLeftAt = millis();
}
}
void lockUnlock() {
long now = millis();
if(now - lastSwitchedAt < 50) return;
locked = !locked;
digitalWrite(greenPin, !locked);
digitalWrite(redPin, locked);
printStatus();
while(digitalRead(switchLockPin) == HIGH) {
lastSwitchedAt = millis();
}
}
/*
SerialEvent occurs whenever a new data comes in the hardware serial RX. This
routine is run between each time loop() runs, so using delay inside loop can
delay response. Multiple bytes of data may be available.
*/
String message = "";
void serialEvent() {
while (Serial.available()) {
char inChar = (char)Serial.read();
message += inChar;
if(inChar == '\n') {
handleMessage(message);
message = "";
}
}
}
void handleMessage(String message) {
message.trim();
if(message == "lock") {
digitalWrite(greenPin, LOW);
digitalWrite(redPin, HIGH);
digitalWrite(redPin, LOW);
digitalWrite(greenPin, HIGH);
}else {
Serial.println("Unknown event");
}
}