/* Sketch sends out an address byte to peripheral nodes. They will toggle an led on receipt of their own address. The control node respond to a long or short button press. A long press flips which address is going to be sent out. A short press sends it. Largely based on the Arduino Debounce example, see original source for author credits. https://www.arduino.cc/en/Tutorial/BuiltInExamples/Debounce We've used an internal Pullup, so some logic has been reversed. Once the debounce timer has expired and the leading edge is detected a timestamp is recorded. On detecting the trailing edge we decide if the pulse was short or long. */ // constants won't change. They're used here to set pin numbers: const int buttonPin = 2; // the number of the pushbutton pin const int ledPin = 13; // the number of the LED pin // Variables will change: int ledState = LOW; // the current state of the output pin int buttonState; // the current reading from the input pin int lastButtonState = HIGH; // the previous reading from the input pin // the following variables are unsigned longs because the time, measured in // milliseconds, will quickly become a bigger number than can be stored in an int. unsigned long lastDebounceTime = 0; // the last time the output pin was toggled unsigned long debounceDelay = 50; // the debounce time; increase if the output flickers unsigned long fallingEdgeTime = 0; unsigned long longPulseThreshold = 500; byte address = 0; void setup() { pinMode(buttonPin, INPUT_PULLUP); pinMode(ledPin, OUTPUT); Serial.begin(9600); // set initial LED state digitalWrite(ledPin, ledState); } void loop() { // read the state of the switch into a local variable: int reading = digitalRead(buttonPin); // check to see if you just pressed the button // (i.e. the input went from HIGH to LOW), and you've waited long enough // since the last press to ignore any noise: // If the switch changed, due to noise or pressing: if (reading != lastButtonState) { // reset the debouncing timer lastDebounceTime = millis(); } if ((millis() - lastDebounceTime) > debounceDelay) { // whatever the reading is at, it's been there for longer than the debounce // delay, so take it as the actual current state: // if the button state has changed: if (reading != buttonState) { buttonState = reading; // timestamp a falling edge if (buttonState == LOW) { fallingEdgeTime = millis(); } if (buttonState == HIGH) { if ((millis() - fallingEdgeTime) > longPulseThreshold) { if (address == 0) { address = 1; } else { address = 0; } flash(); flash(); } else { Serial.print(address); } } } } // flash LED if we see an Ack. if ( Serial.available() > 0) { char input = Serial.read(); if (input == 'a') { flash(); } } // save the reading. Next time through the loop, it'll be the lastButtonState: lastButtonState = reading; } void flash() { digitalWrite(ledPin, HIGH); delay(80); digitalWrite(ledPin, LOW); delay(100); }