
ESP32 master
kwiecinski/BMS-and-offgrid-photovoltaic-management-system
Project contains BMS for lead-acid batteries and ESP-based board used to pull information from EASUN offgrid inverter, energy meters and sensors.

Реализация аппаратной и программной частей путеизмерительной телеги
Telega KiCad is an open-source printed circuit board by r3m4k, from the r3m4k/Telega repository on GitHub. It is a 2-layer board of 180 × 140 mm with 70 parts on 144 nets, routed with 641 tracks and 32 vias.
It is built around the MAX3232ID and L7812. Its parts include 16 capacitors, 14 resistors, 8 connectors, 6 diodes and 4 ICs. It belongs with the STM32 boards of this library.
Проект состоит из нескольких самостоятельных частей:
Embedded - прошивка для STM32F3Discovery, протокол обмена, драйверы датчиков и прикладная логика МК.Python - GUI-приложение для ПК, слой связи с МК, сохранение данных и вспомогательные модули анализа.KiCad - файлы печатной платы. В рамках этого README описывается только наличие раздела, без разбора содержимого.Kompas3d - механические модели и сборки. Файлы CAD не анализируются подробно.Список комплектующих.csv - перечень компонентов проекта.GUI находится в каталоге Python и запускается из Python/main.py. Приложение написано на PyQt5 и предназначено для работы с путеизмерительной тележкой через COM-порт: настройка подключения, запуск служебных стадий МК, отображение текущих показаний и сохранение результатов измерений.
Рекомендуемый запуск из корня репозитория:
python -m venv Python/.venv
Python/.venv/Scripts/pip install -r Python/requirements.txt
Python/.venv/Scripts/python Python/main.pyНа Linux путь к интерпретатору виртуального окружения будет Python/.venv/bin/python.
Acc_X, Acc_Y, Acc_Z, Gyro_X, Gyro_Y, Gyro_Z и кода ДПП;Типовой рабочий сценарий описан подробнее в Python/docs/USER_GUIDE.md.
Python/main.py - точка входа, создание QApplication и главного окна.Python/gui/main_window.py - главное окно, координирующее интерфейс, сессию связи и переключение пользовательских стадий.Python/gui/program_stages - реализации стадий настройки, статического буфера и измерений, а также контракт главного окна, необходимый этим стадиям.Python/gui/ui/main_window.ui - Qt Designer-разметка интерфейса; рядом лежат графические ресурсы telega.png и update.png.Python/gui/com_port_settings.py и Python/gui/saving_params.py - работа с настройками COM-порта и параметрами сохранения.Python/gui/com_port_reader.py - мост между GUI и низкоуровневой сессией МК. Запускает отдельный процесс для обмена с устройством и прокидывает данные/события в GUI через Qt-сигналы.Python/telega_session/data_storage.py - потоковая запись пакетов TelegaData в CSV в дочерней сессии МК.Python/gui/data_visualization.py - обновление LCD-индикаторов текущими значениями телеметрии.Python/telega_session - проектный слой общения с тележкой: COM-порт, декодер протокола, контроллер команд и функция запуска сессии.Python/async_mc_controller - более общий асинхронный слой для источников байтов, декодирования, контроллера, шины сигналов, логирования и конфигурации.Python/app_config и Python/logger - конфигурация приложения на Pydantic и настройка логирования.Python/data_analys и Python/plotting - вспомогательные модули для постобработки, фильтрации, расчета траектории и построения графиков.После применения настроек главное окно создаёт конфигурацию COM-порта и запускает ComPortReader. Низкоуровневая сессия работает в отдельном процессе через multiprocessing, читает байтовый поток с устройства, декодирует пакеты протокола и потоково сохраняет их в CSV. В GUI передаётся только последний пакет не чаще одного раза в 500 мс для обновления индикаторов; служебные события и ошибки передаются отдельной очередью. Главное окно задаёт путь CSV-файла и переключает доступные действия пользователя согласно текущей стадии работы.
Во время набора статического буфера создается файл вида:
{шаблонное_название}_static_init_{номер_проезда}.csvВо время измерительного проезда создается файл вида:
{шаблонное_название}_measuring_{номер_проезда}.csvCSV пишется в UTF-8 с полями:
PackageNum DppCode AccX AccY AccZ GyroX GyroY GyroZ TempНастройки приложения сохраняются в Python/app_config/settings.json; файл относится к локальным runtime-данным и не обязан храниться в репозитории.
Пользовательская часть прошивки расположена в Embedded/user и написана как C++-слой поверх STM32F30x Standard Peripheral Library, USB VCP и библиотек датчиков платы STM32F3Discovery. Проект устроен почти как header-only фреймворк: прикладной сценарий находится в src/main.cpp, а драйверы, контейнеры, фильтры, протоколы и обвязка периферии вынесены в заголовочные модули inc.
src/main.cpp - точка входа, инициализация оборудования, главный цикл, стадии программы, обработчики команд и системные функции.inc/main.h - C/C++ мост к STM32 SPL, USB VCP, CMSIS и функциям пользовательского слоя.inc/Common - общие типы, константы, TriaxialData и базовый механизм регистрации обработчиков прерываний.inc/Periph - GPIO, EXTI и светодиоды платы.inc/Timers - обертки над аппаратными таймерами STM32, конфигурации и descriptor-классы.inc/Sensors - драйверы L3GD20, LSM303DLHC и масштабирование датчиков.inc/Filters - статистика, N-sigma фильтр и фильтр Калмана.inc/DataContainers - очереди фиксированного размера, включая SPSC-очередь для обмена между IRQ и main.inc/Communication - сообщения, пакеты, декодеры, USB VCP и USART.inc/aaa_Project_Files - доменная логика проекта: команды, пакет телеметрии, декодер входящих команд и датчик пройденного пути.При старте main() копирует таблицу векторов прерываний из flash в пользовательскую таблицу _user_vector_table в RAM, переключает SCB->VTOR на эту таблицу и затем инициализирует оборудование через InitAll(). Такой подход позволяет C++-объектам регистрировать собственные обработчики IRQ во время инициализации.
Механизм регистрации прерываний реализован через CRTP-класс BaseIRQDevice. Конкретные устройства, например таймеры или EXTI-пины, наследуются от него, сохраняют указатель на активный экземпляр и записывают статический обработчик в пользовательскую таблицу векторов. При срабатывании IRQ статический обработчик перенаправляет вызов в метод irq_handler() нужного объекта.
Главный цикл прошивки работает как простой диспетчер событий. Сначала он выполняет накопленные отложенные команды из command_manager.command_queue, затем при необходимости переключает текущую стадию из program_stage_queue, после чего вызывает init() новой стадии один раз и execute() на каждом проходе цикла.
Поддерживаемые стадии:
FooStage - состояние ожидания: таймеры остановлены, датчики периодически читаются для поддержания их рабочего состояния.StaticStage - статический сбор начальных данных: формируется InitFrameNum телеметрических пакетов, после чего отправляется END_OF_STATIC_INIT.MeasuringStage - рабочее измерение: по тику TIM3 читаются датчики, данные фильтруются, упаковываются и отправляются на ПК.В прошивке используются два таймера общего назначения:
TIM3 - основной таймер измерений. Его IRQ переключает светодиод LED9, выставляет флаг нового периода измерений и увеличивает счетчик времени tick_counter.TIM4 - таймер индикации состояния. Его IRQ переключает LED6 и LED7.Таймеры описаны шаблонными классами Timer2, Timer3, Timer4, которые принимают пользовательский обработчик прерывания как compile-time параметр. Это позволяет вызывать обработчик без виртуальных функций и без runtime-диспетчеризации.
Прошивка работает с датчиками платы STM32F3Discovery:
L3GD20 - гироскоп, данные угловой скорости.LSM303DLHC - акселерометр и температурный датчик; магнитометр в текущей конфигурации отключен.DppSensor - датчик пройденного пути: импульсы приходят на EXTI-вход PC1, направление считывается с PC3.Перед отправкой телеметрии данные акселерометра, гироскопа и температуры проходят через NSigmaFilter. Для ускорения и угловой скорости используется фильтр NSigmaFilter<TriaxialData, 4, 16>, для температуры - NSigmaFilter<float, 1, 16>. Фильтр отбрасывает выбросы по правилу N-sigma и накапливает итоговое среднее.
Основной канал связи с ПК - USB Virtual COM Port. Входящие данные принимаются в UserEP3_OUT_Callback(), преобразуются в Messages::SizedMessage<VCP_BUFFER_SIZE> и передаются в UsbPort, где поток байтов разбирается DecoderTelega.
Входящий командный протокол:
0xE7 0x7E;0xAB;DecoderTelega отвечает только за входящий поток команд. Он находит команду в списках urgent_commands и deferred_commands менеджера команд. Срочные команды выполняются сразу в контексте обработчика приема, отложенные команды помещаются в SPSC-очередь и выполняются позже в основном цикле.
Поддерживаемые команды:
0xff 0xff - перезагрузка МК.0xaa 0x00 - переход в FooStage.0xaa 0x02 - переход в MeasuringStage.0xaa 0x03 - переход в StaticStage.HANDSHAKE_ACK, HEARTBEAT_ACK - текстовые служебные команды, на которые МК отвечает собственными ACK-сообщениями.Телеметрия отправляется через TelegaPackage. Пакет содержит:
tick_counter;acc_value;gyro_value;temp_value;dpp_code;Текстовые служебные ответы формируются через MessagePackage: подтверждение команды, handshake ACK, heartbeat ACK, сообщение об ошибке и окончание статической инициализации.
Прошивка рассчитана на доверенный ПК-клиент, который отправляет небольшие корректные команды и не перегружает очередь команд. Переполнение очередей и чрезмерная длина входящих пакетов считаются нарушением протокольного соглашения, а не штатным режимом работы. Частота таймера измерений должна быть согласована со временем чтения датчиков, фильтрации и отправки пакета так, чтобы обработка успевала завершиться до следующего периода измерений.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 6 | 0.33uF | Capacitor_Tantalum_SMD:CP_EIA-2012-12_Kemet-R_HandSolder | C303, C304, C305, C403, C404, C405 |
| 6 | R_Small | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P15.24mm_Horizontal | R201, R202, R203, R204, R205, R206 |
| 3 | 1N5400 | Diode_THT:D_DO-201AD_P15.24mm_Horizontal | D501, D502, D506 |
| 3 | Conn_01x05 | Connector_Wire:SolderWire-1sqmm_1x05_P5.4mm_D1.4mm_OD2.7mm | GPS_RS232_Repeater601, Reserved_RS232_601, Reserved_RS232_602 |
| 2 | 0.047uF | Capacitor_Tantalum_SMD:CP_EIA-2012-12_Kemet-R_HandSolder | C302, C402 |
| 2 | 0.5 | Resistor_THT:R_Axial_Power_L38.0mm_W6.4mm_P40.64mm | R510, R511 |
| 2 | 100uH | Inductor_THT:L_Radial_D9.5mm_P5.00mm_Fastron_07HVP | L501, L502 |
| 2 | 150 | Resistor_THT:R_Axial_DIN0516_L15.5mm_D5.0mm_P25.40mm_Horizontal | R504, R505 |
| 2 | 1uF | Capacitor_Tantalum_SMD:CP_EIA-2012-12_Kemet-R_HandSolder | C301, C401 |
| 2 | 22 | Resistor_SMD:R_1206_3216Metric | R601, R602 |
| 2 | 22uF/25V | Capacitor_THT:CP_Radial_D8.0mm_P5.00mm | C502, C504 |
| 2 | C_Small | Capacitor_THT:CP_Radial_D8.0mm_P5.00mm | C201, C202 |
| 2 | DE9_Pins_MountingHoles | Connector_Dsub:DSUB-9_Pins_Horizontal_P2.77x2.84mm_EdgePinOffset7.70mm_Housed_MountingHolesOffset9.12mm | DPP_TW_601, GPS_RS601 |
| 2 | MAX3232 | Package_SO:SOIC-16W_7.5x10.3mm_P1.27mm | U301, U401 |
| 1 | 100k | Resistor_THT:R_Axial_DIN0516_L15.5mm_D5.0mm_P25.40mm_Horizontal | R501 |
| 1 | 10uF/50V | Capacitor_THT:CP_Radial_D8.0mm_P5.00mm | C503 |
| 1 | 22uF/50V | Capacitor_THT:CP_Radial_D8.0mm_P5.00mm | C501 |
| 1 | 680 | Resistor_THT:R_Axial_DIN0516_L15.5mm_D5.0mm_P25.40mm_Horizontal | R503 |
| 1 | 78xx-1000R3(L) | Converter_DCDC:Converter_DCDC_RECOM_R-78B-2.0_THT | Converter_DCDC-12V/5V501 |
| 1 | Conn_12V | Connector_Molex:Molex_KK-254_AE-6410-02A_1x02_P2.54mm_Vertical | J502 |
| 1 | Conn_24V | Connector_Molex:Molex_KK-254_AE-6410-02A_1x02_P2.54mm_Vertical | J501 |
| 1 | Conn_Extra_15V | Connector_Wire:SolderWire-1sqmm_1x05_P5.4mm_D1.4mm_OD2.7mm | J504 |
| 1 | Conn_Extra_5V | Connector_Wire:SolderWire-1sqmm_1x05_P5.4mm_D1.4mm_OD2.7mm | J503 |
| 1 | Conn_Extra_Gnd1 | Connector_Wire:SolderWire-1sqmm_1x05_P5.4mm_D1.4mm_OD2.7mm | J505 |
| 1 | Conn_Extra_Gnd2 | Connector_Wire:SolderWire-1sqmm_1x05_P5.4mm_D1.4mm_OD2.7mm | J506 |
| 1 | Control_connector | Connector_Molex:Molex_KK-254_AE-6410-08A_1x08_P2.54mm_Vertical | J602 |
| 1 | K78xx-2000R3 | Converter_DCDC:Converter_DCDC_RECOM_R-78B-2.0_THT | Converter_DCDC-24V/15V501 |
| 1 | L7812 | Package_TO_SOT_THT:TO-220-3_Vertical | U601 |
| 1 | Led_Green | Connector_Wire:SolderWire-1sqmm_1x02_P5.4mm_D1.4mm_OD2.7mm | D504 |
| 1 | Led_Orange | Connector_Wire:SolderWire-1sqmm_1x02_P5.4mm_D1.4mm_OD2.7mm | D505 |
| 1 | Led_Red | Connector_Wire:SolderWire-1sqmm_1x02_P5.4mm_D1.4mm_OD2.7mm | D503 |
| 1 | MF-R135, 1.35А | Fuse:Fuse_Bourns_MF-RG300 | F501 |
| 1 | STM32f3discovery | _STM32f3discovery:STM32f3discovery | U201 |
| 1 | SW_12V | Connector_Wire:SolderWire-1.5sqmm_1x02_P7.8mm_D1.7mm_OD3.9mm | SW502 |
| 1 | SW_24V | Connector_Wire:SolderWire-1.5sqmm_1x02_P7.8mm_D1.7mm_OD3.9mm | SW501 |
| 1 | USB_B | Connector_USB:USB_B_Lumberg_2411_02_Horizontal | J601 |
The 60 most common of 70 parts.
It measures 180 × 140 mm and has 2 copper layers, 1.6 mm thick.
70 parts, built around the MAX3232ID and L7812. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the r3m4k/Telega repository on GitHub, at the commit this page was made from: the board is KiCad/Telega_KiCad.kicad_pcb and its schematic KiCad/Connectors.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask r3m4k before reusing the design.

kwiecinski/BMS-and-offgrid-photovoltaic-management-system
Project contains BMS for lead-acid batteries and ESP-based board used to pull information from EASUN offgrid inverter, energy meters and sensors.

RadioThermal/RadioThermal_Soldering_OSHW
Open Source Hardware 470KHz Induction Soldering Iron


profdc9/DRSSTC-PCB-Pack
A pack of PCBs for a dual resonant solid state tesla coil setup. Pretty much everything you need.



kholia/Global-Communications-Transceiver
Open-source files for Global Communications Transceiver

oe2lsp/miniWhip
miniWhip Antenna, E-Field Antenna, capacitive antenna, DXLwhip, DXL-miniWhip, DXLminiWhip