pina-maomen-arduino.ino 2,52 ko
Newer Older
Quentin Vauthier's avatar
Quentin Vauthier a validé
#include <Arduino.h>
#define tiltEnterPin 2
#define tiltLeavePin 3
#define greenPin 4
#define redPin 5
#define switchLockPin 7
Quentin Vauthier's avatar
Quentin Vauthier a validé

#define initCatsInside 1

bool tiltOneHigh, tiltTwoHigh;
Quentin Vauthier's avatar
Quentin Vauthier a validé
bool locked;
Quentin Vauthier's avatar
Quentin Vauthier a validé

int catsInside;
long lastEnteredAt, lastLeftAt, lastSwitchedAt;
Quentin Vauthier's avatar
Quentin Vauthier a validé

void setup() {
  Serial.begin(9600);
  pinMode(switchLockPin, INPUT );
Quentin Vauthier's avatar
Quentin Vauthier a validé
  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 );
Quentin Vauthier's avatar
Quentin Vauthier a validé
  catsInside = initCatsInside;
}
volatile bool clicked = false;
Quentin Vauthier's avatar
Quentin Vauthier a validé
void loop() {
  if(digitalRead(switchLockPin) == HIGH) lockUnlock();
}

void printStatus() {
  String status = "{\"locked\": " + (locked ? String("true") : String("false")) + ", \"catsInside\": " + String(catsInside) + "}";
  Serial.println(status);
Quentin Vauthier's avatar
Quentin Vauthier a validé
}

void catEntered() {
  long now = millis();
  if(now - lastEnteredAt < 1000) return;
  ++catsInside;
  lastEnteredAt = now;
  printStatus();
  while(digitalRead(tiltEnterPin) == HIGH) {
    lastEnteredAt = millis();
  }
Quentin Vauthier's avatar
Quentin Vauthier a validé
}

void catLeft() {
  long now = millis();
  if(now - lastLeftAt < 1000) return;
Quentin Vauthier's avatar
Quentin Vauthier a validé
  if(catsInside > 0) --catsInside;
  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();
  }
Quentin Vauthier's avatar
Quentin Vauthier a validé
}

/*
  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") {
Quentin Vauthier's avatar
Quentin Vauthier a validé
    digitalWrite(greenPin, LOW);
    digitalWrite(redPin, HIGH);
Quentin Vauthier's avatar
Quentin Vauthier a validé
  }else if(message == "unlock") {
Quentin Vauthier's avatar
Quentin Vauthier a validé
    locked = false;
Quentin Vauthier's avatar
Quentin Vauthier a validé
    digitalWrite(redPin, LOW);
    digitalWrite(greenPin, HIGH);
Quentin Vauthier's avatar
Quentin Vauthier a validé
  }else if(message == "status") {
Quentin Vauthier's avatar
Quentin Vauthier a validé
  }else {
    Serial.println("Unknown event");
  }
}