Skip to content

Commit

Permalink
feat(matter_examples): apply boot button change to all examples (#10702)
Browse files Browse the repository at this point in the history
* feat(matter_examples): apply boot button change to all examples
  • Loading branch information
SuGlider authored Dec 10, 2024
1 parent 5a8cba8 commit de4824f
Show file tree
Hide file tree
Showing 13 changed files with 260 additions and 115 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,13 @@ const uint8_t ledPin = 2; // Set your pin here if your board has not defined LE
#endif

// set your board USER BUTTON pin here
const uint8_t buttonPin = 0; // Set your pin here. Using BOOT Button. C6/C3 use GPIO9.
const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button.

// Button control
uint32_t button_time_stamp = 0; // debouncing control
bool button_state = false; // false = released | true = pressed
const uint32_t debouceTime = 250; // button debouncing time (ms)
const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission

// WiFi is manually set and started
const char *ssid = "your-ssid"; // Change this to your WiFi SSID
Expand Down Expand Up @@ -125,11 +131,6 @@ void setup() {
ColorLight.updateAccessory();
}
}
// Button control
uint32_t button_time_stamp = 0; // debouncing control
bool button_state = false; // false = released | true = pressed
const uint32_t debouceTime = 250; // button debouncing time (ms)
const uint32_t decommissioningTimeout = 10000; // keep the button pressed for 10s to decommission the light

void loop() {
// Check Matter Light Commissioning state, which may change during execution of loop()
Expand Down Expand Up @@ -167,17 +168,18 @@ void loop() {

// Onboard User Button is used as a Light toggle switch or to decommission it
uint32_t time_diff = millis() - button_time_stamp;
if (button_state && time_diff > debouceTime && digitalRead(buttonPin) == HIGH) {
button_state = false; // released
if (digitalRead(buttonPin) == HIGH && button_state && time_diff > debouceTime) {
// Toggle button is released - toggle the light
Serial.println("User button released. Toggling Light!");
ColorLight.toggle(); // Matter Controller also can see the change
ColorLight.toggle(); // Matter Controller also can see the change
button_state = false; // released
}

// Factory reset is triggered if the button is pressed longer than 10 seconds
if (time_diff > decommissioningTimeout) {
Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again.");
ColorLight = false; // turn the light off
Matter.decommission();
}
// Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node
if (button_state && time_diff > decommissioningTimeout) {
Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again.");
ColorLight = false; // turn the light off
Matter.decommission();
button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,31 +18,42 @@

// List of Matter Endpoints for this Node
// There will be 3 On/Off Light Endpoints in the same Node
MatterOnOffLight OnOffLight1;
MatterOnOffLight OnOffLight2;
MatterOnOffLight OnOffLight3;
MatterOnOffLight Light1;
MatterDimmableLight Light2;
MatterColorLight Light3;

// WiFi is manually set and started
const char *ssid = "your-ssid"; // Change this to your WiFi SSID
const char *password = "your-password"; // Change this to your WiFi password

// set your board USER BUTTON pin here - USED to decommission the Matter Node
const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button.

// Button control
uint32_t button_time_stamp = 0; // debouncing control
bool button_state = false; // false = released | true = pressed
const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission

// Matter Protocol Endpoint Callback for each Light Accessory
bool setLightOnOff1(bool state) {
Serial.printf("CB-Light1 changed state to: %s\r\n", state ? "ON" : "OFF");
Serial.printf("Light1 changed state to: %s\r\n", state ? "ON" : "OFF");
return true;
}

bool setLightOnOff2(bool state) {
Serial.printf("CB-Light2 changed state to: %s\r\n", state ? "ON" : "OFF");
Serial.printf("Light2 changed state to: %s\r\n", state ? "ON" : "OFF");
return true;
}

bool setLightOnOff3(bool state) {
Serial.printf("CB-Light3 changed state to: %s\r\n", state ? "ON" : "OFF");
Serial.printf("Light3 changed state to: %s\r\n", state ? "ON" : "OFF");
return true;
}

void setup() {
// Initialize the USER BUTTON (Boot button) that will be used to decommission the Matter Node
pinMode(buttonPin, INPUT_PULLUP);

Serial.begin(115200);
while (!Serial) {
delay(100);
Expand All @@ -60,24 +71,27 @@ void setup() {
delay(500);
Serial.print(".");
}
Serial.println("\r\nWiFi connected");
Serial.println();
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
delay(500);

// Initialize all 3 Matter EndPoints
OnOffLight1.begin();
OnOffLight2.begin();
OnOffLight3.begin();
OnOffLight1.onChange(setLightOnOff1);
OnOffLight2.onChange(setLightOnOff2);
OnOffLight3.onChange(setLightOnOff3);
Light1.begin();
Light2.begin();
Light3.begin();
Light1.onChangeOnOff(setLightOnOff1);
Light2.onChangeOnOff(setLightOnOff2);
Light3.onChangeOnOff(setLightOnOff3);

// Matter beginning - Last step, after all EndPoints are initialized
Matter.begin();
}

void loop() {
static uint32_t timeCounter = 0;

// Check Matter Light Commissioning state
if (!Matter.isDeviceCommissioned()) {
Serial.println("");
Expand All @@ -97,10 +111,32 @@ void loop() {
Serial.println("Matter Node is commissioned and connected to Wi-Fi. Ready for use.");
}

//displays the Light state every 3 seconds
Serial.println("======================");
Serial.printf("Matter Light #1 is %s\r\n", OnOffLight1.getOnOff() ? "ON" : "OFF");
Serial.printf("Matter Light #2 is %s\r\n", OnOffLight2.getOnOff() ? "ON" : "OFF");
Serial.printf("Matter Light #3 is %s\r\n", OnOffLight3.getOnOff() ? "ON" : "OFF");
delay(3000);
//displays the Light state every 5 seconds
if (!(timeCounter++ % 10)) { // delaying for 500ms x 10 = 5s
Serial.println("======================");
Serial.printf("Matter Light #1 is %s\r\n", Light1.getOnOff() ? "ON" : "OFF");
Serial.printf("Matter Light #2 is %s\r\n", Light2.getOnOff() ? "ON" : "OFF");
Serial.printf("Matter Light #3 is %s\r\n", Light3.getOnOff() ? "ON" : "OFF");
}

// Check if the button has been pressed
if (digitalRead(buttonPin) == LOW && !button_state) {
// deals with button debouncing
button_time_stamp = millis(); // record the time while the button is pressed.
button_state = true; // pressed.
}

if (digitalRead(buttonPin) == HIGH && button_state) {
button_state = false; // released
}

// Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node
uint32_t time_diff = millis() - button_time_stamp;
if (button_state && time_diff > decommissioningTimeout) {
Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again.");
Matter.decommission();
button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so
}

delay(500);
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,13 @@ const uint8_t ledPin = 2; // Set your pin here if your board has not defined LE
#endif

// set your board USER BUTTON pin here
const uint8_t buttonPin = 0; // Set your pin here. Using BOOT Button. C6/C3 use GPIO9.
const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button.

// Button control
uint32_t button_time_stamp = 0; // debouncing control
bool button_state = false; // false = released | true = pressed
const uint32_t debouceTime = 250; // button debouncing time (ms)
const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission

// WiFi is manually set and started
const char *ssid = "your-ssid"; // Change this to your WiFi SSID
Expand Down Expand Up @@ -117,11 +123,6 @@ void setup() {
DimmableLight.updateAccessory();
}
}
// Button control
uint32_t button_time_stamp = 0; // debouncing control
bool button_state = false; // false = released | true = pressed
const uint32_t debouceTime = 250; // button debouncing time (ms)
const uint32_t decommissioningTimeout = 10000; // keep the button pressed for 10s to decommission the light

void loop() {
// Check Matter Light Commissioning state, which may change during execution of loop()
Expand Down Expand Up @@ -156,17 +157,18 @@ void loop() {

// Onboard User Button is used as a Light toggle switch or to decommission it
uint32_t time_diff = millis() - button_time_stamp;
if (button_state && time_diff > debouceTime && digitalRead(buttonPin) == HIGH) {
button_state = false; // released
if (digitalRead(buttonPin) == HIGH && button_state && time_diff > debouceTime) {
// Toggle button is released - toggle the light
Serial.println("User button released. Toggling Light!");
DimmableLight.toggle(); // Matter Controller also can see the change
button_state = false; // released
}

// Factory reset is triggered if the button is pressed longer than 10 seconds
if (time_diff > decommissioningTimeout) {
Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again.");
DimmableLight = false; // turn the light off
Matter.decommission();
}
// Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node
if (button_state && time_diff > decommissioningTimeout) {
Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again.");
DimmableLight = false; // turn the light off
Matter.decommission();
button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,13 @@ const uint8_t ledPin = 2; // Set your pin here if your board has not defined LE
#endif

// set your board USER BUTTON pin here
const uint8_t buttonPin = 0; // Set your pin here. Using BOOT Button. C6/C3 use GPIO9.
const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button.

// Button control
uint32_t button_time_stamp = 0; // debouncing control
bool button_state = false; // false = released | true = pressed
const uint32_t debouceTime = 250; // button debouncing time (ms)
const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission

// WiFi is manually set and started
const char *ssid = "your-ssid"; // Change this to your WiFi SSID
Expand Down Expand Up @@ -147,11 +153,6 @@ void setup() {
EnhancedColorLight.updateAccessory();
}
}
// Button control
uint32_t button_time_stamp = 0; // debouncing control
bool button_state = false; // false = released | true = pressed
const uint32_t debouceTime = 250; // button debouncing time (ms)
const uint32_t decommissioningTimeout = 10000; // keep the button pressed for 10s to decommission the light

void loop() {
// Check Matter Light Commissioning state, which may change during execution of loop()
Expand Down Expand Up @@ -194,12 +195,13 @@ void loop() {
// Toggle button is released - toggle the light
Serial.println("User button released. Toggling Light!");
EnhancedColorLight.toggle(); // Matter Controller also can see the change
}

// Factory reset is triggered if the button is pressed longer than 10 seconds
if (time_diff > decommissioningTimeout) {
Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again.");
EnhancedColorLight = false; // turn the light off
Matter.decommission();
}
// Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node
if (button_state && time_diff > decommissioningTimeout) {
Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again.");
EnhancedColorLight = false; // turn the light off
Matter.decommission();
button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so
}
}
29 changes: 15 additions & 14 deletions libraries/Matter/examples/MatterFan/MatterFan.ino
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,14 @@
// Fan Endpoint - On/Off control + Speed Percent Control + Fan Modes
MatterFan Fan;

// set your board USER BUTTON pin here - used for toggling On/Off
const uint8_t buttonPin = 0; // Set your pin here. Using BOOT Button. C6/C3 use GPIO9.
// set your board USER BUTTON pin here - used for toggling On/Off and decommission the Matter Node
const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button.

// Button control
uint32_t button_time_stamp = 0; // debouncing control
bool button_state = false; // false = released | true = pressed
const uint32_t debouceTime = 250; // button debouncing time (ms)
const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission

// set your board Analog Pin here - used for changing the Fan speed
const uint8_t analogPin = A0; // Analog Pin depends on each board
Expand Down Expand Up @@ -56,7 +62,7 @@ void fanDCMotorDrive(bool fanState, uint8_t speedPercent) {
}

void setup() {
// Initialize the USER BUTTON (Boot button) GPIO that will toggle the Fan (On/Off)
// Initialize the USER BUTTON (Boot button) GPIO that will toggle the Fan (On/Off) and decommission the Matter Node
pinMode(buttonPin, INPUT_PULLUP);
// Initialize the Analog Pin A0 used to read input voltage and to set the Fan speed accordingly
pinMode(analogPin, INPUT);
Expand Down Expand Up @@ -140,12 +146,6 @@ void setup() {
}
}

// Builtin Button control
uint32_t button_time_stamp = 0; // debouncing control
bool button_state = false; // false = released | true = pressed
const uint32_t debouceTime = 250; // button debouncing time (ms)
const uint32_t decommissioningTimeout = 10000; // keep the button pressed for 10s to decommission the Matter Fabric

void loop() {
// Check Matter Accessory Commissioning state, which may change during execution of loop()
if (!Matter.isDeviceCommissioned()) {
Expand Down Expand Up @@ -181,12 +181,13 @@ void loop() {
// button is released - toggle Fan On/Off
Fan.toggle();
Serial.printf("User button released. Setting the Fan %s.\r\n", Fan > 0 ? "ON" : "OFF");
}

// Factory reset is triggered if the button is pressed longer than 10 seconds
if (time_diff > decommissioningTimeout) {
Serial.println("Decommissioning the Generic Switch Matter Accessory. It shall be commissioned again.");
Matter.decommission();
}
// Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node
if (button_state && time_diff > decommissioningTimeout) {
Serial.println("Decommissioning the Generic Switch Matter Accessory. It shall be commissioned again.");
Matter.decommission();
button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so
}

// checks Analog pin and adjust the speed only if it has changed
Expand Down
29 changes: 29 additions & 0 deletions libraries/Matter/examples/MatterMinimum/MatterMinimum.ino
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,14 @@ const uint8_t ledPin = LED_BUILTIN;
const uint8_t ledPin = 2; // Set your pin here if your board has not defined LED_BUILTIN
#endif

// set your board USER BUTTON pin here - decommissioning button
const uint8_t buttonPin = BOOT_PIN; // Set your pin here. Using BOOT Button.

// Button control - decommision the Matter Node
uint32_t button_time_stamp = 0; // debouncing control
bool button_state = false; // false = released | true = pressed
const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s, or longer, to decommission

// Matter Protocol Endpoint (On/OFF Light) Callback
bool matterCB(bool state) {
digitalWrite(ledPin, state ? HIGH : LOW);
Expand All @@ -47,6 +55,8 @@ const char *ssid = "your-ssid"; // Change this to your WiFi SSID
const char *password = "your-password"; // Change this to your WiFi password

void setup() {
// Initialize the USER BUTTON (Boot button) that will be used to decommission the Matter Node
pinMode(buttonPin, INPUT_PULLUP);
// Initialize the LED GPIO
pinMode(ledPin, OUTPUT);

Expand Down Expand Up @@ -77,5 +87,24 @@ void setup() {
}

void loop() {
// Check if the button has been pressed
if (digitalRead(buttonPin) == LOW && !button_state) {
// deals with button debouncing
button_time_stamp = millis(); // record the time while the button is pressed.
button_state = true; // pressed.
}

if (digitalRead(buttonPin) == HIGH && button_state) {
button_state = false; // released
}

// Onboard User Button is kept pressed for longer than 5 seconds in order to decommission matter node
uint32_t time_diff = millis() - button_time_stamp;
if (button_state && time_diff > decommissioningTimeout) {
Serial.println("Decommissioning the Light Matter Accessory. It shall be commissioned again.");
Matter.decommission();
button_time_stamp = millis(); // avoid running decommissining again, reboot takes a second or so
}

delay(500);
}
Loading

0 comments on commit de4824f

Please sign in to comment.