Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: MPU9250_SPI
Fork of WearableDevice_Nucleo by
Revision 29:ab809198c1ba, committed 2018-02-16
- Comitter:
- Muglug
- Date:
- Fri Feb 16 18:30:19 2018 +0000
- Parent:
- 28:c7e977a19564
- Commit message:
- Final Version
Changed in this revision
--- a/configuration.h Tue Dec 19 10:15:19 2017 +0000
+++ b/configuration.h Fri Feb 16 18:30:19 2018 +0000
@@ -13,7 +13,6 @@
#define CONFIGURATION_H_
// Microcontroller definition - Comment the Version not used
-// #define STM32F401RET6 1
#define STM32F446RET6 1
// Debug mode
@@ -22,44 +21,37 @@
//-----------------------------------------------------------------
// PIN Defines
-#ifdef STM32F401RET6
- #define RADIO_TX PA_11
- #define RADIO_RX PA_12
- #define RADIO_RESET NC
-
- #define SD_CLK PC_10
- #define SD_MISO PC_11
- #define SD_MOSI PC_12
- #define SD_CS PD_2
-
- //Analog Input
- AnalogIn micro(A0);
- //Digital Input
- DigitalOut led1(LED1);
-#endif
-
#ifdef STM32F446RET6
+ // Wifi SSID & Password
#define WiFi_SSID "OnePlus3"
#define WiFi_Pass "mahandi00"
+ // ESP8266 Communication Variables
#define ESP_TX PC_6
#define ESP_RX PC_7
-
- // #define SD_CLK PC_10
- // #define SD_MISO PC_11
- // #define SD_MOSI PC_12
- // #define SD_CS PD_2
- // #define SD_CD PC_0
+ // IMU Variables
#define IMU_SCK PB_13
#define IMU_MISO PB_14 // SDO - Serial Data Output - MISO
#define IMU_MOSI PB_15 // SDI - Serial Data Input - MOSI
#define IMU_CS PB_1
+ // Buzzer PWM Output
+ PwmOut Buzzer(PB_4);
+
+ // Voltage & Current Sensor
+ AnalogIn VSense(PA_5);
+ AnalogIn ISense(PA_6);
+
//Analog Input
- AnalogIn micro(PC_4);
- //Digital Input
- DigitalOut led1(LED1);
+ AnalogIn Micro_1(PC_4);
+ AnalogIn Micro_2(PC_0);
+
+ //Digital Output
+ DigitalOut LED_Blue1(PC_10);
+ DigitalOut LED_Blue2(PC_11);
+ DigitalOut LED_Red1(PC_12);
+ DigitalOut LED_Red2(PD_2);
#endif
#endif // CONFIGURATION_H_
--- a/esp8266-driver.lib Tue Dec 19 10:15:19 2017 +0000 +++ b/esp8266-driver.lib Fri Feb 16 18:30:19 2018 +0000 @@ -1,1 +1,1 @@ -https://github.com/armmbed/esp8266-driver/#a7245780485c4743f4905dfeacf01749fa398617 +https://github.com/armmbed/esp8266-driver/#b93fee9e6cb1659b074ae2283d52dd623cbb4e56
--- a/event.cpp Tue Dec 19 10:15:19 2017 +0000
+++ b/event.cpp Fri Feb 16 18:30:19 2018 +0000
@@ -12,25 +12,52 @@
//-----------------------------------------------------------------
// Includes
#include "event.h"
+
+//-----------------------------------------------------------------
+
+//-----------------------------------------------------------------
+void ReadBattery(void)
+{
+ Battery_Status = VSense.read()/0.21 - 3; // Read Voltage Level above Critial Value (> 3V)
+ Power_Consumption = ISense.read() * 3.3; // Read Current Level and calculate Power_Consumption
+ PC.printf("Battery_Status = %.3fV - %.3fmW\n", Battery_Status + 3, Power_Consumption); // Show Total Voltage Level
+
+ if (Battery_Status > 1) { // More than 1V Voltage Difference
+ LED_Red1 = 0; // Turn ON both Red LEDs
+ LED_Red2 = 0;
+ } else if ((Battery_Status > 0.25) && (Battery_Status < 1)) { // Between 0.25V and 1V Voltage Difference
+ LED_Red1 = 0; // Turn ON one Red LEDs
+ LED_Red2 = 1;
+ } else {
+ LED_Red1 = 1; // Turn off both Red LEDs
+ LED_Red2 = 1;
+ }
+}
//-----------------------------------------------------------------
//-----------------------------------------------------------------
void ReceiveCommand(void)
{
- if (Socket_TCP.recv(Data_Buffer, sizeof Data_Buffer) > 0) {
- PC.printf("Socket Data Received! - %s\n", Data_Buffer);
+ response = Socket_TCP.connect("192.168.43.96", 8080); // Connect to TCP Server at 192.168.43.96/8080
- if (strlen(Data_Buffer) == 9) { // Check Package Length (correct: len = 9)
- if ((Data_Buffer[0] == '#') && (Data_Buffer[6] == ',')) { // Check for "#" and "," at specific Positions
- if (strstr(Data_Buffer, DeviceNr) != NULL) { // Check for valid DeviceNr in Package
- Time_Buffer[0] = Data_Buffer[7];
- Time_Buffer[1] = Data_Buffer[8];
- Requested_Time = atoi(Time_Buffer); // Requested Time by received Package
-
- CheckCommandDone_Flag = 1;
- PC.printf("Requested Time: %d\n", Requested_Time);
- memset(Data_Buffer, 0, sizeof(Data_Buffer)); // Clear Data_Buffer
- Ticker_ReceiveCommand.detach();
+ if (0 == response) { // Server Available & Connection Successful
+ if (Socket_TCP.recv(Data_Buffer, sizeof Data_Buffer) > 0) { // TCP Socket Data Available
+ if (strlen(Data_Buffer) == 9) { // Check Package Length (correct: len = 9)
+ if ((Data_Buffer[0] == '#') && (Data_Buffer[6] == ',')) { // Check for "#" and "," at specific Positions
+ if (strstr(Data_Buffer, DeviceNr) != NULL) { // Check for valid DeviceNr in Package
+ Ticker_ReadBattery.detach(); // Stop "ReadBattery" Thread
+ Ticker_ReceiveCommand.detach(); // Stop "ReceiveCommand" Thread
+
+ Time_Buffer[0] = Data_Buffer[7]; // Read 1st Time Byte from Buffer
+ Time_Buffer[1] = Data_Buffer[8]; // Read 2nd Time Byte from Buffer
+ Requested_Time = atoi(Time_Buffer); // Requested Time by Command
+
+ PC.printf("\nCommand Received - Requested Time: %d\n", Requested_Time);
+ Buzzer = 0.5; // Enable Buzzer at 50% DutyCycle
+ wait(0.5); // Pause for Buzzing
+ Buzzer = 0; // Disable Buzzer
+ CheckCommandDone_Flag = 1; // Set Flag for Measurement Start
+ }
}
}
}
@@ -44,21 +71,20 @@
Time_Data = TimeStamp.read_ms(); // Read TimeStamp Data
if (Time_Data <= Requested_Time * 1000) { // Check Time Elapsed
- imu.read_acc();
+ imu.read_acc(); // Read Accelerometer Data
- Data_Storage_MIC[writePointer_MIC++] = micro.read_u16(); // Store Microphone Data
- Data_Storage[writePointer++] = imu.accelerometer_data[2]; // Store Z-Axis Accelerometer Data
- Data_Storage[writePointer++] = imu.accelerometer_data[1]; // Store Y-Axis Accelerometer Data
- Data_Storage[writePointer++] = imu.accelerometer_data[0]; // Store X-Axis Accelerometer Data
- Data_Storage[writePointer++] = Time_Data; // Store Time Data
+ Data_Storage_MIC[writePointer_MIC++] = Micro_1.read_u16(); // Store Microphone Data
+ Data_Storage[writePointer++] = imu.accelerometer_data[2]; // Store Z-Axis Accelerometer Data
+ Data_Storage[writePointer++] = imu.accelerometer_data[1]; // Store Y-Axis Accelerometer Data
+ Data_Storage[writePointer++] = imu.accelerometer_data[0]; // Store X-Axis Accelerometer Data
+ Data_Storage[writePointer++] = Time_Data; // Store Time Data
} else {
- Ticker_IMU.detach(); // Detach Timer to Stop "ReadIMU"
+ Ticker_IMU.detach(); // Stop "ReadIMU" Thread
TimeStamp.stop(); // Stop TimeStamp
TimeStamp.reset(); // Reset TimeStamp
- TimeStamp.start();
- ReadIMUDone_Flag = 1;
- PC.printf("Measurement Done!\n");
+ TimeStamp.start(); // Start TimeStamp
+ ReadIMUDone_Flag = 1; // Set Flag for Sending Start
}
}
//-----------------------------------------------------------------
--- a/event.h Tue Dec 19 10:15:19 2017 +0000 +++ b/event.h Fri Feb 16 18:30:19 2018 +0000 @@ -17,24 +17,43 @@ //----------------------------------------------------------------- #ifndef EVENT_H_ #define EVENT_H_ -#define BufferSize 40000 -#define BufferSize_MIC 10000 -#define SampleRate 1000 // Define Sample Rate in Hz +#define BufferSize 20000 +#define BufferSize_MIC 5000 +#define SampleRate 500 // Define Sample Rate in Hz // Declarations -extern TCPSocket Socket_TCP; +extern Serial PC; extern Timer TimeStamp; extern mpu9250_spi imu; -extern AnalogIn micro; -extern Serial PC; +extern TCPSocket Socket_TCP; +extern nsapi_error_t response; + +// Battery Voltage & Power Consumption Declaration +extern float Battery_Status; +extern float Power_Consumption; -// Read & Writepointers +// Analog Microphone/Current/Voltage Inputs +extern AnalogIn VSense; +extern AnalogIn ISense; +extern AnalogIn Micro_1; +extern AnalogIn Micro_2; + +// Buzzer PWM Output +extern PwmOut Buzzer; + +// Digital LED Outputs +extern DigitalOut LED_Blue1; +extern DigitalOut LED_Blue2; +extern DigitalOut LED_Red1; +extern DigitalOut LED_Red2; + +// Writepointers extern volatile uint16_t writePointer; extern volatile uint16_t writePointer_MIC; // Data Storage Buffers extern char Time_Buffer[2]; -extern char Data_Buffer[2048]; +extern char Data_Buffer[1024]; extern const char DeviceNr[6]; extern int16_t Data_Storage[BufferSize]; extern uint16_t Data_Storage_MIC[BufferSize_MIC]; @@ -47,14 +66,22 @@ extern uint16_t Time_Data; extern uint8_t Requested_Time; -// Ticker Declaration +// EventQueue Declaration +extern EventQueue queue; + +// Thread Declaration extern Thread Thread_IMU; -extern EventQueue queue; +extern Thread Thread_ReadBattery; +extern Thread Thread_ReceiveCommand; + +// Ticker Declaration extern Ticker Ticker_IMU; +extern Ticker Ticker_ReadBattery; extern Ticker Ticker_ReceiveCommand; // Function Declarations void ReadIMU(void); +void ReadBattery(void); void ReceiveCommand(void); #endif // EVENT_H_
--- a/main.cpp Tue Dec 19 10:15:19 2017 +0000
+++ b/main.cpp Fri Feb 16 18:30:19 2018 +0000
@@ -28,47 +28,60 @@
//-----------------------------------------------------------------
//-----------------------------------------------------------------
-// Declarations
-Timer Testing;
-Timer TimeStamp; // Timer µS time-stamp
-Serial PC(USBTX, USBRX); // Create an Serial PC Object - USBTX, USBRX
+// General Declarations
+Timer TimeStamp; // Timer µS time-stamp
+Serial PC(USBTX, USBRX); // Create an Serial PC Object - USBTX, USBRX
-SPI spi(IMU_MOSI, IMU_MISO,IMU_SCK); // Create an SPI Object for MPU9250 - MOSI, MISO, SCK
+// IMU-SPI Declaration
+SPI spi(IMU_MOSI, IMU_MISO,IMU_SCK); // Create an SPI Object for MPU9250 - MOSI, MISO, SCK
mpu9250_spi imu(spi, IMU_CS); // Create an MPU9250 Object - SPI Object, CS
+// WiFi & TCP Socket Declaration
ESP8266Interface WiFi(ESP_TX, ESP_RX); // ESP8266 WiFi Interface
TCPSocket Socket_TCP; // TCP Socket
+nsapi_error_t response; // TCP Socket Response
-// Events
+// EventQueue Declarations
EventQueue queue(32 * EVENTS_EVENT_SIZE); // Event Setup
-// Tickers
+// Ticker Declarations
Ticker Ticker_IMU;
+Ticker Ticker_ReadBattery;
Ticker Ticker_ReceiveCommand;
-// Threads
+// Thread Declarations
Thread Thread_IMU(osPriorityRealtime);
-Thread Thread_ReceiveCommand(osPriorityNormal);
+Thread Thread_ReadBattery(osPriorityRealtime);
+Thread Thread_ReceiveCommand(osPriorityRealtime);
// Global Variables
-uint32_t len = 0;
-uint16_t Time_Data = 0;
+uint16_t LineCount = 0;
+uint32_t Line_Size = 0;
uint32_t Data_Size = 0;
-uint16_t LineCount = 0;
+
+// Read & Writepointer Declarations
+uint8_t Current_Position = 0;
volatile uint16_t readPointer = 0;
volatile uint16_t readPointer_MIC = 0;
volatile uint16_t writePointer = 0;
volatile uint16_t writePointer_MIC = 0;
+// Flag Declarations
uint8_t ReadIMUDone_Flag = 0;
uint8_t CheckCommandDone_Flag = 0;
+// Battery Voltage & Power Consumption Declaration
+float Battery_Status = 0;
+float Power_Consumption = 0;
+
+// Time Buffer Declaration
+char Time_Buffer[2];
+uint16_t Time_Data = 0;
uint8_t Requested_Time = 0;
-uint8_t Current_Position = 0;
-
-char Time_Buffer[2];
-char Data_Buffer[2048];
-const char DeviceNr[6] = "DEV01";
+
+// Data Storage Declaration
+char Data_Buffer[1024];
+const char DeviceNr[6] = "DEV01"; // Device specific ID
int16_t Data_Storage[BufferSize]; // BufferSize defined in "event.h"
uint16_t Data_Storage_MIC[BufferSize_MIC]; // BufferSize_MIC defined in "event.h"
@@ -77,40 +90,47 @@
//-----------------------------------------------------------------
void Setup()
{
+ LED_Blue1 = 1; // Turn OFF all LEDs
+ LED_Blue2 = 1;
+ LED_Red1 = 1;
+ LED_Red2 = 1;
+
PC.baud(230400); // Initialize PC Serial Connection
PC.printf("\r\n------------- Booting! -------------\r\n");
- PC.printf("CPU SystemCoreClock is %d Hz", SystemCoreClock);
+ PC.printf("CPU SystemCoreClock is %d Hz", SystemCoreClock); // Show SystemCoreClock Speed
PC.printf("\nConnecting to %s with %s...\n", WiFi_SSID, WiFi_Pass);
- int ret = WiFi.connect(WiFi_SSID, WiFi_Pass, NSAPI_SECURITY_WPA_WPA2);
- if (ret != 0) {
- printf("\nConnection error\n");
+ int ret = WiFi.connect(WiFi_SSID, WiFi_Pass, NSAPI_SECURITY_WPA_WPA2); // Connect WiFi
+
+ while (ret != 0) { // WiFi Connection Not Successful
+ PC.printf("\nConnecting to %s with %s...\n", WiFi_SSID, WiFi_Pass);
+ ret = WiFi.connect(WiFi_SSID, WiFi_Pass, NSAPI_SECURITY_WPA_WPA2);
+ wait(0.5);
}
- nsapi_error_t response;
- Socket_TCP.open(&WiFi);
- Socket_TCP.set_blocking(false);
- wait(0.5);
+ printf("Connection Done! - IP: %s\r\n", WiFi.get_ip_address()); // Show IP Address
+ Socket_TCP.open(&WiFi); // Open TCP_Socket on WiFi
+ Socket_TCP.set_blocking(false); // Set Non-Blocking Mode
- response = Socket_TCP.connect("192.168.43.96", 8080);
- while (0 != response) {
- wait(0.5);
- response = Socket_TCP.connect("192.168.43.96", 8080);
- }
-
-
- // Initialize IMU SPI Connection
+ // Initialize IMU-SPI Connection
if(imu.init(1, BITS_DLPF_CFG_188HZ)) // Initialize the MPU9250
PC.printf("\nCouldn't initialize MPU9250 via SPI!");
PC.printf("\nWHOAMI = 0x%2x", imu.whoami()); // Output I2C Address to check SPI (correct: 104 - 0x68)
PC.printf("\nAcc_Scale = %u\n", imu.set_acc_scale(BITS_FS_16G)); // Set Full Range for Acc.
imu.calib_acc(); // Calibrate Acceleration Sensor
- TimeStamp.reset(); // Reset Timer TimeStamp
+ ReadBattery(); // Read Battery Level
+ TimeStamp.reset(); // Reset Timer TimeStamp
Thread_ReceiveCommand.start(callback(&queue, &EventQueue::dispatch_forever)); // Start Command-Receiving Thread
- Ticker_ReceiveCommand.attach(queue.event(&ReceiveCommand), 0.250); // Attach 250 ms Ticker to "ReceiveCommand"
+ Ticker_ReceiveCommand.attach(queue.event(&ReceiveCommand), 0.500); // Attach 500ms Ticker to "ReceiveCommand"
- led1 = 1; // Turn ON LED to display 'Ready!'
+ Thread_ReadBattery.start(callback(&queue, &EventQueue::dispatch_forever)); // Start Battery-Reading Thread
+ Ticker_ReadBattery.attach(queue.event(&ReadBattery), 30); // Attach 30s Ticker to "ReadBattery"
+
+ Buzzer = 0; // Disable Buzzer
+ Buzzer.period(0.001); // 1kHz Buzzer Frequency
+
+ LED_Blue1 = 0; // Turn ON LED to display 'Booting Done!'
PC.printf("\r\n------------- Ready! ---------------\r\n");
}
@@ -119,8 +139,20 @@
//-----------------------------------------------------------------
void Reset() // Reset All Variables
{
- len = 0;
+ Line_Size = 0;
+ Data_Size = 0;
+ LineCount = 0;
+ Time_Data = 0;
+ Requested_Time = 0;
+ Current_Position = 0;
+ readPointer = 0;
+ readPointer_MIC = 0;
+ writePointer = 0;
+ writePointer_MIC = 0;
+
+ ReadIMUDone_Flag = 0;
+ CheckCommandDone_Flag = 0;
memset(Data_Storage, 0, sizeof(Data_Storage));
memset(Data_Storage_MIC, 0, sizeof(Data_Storage_MIC));
@@ -134,53 +166,46 @@
Setup(); // Initial Setups
while (true) {
- if ((Requested_Time != 0) && (CheckCommandDone_Flag == 1)) {
- CheckCommandDone_Flag = 0;
+ if ((Requested_Time != 0) && (CheckCommandDone_Flag == 1)) { // Check Flag & Requested Time
+ CheckCommandDone_Flag = 0; // Reset Flag
+ memset(Data_Buffer, 0, sizeof(Data_Buffer)); // Clear Data_Buffer
- TimeStamp.start();
- Thread_IMU.start(callback(&queue, &EventQueue::dispatch_forever)); // Start IMU-Reading Thread
- Ticker_IMU.attach_us(queue.event(&ReadIMU), 1000); // Attach 1 ms Ticker to "ReadIMU"
+ TimeStamp.start(); // Start Timer TimeStamp
+ Thread_IMU.start(callback(&queue, &EventQueue::dispatch_forever)); // Start "ReadIMU" Thread
+ Ticker_IMU.attach_us(queue.event(&ReadIMU), 2000); // Attach 2ms Ticker to "ReadIMU"
}
- while ((writePointer != readPointer) && (writePointer_MIC != readPointer_MIC) && (ReadIMUDone_Flag == 1)) {
- Testing.start();
-
- while ((Data_Size + len) < 1024) {
+ while ((writePointer != readPointer) && (writePointer_MIC != readPointer_MIC) && (ReadIMUDone_Flag == 1)) { // Check Flag & Pointer Position
+ while ((Data_Size + Line_Size) < 1024) { // Check Maximum Package Size
if ((writePointer != readPointer) && (writePointer_MIC != readPointer_MIC)) {
Data_Size += sprintf(&Data_Buffer[Data_Size], "%d;%d;%d;%d;%d\n", Data_Storage[readPointer++], Data_Storage_MIC[readPointer_MIC++], Data_Storage[readPointer++], Data_Storage[readPointer++], Data_Storage[readPointer++]);
- len = snprintf(NULL, 0, "%d;%d;%d;%d;%d\n", Data_Storage[readPointer], Data_Storage_MIC[readPointer_MIC], Data_Storage[readPointer], Data_Storage[readPointer], Data_Storage[readPointer]);
+ Line_Size = snprintf(NULL, 0, "%d;%d;%d;%d;%d\n", Data_Storage[readPointer], Data_Storage_MIC[readPointer_MIC], Data_Storage[readPointer], Data_Storage[readPointer], Data_Storage[readPointer]);
} else
break;
}
- PC.printf("Package Size: %d\n", Data_Size);
- Socket_TCP.send(Data_Buffer, Data_Size);
-
- memset(Data_Buffer, 0, sizeof(Data_Buffer));
- PC.printf("Time: %d\n\n\n", Testing.read_ms());
+ response = Socket_TCP.send(Data_Buffer, Data_Size); // Send Data via TCP_Socket
+ while (response != Data_Size) // Sending Not Successful
+ response = Socket_TCP.send(Data_Buffer, Data_Size); // Resend Data via TCP_Socket
+
+ Data_Size = 0; // Reset Data_Size
+ memset(Data_Buffer, 0, sizeof(Data_Buffer)); // Clear Data_Buffer
+ wait(0.1); // Wait 100ms between Packages for ESP8266 Module
-
- Data_Size = 0;
- wait(0.1);
- Testing.stop();
- Testing.reset();
+ if ((readPointer == writePointer) && (writePointer_MIC == readPointer_MIC)) { // Check if Readpointer reached Writepointer Position
+ ReadIMUDone_Flag = 0; // Reset Flag for Sending
+ PC.printf("Sending Done! - Time Taken: %d ms\n\n", TimeStamp.read_ms()); // Show Time used for Data Sending
+ TimeStamp.stop(); // Stop Timer TimeStamp
+ TimeStamp.reset(); // Reset Timer TimeStamp
- if ((readPointer == writePointer) && (writePointer_MIC == readPointer_MIC)) {
- ReadIMUDone_Flag = 0;
- PC.printf("Sending Done! - Time Taken: %d ms", TimeStamp.read_ms());
- TimeStamp.stop();
- TimeStamp.reset();
+ Reset(); // Reset All Variables
+ Thread_ReceiveCommand.start(callback(&queue, &EventQueue::dispatch_forever)); // Start "ReceiveCommand" Thread
+ Ticker_ReceiveCommand.attach(queue.event(&ReceiveCommand), 0.500); // Attach 500ms Ticker to "ReceiveCommand"
- Reset();
- Thread_ReceiveCommand.start(callback(&queue, &EventQueue::dispatch_forever)); // Start Command-Receiving Thread
- Ticker_ReceiveCommand.attach(queue.event(&ReceiveCommand), 0.250); // Attach 250 ms Ticker to "ReceiveCommand
+ Thread_ReadBattery.start(callback(&queue, &EventQueue::dispatch_forever)); // Start "ReadBattery"
+ Ticker_ReadBattery.attach(queue.event(&ReadBattery), 30); // Attach 30s Ticker to "ReadBattery"
}
}
-
- /* sprintf(Data_Buffer, "%d;%d;%d;", (int)(1000*imu.accelerometer_data[0]), (int)(1000*imu.accelerometer_data[1]), (int)(1000*imu.accelerometer_data[2]));
- Socket_TCP.send(Data_Buffer, strlen(Data_Buffer));
- memset(Data_Buffer, 0, sizeof(Data_Buffer));*/
-
}
}
--- a/mbed-os.lib Tue Dec 19 10:15:19 2017 +0000 +++ b/mbed-os.lib Fri Feb 16 18:30:19 2018 +0000 @@ -1,1 +1,1 @@ -https://github.com/ARMmbed/mbed-os/#182bbd51bc8d1b6217477c2b5de3f1d0c5e6249f +https://github.com/ARMmbed/mbed-os/#eca67ca7dafab4ef70c21e2463b541132d0dd691
