stels3737 пишет:
На этот алгоритм навешиваем:
Гистерезис - сравниваем не две температуры, а разницу между ними - если абсолютная разница меньше требуемой погрешности - ничего не делаем.
Поправку на инерцию. Чем больше разница, тем дольше можно крутить, и, делать паузу между замерами - также пропорционально разнице.
Спасибо. Где-то так и написал. Проблема в том, что алгоритм не всегда сходится к паузе по гистерезису, и продолжает размахивать сервой с амплитудой 20-30 секунд
Соответственно температура скачет +-10 градусов, что недопустимо
Вот как сюда воткнуть изменяемую паузу? Или еще что, чтобы движение дошло до гисерезиса в 1 градус и больше не мучало серву постоянно?
void ICACHE_FLASH_ATTR
startfunc(){
digitalWrite(13,0); //Крутить серву на закрытие
digitalWrite(15,0); //Крутить серву на открытие
digitalWrite(12,1); //Насос
valdes[0]=0; //Крутить серву
valdes[1]=0; //Открывать 1 закрывать 0
valdes[2]=2; //На сколько секунд крутить
// выполняется один раз при старте модуля.
}
void ICACHE_FLASH_ATTR
timerfunc(uint32_t timersrc) {
// выполнение кода каждую 1 секунду
if(timersrc%valdes[2]==0){
// выполнение кода каждые per секунд
if(valdes[0]==1 && digitalRead(12)==1) {
if(valdes[1]==1) {
digitalWrite(13,0);
digitalWrite(15,1);
valdes[0]=0;
}
else{
digitalWrite(13,1);
digitalWrite(15,0);
valdes[0]=0;
}
}
else {
digitalWrite(13,0);
digitalWrite(15,0);
}
}
if(timersrc%30==0){
valdes[2]= abs(data1wire[0]/10-sensors_param.cfgdes[0]);
if (valdes[2]<1){ valdes[2]=1;}
if(data1wire[0] < ((sensors_param.cfgdes[0])*10)){
valdes[0]=1;
valdes[1]=1;
}
if(data1wire[0] > ((sensors_param.cfgdes[0]+sensors_param.cfgdes[1])*10)){
valdes[0]=1;
valdes[1]=0;
}
}
}
void webfunc(char *pbuf) {
os_sprintf(HTTPBUFF,"<br>Per: %d Krutit: %d Kuda: %d",valdes[2],valdes[0],valdes[1]); // вывод данных на главной модуля
}