Add VoiceNotes firmware and CDM customer service SQL project

VoiceNotes is an Arduino sketch for the Waveshare ESP32-C6-LCD-0.85 that
records meetings and voice memos to microSD and turns them into notes:

- Records 16 kHz mono WAV (up to 4 h) from the ES7210 dual mics, with a
  boosted preamp and soft-limited digital gain
- Transcribes via an OpenAI-compatible speech-to-text API in ~10 min parts
  cut at quiet points, with retries and resume after failures
- Summarizes the transcript with Claude into meeting notes (decisions,
  action items, topics with timestamps), streamed to and from the card
- Copies the notes to Nextcloud over WebDAV
- Shows recording/processing state on the 0.85" LCD and the LED ring
- Works around the board's SD card failing multi-sector reads

Credentials live in VoiceNotes/secrets.h, which is git-ignored; see
secrets.example.h.

Also adds the Microsoft CDM customer service SQL implementation (DDL,
sample data, reporting queries and docs). Its README is renamed to
CDM_README.md so the repository README stays at the top level.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Ravi Reddy
2026-10-03 22:22:10 +05:30
co-authored by Claude Opus 5.5
parent ef38a502d8
commit 3b371cdb28
24 changed files with 8700 additions and 0 deletions
+73
View File
@@ -0,0 +1,73 @@
// Board pinout and app settings for the Waveshare ESP32-C6-LCD-0.85.
// Pins come from Waveshare's schematic and demo code:
// https://github.com/waveshareteam/ESP32-C6-LCD-0.85
#pragma once
// ---------- Buttons (active LOW, external pull-ups on the board) ----------
// The board has only two GPIO buttons. The PWR key drives the power switch IC
// and is not readable from firmware.
#define PIN_BTN_PLUS 18 // "PLUS" key -> Button 1: start recording
#define PIN_BTN_BOOT 9 // "BOOT" key -> Button 2: stop recording
// Button 3 (transcribe + summarize) defaults to a long-press of PLUS.
// If you wire an external push button (to GND), set its GPIO here and it
// will also act as Button 3 on a single click. -1 = not fitted.
#define PIN_BTN_EXTRA -1
#define BTN3_LONG_PRESS_MS 1000
// ---------- LCD: ST7735, 128x128, shares the SPI bus with the microSD ----------
#define PIN_SPI_SCK 1
#define PIN_SPI_MOSI 2
#define PIN_SPI_MISO 16
#define PIN_LCD_DC 3
#define PIN_LCD_CS 5
#define PIN_LCD_RST 4
#define PIN_LCD_BL 6
#define LCD_COL_OFFSET 2
#define LCD_ROW_OFFSET 3
// ---------- microSD ----------
#define PIN_SD_CS 17
#define SD_SPI_HZ 20000000
// ---------- LED ring: 8 x WS2812B ----------
#define PIN_LEDS 14
#define NUM_LEDS 8
#define LED_BRIGHTNESS 60 // 0-255; the ring is bright at close range
#define LED_COLOR_ORDER RGB // per Waveshare's demo; use GRB if red and green look swapped
// ---------- Audio: ES7210 mic ADC on I2C + I2S ----------
#define PIN_I2C_SDA 8
#define PIN_I2C_SCL 7
#define PIN_I2S_MCLK 19
#define PIN_I2S_BCLK 20
#define PIN_I2S_WS 22
#define PIN_I2S_DIN 21 // ES7210 SDOUT1 -> ESP32
#define PIN_PA_CTRL 15 // NS4150 speaker amp enable (kept off)
#define ES7210_ADDR 0x40
#define MIC_GAIN_STEP 14 // ES7210 PGA: 0..10 = 0..30 dB in 3 dB steps, 11..14 = 33/34.5/36/37.5 dB (max)
#define DIGITAL_GAIN_DB 6 // extra software gain after the preamp, with a soft limiter (0 = off)
#define SAMPLE_RATE 16000 // 16 kHz mono 16-bit = 32 KB/s, ideal for speech-to-text
// Longest recording (also limited by free space on the card). 4 h = ~460 MB.
#define MAX_RECORD_SECONDS (4 * 3600)
// Transcription APIs reject files over 25 MB (~13 min), so long recordings are
// sent in parts of about STT_SEGMENT_SECONDS each. Every cut is moved to the
// quietest moment in the CUT_SEARCH_SECONDS before it, so words aren't split.
#define MAX_UPLOAD_BYTES (25UL * 1024 * 1024)
#define STT_SEGMENT_SECONDS 600
#define CUT_SEARCH_SECONDS 15
#define STT_MAX_ATTEMPTS 3 // per part, before giving up (progress is kept for a later resume)
// ---------- Network ----------
// DNS servers used instead of the ones the router hands out ("" = keep the router's).
// Pinned because the board was once seen using 8.8.8.9, which doesn't answer DNS and
// added ~8 s to every connection.
#define DNS_PRIMARY "8.8.8.8"
#define DNS_SECONDARY "1.1.1.1"
// ---------- Storage layout ----------
#define DIR_RECORDINGS "/recordings"
#define DIR_NOTES "/notes"
#define LAST_REC_FILE "/recordings/last.txt"