ESP8266 in Homekit Fehlermeldung "Multiple Definition of Loop"



  • Hey,
    ich versuche gerade den D1 Mini in mein HomeKit Netzwerk einzubinden. Ich bin zunächst einmal der Anleitung auf der makesmart Seite gefolgt. Hat auch alles mehr oder weniger geklappt und andere Fehler konnte ich beheben. Jetzt hab ich aber einen neuen:

    c:/users/username/documents/arduinodata/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-4-b40a506/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: sketch\mein_schalter.ino.ino.cpp.o: in function `setup':
    
    C:\Users\Username\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.7.4\cores\esp8266/HardwareSerial.h:76: multiple definition of `setup'; sketch\my_accessory.c.o:sketch/my_accessory.c:1: first defined here
    
    c:/users/Username/documents/arduinodata/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-4-b40a506/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: sketch\mein_schalter.ino.ino.cpp.o: in function `loop':
    
    C:\Users\Username\Documents\Arduino\HomeKitTest1\mein_schalter.ino/mein_schalter.ino.ino:14: multiple definition of `loop'; sketch\my_accessory.c.o:sketch/my_accessory.c:6: first defined here
    collect2.exe: error: ld returned 1 exit status
    exit status 1
    
    Fehler beim Kompilieren für das Board LOLIN(WEMOS) D1 R2 & mini.
    

    Der Code ist direkt von der Tutorial Seite übernommen. Aber hier nochmal:

    mein_schalter.ino

    #include <Arduino.h>
    #include <arduino_homekit_server.h>
    #include "wifi_info.h"
    
    #define LOG_D(fmt, ...)   printf_P(PSTR(fmt "\n") , ##__VA_ARGS__);
    
    void setup() {
      Serial.begin(115200);
      wifi_connect();
      homekit_storage_reset();
      my_homekit_setup();
    }-
    
    void loop() {
      my_homekit_loop();
      delay(10);
    }
    
    //==============================
    // HomeKit setup and loop
    //==============================
    
    // Zugriff auf die Definitionen des Accessories 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 15
    
    // Diese Funktion wird aufgerufen, wenn der Schalter in HomeKit betätigt wird
    void cha_switch_on_setter(const homekit_value_t value) {
      bool on = value.bool_value;
      cha_switch_on.value.bool_value = on;
      LOG_D("Switch: %s", on ? "ON" : "OFF");
      digitalWrite(PIN_SWITCH, on ? HIGH : LOW);
    }
    
    void my_homekit_setup() {
    
      
      pinMode(PIN_SWITCH, OUTPUT);
      digitalWrite(PIN_SWITCH, HIGH);
      cha_switch_on.setter = cha_switch_on_setter;
      arduino_homekit_setup(&config);
    
    
    
      // Das hier kann verwendet werden, um den Status an HomeKit zurückzusenden,
      // falls ein zusätzlicher pysischer Button o.ä verwendet wird.
      
      // 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) {
        // heap-Info alle 30 Sekunden im seriellen Monitor ausgeben
        next_heap_millis = t + 30 * 1000;
        LOG_D("Free heap: %d, HomeKit clients: %d",
            ESP.getFreeHeap(), arduino_homekit_connected_clients_count());
    
      }
    }
    

    my accessory.c

    #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, true);
    
    // max. Länge 64
    homekit_characteristic_t cha_name = HOMEKIT_CHARACTERISTIC_(NAME, "Schalter");
    
    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, "Schalter"),
                HOMEKIT_CHARACTERISTIC(MANUFACTURER, "makesmart Community"),
                HOMEKIT_CHARACTERISTIC(SERIAL_NUMBER, "1234567"),
                HOMEKIT_CHARACTERISTIC(MODEL, "ESP8266 D1 Mini"),
                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 = "123-45-678"
    };
    

    wifi_info.h

    #ifndef WIFI_INFO_H_
    #define WIFI_INFO_H_
    
    #if defined(ESP8266)
    #include <ESP8266WiFi.h>
    #elif defined(ESP32)
    #include <Wifi.h>
    #endif
    
    const char *ssid = "SSID";
    const char *password = "PWD";
    
    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
    

    Vielleicht hat ja der ein oder andere das Gleiche Problem.
    Ich hoffe ich hab nur was übersehen.

    Hier geht es zur Lösung

    https://my.makesmart.net/topic/111/arduino-ide-redefinition-of-onewire-onewire/11



  • Probiers mal damit:

    Vorher den D1 Mini aber mal ab- und wieder anstöpseln. 👍

    2020-09-01 20_32_31-Window.png



  • Hey,
    danke für die schnelle Antwort. Hat aber leider nichts gebracht. Es kommt immer noch die gleiche Fehlermeldung.



  • Das ist komisch weil ich mit der Fehlermeldung nichts anfangen kann. Er sagt setup() bereits definiert. Aber kann’s mir grad nicht erklären.

    multiple definition of setup'; sketch\my_accessory.c.o:sketch/my_accessory.c:1: first defined here

    Lad mal einen komplett leeres Programm , bzw. das Blink Programm auf den D1 Mini. Und versuchs danach nochmal. Am besten mit der Einstellung o.g.

    Und entferne mal das - am Ende außerhalb deines Setups. 🙉

    Ansonsten , hast du eine Datei vielleicht doppelt geöffnet?

    Bzw welche Version der Libary und welche Version der Arduino IDE. Dann könnte ich das bei mir auch noch prüfen. Klappt nämlich ohne Probleme. 🤔