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.
76 lines
2.5 KiB
76 lines
2.5 KiB
9 years ago
|
#include "Arduino.h"
|
||
|
#include "LowLevel.h"
|
||
|
#include "OneWireSlave.h"
|
||
|
|
||
|
#define LEDPin 13
|
||
|
|
||
|
// This is the pin that will be used for one-wire data (depending on your arduino model, you are limited to a few choices, because some pins don't have complete interrupt support)
|
||
|
// On Arduino Uno, you can use pin 2 or pin 3
|
||
|
#define OWPin 2
|
||
|
|
||
|
Pin led(LEDPin);
|
||
|
|
||
|
// This is the ROM the arduino will respond to, make sure it doesn't conflict with another device
|
||
|
byte owROM[7] = { 0xE2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 };
|
||
|
|
||
|
byte acknowledge = 0x42;
|
||
|
|
||
|
// This sample implements a simple protocol : sending match ROM, then the ROM, then 0x01 will turn the arduino light on. Sending 0x02 will turn it off. In each case, the byte 0x42 is sent as acknowledgement.
|
||
|
const byte CMD_TurnOn = 0x01;
|
||
|
const byte CMD_TurnOff = 0x02;
|
||
|
|
||
|
// This function will be called each time the OneWire library has an event to notify (reset, error, byte received)
|
||
|
void owReceive(OneWireSlave::ReceiveEvent evt, byte data);
|
||
|
|
||
|
void setup()
|
||
|
{
|
||
|
led.outputMode();
|
||
|
led.writeLow();
|
||
|
|
||
|
// Setup the OneWire library
|
||
|
OneWire.setReceiveCallback(&owReceive);
|
||
|
OneWire.begin(owROM, OWPin);
|
||
|
}
|
||
|
|
||
|
void loop()
|
||
|
{
|
||
|
delay(1);
|
||
|
|
||
|
// You can do anything you want here, the OneWire library works entirely in background, using interrupts.
|
||
|
|
||
|
cli();//disable interrupts
|
||
|
// Be sure to not block interrupts for too long, OneWire timing is very tight for some operations. 1 or 2 microseconds (yes, microseconds, not milliseconds) can be too much depending on your master controller, but then it's equally unlikely that you block exactly at the moment where it matters.
|
||
|
// This can be mitigated by using error checking and retry in your high-level communication protocol. A good thing to do anyway.
|
||
|
sei();//enable interrupts
|
||
|
}
|
||
|
|
||
|
void owReceive(OneWireSlave::ReceiveEvent evt, byte data)
|
||
|
{
|
||
|
switch (evt)
|
||
|
{
|
||
|
case OneWireSlave::RE_Byte:
|
||
|
if (data == CMD_TurnOn)
|
||
|
{
|
||
|
led.writeHigh();
|
||
|
}
|
||
|
else if (data == CMD_TurnOff)
|
||
|
{
|
||
|
led.writeLow();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// in this simple example we just reply with one byte to say we've processed the command
|
||
|
// a real application should have a CRC system to ensure messages are not corrupt, for both directions
|
||
|
// you can use the static OneWireSlave::crc8 method to add CRC checks in your communication protocol (it conforms to standard one-wire CRC checks, that is used to compute the ROM last byte for example)
|
||
|
OneWire.write(&acknowledge, 1, NULL);
|
||
|
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
; // we could also react to reset and error notifications, but not in this sample
|
||
|
}
|
||
|
}
|