ESP32-S3 BLE Issues
Posted: Wed Dec 27, 2023 3:53 am
Hi,
I got a custom made ESP32-S3 pcb. I tried my sketch wich is running on an ESP32-Wroom 32D Devboard. I can uoload it and got it running via USB with some modifications, but i can not make it advertice ble, even with using nimBLE.
What could be the reason?
Thank you
I got a custom made ESP32-S3 pcb. I tried my sketch wich is running on an ESP32-Wroom 32D Devboard. I can uoload it and got it running via USB with some modifications, but i can not make it advertice ble, even with using nimBLE.
What could be the reason?
Thank you
Code: Untitled.cpp Select all
//Changelog:
//made center doubleklick toggle between STF/Vario (toggle sending S/V)
// Reset XCREMOTE with 5sec X-Hold added
//New BLEKeyboard Library keeps BLE Advertising when disconnected
// uses libraries from
// https://github.com/r89m/PushButton
// https://github.com/r89m/Button
// https://github.com/thomasfredericks/Bounce2
#include <Button.h>
#include <ButtonEventCallback.h>
#include <PushButton.h>
#include <Bounce2.h>
#include <BluetoothSerial.h>
#include <BleKeyboard.h>
// Updating server
#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>
#include <Update.h>
#include "OneButton.h"
// Version
#define VERSION "2.3.2"
#define USE_NIMBLE
// Init BLE
BleKeyboard bleKeyboard("XCREMOTE", "XCNAV UG", 100);
// Pin Assignments
const int LED_Pin = 02;
const int Up_Pin = 15; // UP (Joystick Up)
const int Down_Pin = 26; // Down (Joystick Down)
const int Left_Pin = 25; // Left (Joystick Left)
const int Right_Pin = 27; // Right (Joystick Right)
const int Center_Pin = 17; // Enter (Joystick Press)
const int Rectangle_Pin = 18; // Rectangle (Button 2)
const int Triangle_Pin = 05; // Triangle (Button 3)
const int Circle_Pin = 33; // Circle (Button 4)
const int Cancel_Pin = 04; // X (Button 5)
// Button's keys
const char Up_Press_Key = KEY_UP_ARROW;
const char Down_Press_Key = KEY_DOWN_ARROW;
const char Left_Press_Key = KEY_LEFT_ARROW;
const char Right_Press_Key = KEY_RIGHT_ARROW;
const char Rectangle_Press_Key = KEY_F4;
const char Rectangle_Hold_Key = KEY_F3;
const char Triangle_Press_Key = KEY_F6;
const char Triangle_Hold_Key = KEY_F2;
const char Circle_Press_Key = 'M';
const char Circle_Hold_Key = KEY_F1;
const char Cancel_Press_Key = KEY_ESC;
const char Cancel_Hold_Key = 'T';
const int Joy_Rebounce_Interval = 3;
const int Joy_Rebounce_Threshold = 20;
const int Joy_Active_Threshold = 100;
const int Button_Hold_Threshold = 500;
const int Button_Rebounce_Interval = 500;
const int Reset_Threshold = 5000;
const int Joy_Hold_Threshold = 1;
// PushButton's instances
PushButton Up = PushButton(Up_Pin);
PushButton Down = PushButton(Down_Pin);
PushButton Left = PushButton(Left_Pin);
PushButton Right = PushButton(Right_Pin);
PushButton Center = PushButton(Center_Pin);
PushButton Rectangle = PushButton(Rectangle_Pin);
PushButton Triangle = PushButton(Triangle_Pin);
PushButton Circle = PushButton(Circle_Pin);
PushButton Cancel = PushButton(Cancel_Pin);
// Setup a new OneButton on pin PIN_INPUT
// The 2. parameter activeLOW is true, because external wiring sets the button to LOW when pressed.
OneButton button(Center_Pin, true);
// save the millis when a press has started.
unsigned long HoldCenterTime;
// Variables
int bt_first_connected = false;
boolean Joy_Inactive = true;
int Joy_Active_Counter = 0;
// Updating server
const char* host = "esp32";
const char* ssid = "XCREMOTE";
//const char* ssid = "xcremote";
const char* password = "xcremote";
boolean server_running = 0;
WebServer server(80);
// current Cruise_Climb (Joy Center) state, staring with LOW (0)
int Cruise_Climb = LOW;
void setup() {
pinMode(Up_Pin, INPUT_PULLUP);
pinMode(Down_Pin, INPUT_PULLUP);
pinMode(Left_Pin, INPUT_PULLUP);
pinMode(Right_Pin, INPUT_PULLUP);
pinMode(Center_Pin, INPUT_PULLUP);
pinMode(Rectangle_Pin, INPUT_PULLUP);
pinMode(Triangle_Pin, INPUT_PULLUP);
pinMode(Circle_Pin, INPUT_PULLUP);
pinMode(Cancel_Pin, INPUT_PULLUP);
Serial.begin(115200);
Serial.println("Version: " VERSION);
Serial.print("XCRemote MAC Address: ");
Serial.println(WiFi.macAddress());
// link the xxxclick functions to be called on xxxclick event.
button.attachClick(SingleClick);
button.attachDoubleClick(DoubleClick);
button.setPressTicks(1000); // that is the time when LongHoldCenter is called
button.attachLongPressStart(HoldCenter);
// pinMode(LED_Pin, OUTPUT);
if (digitalRead(Center_Pin) == 0) updating_server_start();
else {
Serial.println("Starting BLE work!");
bleKeyboard.begin();
Up.onRelease(Joy_onRelease);
Down.onRelease(Joy_onRelease);
Left.onRelease(Joy_onRelease);
Right.onRelease(Joy_onRelease);
Up.onHoldRepeat(Joy_Hold_Threshold, Joy_Rebounce_Interval, Joy_onHoldRepeat);
Down.onHoldRepeat(Joy_Hold_Threshold, Joy_Rebounce_Interval, Joy_onHoldRepeat);
Left.onHoldRepeat(Joy_Hold_Threshold, Joy_Rebounce_Interval, Joy_onHoldRepeat);
Right.onHoldRepeat(Joy_Hold_Threshold, Joy_Rebounce_Interval, Joy_onHoldRepeat);
Center.onRelease(0, Button_Hold_Threshold-1, Button_onRelease);
Rectangle.onRelease(0, Button_Hold_Threshold-1, Button_onRelease);
Triangle.onRelease(0, Button_Hold_Threshold-1, Button_onRelease);
Circle.onRelease(0, Button_Hold_Threshold-1, Button_onRelease);
Cancel.onRelease(0, Button_Hold_Threshold-1, Button_onRelease);
Center.onHold(Button_Hold_Threshold, Button_onHold);
Rectangle.onHold(Button_Hold_Threshold, Button_onHold);
Triangle.onHold(Button_Hold_Threshold, Button_onHold);
Circle.onHold(Button_Hold_Threshold, Button_onHold);
Cancel.onHoldRepeat(Button_Hold_Threshold, Button_Rebounce_Interval,Button_onHoldRepeat);
Joy_Active_Counter = 0;
}
}
void loop() {
// keep watching the push button:
button.tick();
if (server_running) {
server.handleClient();
delay(1);
}
else {
if(bleKeyboard.isConnected()) {
Serial.println("ok");
if (not bt_first_connected) {
bt_first_connected = true;
Serial.println("BT connected");
delay (2000);
bleKeyboard.print("C");
}
Up.update();
Down.update();
Left.update();
Right.update();
Center.update();
Rectangle.update();
Triangle.update();
Circle.update();
Cancel.update();
}
}
}
void keyboardPress(char key) {
bleKeyboard.press(key);
}
void Button_onRelease(Button& btn, uint16_t duration){
if (btn.is(Rectangle)) keyboardPress(Rectangle_Press_Key);
if (btn.is(Triangle)) keyboardPress(Triangle_Press_Key);
if (btn.is(Circle)) keyboardPress(Circle_Press_Key);
if (btn.is(Cancel)) keyboardPress(Cancel_Press_Key);
bleKeyboard.releaseAll();
}
void Button_onHold(Button& btn, uint16_t duration){
if (btn.is(Rectangle)) keyboardPress(Rectangle_Hold_Key);
if (btn.is(Triangle)) keyboardPress(Triangle_Hold_Key);
if (btn.is(Circle)) keyboardPress(Circle_Hold_Key);
bleKeyboard.releaseAll();
}
void Joy_onHoldRepeat(Button& btn, uint16_t duration, uint16_t repeat_count){
if(btn.isPressed() && Joy_Active_Counter == 5) {
if(btn.is(Up)) keyboardPress(Up_Press_Key);
if(btn.is(Down)) keyboardPress(Down_Press_Key);
if(btn.is(Left)) keyboardPress(Left_Press_Key);
if(btn.is(Right)) keyboardPress(Right_Press_Key);
bleKeyboard.releaseAll();
}
Joy_Active_Counter = Joy_Active_Counter +1;
if (Joy_Inactive && Joy_Active_Counter > Joy_Active_Threshold){
Joy_Active_Counter = 0;
Joy_Inactive = false;
}
if (!Joy_Inactive && Joy_Active_Counter > Joy_Rebounce_Threshold) Joy_Active_Counter = 0;
}
void Joy_onRelease(Button& btn, uint16_t duration){
Joy_Active_Counter = 0;
Joy_Inactive = true;
}
void SingleClick() { // this function will be called when the Joy center button is pressed 1 time only.
bleKeyboard.write(KEY_RETURN);
Serial.println("SingleClick() detected.");
} // SingleClick
void DoubleClick() { // this function will be called when the Joy center button was pressed 2 times in a short timeframe.
if(Cruise_Climb == LOW) {
bleKeyboard.print("V");
Serial.println("Vario");
}
else {
bleKeyboard.print("S");
Serial.println("Speed to fly");
}
Cruise_Climb = !Cruise_Climb; // reverse the Cruise_Climb
} // DoubleClick
void HoldCenter() { // this function will be called when the Joy center button is held down for 0.5 second or more.
bleKeyboard.print("P");
Serial.println("PAN()");
HoldCenterTime = millis() - 500; // as set in setPressTicks()
} // HoldCenter()
void Button_onHoldRepeat(Button& btn, uint16_t duration, uint16_t repeat_count){ // this function will be called when the Cancel button is held down for a longer time
if (btn.is(Cancel)) {
if (repeat_count == 1) {
keyboardPress(Cancel_Hold_Key);
bleKeyboard.releaseAll();
}
if (duration > 5000){
bleKeyboard.print("E");
delay(1000);
ESP.restart(); // ESP32_Restart
}
}
}