https://www.hackster.io/projects/bfb38d

Dependencies:   mbed MMA8652 TextLCD MAG3110

Revision:
3:2cc1ff874a75
Parent:
2:ad0b044d0a10
--- a/main.cpp	Sat Dec 04 11:31:07 2010 +0000
+++ b/main.cpp	Wed Apr 17 04:28:33 2019 +0000
@@ -1,10 +1,222 @@
-// Hello World! for the TextLCD
 
 #include "mbed.h"
 #include "TextLCD.h"
+#include "MAG3110.h"
+#include "MMA8652.h"
 
-TextLCD lcd(p15, p16, p17, p18, p19, p20); // rs, e, d4-d7
+MAG3110 mag(P20, P19); //  i2c pins SDA, SCL for magnetometer //
+MMA8652 acc(P20, P19); //  i2c pins SDA, SCL for accelerometer //
+// LCD pins rs, en, d4, d5, d6, d7 and 16x2 lcd //
+TextLCD lcd(P6, P8, P7, P13, P14, P15,TextLCD::LCD16x2); 
+
+PwmOut ChargePump(P0);  // pwm output to drive charge pump
+InterruptIn ButtonA(P5);  // active low push switch with interrupt
+InterruptIn ButtonB(P11); // active low push switch with interrupt
+
+AnalogIn Vref_2v5(P3); // 2.5v ref on adc for vcc independent measurement
+AnalogIn ADCP4 (P4);
+AnalogIn ADCP10 (P10);
+
+float frequency = 9000.0f; // min 1.5 kHz for stable operation
+float duty = 50.0f; // min 20% to max 80 percent for stable operation
+float heading = 0.0; // magnetometer heading
+float Xg =0.0; float Yg = 0.0; float Zg = 0.0;
+uint16_t vref =0;
+volatile int selector = 1;
 
-int main() {
-    lcd.printf("Hello World!\n");
+////////////////////////////////////////////////////////////////////////////////
+void EnableChargePump (void)
+{
+// 10kHz drive signal for Diode-Capacitor DC-DC (3.3V ->5.5V) converter
+       ChargePump.period(1.0f/frequency);      
+       ChargePump.write(duty/100.0f); // 50% duty 
+       wait(.5); // Let boosted voltage stabilize to 5.5v (lcd supply as load)
+}
+////////////////////////////////////////////////////////////////////////////////
+void calMag(void) 
+{
+    //magnetometer calibration: finding max and min of X, Y axis
+    int tempXmax, tempXmin, tempYmax, tempYmin, newX, newY;
+    while(selector==1)
+    {
+    lcd.locate(0,0);
+    lcd.printf("Press A to Start");
+    lcd.locate(0,1);
+    lcd.printf("Mag Calibration");
+    wait(.3);
+    }
+    selector=1;
+    lcd.cls();
+    lcd.locate(0,0);
+    lcd.printf("Calibration is");
+    lcd.locate(0,1);
+    lcd.printf("Starting Now..");
+    wait(2);
+    lcd.cls();
+    lcd.locate(0,0);
+    lcd.printf("Rotate like an");
+    lcd.locate(0,1);
+    lcd.printf("Infinity Symbol");
+    wait(3);
+    lcd.cls();
+    lcd.locate(0,0);
+    lcd.printf("Calibrating now");
+    lcd.locate(0,1);
+    lcd.printf("Keep swinging..");  
+    tempXmax = tempXmin = mag.readVal(MAG_OUT_X_MSB);
+    tempYmax = tempYmin = mag.readVal(MAG_OUT_Y_MSB);
+    int sample = 0;
+     
+    while(sample<201) {
+        wait(0.05);
+        newX = mag.readVal(MAG_OUT_X_MSB);
+        newY = mag.readVal(MAG_OUT_Y_MSB);
+        if (newX > tempXmax) tempXmax = newX;
+        if (newX < tempXmin) tempXmin = newX;
+        if (newY > tempYmax) tempYmax = newY;
+        if (newY < tempYmin) tempYmin = newY;
+        sample++;      
+    }
+   
+    mag.setCalibration( tempXmin, tempXmax, tempYmin, tempYmax );
+    lcd.cls();
+    lcd.locate(0,0);
+    lcd.printf("Calibration has");
+    lcd.locate(0,1);
+    lcd.printf("been completed");
+}
+////////////////////////////////////////////////////////////////////////////////
+void getMagHeading(void)
+{
+    heading = mag.getHeading();; // magnetometer heading
+    wait(.1);
+}
+////////////////////////////////////////////////////////////////////////////////
+void getAccXYZ(void)
+{
+    float temp[3];
+    acc.ReadXYZ(temp); // accelerometer 
+    Xg = 10.0*temp[0]; Yg = 10.0*temp[1]; Zg = 10.0*temp[2]; 
+    wait(.1);   
+}
+////////////////////////////////////////////////////////////////////////////////
+void WhenAPressed()
+{
+ // button A ISR   
+    if (selector<8)
+    selector++;
+    if(selector>=8)
+    selector=8;
+    wait(.2);
+}
+////////////////////////////////////////////////////////////////////////////////
+void WhenBPressed()
+{
+ // button B ISR    
+    if (selector>1)
+    selector--;
+    if(selector<=1)
+    selector=1;
+    wait(.2);
 }
+////////////////////////////////////////////////////////////////////////////////
+void updateLCD (void)
+{
+    lcd.cls();
+    
+    
+    if(selector==1)
+    {
+        lcd.locate(0,0);
+        lcd.printf("System Voltage");
+        lcd.locate(0,1);
+        lcd.printf("Vcc:%fVolt", ((2.5*1023.0)/Vref_2v5.read_u16()));
+    }
+    
+     if(selector==2)
+    {
+        lcd.locate(0,0);
+        lcd.printf("Charge Pump");
+        lcd.locate(0,1);
+        lcd.printf("Freq:%dkHz Cyc:%d%",int(frequency/1000.0f),int(duty));
+    }
+    
+    if(selector==3)
+    {
+        lcd.locate(0,0);
+        lcd.printf("Reading ADC val");
+        lcd.locate(0,1);
+        lcd.printf("ADC P4:%d", (ADCP4.read_u16()));
+    }
+    
+    if(selector==4)
+    {   
+        lcd.locate(0,0);
+        lcd.printf("Reading ADC data");
+        lcd.locate(0,1);
+        lcd.printf("ADC P10:%d", (ADCP10.read_u16()));
+    }
+        
+    if(selector==5)
+    {
+        lcd.locate(0,0);
+        lcd.printf("Mag Sensor data");
+        lcd.locate(0,1);
+        lcd.printf("Mag Heading:%d", int(heading));
+    }
+    
+    if(selector==6)
+    {
+        lcd.locate(0,0);
+        lcd.printf("Acc Sensor Xaxis");
+        lcd.locate(0,1);
+        lcd.printf("Xg:%f", Xg);
+    }
+    
+    if(selector==7)
+    {
+        lcd.locate(0,0);
+        lcd.printf("Acc Sensor Yaxis");
+        lcd.locate(0,1);
+        lcd.printf("Yg:%f", Yg);
+    }
+    
+    if(selector==8)
+    {   
+        lcd.locate(0,0);
+        lcd.printf("Acc Sensor Zaxis");
+        lcd.locate(0,1);
+        lcd.printf("Zg:%f", Zg);
+    }
+    wait(.1);
+}
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////// main ////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+
+int main() 
+{
+    EnableChargePump(); // enable lcd power
+    ButtonA.fall(&WhenAPressed); // enable falling edge interrupt on button A
+    ButtonB.fall(&WhenBPressed); // enable falling edge interrupt on button B
+    calMag(); // init magnetometer and calibrate
+    acc.begin(); // init accelerometer
+   
+        lcd.locate(0,0);
+        lcd.printf("Press A or B to");
+        lcd.locate(0,1);
+        lcd.printf("check sensor info");
+        wait(2);
+  ////////////////////// while ////////////////
+  
+    while(1)
+    {   
+    updateLCD();
+    getMagHeading();
+    getAccXYZ();
+    
+    } ///// end of while .....
+
+} ///// end of main ......
+
+//////////////////////////////// end of code ///////////////////////////////////