._.

Dependencies:   LCD_DISCO_F429ZI mbed BSP_DISCO_F429ZI GYRO_DISCO_F429ZI

main.cpp

Committer:
ovcharka132
Date:
2021-12-15
Revision:
0:3294aff3e5ad

File content as of revision 0:3294aff3e5ad:

#include "mbed.h"
#include "GYRO_DISCO_F429ZI.h"
#include "LCD_DISCO_F429ZI.h"
#include "stm32f429i_discovery_lcd.h"
 
GYRO_DISCO_F429ZI gyro;
LCD_DISCO_F429ZI lcd;
 
DigitalOut led1(LED1);

bool isInMotion = false;
 
int main()
{
    float GyroBuffer[3];
    float zero_level[3] = {0, 0, 0};
    uint8_t buffer[100];
    lcd.Init();
    lcd.DisplayStringAt(0, LINE(1), (uint8_t*)"Started", CENTER_MODE);
    uint8_t tmpreg = 0;
    GYRO_IO_Read(&tmpreg,I3G4250D_CTRL_REG4_ADDR,1);
    switch(tmpreg & I3G4250D_FULLSCALE_SELECTION)
    {
        case I3G4250D_FULLSCALE_245:
            lcd.DisplayStringAt(0, LINE(2), (uint8_t*)"245", CENTER_MODE);
        break;
    
        case I3G4250D_FULLSCALE_500:
            lcd.DisplayStringAt(0, LINE(2), (uint8_t*)"500", CENTER_MODE);
        break;
    
        case I3G4250D_FULLSCALE_2000:
            lcd.DisplayStringAt(0, LINE(2), (uint8_t*)"2000", CENTER_MODE);
        break;
  }
    GYRO_IO_Read(&tmpreg, I3G4250D_CTRL_REG1_ADDR, 1);
    switch(tmpreg >> 6) {
        case 0:
            lcd.DisplayStringAt(0, LINE(3), (uint8_t*)"95", CENTER_MODE);
            break;
        case 1:
            lcd.DisplayStringAt(0, LINE(3), (uint8_t*)"190", CENTER_MODE);
            break;
        case 2:
            lcd.DisplayStringAt(0, LINE(3), (uint8_t*)"380", CENTER_MODE);
            break;
        case 3:
            lcd.DisplayStringAt(0, LINE(3), (uint8_t*)"760", CENTER_MODE);
            break;
    }
 
    for (int i = 0; i < 50; i++) {
        gyro.GetXYZ(GyroBuffer);
        zero_level[0] += GyroBuffer[0] / 17.5f;
        zero_level[1] += GyroBuffer[1] / 17.5f;
        zero_level[2] += GyroBuffer[2] / 17.5f;
 
        wait_ms(10);
    }
    for (int i = 0; i < 3; i++)
        zero_level[i] /= 50;
    
    float noise_level = 0.0f;
    for (int i = 0; i < 50; i++) {
        gyro.GetXYZ(GyroBuffer);
        if ((GyroBuffer[0] / 17.5f - zero_level[0]) > noise_level) {
            noise_level = (GyroBuffer[1] / 17.5f - zero_level[0]);
        } 
        else if ((GyroBuffer[0] / 17.5f - zero_level[0]) < -noise_level) {
            noise_level = -(GyroBuffer[1] / 17.5f - zero_level[0]);
        }
        wait_ms(10);
    }
    sprintf((char*)buffer, "Noise %.2f", noise_level);
    lcd.DisplayStringAt(0, LINE(4), buffer, CENTER_MODE);
    float angle = 0.0f, prev_value = 0.0f;
    float saved_angle = 0.0f;
    while(1) {
        // Read Gyroscope values
        wait(0.02);
        
        gyro.GetXYZ(GyroBuffer);
        float value = GyroBuffer[0] / 17.5f - zero_level[0];
        if (value >= noise_level || value <= -noise_level) {
            if(value >= 0.1f) {
                if(!isInMotion){
                    saved_angle = angle;
                }
                isInMotion = true;
            }
            angle += (value + prev_value) / 2 * 0.0175f * 0.02f / 0.825f;
        } else {
            isInMotion = false;
            if(fabs(saved_angle - angle) >= 45.0f){
                lcd.ClearStringLine(7);
                lcd.ClearStringLine(8);
                lcd.DisplayStringAt(0, LINE(7), (uint8_t*)"Gesture", CENTER_MODE);
                sprintf((char*)buffer, "Angle %.3f", angle - saved_angle);
                lcd.DisplayStringAt(0, LINE(8), buffer, CENTER_MODE);
            }
            saved_angle = angle;
        }
        prev_value = value;
        sprintf((char*)buffer, "Angle %.3f", angle);
        lcd.ClearStringLine(6);
        lcd.DisplayStringAt(0, LINE(6), buffer, CENTER_MODE);
        
    }
}