Skip to content

Maxsteff57/kriostat

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Контроллер криогенного газификатора барокамер

Программно-аппаратное ядро для управления криогенным медицинским газификатором, питающим гипербарические камеры (ГБО). Реализует полный цикл: гидростатика → термодинамика → масса/расход → предиктивное управление клапаном Pressure Builder → диагностика безопасности + интеграция с погодой по геолокации + акустическая оценка расхода стравливания.

Структура проекта

gasifier_controller/
├── __init__.py                # публичный API пакета
├── config.py                  # константы, NIST-таблица O2, уставки
├── calibration.py             # AnalogSensorCalibration (Gain/Offset, auto-zero)
├── thermodynamics.py          # CryogenicThermodynamics (NIST + Антуан)
├── geometry.py                # TankGeometry (гор. цилиндр + эллипсы, zero-trap)
├── mass_flow.py               # MassAndFlowProcessor (масса, EWMA, прогноз)
├── pressure_control.py        # PredictivePressureController (упреждение + обучение)
├── safety.py                  # SafetyDiagnostics (утечки, вакуум, PRV, обмерзание)
├── weather.py                 # Open-Meteo + Яндекс.Погода + геокодинг
├── environment.py             # Поправки на погоду + флаг «под навесом»
├── acoustic_flow.py           # 🎤 Оценка стравливания по шуму микрофона
├── controller.py              # GasifierController — фасад
├── main.py                    # CLI-демо
├── ui_desktop.py              # 🖥️ Tkinter-приложение
├── tests/                     # юнит-тесты (51 шт.)
├── requirements.txt           # пусто (ядро на stdlib)
├── requirements-desktop.txt   # для микрофона: sounddevice + numpy
└── README.md

Быстрый старт

Десктопное приложение

# Tkinter уже в stdlib. Для микрофона установить:
pip install -r gasifier_controller/requirements-desktop.txt

# Запуск GUI:
python -m gasifier_controller.ui_desktop

Окно содержит:

  • Состояние газификатора — давление, уровень, объём, масса, расход, прогноз, температура насыщения, плотности фаз
  • Журнал событий — все алерты диагностики с уровнями INFO/WARNING/CRITICAL
  • Внешние условия — ввод города или координат, выбор провайдера погоды (Open-Meteo / Яндекс / mock), галочка «под навесом»
  • Управление — старт/пауза/сброс симуляции, имитация отбора в барокамеру и стравливания, калибровки P, DP, Auto-Zero DP
  • Акустическая оценка стравливания — индикатор шума, оценка расхода и времени до целевого давления, калибровка по эталонному стравливанию

CLI-демо

python -m gasifier_controller.main                    # mock-погода, под навесом
python -m gasifier_controller.main --city Москва      # геокодинг города
python -m gasifier_controller.main --coords "55.75,37.62"
python -m gasifier_controller.main --no-canopy --mock-weather --mock-temp -25

С Яндекс.Погодой:

export YANDEX_WEATHER_KEY="..."
python -m gasifier_controller.main --city Хабаровск

Тариф «Тестовый» Яндекс.Погоды закрыт в 2024 году — нужен платный ключ. Open-Meteo используется как бесплатный fallback.

Использование как библиотека

from gasifier_controller import (
    GasifierController, SensorReadings, WeatherService, OpenMeteoProvider,
    AcousticFlowEstimator, MicrophoneSource,
)

controller = GasifierController()

# Опционально — обновить погоду
weather_svc = WeatherService([OpenMeteoProvider()])
snap = weather_svc.fetch_current(lat=55.75, lon=37.62)
controller.update_weather(snap, under_canopy=True)

# Опционально — акустический оценщик
acoustic = AcousticFlowEstimator(MicrophoneSource())
acoustic.start()
# ...когда оператор открыл известный стравливающий клапан...
acoustic.add_calibration_point(known_flow_kg_per_s=0.05)

# Основной цикл (например, 1 Гц):
readings = SensorReadings(
    pressure_raw_bar=9.0, dp_raw_pa=12500.0,
    consumer_demand_active=True, vaporizer_outlet_temp_c=10.0,
)
report = controller.process_cycle(readings)

if report.pb_valve_open:
    relay.open_pb_valve()
else:
    relay.close_pb_valve()

for alert in report.alerts:
    print(alert)

🎤 Акустическая оценка стравливания

Идея: уровень шума струи газа коррелирует с её массовым расходом (теория сонорных струй: акустическая мощность ~ ṁ²·v²). Это позволяет по шуму микрофона примерно оценить, сколько ещё стравливать кислород для падения давления до уставки.

Точность ±30–50% — метод именно для оценки порядка величины. Не используется в безопасности (для этого есть прямые датчики P и dP/dt). Удобство: оператор слышит шум стравливания и тут же видит примерный остаток времени.

Калибровка (один раз для конкретной установки)

  1. Запустите микрофон в UI.
  2. Откройте стравливающий клапан в контролируемом режиме (или нажмите «Открыт стравл. клапан» в симуляторе для проверки на mock).
  3. Нажмите «Начать запись эталона» — программа запомнит P_before и объём ullage.
  4. Подождите 5–10 с при стабильном шуме струи.
  5. Нажмите «Зафиксировать ṁ_эталон» — программа вычислит фактический расход по падению давления и плотности газа, и привяжет его к текущему уровню шума.

Калибровочные точки можно сохранять в JSON-файле. Двух точек достаточно для подгонки степенной зависимости ṁ = c·RMS^p.

Файлы:

  • acoustic_flow.py — модуль оценщика (классы AcousticFlowEstimator, MicrophoneSource, MockAcousticSource)
  • tests/test_acoustic.py — 16 юнит-тестов с mock-источником

Что делает фича «погода + навес»

Модуль environment.py пересчитывает паспортные пороги диагностики под текущие условия среды:

Параметр Без навеса (открытая площадка) Под навесом
Солнечный нагрев поверхности до +18 °C при ясном дне пренебрежимо
Влияние ветра сильное (×3 коэффициент) слабое
Осадки усиливают обмерзание не действуют
Норма BOG (адаптация safety) коррекция ×(ΔT_air/ΔT_ref) то же без солнечной добавки
Порог защиты испарителя по T_out смягчается в мороз без изменений

Передаётся флагом under_canopy в update_weather() или галочкой в UI.

Карта развития (мультиплатформа)

Ядро написано на чистой stdlib и работает везде, где есть Python ≥ 3.10 (в т.ч. на одноплатниках Raspberry Pi / Orange Pi). Фронты подключаются без модификации ядра:

Платформа Стек Статус
Десктоп (Win/Linux/macOS) Tkinter (stdlib) ✅ готов (ui_desktop.py)
Веб (HMI в браузере) FastAPI + WebSocket планируется
Мобильное (iOS/Android) BeeWare (Toga) или Kivy/KivyMD планируется
ПЛК (промконтроллер) MicroPython / C++ порт портируется по модулям

Чтобы добавить новый фронт — импортируйте GasifierController, читайте датчики через ваш IO-драйвер, отправляйте показания в process_cycle(), рендерьте поля из CycleReport.

Тестирование

python -m unittest discover gasifier_controller/tests -v
# 51 тест, все зелёные

Тесты разбиты на 2 файла:

  • test_all.py — 35 тестов ядра (калибровка, термодинамика, геометрия, расход, PB, безопасность, поправки погоды, интеграция)
  • test_acoustic.py — 16 тестов акустического модуля (модель, калибровка, оценка времени, файл-IO)

Соответствие исходному ТЗ

Все классы и методы из промта реализованы:

  • AnalogSensorCalibration с calibrate_from_two_points, auto_zero
  • CryogenicThermodynamics.get_densities(P), NIST таблица + Антуан
  • TankGeometry.calculate_liquid_level, calculate_volumes со zero-trap
  • MassAndFlowProcessor.update_flow_rate (EWMA), predict_time_to_empty
  • PredictivePressureController с динамическим P_stop и самообучением
  • SafetyDiagnostics.detect_leakage, detect_vacuum_degradation, log_prv_cycles, check_vaporizer_frost
  • ✅ Интеграция Open-Meteo + Яндекс.Погода + флаг навеса (environment.EnvironmentalCorrections)
  • ✅ Десктопное приложение (Tkinter) со всеми панелями
  • ✅ Акустический оценщик стравливания по микрофону

About

Криостат — контроллер криогенного газификатора (Tkinter). Симуляция, прогноз запаса, калибровка.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors

Languages