From 736c0644f285cdb3503dde08a4033a4156e0ff02 Mon Sep 17 00:00:00 2001 From: Thomas Hooge Date: Sun, 30 Nov 2025 09:56:05 +0100 Subject: [PATCH] Buzzer integrated, pin assignment improvements --- .gitignore | 1 + README | 81 ++++++++++++++++++-------------------------- include/main.h | 63 ++++++++++++++++++++-------------- src/main.cpp | 91 ++++++++++++++++++++++++++++++-------------------- 4 files changed, 126 insertions(+), 110 deletions(-) diff --git a/.gitignore b/.gitignore index d7b64b8..dcd8017 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *~ .pio +lib/generated diff --git a/README b/README index 3009054..6d6130c 100644 --- a/README +++ b/README @@ -7,11 +7,22 @@ OBP Keypad - Konfiguration über Web-Interface - PWR leuchtet grün wen NMEA2000-Verbindung etabliert - PWR leuchtet rot wenn nur Stromversorgung aktiv ist +- Buzzer für Tastendruck-Feedback + passiv, damit können die Töne mit PWM programmiert werden +- I²C Temp/Hum-Sensor SHT31 -Optionen -- I²C Temp/Hum-Sensor -- Seatalk1 Anschluß für Fernbedienung Raymarine Pinnenpilot -- EPaper-Display 2.9" zur Anzeige der Tastenbelegung +Optionen für später +- Helligkeitssensor z.B. zum automatischen LED dimmen + Pins umbelegen: + I²C -> D0, D1 (GPIO 44, 43) + LEDs umsortieren: A0 bis A5 für die 6 LEDs + A6 als analoger Input für Sensor + A7 ist frei als Reserve +- Version 2 + - Seatalk1 Anschluß für Fernbedienung Raymarine Pinnenpilot +- Version X, immer als Option + - EPaper-Display 2.9" zur Anzeige der Tastenbelegung + bedeutet auch: viel komplizierteres Gehäuse Damit die LEDs nicht stören, kann umgeschaltet werden zwischen permanentem Leuchten und nur kurzem Aufblinken bei Betätigung. @@ -35,8 +46,10 @@ Anschlußmöglichkeiten für mechanische Taster 1x JST 2.54 XH 7 Pin Steckverbinder -> Tasten Masseverbindung über einzelnes getrenntes Kabel + in eine 8-fach WAGO-Klemme für LEDs + TBD Bemerkungen @@ -60,7 +73,7 @@ Das Mapping von Nano-Pin zu GPIO muß noch überprüft werden. Der nano kann in zwei verschiedenen Mapping-Modi betrieben werden! -Die Pins für i²C (A4, A5)und SPI (D11, D12, D13) sind absichtlich +Die Pins für SPI (D11, D12, D13) sind absichtlich nicht belegt um frei für Erweiterungen zu sein. An SPI kann ggf. ein Epaper angeschlossen werden. @@ -75,51 +88,22 @@ ggf. ein Epaper angeschlossen werden. 6 Y D7 GPIO10 Illumination DST Y D8 GPIO17 Destination, On/Off - LED Pin ------- ---------- - A A0 GPIO1 - B A1 GPIO2 - C A2 GPIO3 -(D A3 reserved for future) - RGBA A6 GPIO4 - RGBB A7 GPIO13 - RGBC B1 GPIO14 + LED Pin Remarks +------ ---------- ---------------------- + A A0 GPIO1 + B A1 GPIO2 + C A2 GPIO3 + RGB-R A3 GPIO4 + RGB-G A6 GPIO13 + RGB-B A7 GPIO14 - CAN Pin ------- ---------- - RX D9 - TX D10 + CAN Pin Remarks +------ ---------- ---------------------- + RX D9 GPIO18 + TX D10 GPIO21 - -Beschaltung MCU Pico !!! Nicht fertig / ungültig !!! --------------------- - -Stromversorgung über VSYS mit 5V. - - - Key Color Pin Remarks ------ ------- -------- -------------------- - 1 B GP11 - 2 B GP12 - 3 B GP13 - 4 B GP14 - 5 B GP15 - 6 Y GP16 Illumination - DST Y GP17 Destination, On/Off - - LED Pin ------- ---------- - A GP1 - B GP2 - C GP4 - RGBA GP5 - RGBB GP6 - RGBC GP7 - - CAN Pin ------- ---------- - RX GP9 - TX GP10 +BUZZER + TBD Bauteilliste ------------ @@ -132,6 +116,7 @@ Bauteilliste 1x RGB LED (gemeinsame Anode) 3x LED grün 1x SN65HVD230 CAN Transceiver + 1x Buzzer, passiv 1x Gehäuse 150x60x40 4x Befestigungsschraube M4 1x Kabelsatz diff --git a/include/main.h b/include/main.h index 651da0b..fb0ea2b 100644 --- a/include/main.h +++ b/include/main.h @@ -4,35 +4,48 @@ #define WIFI_CHANNEL 9 #define WIFI_MAX_STA 2 -// Keys -#define KEY_1 GPIO_NUM_5 // D2 -#define KEY_2 GPIO_NUM_6 // D3 -#define KEY_3 GPIO_NUM_7 // D4 -#define KEY_4 GPIO_NUM_8 // D5 -#define KEY_5 GPIO_NUM_9 // D6 -#define KEY_6 GPIO_NUM_10 // D7 -#define KEY_DST GPIO_NUM_17 - -// LEDS -#define LED_A GPIO_NUM_1 -#define LED_B GPIO_NUM_2 -#define LED_C GPIO_NUM_3 -#define LED_RGBA GPIO_NUM_4 -#define LED_RGBB GPIO_NUM_13 -#define LED_RGBC GPIO_NUM_14 -#define LED_USER GPIO_NUM_48 - -// CAN bus for NMEA2000 connection -#define CAN_RX GPIO_NUM_18 // D9 -#define CAN_TX GPIO_NUM_21 // D10 -#define CAN_RECOVERY_PERIOD 3000 - // NMEA2000 defaults #define N2K_DEFAULT_NODEID 124 +// Keys +#define KEY_1 GPIO_NUM_5 // D2 +#define KEY_2 GPIO_NUM_6 // D3 +#define KEY_3 GPIO_NUM_7 // D4 +#define KEY_4 GPIO_NUM_8 // D5 +#define KEY_5 GPIO_NUM_9 // D6 +#define KEY_6 GPIO_NUM_10 // D7 +#define KEY_DST GPIO_NUM_17 // D8 + +// Buzzer +#define BUZZER GPIO_NUM_0 // B1 +#define LEDC_CHANNEL 0 +#define LEDC_TIMER_8_BIT 8 +#define LEDC_BASE_FREQ 5000 + +// LEDS +#define LED_A GPIO_NUM_1 // A0 +#define LED_B GPIO_NUM_2 // A1 +#define LED_C GPIO_NUM_3 // A2 +#define RGBLED_R GPIO_NUM_4 // A3 red +#define RGBLED_G GPIO_NUM_13 // A6 green +#define RGBLED_B GPIO_NUM_14 // A7 blue +#define LED_USER GPIO_NUM_48 // internal red user led + +// CAN bus for NMEA2000 connection +#define CAN_RX GPIO_NUM_18 // D9 +#define CAN_TX GPIO_NUM_21 // D10 +#define CAN_RECOVERY_PERIOD 3000 + // I2C temp. sensor -#define I2C_SDA GPIO_NUM_11 // A4 -#define I2C_SCL GPIO_NUM_12 // A5 +#define I2C_SDA GPIO_NUM_11 // A4 +#define I2C_SCL GPIO_NUM_12 // A5 +#define I2C_SPEED 100000UL // 100kHz clock speed on I2C bus // I2C addresses #define SHT31_ADDRESS 0x44 + +// SPI display connector (optional) +#define SPI_MOSI GPIO_NUM_38 // D11 +#define SPI_MISO GPIO_NUM_47 // D12 +#define SPI_SCK GPIO_NUM_48 // D13 +#define SPI_CS GPIO_NUM_46 // B0 diff --git a/src/main.cpp b/src/main.cpp index fad07d8..aab48ca 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -59,9 +59,14 @@ bool rgb_r = false; bool rgb_g = false; bool rgb_b = false; -char destination = 'A'; // A | B | C +char destination = 'A'; // A | B | C +uint8_t led_brightness = 128; // analog pin: 0 .. 255 +uint8_t rgp_brightness = 128; + +uint buzzerpower = 50; // TBD make use of this SHT31 sht(SHT31_ADDRESS); +bool sht_available = false; int nodeid; // NMEA2000 id on bus Nmea2kTwai &NMEA2000=*(new Nmea2kTwai(CAN_TX, CAN_RX, CAN_RECOVERY_PERIOD)); @@ -110,8 +115,15 @@ void wifi_init_softap() } */ + void setup() { + Serial.begin(115200); + delay(500); + Serial.println("Starting..."); + + ESP_LOGI(TAG, "Test logging: %d", 100); + nodeid = N2K_DEFAULT_NODEID; Serial.print("N2K default node id="); Serial.println(nodeid); @@ -120,15 +132,7 @@ void setup() { nodeid = preferences.getInt("LastNodeId", N2K_DEFAULT_NODEID); preferences.end(); - /* - // Connect as client to existing network - WiFi.begin(ssid, password); - while (WiFi.status() != WL_CONNECTED) { - delay(1000); - Serial.println("Connecting to WiFi.."); - } - Serial.println(WiFi.localIP()); */ - + // Setup webserver WiFi.persistent(false); WiFi.mode(WIFI_MODE_AP); @@ -154,7 +158,7 @@ void setup() { } server.begin(); - + // NMEA2000 configuration NMEA2000.SetProductInformation("00000001", // Manufacturer's Model serial code 74, // Manufacturer's product code "OBPkeypad6/1", // Manufacturer's Model ID @@ -184,38 +188,51 @@ void setup() { delay(1000); digitalWrite(LED_USER, LOW); - // destination leds - pinMode(LED_A, OUTPUT); - digitalWrite(LED_A, HIGH); - pinMode(LED_B, OUTPUT); - digitalWrite(LED_B, LOW); - pinMode(LED_C, OUTPUT); - digitalWrite(LED_C, LOW); + // Buzzer + ledcSetup(LEDC_CHANNEL, LEDC_BASE_FREQ, LEDC_TIMER_8_BIT); + ledcAttachPin(BUZZER, LEDC_CHANNEL); + // Test tone while booting + if (ledcWriteTone(BUZZER, 4000) == 0) { + Serial.println("Error setting buzzer tone"); + } else { + delay(750); + ledcWriteTone(BUZZER, 0); // Buzzer off + } // Init onbard RGB LED // TODO - // enclosure rgb led (common anode) - pinMode(LED_RGBA, OUTPUT); - digitalWrite(LED_RGBA, HIGH); - pinMode(LED_RGBB, OUTPUT); - digitalWrite(LED_RGBB, HIGH); - pinMode(LED_RGBC, OUTPUT); - digitalWrite(LED_RGBC, HIGH); + // destination leds + pinMode(LED_A, OUTPUT); + pinMode(LED_B, OUTPUT); + pinMode(LED_C, OUTPUT); - Serial.begin(115200); - delay(500); - Serial.println("Starting..."); + //digitalWrite(LED_A, HIGH); + //digitalWrite(LED_B, LOW); + //digitalWrite(LED_C, LOW); + analogWrite(LED_A, led_brightness); + analogWrite(LED_B, 0); + analogWrite(LED_C, 0); + + // enclosure rgb led + pinMode(RGBLED_R, OUTPUT); + pinMode(RGBLED_G, OUTPUT); + pinMode(RGBLED_B, OUTPUT); + // common anode so we need high here to switch off! + digitalWrite(RGBLED_R, HIGH); + digitalWrite(RGBLED_G, HIGH); + digitalWrite(RGBLED_B, HIGH); // I²C Serial.print("SHT31_LIB_VERSION: "); Serial.println(SHT31_LIB_VERSION); Wire.begin(I2C_SDA, I2C_SCL); - Wire.setClock(100000); + Wire.setClock(I2C_SPEED); uint16_t stat = sht.readStatus(); - Serial.print(stat, HEX); // stat = ffff anscheinend Fehler // = 8010 läuft anscheinend + sht_available = (stat == 0x8010); + Serial.print(stat, HEX); Serial.println(); } @@ -229,10 +246,10 @@ void loop() { button = 1; if (rgb_r) { rgb_r = false; - digitalWrite(LED_RGBA, HIGH); + digitalWrite(RGBLED_R, HIGH); } else { rgb_r = true; - digitalWrite(LED_RGBA, LOW); + digitalWrite(RGBLED_R, LOW); } } if (digitalRead(KEY_2) == LOW) { @@ -240,10 +257,10 @@ void loop() { button += 2; if (rgb_g) { rgb_g = false; - digitalWrite(LED_RGBB, HIGH); + digitalWrite(RGBLED_G, HIGH); } else { rgb_g = true; - digitalWrite(LED_RGBB, LOW); + digitalWrite(RGBLED_G, LOW); } } if (digitalRead(KEY_3) == LOW) { @@ -251,10 +268,10 @@ void loop() { button += 4; if (rgb_b) { rgb_b = false; - digitalWrite(LED_RGBC, HIGH); + digitalWrite(RGBLED_B, HIGH); } else { rgb_b = true; - digitalWrite(LED_RGBC, LOW); + digitalWrite(RGBLED_B, LOW); } } @@ -315,7 +332,7 @@ void loop() { delay(200); } - // ---- PRINT NUMBER EVERY SECOND ---- + // development heartbeat if (millis() - lastPrint >= 1000) { lastPrint = millis(); counter++;