А потому что ты не выложил свой код. А так мы больше угадываем и каждый пишет СВОЙ верный ответ. И гадать так можно до посинения.
Вы не правы, код в 12 посту, а 14 пояснено из за чего ищу другой выход.А потому что ты не выложил свой код.
Похабыч предложил самое простое элегантное решение. Только он чуть-чуть ошибся в коде, правильно будет так:Да может оно и так, да вот уже набралось 26 постов, но как говорили ( да посмотри, почитай) , а ответа так и не нашлось . Не кому не в обиду!
if (temp <24) btnTimer = millis();
if ((millis() - btnTimer) > 2000) {
digitalWrite(13, HIGH);
}
btnTimer
храним время, когда в последний раз температура была ниже пороговой (и постоянно обновляем это время). Соответственно, диод надо зажигать, если прошло больше ХХХ мс с этого времени.if (temp < 24) btnTimer = millis();
if (millis() - btnTimer >= 2000)
{
digitalWrite(13, HIGH);
digitalWrite(5, LOW);
}
else
{
(temp > 24 ) ;
digitalWrite(13, LOW);
digitalWrite(5, HIGH);
}
потому что не сами додумались, а получили готовенькоеуткнулся в новый тупик
нужно ввести переменную состояния. Если темп ниже 24 - состояние, скажем, 1, а если выше = 0Суть в том, что в данном коде нужен контроль температуры с задержкой. Если температура ниже 24 градуса пин 13 HIGH, пин 5 LOW, иначе температура выше 24 градусов пин 13 LOW , пин 5 HIGH. И при этом между переключениями должна быть задержка 2 секунды.
bool temp1 = (temp < 23);
bool temp2 = (temp > 23);
if (temp1 ) btnTimer = millis();
if (millis() - btnTimer >= 2000)
{
digitalWrite(13, HIGH);
digitalWrite(5, LOW);
}
else
if (temp2 ) btnTimer = millis();
{
if (millis() - btnTimer >= 2000) ;
digitalWrite(13, LOW);
digitalWrite(5, HIGH);
}
совсем нет. Оно даже компилироваться не будетНе уверен, что правильно.
В точку попали. Может направите где почитать?избавиться от частого переключения
Сдается мне тут в корне неверный подход к удержанию температуры. Если @Sascha хочет таким образом избавиться от частого переключения... То надо почитать про гистерезис
Тогда еще про усреднение и среднеквадратическое отклонение почитать. Где почитать спросите у гугла, он добрый и знает.В точку попали. Может направите где почитать?
Это лишнее, здесь такой точности не нужно.почитать про PID-регуляторы
Это я тоже понимаю и пид регулятор понимаю, мне интересно как все это программно выполнять, уж больно закручена эта наука программирование, но интересна.называется гистерезис
Да я не особо про точность, а по большей мере по усреднению данных и отфильтровыванию случайных ошибок с датчика. Но дело ваше, хотя пид штука простаяЭто лишнее, здесь такой точности не нужно.
if (temp>23.5)
{
digitalWrite(13, HIGH);
digitalWrite(5, LOW);
}
if (temp <22.5)
{
digitalWrite(13, LOW);
digitalWrite(5, HIGH);
}
То, что прерывание один раз в миллисекунду взято из стандартного кода для датчика протока, я добавил лишь функцию pulsesi () ; и таким методом решил проблему сохранения в eeprom переменную liters. Так же добавил кнопку, для сброса eeprom. Как то так.опрашивать датчики 1000 раз в секунду
Всем доброго дня. Я так понимаю Вы рассуждаете, как человек сточивший зубы в этой науке, я описывал в раннем посте, что это первый в моей жизни код, догадываюсь что не все там гладко, но не ошибается тот, кто не чего не делает. Для того и пытается человек что то познать, для того и общаемся на форумах, а не там где все знатоки, за что и благодарен вам , что помогаете, подсказываете, на путь истины направляете. Весь этот код работает, все ,что задумывал выполняет, сейчас и изучаю что бы улучшить и понять поболее.Вам не приходило в голову
#define everyMillis(interval, action) \
{ \
static unsigned long t = 0UL; \
if( millis() - t > (interval) ) \
{ \
{ action; } \
t = millis(); \
} \
}
everyMillis(1000,
{
pinOut(pinLed, 1-digitalRead(pinLed));
analogWrite(pwm12, analogRead(pin54)>>4);
});
// или так:
everyMillis(1000, blink() );
// вариант макроса для флага состояния и времени гистерезиса:
// 1. статические переменные локальны внутри блока (у каждого - свои!) макроса и не доступны извне!
// 2. вн. переключатель "f" разрешает фиксировать время начала отсчета только 1 раз!
// 3. отсчет интервала начинается от момента вызова с условием flag=true
#define gistMillis(flag, interval, action) \
{ \
static unsigned long t = 0UL; \
static unsigned char f = 0; \
if( flag && !f ){ t = millis(); f=1; } \
if( millis() - t > (interval) ) \
{ \
{ action; } \
t = millis(); \
f = 0; \
} \
}
// применение:
void devOn(){ /* функция включения чего надо */ }
void devOff(){ /* тут выключаем чего надо */ }
void loop(void){
// .. тут что-то делаем свое, личное
gistMillis( devTemprature < 23.0, 2000, devOn() ); // включаем с задержкой 2сек.
gistMillis( devTemprature > 23.0, 2000, devOff() ); // выключаем через 2сек.
// .. вариант гистерезиса по значению:
gistMillis( devTemprature < 23.0, 0, devOn() ); // включаем сразу.
gistMillis( devTemprature > 25.0, 0, devOff() ); // выключаем тоже.
}