Nodemcu ile homekit ve buton sorunu

kemaluz

Yeni Üye
Katılım
30 Ekim 2024
Mesajlar
2
Arkadaşlar hepinize merhabalar ;

NodemCu kullanarak evımdeki ışıkları google asistan ile kontrol ediyorum hem google asistan üzerinden hemde nodemcuya bağladığım br pushbuton üzerinden ışıkları açıp kapatabiliyorum. Apple kullanmaya baslamam nedeni ile kullandığım cihazları apple home uygulması üzerinden kontrol etmek istemem nedeni ile nodemcu ile homekit ile kontrol etmek istemekteyim.

hem home uygulaması hemde fiziksel pushbuton ile kontrol etmek için bazı calısmalar yaptım ancak bir sorunum var nodemcu wifi ağına baglandıgında hem buton hemde home uygulamasından rahatca kullanabılıyorum ancak wifi bağlantısı kesildiğinde fiziksel butonda devre dışı kalıyor. yardımlarınız için şimdiden teşekkür ederim. kodlarım aşağıdaki gibi.


__

C++:
#include <Arduino.h>
#include <arduino_homekit_server.h>
#include "wifi_info.h"
//BUTON BASLANGIÇ
byte buton_pin = D7;
byte role_pin = D1;
byte OldValue = 1;
byte NewValue = 1;
//BUTON SON
#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();
  //BUTON BAS
  pinMode(role_pin, OUTPUT);
  pinMode(buton_pin, INPUT_PULLUP);
  digitalWrite(role_pin, HIGH);
  //BUTON SON
}
void loop() {
  ButonKontrol();
  my_homekit_loop();
  delay(10);
}
void ButonKontrol() {
  //BUTON BAS
  NewValue = digitalRead(buton_pin);
  if (NewValue != OldValue) {
    OldValue = NewValue;
    if (NewValue == LOW) {
      if (digitalRead(role_pin) == LOW) {
        digitalWrite(role_pin, HIGH);
      } else {
        digitalWrite(role_pin, LOW);
      }
    }
  }
  delay(20);
  //BUTON SON
}
//==============================
// 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 cha_switch_on;
static uint32_t next_heap_millis = 0;
#define PIN_SWITCH 2
//Called when the switch value is changed by iOS Home APP
void cha_switch_on_setter(const homekit_value_t value) {
  bool on = value.bool_value;
  cha_switch_on.value.bool_value = on;  //sync the value
  LOG_D("Switch: %s", on ? "ON" : "OFF");
  digitalWrite(PIN_SWITCH, on ? LOW : HIGH);
}
void my_homekit_setup() {
  pinMode(PIN_SWITCH, OUTPUT);
  digitalWrite(PIN_SWITCH, HIGH);
  //Add the .setter function to get the switch-event sent from iOS Home APP.
  //The .setter should be added before arduino_homekit_setup.
  //HomeKit sever uses the .setter_ex internally, see homekit_accessories_init function.
  //Maybe this is a legacy design issue in the original esp-homekit library,
  //and I have no reason to modify this "feature".
  cha_switch_on.setter = cha_switch_on_setter;
  arduino_homekit_setup(&config);
  //report the switch value to HomeKit if it is changed (e.g. by a physical button)
  //bool switch_is_on = true / false;
  //cha_switch_on.value.bool_value = switch_is_on;
  //homekit_characteristic_notify(&cha_switch_on, cha_switch_on.value);
}
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());
  }
}



___my_accessory.c komutlarım bu şekilde_______________________________

/*
 * my_accessory.c
 * Define the accessory in C language using the Macro in characteristics.h
 *
 *  Created on: 2020-05-15
 *      Author: Mixiaoxiao (Wang Bin)
 */
#include <homekit/homekit.h>
#include <homekit/characteristics.h>
void my_accessory_identify(homekit_value_t _value) {
  printf("accessory identify\n");
}
// Switch (HAP section 8.38)
// required: ON
// optional: NAME
// format: bool; HAP section 9.70; write the .setter function to get the switch-event sent from iOS Home APP.
homekit_characteristic_t cha_switch_on = HOMEKIT_CHARACTERISTIC_(ON, false);
// format: string; HAP section 9.62; max length 64
homekit_characteristic_t cha_name = HOMEKIT_CHARACTERISTIC_(NAME, "Switch");
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, "Switch"),
            HOMEKIT_CHARACTERISTIC(MANUFACTURER, "Arduino HomeKit"),
            HOMEKIT_CHARACTERISTIC(SERIAL_NUMBER, "0123456"),
            HOMEKIT_CHARACTERISTIC(MODEL, "ESP8266/ESP32"),
            HOMEKIT_CHARACTERISTIC(FIRMWARE_REVISION, "1.0"),
            HOMEKIT_CHARACTERISTIC(IDENTIFY, my_accessory_identify),
            NULL
        }),
    HOMEKIT_SERVICE(SWITCH, .primary=true, .characteristics=(homekit_characteristic_t*[]){
      &cha_switch_on,
      &cha_name,
      NULL
    }),
        NULL
    }),
    NULL
};
homekit_server_config_t config = {
    .accessories = accessories,
    .password = "111-11-111"
};

_______wifi_info.h komutlarımda bu şekilde____________________________________________

/*
 * wifi_info.h
 *
 *  Created on: 2020-05-15
 *      Author: Mixiaoxiao (Wang Bin)
 */
#ifndef WIFI_INFO_H_
#define WIFI_INFO_H_
#if defined(ESP8266)
#include <ESP8266WiFi.h>
#elif defined(ESP32)
#include <WiFi.h>
#endif
const char *ssid = "MikroTik-C31527";
const char *password = "Turassssant07";
void wifi_connect() {
  WiFi.persistent(false);
  WiFi.mode(WIFI_STA);
  WiFi.setAutoReconnect(true);
  WiFi.begin(ssid, password);
  Serial.println("WiFi connecting...");
  while (!WiFi.isConnected()) {
    delay(100);
    Serial.print(".");
  }
  Serial.print("\n");
  Serial.printf("WiFi connected, IP: %s\n", WiFi.localIP().toString().c_str());
}
#endif /* WIFI_INFO_H_ */
 
Last edited by a moderator:
Yardımcı olmak isteyenler için kodların formatlanmış hali.

C:
#include <Arduino.h>

#include <arduino_homekit_server.h>

#include "wifi_info.h"
 //BUTON BASLANGIÇ
byte buton_pin = D7;
byte role_pin = D1;
byte OldValue = 1;
byte NewValue = 1;
//BUTON SON
#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();
  //BUTON BAS
  pinMode(role_pin, OUTPUT);
  pinMode(buton_pin, INPUT_PULLUP);
  digitalWrite(role_pin, HIGH);
  //BUTON SON
}
void loop() {
  ButonKontrol();
  my_homekit_loop();
  delay(10);
}
void ButonKontrol() {
  //BUTON BAS
  NewValue = digitalRead(buton_pin);
  if (NewValue != OldValue) {
    OldValue = NewValue;
    if (NewValue == LOW) {
      if (digitalRead(role_pin) == LOW) {
        digitalWrite(role_pin, HIGH);
      } else {
        digitalWrite(role_pin, LOW);
      }
    }
  }
  delay(20);
  //BUTON SON
}
//==============================
// 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 cha_switch_on;
static uint32_t next_heap_millis = 0;
#define PIN_SWITCH 2
//Called when the switch value is changed by iOS Home APP
void cha_switch_on_setter(const homekit_value_t value) {
  bool on = value.bool_value;
  cha_switch_on.value.bool_value = on; //sync the value
  LOG_D("Switch: %s", on ? "ON" : "OFF");
  digitalWrite(PIN_SWITCH, on ? LOW : HIGH);
}
void my_homekit_setup() {
  pinMode(PIN_SWITCH, OUTPUT);
  digitalWrite(PIN_SWITCH, HIGH);
  //Add the .setter function to get the switch-event sent from iOS Home APP.
  //The .setter should be added before arduino_homekit_setup.
  //HomeKit sever uses the .setter_ex internally, see homekit_accessories_init function.
  //Maybe this is a legacy design issue in the original esp-homekit library,
  //and I have no reason to modify this "feature".
  cha_switch_on.setter = cha_switch_on_setter;
  arduino_homekit_setup( & config);
  //report the switch value to HomeKit if it is changed (e.g. by a physical button)
  //bool switch_is_on = true / false;
  //cha_switch_on.value.bool_value = switch_is_on;
  //homekit_characteristic_notify(&cha_switch_on, cha_switch_on.value);
}
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());
  }
}

___my_accessory.c komutlarım bu şekilde_______________________________

/*
 * my_accessory.c
 * Define the accessory in C language using the Macro in characteristics.h
 *
 * Created on: 2020-05-15
 * Author: Mixiaoxiao (Wang Bin)
 */
#include <homekit/homekit.h>

#include <homekit/characteristics.h>

void my_accessory_identify(homekit_value_t _value) {
  printf("accessory identify\n");
}
// Switch (HAP section 8.38)
// required: ON
// optional: NAME
// format: bool; HAP section 9.70; write the .setter function to get the switch-event sent from iOS Home APP.
homekit_characteristic_t cha_switch_on = HOMEKIT_CHARACTERISTIC_(ON, false);
// format: string; HAP section 9.62; max length 64
homekit_characteristic_t cha_name = HOMEKIT_CHARACTERISTIC_(NAME, "Switch");
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, "Switch"),
          HOMEKIT_CHARACTERISTIC(MANUFACTURER, "Arduino HomeKit"),
          HOMEKIT_CHARACTERISTIC(SERIAL_NUMBER, "0123456"),
          HOMEKIT_CHARACTERISTIC(MODEL, "ESP8266/ESP32"),
          HOMEKIT_CHARACTERISTIC(FIRMWARE_REVISION, "1.0"),
          HOMEKIT_CHARACTERISTIC(IDENTIFY, my_accessory_identify),
          NULL
      }),
      HOMEKIT_SERVICE(SWITCH, .primary = true, .characteristics = (homekit_characteristic_t * []) {
        &
        cha_switch_on, &
        cha_name,
        NULL
      }),
      NULL
  }),
  NULL
};
homekit_server_config_t config = {
  .accessories = accessories,
  .password = "111-11-111"
};

_______wifi_info.h komutlarımda bu şekilde____________________________________________

/*
 * wifi_info.h
 *
 * Created on: 2020-05-15
 * Author: Mixiaoxiao (Wang Bin)
 */
#ifndef WIFI_INFO_H_
#define WIFI_INFO_H_
#if defined(ESP8266)#include <ESP8266WiFi.h>

#elif defined(ESP32)#include <WiFi.h>

#endif
const char * ssid = "MikroTik-C31527";
const char * password = "Turassssant07";
void wifi_connect() {
  WiFi.persistent(false);
  WiFi.mode(WIFI_STA);
  WiFi.setAutoReconnect(true);
  WiFi.begin(ssid, password);
  Serial.println("WiFi connecting...");
  while (!WiFi.isConnected()) {
    delay(100);
    Serial.print(".");
  }
  Serial.print("\n");
  Serial.printf("WiFi connected, IP: %s\n", WiFi.localIP().toString().c_str());
}
#endif /* WIFI_INFO_H_ */
 
void loop içindeki butonkontrol fonksiyonunu if içine al.
Yapı şöyle olmalı:
C++:
if(butonabasıldıysa){
Butonkontrol();
}

Birde kodların çok karışık. Kendine eziyet, bize eziyet. En tepede kütüphane include etmişsin, sonra aşağılara doğru başka kütüphaneler include etmişsin.
Önce fonksiyonu çağırmışsın sonra aşağıda fonksiyonu yazmışsın. Tüm kütüphaneleri en tepede include et. Sonrasında kullanacağın değişkenleri tanımla. Onların da altına tüm fonksiyonlarını koy. Devamında void setup ve en son void loop olsun. Böylece bizler kodu ayıklamaya vakit harcamayıp direk sorunu görerek cevap verebiliriz.
 
Bu arada bir düzeltme yapayım. Butonu if içine aldığın için bu seferde wifi bağlantısında çalışmaya bilir. Onun içinde aynı fonksiyonu void loop içinde, if dışında ikincikez çağır.

Bunu yapınca da butona iki kez basmış gibi algılama ihtimali var.

O zaman if koşuluna ikinci bir şart eklemek gerekecek. Mesela şöyle olabilir.
C++:
if(wifi_bağlıysa){
 Butonkontrol();
  my_homekit_loop();
  delay(10);
}
if(wifi_bağlı_değilse) && ( butona_basıldıysa){
Butonkontrol();
}
 
İlginize ve önerilerinize çok teşekkür ederim.
void loop içindeki butonkontrol fonksiyonunu if içine al.
Yapı şöyle olmalı:
C++:
if(butonabasıldıysa){
Butonkontrol();
}

Birde kodların çok karışık. Kendine eziyet, bize eziyet. En tepede kütüphane include etmişsin, sonra aşağılara doğru başka kütüphaneler include etmişsin.
Önce fonksiyonu çağırmışsın sonra aşağıda fonksiyonu yazmışsın. Tüm kütüphaneleri en tepede include et. Sonrasında kullanacağın değişkenleri tanımla. Onların da altına tüm fonksiyonlarını koy. Devamında void setup ve en son void loop olsun. Böylece bizler kodu ayıklamaya vakit harcamayıp direk sorunu görerek cevap verebiliriz.
İlginiz ve tavsiyeniz için çok teşekkür ederim. Programlama bilgim çok fazla olmamasından kaynaklı derme çatma oluyor biraz
 

Çevrimiçi personel

Forum istatistikleri

Konular
6,819
Mesajlar
116,205
Üyeler
2,776
Son üye
banu111

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Back
Top