🪰 Adds angle, heading, altitude, pressure and temperature

This commit is contained in:
Rune Harlyk
2024-06-02 21:59:06 +02:00
committed by Rune Harlyk
parent f6ca10846f
commit c2d5195243
9 changed files with 1518 additions and 1517 deletions
+5 -14
View File
@@ -111,14 +111,6 @@
type: 'line', type: 'line',
data: { data: {
datasets: [ datasets: [
{
label: 'IMU temperature',
borderColor: daisyColor('--p'),
backgroundColor: daisyColor('--p', 50),
borderWidth: 2,
data: $imu.imu_temp,
yAxisID: 'y'
},
{ {
label: 'Barometer temperature', label: 'Barometer temperature',
borderColor: daisyColor('--s'), borderColor: daisyColor('--s'),
@@ -257,14 +249,13 @@
angleChart.options.scales!.y!.max = Math.max(Math.max(...$imu.x), Math.max(...$imu.y), Math.max(...$imu.z)) + 1; angleChart.options.scales!.y!.max = Math.max(Math.max(...$imu.x), Math.max(...$imu.y), Math.max(...$imu.z)) + 1;
angleChart.update('none'); angleChart.update('none');
tempChart.data.labels = $imu.imu_temp; tempChart.data.labels = $imu.bmp_temp;
tempChart.data.datasets[0].data = $imu.imu_temp; tempChart.data.datasets[0].data = $imu.bmp_temp;
tempChart.data.datasets[1].data = $imu.bmp_temp; tempChart.options.scales!.y!.min = Math.min(...$imu.bmp_temp) - 1;
tempChart.options.scales!.y!.min = Math.min(Math.min(...$imu.imu_temp), Math.min(...$imu.bmp_temp)) - 1; tempChart.options.scales!.y!.max = Math.max(...$imu.bmp_temp) + 1;
tempChart.options.scales!.y!.max = Math.max(Math.max(...$imu.imu_temp), Math.max(...$imu.bmp_temp)) + 1;
tempChart.update('none'); tempChart.update('none');
altitudeChart.data.labels = $imu.imu_temp; altitudeChart.data.labels = $imu.altitude;
altitudeChart.data.datasets[0].data = $imu.altitude; altitudeChart.data.datasets[0].data = $imu.altitude;
altitudeChart.options.scales!.y!.min = Math.min(Math.min(...$imu.altitude)) - 1; altitudeChart.options.scales!.y!.min = Math.min(Math.min(...$imu.altitude)) - 1;
altitudeChart.options.scales!.y!.max = Math.max(Math.max(...$imu.altitude)) + 1; altitudeChart.options.scales!.y!.max = Math.max(Math.max(...$imu.altitude)) + 1;
+1
View File
@@ -12,3 +12,4 @@ build_flags =
-D FT_MAG=1 -D FT_MAG=1
-D FT_BMP=1 -D FT_BMP=1
-D FT_GPS=1 -D FT_GPS=1
@@ -161,7 +161,7 @@ Adafruit_HMC5883_Unified::Adafruit_HMC5883_Unified(int32_t sensorID) {
/**************************************************************************/ /**************************************************************************/
bool Adafruit_HMC5883_Unified::begin() { bool Adafruit_HMC5883_Unified::begin() {
// Enable I2C // Enable I2C
Wire.begin(); // Wire.begin();
// Enable the magnetometer // Enable the magnetometer
write8(HMC5883_ADDRESS_MAG, HMC5883_REGISTER_MAG_MR_REG_M, 0x00); write8(HMC5883_ADDRESS_MAG, HMC5883_REGISTER_MAG_MR_REG_M, 0x00);
+4 -2
View File
@@ -66,7 +66,9 @@ ESP32SvelteKit::ESP32SvelteKit(PsychicHttpServer *server,
_fileExplorer(server, &_securitySettingsService), _fileExplorer(server, &_securitySettingsService),
_motionService(_server, &_socket, &_securitySettingsService,&_taskManager), _motionService(_server, &_socket, &_securitySettingsService,&_taskManager),
_deviceConfiguration(server, &ESPFS, &_securitySettingsService, &_socket), _deviceConfiguration(server, &ESPFS, &_securitySettingsService, &_socket),
#if FT_ENABLED(FT_IMU) || FT_ENABLED(FT_MAG) || FT_ENABLED(FT_BMP)
_imuService(&_socket) _imuService(&_socket)
#endif
{ {
} }
@@ -208,7 +210,7 @@ void ESP32SvelteKit::startServices() {
_cameraSettingsService.begin(); _cameraSettingsService.begin();
#endif #endif
_deviceConfiguration.begin(); _deviceConfiguration.begin();
#if FT_ENABLED(FT_IMU) #if FT_ENABLED(FT_IMU) || FT_ENABLED(FT_MAG) || FT_ENABLED(FT_BMP)
_imuService.begin(); _imuService.begin();
#endif #endif
} }
@@ -223,7 +225,7 @@ void IRAM_ATTR ESP32SvelteKit::_loop() {
#if FT_ENABLED(FT_ANALYTICS) #if FT_ENABLED(FT_ANALYTICS)
_analyticsService.loop(); _analyticsService.loop();
#endif #endif
#if FT_ENABLED(FT_IMU) #if FT_ENABLED(FT_IMU) || FT_ENABLED(FT_MAG) || FT_ENABLED(FT_BMP)
_imuService.loop(); _imuService.loop();
#endif #endif
_motionService.loop(); _motionService.loop();
+2 -2
View File
@@ -186,7 +186,7 @@ public:
return &_deviceConfiguration; return &_deviceConfiguration;
} }
#if FT_ENABLED(FT_IMU) #if FT_ENABLED(FT_IMU) || FT_ENABLED(FT_MAG) || FT_ENABLED(FT_BMP)
IMUService *getIMUService() IMUService *getIMUService()
{ {
return &_imuService; return &_imuService;
@@ -255,7 +255,7 @@ private:
CameraSettingsService _cameraSettingsService; CameraSettingsService _cameraSettingsService;
#endif #endif
DeviceConfigurationService _deviceConfiguration; DeviceConfigurationService _deviceConfiguration;
#if FT_ENABLED(FT_IMU) #if FT_ENABLED(FT_IMU) || FT_ENABLED(FT_MAG) || FT_ENABLED(FT_BMP)
IMUService _imuService; IMUService _imuService;
#endif #endif
+1 -1
View File
@@ -67,7 +67,7 @@
#define FT_IMU 1 #define FT_IMU 1
#endif #endif
// ESP32 magnetometer off by default // ESP32 magnetometer on by default
#ifndef FT_MAG #ifndef FT_MAG
#define FT_MAG 0 #define FT_MAG 0
#endif #endif
+40 -28
View File
@@ -1,6 +1,6 @@
#pragma once #pragma once
#include <MPU6050_light.h> #include "MPU6050_6Axis_MotionApps612.h"
#include <Adafruit_Sensor.h> #include <Adafruit_Sensor.h>
#include <Adafruit_BMP085_U.h> #include <Adafruit_BMP085_U.h>
#include <Adafruit_HMC5883_U.h> #include <Adafruit_HMC5883_U.h>
@@ -16,9 +16,6 @@ class IMUService
public: public:
IMUService(EventSocket *socket) IMUService(EventSocket *socket)
: :
#if FT_ENABLED(FT_IMU)
_imu(Wire),
#endif
#if FT_ENABLED(FT_MAG) #if FT_ENABLED(FT_MAG)
_mag(12345), _mag(12345),
#endif #endif
@@ -32,12 +29,16 @@ public:
{ {
_socket->registerEvent(EVENT_IMU); _socket->registerEvent(EVENT_IMU);
#if FT_ENABLED(FT_IMU) #if FT_ENABLED(FT_IMU)
byte status = _imu.begin(); _imu.initialize();
imu_success = status == 0; imu_success = _imu.testConnection();
if(status != 0) { devStatus = _imu.dmpInitialize();
ESP_LOGE("IMUService", "MPU initialize failed: %d", status); if(!imu_success) {
ESP_LOGE("IMUService", "MPU initialize failed");
} }
calibrate(); _imu.setDMPEnabled(true);
_imu.setI2CMasterModeEnabled(false);
_imu.setI2CBypassEnabled(true);
_imu.setSleepEnabled(false);
#endif #endif
#if FT_ENABLED(FT_MAG) #if FT_ENABLED(FT_MAG)
mag_success = _mag.begin(); mag_success = _mag.begin();
@@ -59,25 +60,27 @@ public:
} }
float getTemp() { float getTemp() {
return imu_success ? _imu.getTemp() : -1; return imu_success ? imu_temperature : -1;
} }
float getAngleX() { float getAngleX() {
return imu_success ? _imu.getAngleX() : -1; return imu_success ? ypr[0] * 180/M_PI : -1;
} }
float getAngleY() { float getAngleY() {
return imu_success ? _imu.getAngleY() : -1; return imu_success ? ypr[1] * 180/M_PI : -1;
} }
float getAngleZ() { float getAngleZ() {
return imu_success ? _imu.getGyroZ() : -1; return imu_success ? ypr[2] * 180/M_PI : -1;
} }
void calibrate() { bool readIMU() {
if (imu_success) { bool updated = imu_success && _imu.dmpGetCurrentFIFOPacket(fifoBuffer);
_imu.calcOffsets(true, true); _imu.dmpGetQuaternion(&q, fifoBuffer);
} _imu.dmpGetGravity(&gravity, &q);
_imu.dmpGetYawPitchRoll(ypr, &q, &gravity);
return updated;
} }
#endif #endif
@@ -139,26 +142,29 @@ protected:
void updateImu() { void updateImu() {
doc.clear(); doc.clear();
bool newData = false;
#if FT_ENABLED(FT_IMU) #if FT_ENABLED(FT_IMU)
if (imu_success){ newData = imu_success && readIMU();
_imu.update(); if (imu_success) {
doc["x"] = round2(getAngleX()); doc["x"] = round2(getAngleX());
doc["y"] = round2(getAngleY()); doc["y"] = round2(getAngleY());
doc["z"] = round2(getAngleZ()); doc["z"] = round2(getAngleZ());
doc["imu_temp"] = round2(getTemp()); // doc["imu_temp"] = round2(getTemp());
} }
#endif #endif
#if FT_ENABLED(FT_MAG) #if FT_ENABLED(FT_MAG)
if (mag_success) { newData = newData || mag_success;
doc["heading"] = round2(getHeading()); if (mag_success) {
} doc["heading"] = round2(getHeading());
}
#endif #endif
#if FT_ENABLED(FT_BMP) #if FT_ENABLED(FT_BMP)
if (bmp_success) { newData = newData || bmp_success;
doc["pressure"] = round2(getPressure()); if (bmp_success) {
doc["altitude"] = round2(getAltitude()); doc["pressure"] = round2(getPressure());
doc["bmp_temp"] = round2(getTemperature()); doc["altitude"] = round2(getAltitude());
} doc["bmp_temp"] = round2(getTemperature());
}
#endif #endif
serializeJson(doc, message); serializeJson(doc, message);
_socket->emit(EVENT_IMU, message); _socket->emit(EVENT_IMU, message);
@@ -168,6 +174,12 @@ private:
#if FT_ENABLED(FT_IMU) #if FT_ENABLED(FT_IMU)
MPU6050 _imu; MPU6050 _imu;
bool imu_success {false}; bool imu_success {false};
uint8_t devStatus {false};
Quaternion q;
uint8_t fifoBuffer[64];
VectorFloat gravity;
float ypr[3];
float imu_temperature {-1};
#endif #endif
#if FT_ENABLED(FT_MAG) #if FT_ENABLED(FT_MAG)
Adafruit_HMC5883_Unified _mag; Adafruit_HMC5883_Unified _mag;
File diff suppressed because it is too large Load Diff
+1 -4
View File
@@ -39,15 +39,12 @@ lib_deps =
ArduinoJson@>=7.0.0 ArduinoJson@>=7.0.0
https://github.com/theelims/PsychicMqttClient.git#0.1.1 https://github.com/theelims/PsychicMqttClient.git#0.1.1
teckel12/NewPing@^1.9.7 teckel12/NewPing@^1.9.7
rfetick/MPU6050_light@^1.1.0 jrowberg/I2Cdevlib-MPU6050@^1.0.0
adafruit/Adafruit SSD1306@^2.5.7 adafruit/Adafruit SSD1306@^2.5.7
adafruit/Adafruit GFX Library@^1.11.5 adafruit/Adafruit GFX Library@^1.11.5
adafruit/Adafruit BusIO@^1.9.3 adafruit/Adafruit BusIO@^1.9.3
adafruit/Adafruit PWM Servo Driver Library@^2.4.1 adafruit/Adafruit PWM Servo Driver Library@^2.4.1
SPI SPI
; thomasfredericks/Bounce2@ ^2.7.0
; adafruit/Adafruit ADS1X15@^2.4.0
; plageoj/UrlEncode@ ^1.0.1
extra_scripts = extra_scripts =
pre:scripts/pre_build.py pre:scripts/pre_build.py
pre:scripts/build_app.py pre:scripts/build_app.py