hi all,
i am using this code and acebutton to get update on homekit from button pressed and released
how i can add same condition with more buttons for green and yellow led?
/*
* switch.ino
*
* Created on: 2020-05-15
* Author: Mixiaoxiao (Wang Bin)
* Modified on: 2021-05-17
* Modifier: Josh Spicer <hello@joshspicer.com>
*/
#include <Arduino.h>
#include <arduino_homekit_server.h>
#include "wifi_info.h"
#include <AceButton.h>
using namespace ace_button;
const uint8_t PIN1 = 13;
ButtonConfig buttonConfig;
AceButton button(&buttonConfig, PIN1);
int lock_state;
#define LOG_D(fmt, ...) printf_P(PSTR(fmt "\n") , ##__VA_ARGS__);
void setup() {
Serial.begin(115200);
wifi_connect(); // in wifi_info.h
//homekit_storage_reset(); // to remove the previous HomeKit pairing storage when you first run this new HomeKit example
my_homekit_setup();
delay(20);
pinMode(PIN1, INPUT_PULLUP);
button.setEventHandler(handleEvent);
}
void loop() {
my_homekit_loop();
button.check();
delay(10);
}
//==============================
// HomeKit setup and loop
//==============================
// access your HomeKit characteristics defined in my_accessory.c
extern "C" homekit_server_config_t config;
extern "C" homekit_characteristic_t red_led;
extern "C" homekit_characteristic_t green_led;
extern "C" homekit_characteristic_t yellow_led;
static uint32_t next_heap_millis = 0;
#define PIN_SWITCH D3
#define LED_RED D2
#define LED_YELLOW D4
#define LED_GREEN 5
//Called when the switch value is changed by iOS Home APP
void green_led_setter(const homekit_value_t value) {
bool on = value.bool_value;
green_led.value.bool_value = on; //sync the value
LOG_D("Green Switch: %s", on ? "ON" : "OFF");
digitalWrite(LED_GREEN, on ? HIGH : LOW);
}
//Called when the switch value is changed by iOS Home APP
void red_led_setter(const homekit_value_t value) {
bool on = value.bool_value;
red_led.value.bool_value = on; //sync the value
LOG_D("Red Switch: %s", on ? "ON" : "OFF");
digitalWrite(LED_RED, on ? HIGH : LOW);
}
//Called when the switch value is changed by iOS Home APP
void yellow_led_setter(const homekit_value_t value) {
bool on = value.bool_value;
yellow_led.value.bool_value = on; //sync the value
LOG_D("Yellow Switch: %s", on ? "ON" : "OFF");
digitalWrite(LED_YELLOW, on ? HIGH : LOW);
}
void my_homekit_setup() {
pinMode(PIN_SWITCH, OUTPUT);
digitalWrite(PIN_SWITCH, HIGH);
pinMode(LED_YELLOW, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
red_led.setter = red_led_setter;
yellow_led.setter = yellow_led_setter;
green_led.setter = green_led_setter;
arduino_homekit_setup(&config);
}
void my_homekit_loop() {
arduino_homekit_loop();
const uint32_t t = millis();
if (t > next_heap_millis) {
// show heap info every 5 seconds
next_heap_millis = t + 5 * 1000;
LOG_D("Free heap: %d, HomeKit clients: %d",
ESP.getFreeHeap(), arduino_homekit_connected_clients_count());
}
}
void handleEvent(AceButton* button, uint8_t eventType,
uint8_t /* buttonState */) {
switch (eventType) {
case AceButton::kEventPressed:
if(lock_state==0){
red_led.value.bool_value = true;
bool on = red_led.value.bool_value;
Serial.println("LED:ON(Force)");
digitalWrite(LED_RED, LOW);
homekit_characteristic_notify(&red_led, red_led.value);
lock_state = 1;
}
break;
case AceButton::kEventReleased:
if(lock_state==1){
red_led.value.bool_value = false;
bool on = !red_led.value.bool_value;
Serial.println("LED:OFF(Force)");
digitalWrite(LED_RED, HIGH);
homekit_characteristic_notify(&red_led, red_led.value);
lock_state = 0;
}
break;
}
}
i tried like this but buttons are updating only green led homekit
/*
* switch.ino
*
* Created on: 2020-05-15
* Author: Mixiaoxiao (Wang Bin)
* Modified on: 2021-05-17
* Modifier: Josh Spicer <hello@joshspicer.com>
*/
#include <Arduino.h>
#include <arduino_homekit_server.h>
#include "wifi_info.h"
#include <AceButton.h>
using namespace ace_button;
const uint8_t PIN1 = 13;
ButtonConfig buttonConfig;
AceButton button(&buttonConfig, PIN1);
void handleEvent(AceButton*, uint8_t, uint8_t);
int lock_state;
const uint8_t PIN2 = 14;
AceButton button2(&buttonConfig, PIN2);
void handleEvent2(AceButton*, uint8_t, uint8_t);
int lock_state2;
#define LOG_D(fmt, ...) printf_P(PSTR(fmt "\n") , ##__VA_ARGS__);
void setup() {
Serial.begin(115200);
wifi_connect(); // in wifi_info.h
//homekit_storage_reset(); // to remove the previous HomeKit pairing storage when you first run this new HomeKit example
my_homekit_setup();
delay(20);
pinMode(PIN1, INPUT_PULLUP);
button.setEventHandler(handleEvent);
pinMode(PIN2, INPUT_PULLUP);
button2.setEventHandler(handleEvent2);
}
void loop() {
my_homekit_loop();
button.check();
button2.check(); //ADD THIS.
delay(10);
}
//==============================
// HomeKit setup and loop
//==============================
// access your HomeKit characteristics defined in my_accessory.c
extern "C" homekit_server_config_t config;
extern "C" homekit_characteristic_t red_led;
extern "C" homekit_characteristic_t green_led;
extern "C" homekit_characteristic_t yellow_led;
static uint32_t next_heap_millis = 0;
#define PIN_SWITCH D3
#define LED_RED D2
#define LED_YELLOW D4
#define LED_GREEN 5
//Called when the switch value is changed by iOS Home APP
void green_led_setter(const homekit_value_t value) {
bool on = value.bool_value;
green_led.value.bool_value = on; //sync the value
LOG_D("Green Switch: %s", on ? "ON" : "OFF");
digitalWrite(LED_GREEN, on ? HIGH : LOW);
}
//Called when the switch value is changed by iOS Home APP
void red_led_setter(const homekit_value_t value) {
bool on = value.bool_value;
red_led.value.bool_value = on; //sync the value
LOG_D("Red Switch: %s", on ? "ON" : "OFF");
digitalWrite(LED_RED, on ? HIGH : LOW);
}
//Called when the switch value is changed by iOS Home APP
void yellow_led_setter(const homekit_value_t value) {
bool on = value.bool_value;
yellow_led.value.bool_value = on; //sync the value
LOG_D("Yellow Switch: %s", on ? "ON" : "OFF");
digitalWrite(LED_YELLOW, on ? HIGH : LOW);
}
void my_homekit_setup() {
pinMode(PIN_SWITCH, OUTPUT);
digitalWrite(PIN_SWITCH, HIGH);
pinMode(LED_YELLOW, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
red_led.setter = red_led_setter;
yellow_led.setter = yellow_led_setter;
green_led.setter = green_led_setter;
arduino_homekit_setup(&config);
}
void my_homekit_loop() {
arduino_homekit_loop();
const uint32_t t = millis();
if (t > next_heap_millis) {
// show heap info every 5 seconds
next_heap_millis = t + 5 * 1000;
LOG_D("Free heap: %d, HomeKit clients: %d",
ESP.getFreeHeap(), arduino_homekit_connected_clients_count());
}
}
void handleEvent(AceButton* button, uint8_t eventType,
uint8_t /* buttonState */) {
switch (eventType) {
case AceButton::kEventPressed:
if(lock_state==0){
red_led.value.bool_value = true;
bool on = red_led.value.bool_value;
Serial.println("LED:ON(Force)");
digitalWrite(LED_RED, LOW);
homekit_characteristic_notify(&red_led, red_led.value);
lock_state = 1;
}
break;
case AceButton::kEventReleased:
if(lock_state==1){
red_led.value.bool_value = false;
bool on = !red_led.value.bool_value;
Serial.println("LED:OFF(Force)");
digitalWrite(LED_RED, HIGH);
homekit_characteristic_notify(&red_led, red_led.value);
lock_state = 0;
}
break;
}
}
void handleEvent2(AceButton* button2, uint8_t eventType,
uint8_t /* buttonState */) {
switch (eventType) {
case AceButton::kEventPressed:
if(lock_state2==0){
green_led.value.bool_value = true;
bool on = green_led.value.bool_value;
Serial.println("LED:ON(Force)");
digitalWrite(LED_GREEN, LOW);
homekit_characteristic_notify(&green_led, green_led.value);
lock_state2 = 1;
}
break;
case AceButton::kEventReleased:
if(lock_state2==1){
green_led.value.bool_value = false;
bool on = !green_led.value.bool_value;
Serial.println("LED:OFF(Force)");
digitalWrite(LED_GREEN, HIGH);
homekit_characteristic_notify(&green_led, green_led.value);
lock_state2 = 0;
}
}}
Where's your code from my_accessory.c
?
i can share, but homekit is working fine and i was able to add one physical button with red led and its working fine with homekit..
my concern is how i can add second ace button to green led?
i am trying but something going wrong in my coding as above, when i press any button only red or only green respond in homekit.
please guide me correct way of code to add second acebutton to above code.
gcjr
April 5, 2023, 9:37am
5
rather than repeat yourself ... you'll get more help if you respond to questions
ok, here you go:
/*
* my_accessory.c
* Defines the accessory in C using the Macro in characteristics.h
*
* Created on: 2020-05-15
* Author: Mixiaoxiao (Wang Bin)
* Modified on: 2021-05-17
* Modifier: Josh Spicer <hello@joshspicer.com>
*/
#include <homekit/homekit.h>
#include <homekit/characteristics.h>
void my_accessory_identify(homekit_value_t _value) {
printf("accessory identify\n");
}
homekit_characteristic_t green_led = HOMEKIT_CHARACTERISTIC_(ON, false);
homekit_characteristic_t yellow_led = HOMEKIT_CHARACTERISTIC_(ON, false);
homekit_characteristic_t red_led = HOMEKIT_CHARACTERISTIC_(ON, false);
homekit_accessory_t *accessories[] = {
HOMEKIT_ACCESSORY(.id=1, .category=homekit_accessory_category_switch, .services=(homekit_service_t*[]) {
HOMEKIT_SERVICE(ACCESSORY_INFORMATION, .characteristics=(homekit_characteristic_t*[]) {
HOMEKIT_CHARACTERISTIC(NAME, "SMART-Switch"),
HOMEKIT_CHARACTERISTIC(MANUFACTURER, "ESP HomeKit"),
HOMEKIT_CHARACTERISTIC(SERIAL_NUMBER, "SP290833"),
HOMEKIT_CHARACTERISTIC(MODEL, "SMART-LIGHT"),
HOMEKIT_CHARACTERISTIC(FIRMWARE_REVISION, "1.0"),
HOMEKIT_CHARACTERISTIC(IDENTIFY, my_accessory_identify),
NULL
}),
HOMEKIT_SERVICE(SWITCH, .characteristics=(homekit_characteristic_t*[]) {
&green_led,
HOMEKIT_CHARACTERISTIC(NAME, "Green LED"),
NULL
}),
HOMEKIT_SERVICE(SWITCH, .characteristics=(homekit_characteristic_t*[]) {
&yellow_led,
HOMEKIT_CHARACTERISTIC(NAME, "Yellow LED"),
NULL
}),
HOMEKIT_SERVICE(SWITCH, .characteristics=(homekit_characteristic_t*[]) {
&red_led,
HOMEKIT_CHARACTERISTIC(NAME, "Red LED"),
NULL
}),
NULL
}),
NULL
};
homekit_server_config_t config = {
.accessories = accessories,
.password = "111-11-111"
};
system
Closed
October 23, 2023, 5:29am
8
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.