Initial commit.

This commit is contained in:
conky
2026-08-31 15:45:58 +03:00
commit ec9805b01a
22 changed files with 1536 additions and 0 deletions

120
include/config.h Normal file
View File

@@ -0,0 +1,120 @@
#pragma once
#include <Arduino.h>
//
// Project-wide hardware and behaviour configuration.
//
// Board : NUCLEO-F042K6 (STM32F042K6T6, LQFP32, board MB1180)
// 32 KB flash / 6 KB RAM
// Sensor: 2x GY-63 breakout carrying a MS5611-01BA03
// one on I2C1, one on SPI1
//
// Pin facts below are taken from ST UM1956 "STM32 Nucleo-32 boards (MB1180)"
// Table 10 + the MB1180 C.2 schematic, cross-checked against the STM32duino
// variant files for NUCLEO_F042K6.
//
// ---------------------------------------------------------------------------
// I2C sensor ("baro0")
// ---------------------------------------------------------------------------
// STM32duino default Wire pins for this variant:
// PIN_WIRE_SDA = PB7 (Arduino D4, routed to the A4 header pad via SB18)
// PIN_WIRE_SCL = PB6 (Arduino D5, routed to the A5 header pad via SB16)
// Both are the STM32duino defaults, so plain Wire.begin() selects them and no
// explicit setSDA()/setSCL() call is required.
//
// MS5611 I2C address is 1110 11Cx where C is the COMPLEMENT of the CSB pin
// (datasheet p.12), therefore:
// CSB tied to GND -> 0x77
// CSB tied to VCC -> 0x76
// Change this if the GY-63 CSB pad is strapped high.
#define BARO_I2C_ADDRESS 0x77
// ---------------------------------------------------------------------------
// SPI sensor ("baro1")
// ---------------------------------------------------------------------------
// SPI1 MUST stay on the PB3/PB4/PB5 group on this board.
//
// The alternative SPI1 group (PA5 SCK / PA6 MISO / PA7 MOSI) is NOT usable
// here: with the factory-default solder bridges SB16 and SB18 closed, PA6 is
// tied to the same net as PB6 (I2C SCL) and PA5 is tied to the same net as
// PB7 (I2C SDA). Driving SPI on PA5/PA6 while I2C runs on PB6/PB7 would put
// two peripherals on one net. See UM1956 Table 8 (SB16/SB18).
//
// SCK = PB3 (Arduino D13) <- also the on-board user LED LD3, see below
// MISO = PB4 (Arduino D12) <- connect to sensor SDO
// MOSI = PB5 (Arduino D11) <- connect to sensor SDI
// These three are the STM32duino defaults (core falls back to Arduino pin
// numbers 13/12/11), so plain SPI.begin() selects them.
#define BARO_SPI_CS_PIN PA11 // Arduino D10, core default PIN_SPI_SS
// MS5611 accepts SPI mode 0 and mode 3, up to 20 MHz (datasheet p.5/p.6).
// The library hardcodes mode 0; 1 MHz is its default and is plenty here.
#define BARO_SPI_CLOCK_HZ 1000000UL
// ---------------------------------------------------------------------------
// Error indicator LEDs - one per sensor
// ---------------------------------------------------------------------------
// IMPORTANT: the NUCLEO-F042K6 has exactly ONE user-controllable LED, and it
// is unusable for this project:
//
// LD1 (COM, tricolor) - driven by the ST-LINK MCU, not by the target
// LD2 (PWR, red) - hardwired to the power rail, not by the target
// LD3 (user, green) - on PB3 via SB15 + R23, and PB3 is our SPI1 SCK
//
// So both indicators are external LEDs (LED + ~510R to GND) on free GPIOs.
// PB0/PB1 are plain GPIO on this board and collide with nothing we use.
#define LED_BARO_I2C_PIN PB0 // Arduino D3 - error LED for the I2C sensor
#define LED_BARO_SPI_PIN PB1 // Arduino D6 - error LED for the SPI sensor
// How long an LED stays lit after an error is detected.
#define LED_ERROR_HOLD_MS 1000UL
// ---------------------------------------------------------------------------
// UART
// ---------------------------------------------------------------------------
// `Serial` on this variant is USART2 (SERIAL_UART_INSTANCE 2) on PA2/PA15,
// which is wired to the ST-LINK Virtual COM Port. No extra wiring needed.
#define UART_BAUD 115200UL
// Measurement report rate: 10 Hz.
#define REPORT_PERIOD_MS 100UL
// ---------------------------------------------------------------------------
// Acquisition
// ---------------------------------------------------------------------------
// The driver's read() busy-waits through two conversions, so a poll of both
// sensors is the loop period, and the report deadline can only be evaluated
// on that grid. Keeping the cycle short keeps the 10 Hz output jitter small:
//
// OSR_STANDARD (1024) 2.28 ms/conv -> ~5 ms/sensor -> ~11 ms cycle
// OSR_ULTRA_HIGH (4096) 9.04 ms/conv -> ~19 ms/sensor -> ~37 ms cycle
//
// Conversion times are the datasheet p.3 maxima. OSR 1024 already resolves
// well under a mbar, so it is the better trade here; raise it if resolution
// matters more than tight report timing.
#define BARO_OVERSAMPLING OSR_STANDARD
// Retry interval for a sensor that failed to initialise.
#define BARO_INIT_RETRY_MS 2000UL
// Consecutive failed polls after which the channel is torn down and taken
// back through the full reset + PROM/CRC handshake. Covers a sensor that was
// unplugged, browned out, or otherwise lost its calibration constants.
#define BARO_REINIT_AFTER_ERRORS 10
// ---------------------------------------------------------------------------
// Validation limits
// ---------------------------------------------------------------------------
// MS5611-01BA03 operating ranges (datasheet p.2/p.4).
#define BARO_PRESSURE_MIN_MBAR 10.0f
#define BARO_PRESSURE_MAX_MBAR 1200.0f
#define BARO_TEMP_MIN_C (-40.0f)
#define BARO_TEMP_MAX_C 85.0f
// A healthy MS5611 dithers by well under a mbar but never repeats a 24-bit
// reading bit-for-bit many times running. Identical pressure AND temperature
// this many polls in a row means the sensor stopped converting while still
// answering on the bus.
#define BARO_STALE_LIMIT 32