fix(esp32-IMU): Add MQTT/Serial toggle

This commit is contained in:
2025-10-31 21:07:52 +01:00
committed by Wessel T
parent 57a1dc4b7f
commit d26e428f99
4 changed files with 138 additions and 92 deletions

View File

@@ -1,7 +1,8 @@
menu "Example Configuration"
menu "ESP32 IMU Project Configuration"
orsource "$IDF_PATH/examples/common_components/env_caps/$IDF_TARGET/Kconfig.env_caps"
menu "I2C Master Configuration"
config I2C_MASTER_SCL
int "SCL GPIO Num"
range ENV_GPIO_RANGE_MIN ENV_GPIO_OUT_RANGE_MAX
@@ -21,22 +22,20 @@ menu "Example Configuration"
default 400000
help
I2C Speed of Master device.
endmenu
config WIFI_SSID
string "WiFi SSID"
default "YourNetworkName"
config ENV_MQTT_ENABLED
bool "Enable MQTT Communication"
default y
help
SSID of WiFi network to connect to.
config WIFI_PASSWORD
string "WiFi Password"
default "YourPassword"
help
Password of WiFi network to connect to.
Enable this option to use MQTT for communication.
If disabled, communication will use usb uart connection.
menu "MQTT Configuration"
depends on ENV_MQTT_ENABLED
config MQTT_BROKER_URI
string "MQTT Broker URI"
default "mqtt://192.168.178.26:1883"
default "mqtt://192.168.4.2:1883"
help
URI of the MQTT broker to connect to.
@@ -45,23 +44,43 @@ menu "Example Configuration"
default "esp32/imu"
help
MQTT topic to publish IMU data to.
endmenu
menu "WiFi Access Point Configuration"
depends on ENV_MQTT_ENABLED
config WIFI_AP_MODE
bool "Enable WiFi AP Mode"
default n
default y
help
Enable this option to start the device in Access Point mode.
If disabled, the device will start in Station mode.
config WIFI_SSID
string "WiFi SSID"
default "YourNetworkName"
depends on !WIFI_AP_MODE
help
SSID of WiFi network to connect to.
config WIFI_PASSWORD
string "WiFi Password"
default "YourPassword"
depends on !WIFI_AP_MODE
help
Password of WiFi network to connect to.
config WIFI_AP_SSID
string "WiFi AP SSID"
default "ESP32_IMU_AP"
depends on WIFI_AP_MODE
help
SSID of the WiFi Access Point when in AP mode.
config WIFI_AP_PASSWORD
string "WiFi AP Password"
default "esp32imuap"
depends on WIFI_AP_MODE
help
Password of the WiFi Access Point when in AP mode.
endmenu
endmenu

View File

@@ -2,8 +2,8 @@
#include <string.h>
// New: initialise WiFi in either STA or AP mode. Pass ap_mode=true to start an Access Point.
static void wifi_init(bool ap_mode)
#ifdef CONFIG_ENV_MQTT_ENABLED
static void wifi_init()
{
ESP_ERROR_CHECK(nvs_flash_init());
ESP_ERROR_CHECK(esp_netif_init());
@@ -12,7 +12,7 @@ static void wifi_init(bool ap_mode)
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
if (ap_mode) {
#ifdef CONFIG_WIFI_AP_MODE
esp_netif_create_default_wifi_ap();
wifi_config_t wifi_config = { 0 };
@@ -30,7 +30,7 @@ static void wifi_init(bool ap_mode)
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_AP, &wifi_config));
ESP_ERROR_CHECK(esp_wifi_start());
ESP_LOGI("WIFI", "AP started SSID:%s", CONFIG_WIFI_AP_SSID);
} else {
#else
esp_netif_create_default_wifi_sta();
wifi_config_t wifi_config = {
@@ -45,21 +45,8 @@ static void wifi_init(bool ap_mode)
ESP_ERROR_CHECK(esp_wifi_start());
ESP_ERROR_CHECK(esp_wifi_connect());
ESP_LOGI("WIFI", "STA started, connecting to: %s", CONFIG_WIFI_SSID);
}
}
static esp_err_t mpu6886_write_byte(mpu6886_t *dev, uint8_t reg, uint8_t data) {
uint8_t tx[2] = { reg, data };
return i2c_master_write_to_device(dev->i2c_port, dev->address, tx, sizeof(tx), pdMS_TO_TICKS(100));
}
static esp_err_t mpu6886_read_bytes(mpu6886_t *dev, uint8_t reg, uint8_t *data, size_t len) {
return i2c_master_write_read_device(dev->i2c_port, dev->address, &reg, 1, data, len, pdMS_TO_TICKS(100));
}
static int16_t bytes_to_int16(uint8_t high, uint8_t low) {
return (int16_t)((high << 8) | low);
#endif
}
static void mqtt_app_start(void)
@@ -75,8 +62,21 @@ static void mqtt_app_start(void)
}
esp_mqtt_client_start(s_mqtt_client);
}
#endif // CONFIG_ENV_MQTT_ENABLED
static esp_err_t mpu6886_write_byte(mpu6886_t* dev, uint8_t reg, uint8_t data) {
uint8_t tx[2] = { reg, data };
return i2c_master_write_to_device(dev->i2c_port, dev->address, tx, sizeof(tx), pdMS_TO_TICKS(100));
}
static esp_err_t mpu6886_read_bytes(mpu6886_t* dev, uint8_t reg, uint8_t* data, size_t len) {
return i2c_master_write_read_device(dev->i2c_port, dev->address, &reg, 1, data, len, pdMS_TO_TICKS(100));
}
static int16_t bytes_to_int16(uint8_t high, uint8_t low) {
return (int16_t)((high << 8) | low);
}
// new: detect accel/gyro full-scale selections and set divisors accordingly
static esp_err_t mpu6886_update_sensitivity(mpu6886_t* dev)
{
uint8_t aconf = 0, gconf = 0;
@@ -244,28 +244,24 @@ void app_main(void)
}
// Start WiFi: set CONFIG_WIFI_AP_MODE in sdkconfig to build in AP mode,
// otherwise the default is STA mode. You can also call wifi_init(true)
// or wifi_init(false) directly to toggle at runtime.
#ifdef CONFIG_WIFI_AP_MODE
wifi_init(true);
#else
wifi_init(false);
#ifdef CONFIG_ENV_MQTT_ENABLED
wifi_init();
// Start MQTT client (will retry until network is available)
mqtt_app_start();
#endif
mpu6886_t mpu;
mpu.i2c_port = I2C_NUM_0;
mpu.address = MPU6886_ADDR;
esp_err_t ret = mpu6886_init(&mpu, I2C_NUM_0);
if (ret != ESP_OK) {
// Handle initialization error
ESP_LOGE("MPU6886", "init failed");
return;
}
// Start MQTT client (will retry until network is available)
mqtt_app_start();
mpu6886_calibrate_gyro(&mpu, 100, 10);
mpu6886_calibrate_accel(&mpu, 100, 10);
@@ -276,17 +272,13 @@ void app_main(void)
mpu6886_read_accel(&mpu, &accel);
mpu6886_read_gyro(&mpu, &gyro);
mpu6886_read_temp(&mpu, &temp);
// ESP_LOGI("MPU6886", "Accel: X=%8.2f Y=%8.2f Z=%8.2f m/s² | Gyro: X=%8.2f Y=%8.2f Z=%8.2f rad/s | Temp: %8.2f °C",
// accel.x, accel.y, accel.z, gyro.x, gyro.y, gyro.z, temp);
// printf("aX=%8.2f aY=%8.2f aZ=%8.2f m/s² | gX=%8.2f gY=%8.2f gZ=%8.2f rad/s | Temp: %8.2f °C\n",
// accel.x, accel.y, accel.z, gyro.x, gyro.y, gyro.z, temp);
#ifndef CONFIG_ENV_MQTT_ENABLED
printf("{\"accel\":{\"x\":%8.3f,\"y\":%8.3f,\"z\":%8.3f},\"gyro\":{\"x\":%8.3f,\"y\":%8.3f,\"z\":%8.3f},\"Temp\":%8.2f}\n",
accel.x, accel.y, accel.z,
gyro.x, gyro.y, gyro.z,
temp);
// Publish readings as JSON over MQTT if client available
#else
if (s_mqtt_client != NULL) {
char payload[256];
int n = snprintf(payload, sizeof(payload),
@@ -301,6 +293,7 @@ void app_main(void)
ESP_LOGW("MQTT", "payload truncated or encoding error");
}
}
#endif
vTaskDelay(pdMS_TO_TICKS(500));
}
}

View File

@@ -433,21 +433,38 @@ CONFIG_PARTITION_TABLE_MD5=y
# end of Partition Table
#
# Example Configuration
# ESP32 IMU Project Configuration
#
CONFIG_ENV_GPIO_RANGE_MIN=0
CONFIG_ENV_GPIO_RANGE_MAX=39
CONFIG_ENV_GPIO_IN_RANGE_MAX=39
CONFIG_ENV_GPIO_OUT_RANGE_MAX=33
#
# I2C Master Configuration
#
CONFIG_I2C_MASTER_SCL=22
CONFIG_I2C_MASTER_SDA=21
CONFIG_I2C_MASTER_FREQUENCY=100000
# end of I2C Master Configuration
CONFIG_ENV_MQTT_ENABLED=y
#
# MQTT Configuration
#
CONFIG_MQTT_BROKER_URI="mqtt://192.168.4.2:1883"
CONFIG_MQTT_TOPIC="esp32/imu"
# end of MQTT Configuration
#
# WiFi Access Point Configuration
#
CONFIG_WIFI_AP_MODE=y
CONFIG_WIFI_AP_SSID="ESP32_IMU_AP"
CONFIG_WIFI_AP_PASSWORD="esp32imuap"
# end of Example Configuration
# end of WiFi Access Point Configuration
# end of ESP32 IMU Project Configuration
#
# Compiler options

View File

@@ -433,21 +433,38 @@ CONFIG_PARTITION_TABLE_MD5=y
# end of Partition Table
#
# Example Configuration
# ESP32 IMU Project Configuration
#
CONFIG_ENV_GPIO_RANGE_MIN=0
CONFIG_ENV_GPIO_RANGE_MAX=39
CONFIG_ENV_GPIO_IN_RANGE_MAX=39
CONFIG_ENV_GPIO_OUT_RANGE_MAX=33
#
# I2C Master Configuration
#
CONFIG_I2C_MASTER_SCL=22
CONFIG_I2C_MASTER_SDA=21
CONFIG_I2C_MASTER_FREQUENCY=100000
CONFIG_MQTT_BROKER_URI="mqtt://192.168.178.200:1883"
# end of I2C Master Configuration
CONFIG_ENV_MQTT_ENABLED=y
#
# MQTT Configuration
#
CONFIG_MQTT_BROKER_URI="mqtt://192.168.4.2:1883"
CONFIG_MQTT_TOPIC="esp32/imu"
# end of MQTT Configuration
#
# WiFi Access Point Configuration
#
CONFIG_WIFI_AP_MODE=y
CONFIG_WIFI_AP_SSID="ESP32_IMU_AP"
CONFIG_WIFI_AP_PASSWORD="esp32imuap"
# end of Example Configuration
# end of WiFi Access Point Configuration
# end of ESP32 IMU Project Configuration
#
# Compiler options