forked from youen/OneWireArduinoSlave
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
2.2 KiB
117 lines
2.2 KiB
#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: |
|
; |
|
} |
|
}
|
|
|