Homekit + ESP8266

Ik ben een vrij eenvoudige opstelling aan het maken om met een ESP 8266 Wemos D1 V2 een mosfet aan te sturen via Apple HomeKit.
De connectie lukt, mijn schakeling van een led strip op 4,5 via een mosfet klopt ook, maar ik zit met een eigenaardigheid.

Eens de esp connectie maakt met Homekit kan ik die aansturen, maar enkel de interne led reageert correct. AAN/UIT/pwm adv dimmer, maar mijn pin d4 die ofwel rechtstreeks een enkele led of via de mosfet een lesstring moet aansturen, stuurt die omgekeerd evenredig aan. Homekit & interne led AAN, dan gaat de te schakelen led UIT en omgekeerd, ook in het dimmen gaat hij net andersom.

Wie kan me helpen om het probleem op te zoeken? Dus mijn D4 zou gelijk moeten lopen met de status op homekit. Ook zou die interne led van mij gewoon uitgeschakeld mogen blijven, maar is geen must.

Hieronder het standaard voorbeeld script in IDE van Homekit-ESP8266 Library:

avr asm code:


/*
 * simple_led.ino
 *
 * This accessory contains a builtin-led on NodeMCU and a "virtual" occupancy sensor.
 * Setup code: 111-11-111
 * The Flash-Button(D3, GPIO0) on NodeMCU:
 * 		single-click: turn on/off the builtin-led (D4, GPIO2)
 * 		double-click: toggle the occupancy sensor state
 * 		long-click: reset the homekit server (remove the saved pairing)
 *
 *  Created on: 2020-02-08
 *      Author: Mixiaoxiao (Wang Bin)
 */

#include <Arduino.h>
#include <ESP8266WiFi.h>

#include <arduino_homekit_server.h>
#include "ButtonDebounce.h"
#include "ButtonHandler.h"

//D0 16 //led
//D3  0 //flash button
//D4  2 //led

#define PIN_LED 2//D4

const char *ssid = "XXX";
const char *password = "XXX";

#define SIMPLE_INFO(fmt, ...)   printf_P(PSTR(fmt "\n") , ##__VA_ARGS__);

void blink_led(int interval, int count) {
	for (int i = 0; i < count; i++) {
		builtinledSetStatus(true);
		delay(interval);
		builtinledSetStatus(false);
		delay(interval);
	}
}

void setup() {
	Serial.begin(115200);
	Serial.setRxBufferSize(32);
	Serial.setDebugOutput(false);

	pinMode(PIN_LED, OUTPUT);
	WiFi.mode(WIFI_STA);
	WiFi.persistent(false);
	WiFi.disconnect(false);
	WiFi.setAutoReconnect(true);
	WiFi.begin(ssid, password);

	SIMPLE_INFO("");
	SIMPLE_INFO("SketchSize: %d", ESP.getSketchSize());
	SIMPLE_INFO("FreeSketchSpace: %d", ESP.getFreeSketchSpace());
	SIMPLE_INFO("FlashChipSize: %d", ESP.getFlashChipSize());
	SIMPLE_INFO("FlashChipRealSize: %d", ESP.getFlashChipRealSize());
	SIMPLE_INFO("FlashChipSpeed: %d", ESP.getFlashChipSpeed());
	SIMPLE_INFO("SdkVersion: %s", ESP.getSdkVersion());
	SIMPLE_INFO("FullVersion: %s", ESP.getFullVersion().c_str());
	SIMPLE_INFO("CpuFreq: %dMHz", ESP.getCpuFreqMHz());
	SIMPLE_INFO("FreeHeap: %d", ESP.getFreeHeap());
	SIMPLE_INFO("ResetInfo: %s", ESP.getResetInfo().c_str());
	SIMPLE_INFO("ResetReason: %s", ESP.getResetReason().c_str());
	INFO_HEAP();
	homekit_setup();
	INFO_HEAP();
	blink_led(200, 3);
}

void loop() {
	homekit_loop();
}

void builtinledSetStatus(bool on) {
	digitalWrite(PIN_LED, on ? LOW : HIGH);
}

//==============================
// Homekit setup and loop
//==============================

extern "C" homekit_server_config_t config;
extern "C" homekit_characteristic_t name;
extern "C" void occupancy_toggle();
extern "C" void led_toggle();
extern "C" void accessory_init();

ButtonDebounce btn(0, INPUT_PULLUP, LOW);
ButtonHandler btnHandler;

void IRAM_ATTR btnInterrupt() {
	btn.update();
}

void homekit_setup() {
	accessory_init();
	uint8_t mac[WL_MAC_ADDR_LENGTH];
	WiFi.macAddress(mac);
	int name_len = snprintf(NULL, 0, "%s_%02X%02X%02X",
			name.value.string_value, mac[3], mac[4], mac[5]);
	char *name_value = (char*) malloc(name_len + 1);
	snprintf(name_value, name_len + 1, "%s_%02X%02X%02X",
			name.value.string_value, mac[3], mac[4], mac[5]);
	name.value = HOMEKIT_STRING_CPP(name_value);

	arduino_homekit_setup(&config);

	btn.setCallback(std::bind(&ButtonHandler::handleChange, &btnHandler,
			std::placeholders::_1));
	btn.setInterrupt(btnInterrupt);
	btnHandler.setIsDownFunction(std::bind(&ButtonDebounce::checkIsDown, &btn));
	btnHandler.setCallback([](button_event e) {
		if (e == BUTTON_EVENT_SINGLECLICK) {
			SIMPLE_INFO("Button Event: SINGLECLICK");
			led_toggle();
		} else if (e == BUTTON_EVENT_DOUBLECLICK) {
			SIMPLE_INFO("Button Event: DOUBLECLICK");
			occupancy_toggle();
		} else if (e == BUTTON_EVENT_LONGCLICK) {
			SIMPLE_INFO("Button Event: LONGCLICK");
			SIMPLE_INFO("Rebooting...");
			homekit_storage_reset();
			ESP.restart(); // or system_restart();
		}
	});
}

void homekit_loop() {
	btnHandler.loop();
	arduino_homekit_loop();
	static uint32_t next_heap_millis = 0;
	uint32_t time = millis();
	if (time > next_heap_millis) {
		SIMPLE_INFO("heap: %d, sockets: %d",
				ESP.getFreeHeap(), arduino_homekit_connected_clients_count());
		next_heap_millis = time + 5000;
	}
}
Shiptronic

Golden Member

Als je het programma tussen code tag's zet leest het wat prettiger.

[edit] Thanks !

[Bericht gewijzigd door Shiptronic op 11 november 2020 19:30:06 (12%)]

Wie de vraag stelt, zal met het antwoord moeten leren leven.
buckfast_beekeeper

Golden Member

c code:

digitalWrite(PIN_LED, on ? LOW : HIGH);

Vanuit je esp, moet je de uitgang hoog of laag maken om je led laten aan te gaan? Draai de bovenstaande LOW en HIGH eens om.

Van Lambiek wordt goede geuze gemaakt.

Ik zie alleen maar led_toggle dus hij begint toevallig hoog?

Lol de functienaam is langer dan de code:

void builtinledSetStatus(bool on) {
digitalWrite(PIN_LED, on ? LOW : HIGH);
}

Moet je niet met een accesoiry werken ipv die status led te kapen?