Как выполнить Гистерезис.

Литр

✩✩✩✩✩✩✩
25 Фев 2021
8
1
Описание: При скорости 90 включается лапа и горит до падения скорости до 85.
Что нужно: при падении скорости ниже 85 лампа должна гореть ещё 1 секунду. При повышении скорости задержки нет.
Функция Delay() не подходит.
ИТОГО: Нет вообще понимания как это записать в скетче при помощи команды
millis() или micros()


Ttime1=Htime1+Ltime1;
frequency1=1440000/Ttime1; //Shift-lamp
Ttime=Htime+Ltime;
frequency=1440000/Ttime; //Если датчик на 2500 импульсов на км (японский)
if(frequency1>90)digitalWrite(11, HIGH);//Скорость
if(frequency1<85)digitalWrite(11, LOW); //Скорость


if(frequency1>110)digitalWrite(12, HIGH); //Shift-lamp
if(frequency1<109)digitalWrite(12, LOW); //Shift-lamp
 

bort707

★★★★★★✩
21 Сен 2020
3,058
910
ну вот где у вас строчка
if(frequency1<85) - тут не гасите лампу, а только запоминаете время. Когда время станет на 1 секунду больше - тогда гасите лампу
 

Литр

✩✩✩✩✩✩✩
25 Фев 2021
8
1
Спасибо за ответ.
Сегодня покурю эту тему и попробую дописать скетч сам.
позже выложу итого.
 

Литр

✩✩✩✩✩✩✩
25 Фев 2021
8
1
Это правильно? Проверка/Компиляция прошла.

if(frequency1>80)digitalWrite(11, HIGH);//Скорость

static uint32_t pause;
if (millis() - pause >= 1000) { //Задержка 1 секунда
pause = millis();
if (frequency1<78) digitalWrite(11, LOW);

if(frequency1>111)digitalWrite(12, HIGH); //Shift-lamp
if(frequency1<109)digitalWrite(12, LOW); //Shift-lamp

if (millis() - myTimer >= 500) { // таймер на 500 мс
myTimer = millis(); // сброс таймера

lcd.clear();
lcd.setCursor(0,0);
lcd.print(frequency1,0);
lcd.print("km/h");
lcd.setCursor(0,1);
lcd.print (frequency,0);
lcd.print("ob/min");
}
}
}
 

bort707

★★★★★★✩
21 Сен 2020
3,058
910
Это правильно? Проверка/Компиляция прошла.
неправильно. Таймер надо запускать по условию, когда у вас frequency снизилось ниже 85(или сколько там...)
А у вас в коде таймер запускается просто так, без всяких условий...
 

poty

★★★★★★✩
19 Фев 2020
3,228
939
@Литр, вы распишите для себя алгоритм, иначе так и будете перебирать варианты. Слово "гистерезис", который Вы вынесли в заголовок, имеет несколько другой смысл, чем то, что Вы пытаетесь сделать.
Фактически, система у Вас получается имеет три состояния:
1. Ниже 85.
2. Ждём 1 секунду после снижения ниже 85.
3. Выше или равно 85.
В каждом из этих состояний (я бы предложил их хранить в переменной, например, speedState и сделал три ветки, например, через switch, в которых обрабатывается соответствующее состояние) есть события, которые могут приводить к смене состояний:
  • в состоянии 1 контролируем достижение скорости 85, если такое произошло - переходим в состояние 3, включаем светодиод;
  • в состоянии 2 контролируем:
  • достижение скорости 85, при этом переходим в состояние 3, включаем светодиод;
  • истечение таймера в одну секунду, при этом переходим с состояние 1, выключаем светодиод;
  • в состоянии 3 контролируем достижение скорости <85, если такое произошло - запоминаем текущее время и переходим в состояние 2.
Вот и всё.
 

Литр

✩✩✩✩✩✩✩
25 Фев 2021
8
1
1.Таймер по условию дописать правильно Немогу . Очень много примеров с Delay и еденичные с Millis и они совершенно разные и не по теме.
Подскажите пару строчек.

if (frequency1<85) digitalWrite(11, LOW); Это главное Условие

static uint32_t pause;
if (millis() - pause >= 1000) { //Задержка отключения 1 секунда, только при снижении скорости ниже 85. Второстепенное условие
pause = millis();



2. Замена Delay(500) на millis для дисплея

if (millis() - myTimer >= 500) { // таймер на 500 мс
myTimer = millis(); // сброс таймера
 

Литр

✩✩✩✩✩✩✩
25 Фев 2021
8
1
Гистерезис -запоздалая реакция на событие , или я не прав? Тут он как-бы двойной получается. Включается на 90 выключается на 85 и от 85 ещё ждет 1 секунду до выключения. Если в течении этой 1 секунды скорость подскочит к 90, Моментальное включения без каких либо условий .
 

bort707

★★★★★★✩
21 Сен 2020
3,058
910
if (frequency1<85) digitalWrite(11, LOW); Это главное Условие
Вы ошибаетесь, никакое это не условие.
Условие тут только
if (frequency1<85)
а
digitalWrite(11, LOW); - это уже действие по условию.

Аи еще самая главная ваша ошибка в том, что если вам нужно действие с задержкой, строчку
digitalWrite(11, LOW);
совать в условие НЕ НАДО! Иначе это действие у вас будет выполнятся сразу, а не через секунду
 

poty

★★★★★★✩
19 Фев 2020
3,228
939
@Литр, Вы опять идёте от попытки выловить текущее состояние не запоминая его... :-( @bort707, Вам правильно подсказывает, что
C++:
digitalWrite(11, LOW);
нужно выполнять только тогда, когда истечёт таймер.
Гистерезис -запоздалая реакция на событие , или я не прав?
нет, гистерезис - это разная зависимость изменения одной величины от другой в зависимости от направления изменения величины. Если пояснить на Вашем случае, то, допустим, светодиод загорался бы при переходе через скорость 90, а выключался - при переходе через скорость 85.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,262
1,300
Москва
Небольшой пример
тут скорость вводится в монитор порта, для верного ввода внизу справа надо выбрать "нет конца строки"
И учесть, что парсер работает с небольшой задержкой. А задержка на выключение начинает работать с момента вывода скорости в монитор

C++:
int8_t speed = 0;
uint32_t timer = 0;
void setup() {
  Serial.begin(115200);
  pinMode(13, OUTPUT);

}

void loop() {
  if (Serial.available())
  {
    speed = Serial.parseInt();
    Serial.println(speed);
  }

  if (speed > 85)
  {
    digitalWrite(13, HIGH);
    timer = 0;
  }
  else
  {
    if (timer == 0) timer = millis();
    if (millis() - timer > 1000)      digitalWrite(13, LOW);
  }
}
 

bort707

★★★★★★✩
21 Сен 2020
3,058
910
нет, гистерезис - это разная зависимость изменения одной величины от другой в зависимости от направления изменения величины.
@poty, слово "гистерезис" подкинул ТС я.
Дело в том, что в своей прошлой теме ТС описывал, что ему надо зажигать светодиод, если температура при движении вверх превысит 90 градусов, а тушить светик - через секунду после того, как температура пройдет 85 градусов при движении вниз.
То есть в задаче у него есть "гистерезис" :)
Другое дело, что в новой теме ТС сузил задачу только до "как сделать что-то через секунду после события" - и к этой задаче слово "гистерезис" действительно отношения не имеет.