Запомнить последнюю выполненную функцию и сравнить с имеющимися

Доброго времени суток!
Сразу к сути проблематики =)
Подскажите как решить следующую ситуацию:
имеем рольставни (для закрытия окон снаружи). При определенной температуре они совершают действие, а именно: закрываются полностью, а затем открываются на определенное расстояние. Всего четыре варианта нахождения рольставни: полностью открыто, 1/2, 1/4, полностью закрыто. Управление происходит выполнением соответствующих функций, которые активируются в зависимости от действующей температуры (Пример: открыты полностью при температуре от -55 С до 50 С и т.д.).
Собственно вопрос: как прописать, а точнее запомнить последнюю выполненную функцию? Необходимо для того, чтобы при постоянной (неизменной) температуре, рольставни постоянно не гоняли вниз и вверх.
Как я понимаю здесь две составляющие вопроса, первый, который я уже описал, а второй: как сравнить запомнившую функцию с той функцией, которая была выполнена последний раз?
Заранее благодарен за подсказку =)

Записать признак действия (например число от 1 до 4) в нужную ячейку памяти.
Способ сравнения вытекает из природы признака: сравнение двух чисел на равенство.

  1. А чем сейчас ставни управляются? Это уже какое-то самодельное устройство, алгоритм работы которого Вас не устраивает, Вы хотите его поменять и есть возможность его поменять? Или это какое-то неизвестное устройство-чёрный ящик, в работу которого неизвестно как вмешаться?
  2. Не очень понятна проблема. Ну да, в конечное положение ставни встают только после полного закрытия. Но по моим представлениям о ставнях это раз в день, да и больно наплевать! А уж откуда “гонять вверх вниз”?
  3. Сам вопрос про запоминание каких-то функций - это типичная проблема XY.

Чтобы не гонять мотор постоянно в нулевую позицию, а затем устанавливать на нужную, вам надо завести переменную “текущая позиция”, и, написать функцию вычисления новой позиции, в которой "текущую позицию " сравнивать с константой, которую необходимо установить, и , соответственно , определять направление движения, и расстояние, на которое надо передвинуть ставни.

Изначально так и предполагал, но на практике не все так просто. Полное время закрывания и открывания отличается, причем отличается как между собой, так и от условий окружающей обстановки (ветер, мороз и т.д.). Но в точках полного закрытия и открытия имеются концевики, которые независимо от того времени, которое мы подали на реле для закрытия/открытия безболезненно и главное вовремя остановят движения рольставни, а значит и точно известно место нахождения. Если гонять рольставню по местам нахождения в позициях закрытия 1/3 и 1/4, то рано или поздно (из-за непостоянства времени перемещения) площадь открытия/закрытия либо увеличится, либо уменьшится.

Ну так установить, чтобы на каждое десятое перемещение устройство производило самокалибровку, т.е. доезжало до концевика.

Не, это не просто глупое гоняние рольставней ))))
Рольставни прикрывают панель солнечного коллектора, в замкнутом пространстве которого имеется теплопередающая жидкость (антифриз), которая передает тепло в двухконтурном боллере. При солнечной погоде и открытой полностью рольставне антифриз нагреется очень быстро, а летом потребление горячей воды - минимальное, следовательно куда денется накопившаяся энергия…, правильно - разорвет в клочья солнечный коллектор… Для этого, в зависимости от температуры необходимо уменьшить нагревательную площадь солнечного коллектора, и именно для этого и придумывается сей девайс.
Как двигать рольставни, как производить съем температуры, управление насосами для прогона жидкости в замкнутом контуре - это уже реализовано.
А вот как уберечь нервную систему от постоянного движения рольставней - это задача заводит пока в тупик ((((

Как сказал следующий собеседник - за черный ящик отдельное спасибо =)))
Это на пальцах я понимаю, но вот если приближаться более подробно к коду, то тут возникают проблемки.
Но благодарю, что подтвердили мою идею, я мыслю в этом же направлении

Один вариант - тремя постами выше. Правда, он лишь уменьшает количество лишних движений, не сводя их к нулю.
А вот если поставить дополнительные датчики, от лишних движений можно избавиться полностью.

С этим полностью согласен! Вопрос: как запомнить последнее выполненное действие и чтобы оно не повторялось до изменения условия (температуры), но при этом температура отслеживалась,. А при возникновении нового условия (температура изменилась) выполнилось новое действие (через полное закрытие и открытие до нового положения), которое теперь является последним выполненным и также не повторяется до тех пор пока не температура не выйдет за рамки данного условия

Если запоминать последнее выполненное действие, то частого движения не предвидится, разброс температур довольно большой:
1. от -55 до 80 - полностью открыто
2. от 80 до 120 - открыто на 1/2
3. от 120 до 140 - открыто на 1/4
4. более 140 - закрыто - защита солнечного коллектора от перегрева
В этой системе еще имеется и насос, который имеет несколько скоростей на прогон жидкости в системе ))))

Замечательно!

См. ответ №1.

Не повторять его до изменения условия.

Отслеживание температуры и выполнение действий по перемещению не зависят друг от друга.
Т.е. ответ: независимо.

Для задачи это несущественно.
А чтобы заслонка не дергалась туда-сюда на границах зон, нужно ввести гистерезис.

Ок, все вроде проще простого ))))). За направление идеи спасибо

Отдельное действительное спасибо за последний совет, о нем-то я как раз и не подумал !!!

У китайцев есть модули на микросхеме AS5600, цена с доставкой ~200р.
Это по факту абсолютный энкодер с датчиком Холла.
Я бы реализовал через этот датчик.

Спасибо за идею, посмотрю

Если вы хотите поддерживать именно температуру теплоносителя, я бы посоветовал использовать ПИД-регулятор. Входной сигнал - температура в контуре (сразу после коллектора), выход - позиция жалюзи. При наличии энкодера будет точное регулирование и не надо будет гонять туда-сюда до крайних положений. И гораздо точнее чем фикс.1/2, 1/4 и т.д. Только надо подбирать коэффициенты под свою конкретную установку.

1 лайк

Вот очень вредный совет в данном вопросе. ПИД хорош когда нужно поддерживать какой то параметр в строго ограниченном коридоре. Здесь же он излишен. Достаточно ввести две переменных - надо куда то двигаться и двигаюсь. Первой переменной присваивать значение 0,1,2,3 в зависимости от того в каком диапазоне температур находимся. Дальше в цикле проверять соответствует ли диапазон значению. Если не соответствует присвоить новое значение, присвоить второе переменной значение соответствующее движению жалюзи. Пока происходит движение ждать и ничего не проверять и не делать. По окончанию движения вторую переменную сбросить и кутить цикл проверки температуры. Если ввести гистерезис на пару градусов в диапазоны температуры, то лишних движений не будет.

Я бы поставил 4 концевика на каждое положение и не парился с вычислениями, энкодерами, шаговиками. И присваивать этим концевикам фиксировенное значения температуры.

1 лайк

А вы тут хотите переложить ответственность на кого-то за этот акт природного вандализма?