#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; } } }