#include "OWSlave.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 unsigned char rom[8] = {0xE2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00}; volatile long prevInt = 0; // Previous Interrupt micros volatile boolean owReset = false; OWSlave oneWire(OWPin); void setup() { pinMode(LEDPin, OUTPUT); pinMode(OWPin, INPUT); digitalWrite(LEDPin, LOW); attachInterrupt(InterruptNumber,onewireInterrupt,CHANGE); oneWire.setRom(rom); } void loop() { if (owReset) owHandler(); } void owHandler(void) { detachInterrupt(InterruptNumber); owReset=false; if (oneWire.presence()) { if (oneWire.recvAndProcessCmd()) { uint8_t cmd = oneWire.recv(); if (cmd == 0x44) { digitalWrite(LEDPin, HIGH); } if (cmd == 0xBE) { for( int i = 0; i < 9; i++) { oneWire.send((byte)0); } } } } attachInterrupt(InterruptNumber,onewireInterrupt,CHANGE); } void onewireInterrupt(void) { volatile long lastMicros = micros() - prevInt; prevInt = micros(); if (lastMicros >= 410 && lastMicros <= 550) { // OneWire Reset Detected owReset=true; } }