在看完这段视频之后。https://www.youtube.com/watch?v=QBj8OLig8Kg是如何创建一个homekit系统的,而不必使用我想要创建的强盗。
我的想法是有两个不同的灯连接到互联网,我处理他们与siri和两个外部按钮,可以关闭灯,而不必总是使用siri。(例如,如果我的手机没有电池)。所有这些都在相同的ESP 8266中。
我已经可以用下面的代码操作这两盏灯,而不需要一个家庭桥
#define Relay1 16 //D0
#define Relay2 5 //D1
#define button1 14 //D5
#define button2 12 //D6
#define button3 13 //D7
bool state1 = false;
bool state2 = false;
// ---------------------------------------------------- Inicializacion de wifi -------------------------------------------------
static void wifi_init() {
struct sdk_station_config wifi_config = {
.ssid = WIFI_SSID,
.password = WIFI_PASSWORD,
};
sdk_wifi_set_opmode(STATION_MODE);
sdk_wifi_station_set_config(&wifi_config);
sdk_wifi_station_connect();
}
// -------------------------------------------------------- Logica de Relay1 -----------------------------------------------------
void relay1_write(bool on) {
gpio_write(Relay1, on ? 1 : 0);
}
void relay1_init() {
gpio_enable(Relay1, GPIO_OUTPUT);
relay1_write(state1);
}
void relay1_identify_task(void *_args) {
for (int i=0; i<3; i++) {
for (int j=0; j<2; j++) {
relay1_write(true);
vTaskDelay(100 / portTICK_PERIOD_MS);
relay1_write(false);
vTaskDelay(100 / portTICK_PERIOD_MS);
}
vTaskDelay(250 / portTICK_PERIOD_MS);
}
relay1_write(state1);
vTaskDelete(NULL);
}
void relay1_identify(homekit_value_t _value) {
printf("Relay 1 identify\n");
xTaskCreate(relay1_identify_task, "Relay Identify", 128, NULL, 2, NULL);
}
homekit_value_t relay1_on_get() {
return HOMEKIT_BOOL(state1);
}
void relay1_on_set(homekit_value_t value) {
if (value.format != homekit_format_bool) {
printf("Invalid value format: %d\n", value.format);
return;
}
state1 = value.bool_value;
relay1_write(state1);
}
// -------------------------------------------------------- Logica de Relay2 -----------------------------------------------------
void relay2_write(bool on) {
gpio_write(Relay2, on ? 1 : 0);
}
void relay2_init() {
gpio_enable(Relay2, GPIO_OUTPUT);
relay2_write(state2);
}
void relay2_identify_task(void *_args) {
for (int i=0; i<3; i++) {
for (int j=0; j<2; j++) {
relay2_write(true);
vTaskDelay(100 / portTICK_PERIOD_MS);
relay2_write(false);
vTaskDelay(100 / portTICK_PERIOD_MS);
}
vTaskDelay(250 / portTICK_PERIOD_MS);
}
relay2_write(state2);
vTaskDelete(NULL);
}
void relay2_identify(homekit_value_t _value) {
printf("Relay 2 identify\n");
xTaskCreate(relay2_identify_task, "Relay Identify", 128, NULL, 2, NULL);
}
homekit_value_t relay2_on_get() {
return HOMEKIT_BOOL(state2);
}
void relay2_on_set(homekit_value_t value) {
if (value.format != homekit_format_bool) {
printf("Invalid value format: %d\n", value.format);
return;
}
state2 = value.bool_value;
relay2_write(state2);
}
// ------------------------------------------------ Configuracion del server de Homekit ------------------------------------------
homekit_accessory_t *accessories[] = {
HOMEKIT_ACCESSORY(.id=1, .category=homekit_accessory_category_lightbulb, .services=(homekit_service_t*[]){
HOMEKIT_SERVICE(ACCESSORY_INFORMATION, .characteristics=(homekit_characteristic_t*[]){
HOMEKIT_CHARACTERISTIC(NAME, "Cuarto"),
HOMEKIT_CHARACTERISTIC(MANUFACTURER, "Estonian Port"),
HOMEKIT_CHARACTERISTIC(SERIAL_NUMBER, "ASD123"),
HOMEKIT_CHARACTERISTIC(MODEL, "C.U.C.A"),
HOMEKIT_CHARACTERISTIC(FIRMWARE_REVISION, "0.1"),
HOMEKIT_CHARACTERISTIC(IDENTIFY, relay1_identify),
NULL
}),
HOMEKIT_SERVICE(LIGHTBULB, .primary=true, .characteristics=(homekit_characteristic_t*[]){
HOMEKIT_CHARACTERISTIC(NAME, "Luz"),
HOMEKIT_CHARACTERISTIC(ON, false,
.getter=relay1_on_get,
.setter=relay1_on_set
),
NULL
}),
NULL
}),
HOMEKIT_ACCESSORY(.id=2, .category=homekit_accessory_category_lightbulb, .services=(homekit_service_t*[]){
HOMEKIT_SERVICE(ACCESSORY_INFORMATION, .characteristics=(homekit_characteristic_t*[]){
HOMEKIT_CHARACTERISTIC(NAME, "Cuarto"),
HOMEKIT_CHARACTERISTIC(MANUFACTURER, "Estonian Port"),
HOMEKIT_CHARACTERISTIC(SERIAL_NUMBER, "ASD123"),
HOMEKIT_CHARACTERISTIC(MODEL, "C.U.C.A"),
HOMEKIT_CHARACTERISTIC(FIRMWARE_REVISION, "0.1"),
HOMEKIT_CHARACTERISTIC(IDENTIFY, relay2_identify),
NULL
}),
HOMEKIT_SERVICE(LIGHTBULB, .primary=true, .characteristics=(homekit_characteristic_t*[]){
HOMEKIT_CHARACTERISTIC(NAME, "Luz"),
HOMEKIT_CHARACTERISTIC(ON, false,
.getter=relay2_on_get,
.setter=relay2_on_set
),
NULL
}),
NULL
}),
NULL
};
homekit_server_config_t config = {
.accessories = accessories,
.password = "111-11-111"
};
// ----------------------------------------------------------- MAIN ----------------------------------------------------------
void user_init(void) {
uart_set_baud(0, 115200);
wifi_init();
relay1_init();
relay2_init();
homekit_server_init(&config);
}但我想不出如何实现这两个外部按钮。我试着实施:
void setup()
{
pinMode(button1, INPUT);
pinMode(button2, INPUT);
}
void loop() {
if (digitalRead(button1))
{
relay1_write(state1);
}
}但是它给了我错误,因为我无法实现这个库。我也试着理解这个例子。https://github.com/maximkulkin/esp-homekit-demo/tree/master/examples/button,但是它不适用于我想要做的事情,因为在这种情况下,这个按钮被homekit识别了,我希望它只是关闭并打开灯。
非常感谢你的时间!
发布于 2019-08-24 03:05:22
在写我的问题时,我意识到了一些事情,在更好地思考之后,我认为我应该把输出的继电器连接到一个组合的轻键上。这样,它就有可能以类似的方式打开和关闭灯。很抱歉给您带来不便!谢谢
https://stackoverflow.com/questions/57634556
复制相似问题