Nie dziwię się, że działają tak samo skoro kod odpowiedzialny za typ przycisku INPUT_TYPE_BTN_MONOSTABLE_RS w supla_esp_gpio_on_input_active i supla_esp_gpio_on_input_inactive są takie same jak kod w inCan.c.
Z tego co widzę, to racze trzeba przerobić kod z inCan tak, żeby na active nie wyzwalał przełączania w supla_esp_gpio_rs_set_relay ale w inactive sprawdzał czy któryś z przekaźników jest włączony to wtedy robić RS_RELAY_OFF jeśli nie to na załączać przekaźnik UP lub DOWN odpowiednio.
Przycisk monostabilny dla rolet
Skompilowałem sobie rs_module ze źródeł i przekaźniki załączają się na zboczu opadającym, czyli tak jak chceszkinium pisze: ↑śr lut 05, 2020 8:29 pm Mam pytanie odnoście przycisków monostabilnych. Chciałbym zaprogramować działanie takie jak w modułach Zamela do rolet. Czyli dopiero jak puszczę przycisk to załączany jest przekaźnik.
Możecie podpowiedzieć, w którym pliku (funkcji) z SDK mam szukać? Nie do końca rozumiem logiki działania kodu odpowiedzialnego za przełączanie tych stanów.
Ustawiony masz czas w Cloud dla ruchu rolety w górę i w dół?
Czekam na kolejne Supla Offline Party
Tak mam ustawione czasy.lesny8 pisze: ↑czw lut 06, 2020 10:01 pmSkompilowałem sobie rs_module ze źródeł i przekaźniki załączają się na zboczu opadającym, czyli tak jak chceszkinium pisze: ↑śr lut 05, 2020 8:29 pm Mam pytanie odnoście przycisków monostabilnych. Chciałbym zaprogramować działanie takie jak w modułach Zamela do rolet. Czyli dopiero jak puszczę przycisk to załączany jest przekaźnik.
Możecie podpowiedzieć, w którym pliku (funkcji) z SDK mam szukać? Nie do końca rozumiem logiki działania kodu odpowiedzialnego za przełączanie tych stanów.
Ustawiony masz czas w Cloud dla ruchu rolety w górę i w dół?
A czy piny sterujące masz z pullupem?
Sprawdzę to jeszcze raz dzisiaj na świeżych źródłach.
Zrobiłem test na czystym kodzie z repo na rs_module.
Za pierwszym razem przycisk działa prawidłowo, czyli jak odpuszczę przycisk to załączany jest przekaźnik.
Niestety ponowny wciśnięcie przycisku wyłącza przekaźnik a zwolnienie załącza go znowu.
Działa prawidłowo tylko jak roleta zostanie zamknięta lub otwarta całkowicie.
Z tego wynika, że niestety kod który jest w repo nie działa do końca prawidłowo.
Rozwiązałem ten problem definiując BOARD_ON_INPUT_ACTIVE i BOARD_ON_INPUT_INACTIVE jak w inCan i z poniższym kodem:
Kod: Zaznacz cały
#include "supla_esp.h"
#include "supla_esp_gpio.h"
void ICACHE_FLASH_ATTR supla_esp_board_gpio_on_input_active(void *_input_cfg)
{
supla_input_cfg_t *input_cfg = (supla_input_cfg_t *)_input_cfg;
if (input_cfg->type == INPUT_TYPE_BTN_MONOSTABLE_RS)
{
}
else if (input_cfg->type == INPUT_TYPE_BTN_BISTABLE || input_cfg->type == INPUT_TYPE_BTN_MONOSTABLE)
{
supla_esp_board_gpio_relay_switch(input_cfg, 255);
}
else if (input_cfg->type == INPUT_TYPE_SENSOR && input_cfg->channel != 255)
{
supla_esp_channel_value_changed(input_cfg->channel, 1);
}
input_cfg->last_state = 1;
}
void ICACHE_FLASH_ATTR
supla_esp_board_gpio_on_input_inactive(void *_input_cfg)
{
supla_input_cfg_t *input_cfg = (supla_input_cfg_t *)_input_cfg;
if (input_cfg->type == INPUT_TYPE_BTN_MONOSTABLE_RS)
{
supla_roller_shutter_cfg_t *rs_cfg = supla_esp_gpio_get_rs__cfg(input_cfg->relay_gpio_id);
if (rs_cfg != NULL)
{
uint8 direction = rs_cfg->up->gpio_id == input_cfg->relay_gpio_id ? RS_RELAY_UP : RS_RELAY_DOWN;
if (!__supla_esp_gpio_relay_is_hi(rs_cfg->down) && !__supla_esp_gpio_relay_is_hi(rs_cfg->up))
{
supla_esp_gpio_rs_set_relay(rs_cfg, direction, 1, 1);
}
else
{
supla_esp_gpio_rs_set_relay(rs_cfg, RS_RELAY_OFF, 1, 1);
}
}
}
else if (input_cfg->type == INPUT_TYPE_BTN_BISTABLE)
{
supla_esp_board_gpio_relay_switch(input_cfg, 255);
}
else if (input_cfg->type == INPUT_TYPE_SENSOR && input_cfg->channel != 255)
{
supla_esp_channel_value_changed(input_cfg->channel, 0);
}
input_cfg->last_state = 0;
}