|
|
|
#include "Arduino.h"
|
|
|
|
#include "LowLevel.h"
|
|
|
|
#include "SerialChannel.h"
|
|
|
|
|
|
|
|
#define LEDPin 13
|
|
|
|
#define OWPin 2
|
|
|
|
#define InterruptNumber 0 // Must correspond to the OWPin to correctly detect state changes. On Arduino Uno, interrupt 0 is for digital pin 2
|
|
|
|
|
|
|
|
#define ResetMinDuration 480
|
|
|
|
#define ResetMaxDuration 900
|
|
|
|
|
|
|
|
#define PresenceWaitDuration 30
|
|
|
|
#define PresenceDuration 150
|
|
|
|
|
|
|
|
SerialChannel debug("debug");
|
|
|
|
|
|
|
|
Pin owPin(OWPin);
|
|
|
|
Pin ledPin(LEDPin);
|
|
|
|
|
|
|
|
unsigned long resetStart = (unsigned long)-1;
|
|
|
|
|
|
|
|
enum Status
|
|
|
|
{
|
|
|
|
S_WaitReset,
|
|
|
|
S_WaitPresence,
|
|
|
|
S_Presence,
|
|
|
|
};
|
|
|
|
|
|
|
|
Status status = S_WaitReset;
|
|
|
|
unsigned long statusChangeTime = (unsigned long)-1;
|
|
|
|
|
|
|
|
void setup()
|
|
|
|
{
|
|
|
|
ledPin.outputMode();
|
|
|
|
owPin.inputMode();
|
|
|
|
|
|
|
|
ledPin.writeLow();
|
|
|
|
|
|
|
|
attachInterrupt(InterruptNumber,onewireInterrupt,CHANGE);
|
|
|
|
|
|
|
|
Serial.begin(400000);
|
|
|
|
}
|
|
|
|
|
|
|
|
void loop()
|
|
|
|
{
|
|
|
|
cli();//disable interrupts
|
|
|
|
SerialChannel::swap();
|
|
|
|
sei();//enable interrupts
|
|
|
|
|
|
|
|
SerialChannel::flush();
|
|
|
|
}
|
|
|
|
|
|
|
|
void onewireInterrupt(void)
|
|
|
|
{
|
|
|
|
bool state = owPin.read();
|
|
|
|
unsigned long now = micros();
|
|
|
|
|
|
|
|
//ledPin.write(state);
|
|
|
|
|
|
|
|
if (!state)
|
|
|
|
resetStart = now;
|
|
|
|
|
|
|
|
if (state)
|
|
|
|
{
|
|
|
|
unsigned long resetDuration = resetStart == (unsigned long)-1 ? (unsigned long)-1 : now - resetStart;
|
|
|
|
resetStart = (unsigned long)-1;
|
|
|
|
|
|
|
|
if (resetDuration >= ResetMinDuration && resetDuration <= ResetMaxDuration)
|
|
|
|
{
|
|
|
|
debug.SC_APPEND_STR_TIME("reset", now);
|
|
|
|
status = S_WaitPresence;
|
|
|
|
statusChangeTime = now;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|