Buzzer integrated, pin assignment improvements

This commit is contained in:
2025-11-30 09:56:05 +01:00
parent 830d1b53c1
commit 736c0644f2
4 changed files with 126 additions and 110 deletions

1
.gitignore vendored
View File

@@ -1,2 +1,3 @@
*~
.pio
lib/generated

81
README
View File

@@ -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

View File

@@ -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

View File

@@ -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++;