ECE56810 Project 2 - Runner's Monitor

Dependencies:   mbed rohm-bh1790glc-driver mbed-http FXAS21000 FXOS8700Q ESP8266 RegisterWriter

main.cpp

Committer:
ndnafzig
Date:
2022-04-29
Revision:
12:2dde21ae53c4
Parent:
11:756321f0b0cd

File content as of revision 12:2dde21ae53c4:

#include "mbed.h"
#include "hcsr04.h"
#include "ESP8266.h"
#include "math.h"
#include "FXOS8700Q.h"
#include "FXAS21000.h"
#include "RegisterWriter/RegisterWriter/rohm_hal2.h"
#include "rohm-bh1790glc-driver/bh1790glc_registers.h"
#include "rohm-bh1790glc-driver/bh1790glc.h"

#define CloudIP "184.106.153.149"           //Raw IP Address of ThingSpeak Cloud Server
#define SSID "SSID"
#define Password "Password"

HCSR04 usensor1(D10,D11);                   //ECHO Pin=D11, TRIG Pin=D10
Serial pc(USBTX,USBRX);                     //Serial Communication with PC
ESP8266 wifi(PTC17, PTC16, 115200);         //Tx Pin:PTC17; Rx Pin:PTC17; Baud rate:115200

I2C i2c(PTE25, PTE24);
FXOS8700QAccelerometer acc(i2c, FXOS8700CQ_SLAVE_ADDR1);    // Configured for the FRDM-K64F with onboard sensors
FXOS8700QMagnetometer mag(i2c, FXOS8700CQ_SLAVE_ADDR1);
FXAS21000 gyro(D14,D15);

I2C i2chm(I2C_SDA, I2C_SCL);
RegisterWriter i2c_rw(i2chm);
BH1790GLC bh1790glc(i2c_rw);

DigitalOut buzzer(D7);

int on = 1, off = 0; 

void wifi_send(void);               //Connect and Push Data Channel to Cloud Server
void US_Sensor(void);               //Take ultrasonic measurement and send to cloud
void Acc_Mag_Gyro(void);            //Take measurements from acceleromter, magnetometer, and gyroscope and send to cloud
void Heart_Monitor(void);              

int num = 0;
char snd[255],rcv[1000];                    //snd: send command to ESP8266, rcv: receive response from ESP8266
    
//Ultrasonic sensor variable
int distance1 = 100;
    
//acc, mag, and gryo variables
float gyro_data[3];
motion_data_units_t acc_data, mag_data;
motion_data_counts_t acc_raw, mag_raw;
float faX, faY, faZ, fmX, fmY, fmZ, tmp_float;
int16_t raX, raY, raZ, rmX, rmY, rmZ, tmp_int;

//heart monitor variables
bool interval_elapsed;
Ticker ticker;
uint16_t data[2];

void timer_isr()
{
    interval_elapsed = true;
}

int main()
{
    buzzer = off;
    pc.baud(115200);                        //Baud Rate of 115200 for Tera Term
    
    acc.enable();
    mag.enable();

    pc.baud(115200);
    i2c.frequency(400000);
    
    int error;

    wait(0.1);

    do
    { //until init OK.
        error = bh1790glc.set_default_on();
        wait_ms(500);
        wait_ms(200);
    }
    while (error);
    
    bh1790glc.set_default_on();
    
    interval_elapsed = false;
    ticker.attach(&timer_isr, 0.03125);                 //32Hz
    
    pc.printf("Initial Setup\r\n");
    wifi.SetMode(1);                        //Set ESP mode to 1
    wifi.RcvReply(rcv, 1000);               //Receive a response from ESP
    pc.printf("%s\r", rcv);

    pc.printf("Connecting to WiFi\r\n");    //AP Setup Initialization
    wifi.Join(SSID, Password);              //Put your Wifi SSID followed by Password
    wifi.RcvReply(rcv, 1000);
    pc.printf("%s\n", rcv);
    wait(2);
    
    wifi.GetIP(rcv);                        //Obtains an IP address from the AP
    
    while (1) 
    {
        wifi_send();
        
        wait(1.0f);
    }
}

void wifi_send(void)
{
    while(num<1000000000000)
    {
        num=num+1;
        pc.printf("\nSyncing to Thingspeak #: %d\n\r", num);
        
        US_Sensor();
        
        Acc_Mag_Gyro();     
        
        Heart_Monitor();
    }
}

void US_Sensor(void)
{
    //Ultrasound Sensor (HC-SR04) #1 Initialization
    usensor1.start();
    wait_ms(100);
        
    //Calculating Distance Percentage Remaining for Sensor # 1
    distance1 = usensor1.get_dist_cm();
        
    //Sending Data to the Cloud Server via ESP8266 WiFi Module
    strcpy(snd,"AT+CIPMUX=0\n\r");        //AT+CIPMUX: Enabling Single Channel Mode
    wifi.SendCMD(snd);
    wait(0.1);
    wifi.RcvReply(rcv, 1000);
    wait(0.1);
        
    //Establish TCP connection w/ Cloud Server
    sprintf(snd,"AT+CIPSTART=4,\"TCP\",\"%s\",80\n",CloudIP);
    wait(0.1);
    wifi.RcvReply(rcv, 1000);
    wait(0.1);
        
    //Set length of the data that will be sent
    strcpy(snd,"AT+CIPSEND=100\n\r");
    wifi.SendCMD(snd);
    pc.printf("%s\r", rcv);
    wait(0.1);
    wifi.RcvReply(rcv, 1000);
    pc.printf("%s\r", rcv);
    wait(0.1);
        
    //Pushing the data acquired from HC-SR04 Ultrasonic Sensor to Cloud Server via API
    sprintf(snd,"\rhttps://api.thingspeak.com/update?api_key=MR7SIH7MSC5KIIH0&field1=%d\r", distance1);
    printf("Distance from Object: %dcm\n\r", distance1);
    
    
    
    if(distance1 < 6)
    {
        buzzer = on;
        wait(.3);
        buzzer = off;
        wait(0.3);
        buzzer = on;
        wait(0.3);
        buzzer = off;
        wait(0.3);
        buzzer = on;
        wait(0.3);
        buzzer = off;
    }
    
    wifi.SendCMD(snd);
    pc.printf("%s\r",snd);
    wait(0.1);
    wifi.RcvReply(rcv, 1000);
    pc.printf("%s\r", rcv);    
}

void Acc_Mag_Gyro(void)
{
    //counts based results
    acc.getAxis(acc_raw);
    mag.getAxis(mag_raw);
    acc.getX(raX);
    acc.getY(raY);
    acc.getZ(raZ);
    mag.getX(rmX);
    mag.getY(rmY);
    mag.getZ(rmZ);
            
    //unit based results
    acc.getAxis(acc_data);
    mag.getAxis(mag_data);
    acc.getX(faX);
    acc.getY(faY);
    acc.getZ(faZ);
    mag.getX(fmX);
    mag.getY(fmY);
    mag.getZ(fmZ);
    pc.printf("Acellerometer: X=%1.4fY=%1.4fZ=%1.4f\n\r", acc.getX(faX),acc.getY(faY),acc.getZ(faZ));
    pc.printf("Magnetometer: X=%4.1fY=%4.1fZ=%4.1f\n\r", mag.getX(fmX),mag.getY(fmY), mag.getZ(fmZ));
    gyro.ReadXYZ(gyro_data);
    pc.printf("Gyro: X=%6.2f Y=%6.2f Z=%6.2f\n\r", gyro_data[0],gyro_data[1], gyro_data[2]);
    wait(0.5f);
            
    //Sending Data to the Cloud Server via ESP8266 WiFi Module
    strcpy(snd,"AT+CIPMUX=0\n\r");        //AT+CIPMUX: Enabling Single Channel Mode
    wifi.SendCMD(snd);
    wait(0.1);
    wifi.RcvReply(rcv, 1000);
    wait(0.1);
        
    //Establish TCP connection w/ Cloud Server
    sprintf(snd,"AT+CIPSTART=4,\"TCP\",\"%s\",80\n",CloudIP);
    wait(0.1);
    wifi.RcvReply(rcv, 1000);
    wait(0.1);
        
    //Set length of the data that will be sent
    strcpy(snd,"AT+CIPSEND=100\n\r");
    wifi.SendCMD(snd);
    pc.printf("%s\r", rcv);
    wait(0.1);
    wifi.RcvReply(rcv, 1000);
    pc.printf("%s\r", rcv);
    wait(0.1);
        
    //Pushing the data acquired from Acc to Cloud Server via API
    //Sends only X data for simplicity of testing purposes
    sprintf(snd,"\rhttps://api.thingspeak.com/update?api_key=MR7SIH7MSC5KIIH0&field2=%f\r", acc.getX(faX));
    printf("Current X Acceleration: %f\n\r", acc.getX(faX));
    wifi.SendCMD(snd);
    pc.printf("%s\r",snd);
    wait(0.1);
    wifi.RcvReply(rcv, 1000);
    pc.printf("%s\r", rcv);   
    
    //Pushing the data acquired from Mag to Cloud Server via API
    //Sends only X data for simplicity of testing purposes
    sprintf(snd,"\rhttps://api.thingspeak.com/update?api_key=MR7SIH7MSC5KIIH0&field3=%f\r", mag.getX(fmX));
    printf("Current X Position: %f\n\r", mag.getX(fmX));
    wifi.SendCMD(snd);
    pc.printf("%s\r",snd);
    wait(0.1);
    wifi.RcvReply(rcv, 1000);
    pc.printf("%s\r", rcv); 
    
    //Pushing the data acquired from Gyro to Cloud Server via API
    //Sends only X data for simplicity of testing purposes
    sprintf(snd,"\rhttps://api.thingspeak.com/update?api_key=MR7SIH7MSC5KIIH0&field4=%f\r", gyro_data[0]);
    printf("Current X Orientation: %f\n\r", gyro_data[0]);
    wifi.SendCMD(snd);
    pc.printf("%s\r",snd);
    wait(0.1);
    wifi.RcvReply(rcv, 1000);
    pc.printf("%s\r", rcv);  
}

void Heart_Monitor(void)
{
    int i = 0;
    int sum = 0;
    int count = 0;
    float average = 0;
    int error;
    
    wait_ms(500);
    
    while(i < 10)
        { 
            if (interval_elapsed)       //Wait until ISR
            {                         
                error = bh1790glc.getresults(data);
                
                if (!error) 
                {                          
                    //get data, print to serial, update flags
                    pc.printf("%d, \t%d\n\r", data[1], data[0]);                
                    interval_elapsed = false;
                    i++;
                    sum += data[1];
                    count++;
                }   
            }
        }
        
        average = sum/10;
        
    if(average > 3500)
    {
        buzzer = on;
        wait(.1);
        buzzer = off;
        wait(0.1);
        buzzer = on;
        wait(0.1);
        buzzer = off;
        wait(0.1);
        buzzer = on;
        wait(.1);
        buzzer = off;
        wait(0.1);
        buzzer = on;
        wait(0.1);
        buzzer = off;
        wait(0.1);
        buzzer = on;
        wait(.1);
        buzzer = off;
        wait(0.1);
        buzzer = on;
        wait(0.1);
        buzzer = off;
    }
        
    //Sending Data to the Cloud Server via ESP8266 WiFi Module
    strcpy(snd,"AT+CIPMUX=0\n\r");        //AT+CIPMUX: Enabling Single Channel Mode
    wifi.SendCMD(snd);
    wait(0.1);
    wifi.RcvReply(rcv, 1000);
    wait(0.1);
        
    //Establish TCP connection w/ Cloud Server
    sprintf(snd,"AT+CIPSTART=4,\"TCP\",\"%s\",80\n",CloudIP);
    wait(0.1);
    wifi.RcvReply(rcv, 1000);
    wait(0.1);
        
    //Set length of the data that will be sent
    strcpy(snd,"AT+CIPSEND=100\n\r");
    wifi.SendCMD(snd);
    pc.printf("%s\r", rcv);
    wait(0.1);
    wifi.RcvReply(rcv, 1000);
    pc.printf("%s\r", rcv);
    wait(0.1);
        
    //Pushing the data acquired from heart monitor to Cloud Server via API
    //Sends only X data for simplicity of testing purposes
    sprintf(snd,"\rhttps://api.thingspeak.com/update?api_key=MR7SIH7MSC5KIIH0&field5=%f\r", average);
    printf("Current average heart rate: %f\n\r", average);
    wifi.SendCMD(snd);
    pc.printf("%s\r",snd);
    wait(0.1);
    wifi.RcvReply(rcv, 1000);
    pc.printf("%s\r", rcv);
}