#include "Arduino.h" #include "LowLevel.h" #include "SerialChannel.h" #include "OneWireSlave.h" #define LEDPin 13 #define OWPin 2 #ifdef ENABLE_SERIAL_CHANNEL SerialChannel debug("debug"); #endif Pin led(LEDPin); byte owROM[7] = { 0xE2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 }; byte acknowledge = 0x42; byte commandCheckError = 0xF1; int turnOnTimeoutSeconds = 5 * 60; const byte CMD_TurnOn = 0x01; const byte CMD_TurnOff = 0x02; const byte CMD_ReadState = 0x03; const byte ANS_StateIsOn = 0x01; const byte ANS_StateIsOff = 0x02; volatile byte command = 0x0; volatile long turnOnStartTime = 0; void owReceive(OneWireSlave::ReceiveEvent evt, byte data); void setup() { led.outputMode(); led.writeLow(); OneWire.setReceiveCallback(&owReceive); OneWire.begin(owROM, OWPin); Serial.begin(9600); } void loop() { delay(1); long now = millis(); if (now > turnOnStartTime + (long)turnOnTimeoutSeconds * 1000 || now < turnOnStartTime) { led.writeLow(); turnOnStartTime = 0; } cli();//disable interrupts #ifdef ENABLE_SERIAL_CHANNEL SerialChannel::swap(); #endif sei();//enable interrupts #ifdef ENABLE_SERIAL_CHANNEL SerialChannel::flush(); #endif } void owReceive(OneWireSlave::ReceiveEvent evt, byte data) { switch (evt) { case OneWireSlave::RE_Byte: if (command == 0x00) { command = data; } else { if (data == (0xFF-command)) // to check there is no communication error, the master must send the command, and then its inverse { byte receivedCommand = command; command = 0x0; switch (receivedCommand) { case CMD_TurnOn: turnOnStartTime = millis(); led.writeHigh(); OneWire.write(&acknowledge, 1, NULL); break; case CMD_TurnOff: led.writeLow(); turnOnStartTime = 0; OneWire.write(&acknowledge, 1, NULL); break; case CMD_ReadState: bool state = led.read(); static byte response[2]; response[0] = state ? ANS_StateIsOn : ANS_StateIsOff; response[1] = 0xFF - response[0]; OneWire.write(response, 2, NULL); break; } } else { command = 0x0; OneWire.write(&commandCheckError, 1, NULL); } } break; case OneWireSlave::RE_Reset: case OneWireSlave::RE_Error: command = 0x0; break; default: ; } }