не получается у меня эта простая задача, помогите, плиз
задача:
кнопкой на sonoff включать/выключать термостат
если термостат включен, то синий светодиод горит, реле управляется термостатом
если термостат выключен, то синий светодиод не горит, реле включается на постоянку
термостат может быть выключен из веб-интерфейса, либо по mqtt
соответственно, поведение синего светодиода и реле должно быть таким же как в случае с кнопкой
кнопка у sonoff
на нажатие кнопки настроено прерывание
GPIO for Key - 6
т.е. нажатие кнопки я записываю в GPIO6
дальше в конструкторе кода хочу это использовать
при нажатии кнопки GPIO6 переходит в 0, а потом спустя какое-то время обратно сбрасывается в 255 (использую переменную uint8_t state = GPIO_ALL_GET(GPIO6)
какое это время?
влияет ли на это параметр Time For Key?
как однозначно понять, что кнопка нажималась? нужно ли как то обрабатывать антидребезг?
я сделал свой таймер на 300(500?) мс и в нем пытаюсь определить состояние кнопки и что-то сделать в зависимости от состояния
но спустя какое-то время у меня все сбрасывается обратно
#define LED_BLUE 15
#define RELAY_AND_LED_RED 12
#define TMP_GPIO 6
#define THERM_NUMBER 1
static os_timer_t esp_timer;
uint8_t last_button_state; // предыдущее состояние кнопки
uint8_t last_term_state; // предыдущее состояние термостата
void ICACHE_FLASH_ATTR read_gpio()
{
uint8_t state = !GPIO_ALL_GET(TMP_GPIO); // получим состояние кнопки
if ( (last_button_state != state)) { // нажимали?
last_button_state = state; // запомнили новое состояние
sensors_param.termo[THERM_NUMBER-1][0]= state; // включили/выключили термостат
}
// термостат могли выключить и не кнопкой, а через веб-интерфейс
state = sensors_param.termo[THERM_NUMBER-1][0];
if ( state != last_term_state ) {
last_term_state = state;
GPIO_ALL(LED_BLUE,state); // зажгли/погасили синий светодиод
if ( state == 0 ) GPIO_ALL(RELAY_AND_LED_RED, 1); // если выключили термостат, включим реле, чтобы было питание, и конвектор сам управлял температурой
}
}
void ICACHE_FLASH_ATTR
startfunc(){
// выполняется один раз при старте модуля.
//is_changed = 0;
last_button_state=0;
last_term_state=sensors_param.termo[THERM_NUMBER-1][0];
os_timer_disarm(&esp_timer);
os_timer_setfn(&esp_timer, (os_timer_func_t *) read_gpio, NULL);
os_timer_arm(&esp_timer, 500, 1);
}
void ICACHE_FLASH_ATTR
timerfunc(uint32_t timersrc) {
// выполнение кода каждую 1 секунду
if(timersrc%30==0){
// выполнение кода каждые 30 секунд
}
}
void webfunc(char *pbuf) {
//os_sprintf(HTTPBUFF,"<br>test"); // вывод данных на главной модуля
os_sprintf(HTTPBUFF,"<br>Термостат %s", sensors_param.termo[THERM_NUMBER-1][0] ? "ВКЛ" : "ВЫКЛ"); // вывод данных на главной модуля
os_sprintf(HTTPBUFF,"<br>last_term_state %d", last_term_state); // вывод данных на главной модуля
os_sprintf(HTTPBUFF,"<br>last_button_state %d", last_button_state); // вывод данных на главной модуля
}