0608 practice 1

Dependencies:   mbed ADXL345 Adafruit_GFX

Revision:
0:6f82db07119a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Jun 08 08:14:15 2022 +0000
@@ -0,0 +1,289 @@
+#include "mbed.h"
+#include "Adafruit_SSD1306.h"   // Adafruit_GFX library
+#include "ADXL345.h"            // ADXL, SPI library
+
+#define NUM_CHAR    16
+
+#define OLED_DISPLAY
+#define ADC_TEST
+
+Serial      pc(SERIAL_TX, SERIAL_RX);
+DigitalOut  greenLed(LED1);
+DigitalOut  redLed(PA_12);
+Timer       t1, t2;
+Ticker       t3, t4;
+InterruptIn   myButton(PC_13);
+InterruptIn   exButton(PC_11);
+
+BusOut my7Seg(PA_8, PA_9, PA_10, PC_9, PC_8, PC_7, PC_6, PA_11); // 8bit data
+            // LSB,                                      , MSB
+
+AnalogOut   myAnalogOut(PA_4);       
+AnalogIn    lightSensor(PA_0);          
+ADXL345     accelerometer(PB_5, PB_4, PB_3, PB_6);       // MOSI, MISO, SCK, CS
+
+char    rxData[5];
+bool    flagRx = 0;
+int     dir = 1;        // 1: increase, -1: decrease
+bool    flagT3 = 0;
+bool    modeT3 = 0;     // 0: stop, 1: working
+bool    flagDAC = 0;
+bool    flagADC = 0;    
+bool    flagADXL = 0;   // new added
+
+void ReceiveInt() {
+    char inChar;
+    static char rxCount = 0;
+    static char rxBuf[4];
+    
+    while(1 == pc.readable()) {
+        inChar = pc.getc();
+        if ('<' == inChar){
+            rxCount = 1;            
+        }
+        else if (rxCount > 0 && rxCount < 5) {
+            rxBuf[rxCount-1] = inChar;
+            rxCount++;   
+        }
+        else if (5 == rxCount && '>' == inChar) {
+            rxCount = 0;
+            flagRx = 1;
+            memcpy(rxData, rxBuf, 4);
+//            pc.putc(rxData[0]);
+//            pc.putc(rxData[1]);
+//            pc.putc(rxData[2]);
+//            pc.putc(rxData[3]);
+ 
+//            pc.puts(rxData);  
+        }
+        else {
+            rxCount = 0;
+        }
+    }
+}
+
+void tickerFunc3() {
+    flagT3 = 1;
+}
+
+void Btn1Down() {
+//    pc.puts("1 pushed\n");   // for debugging
+    dir = -1*dir;
+}
+
+void Btn1Up() {
+//    pc.puts("1 released\n");    // for debugging
+    greenLed = !greenLed;
+}
+
+void Btn2Down() {
+//    pc.puts("2 pushed\n");   // for debugging
+    if (1 == modeT3) t3.detach();
+    else t3.attach(tickerFunc3, 0.1);
+    modeT3 = !modeT3;
+}
+
+void Btn2Up() {
+//    pc.puts("2 released\n");    // for debugging
+    redLed = !redLed;
+}
+
+void DACInt() {
+    flagDAC = 1;
+}
+
+void ADCint() {
+    flagADC = 1;
+}
+
+// new added
+void ADXLInt()
+{
+    flagADXL = 1;
+}
+
+int main()
+{   
+    pc.baud(115200);
+    pc.puts("\n<< ADXL Test Start>>\n");
+    pc.printf("Device ID: 0x%02x\n", accelerometer.getDevId());      // 0xE5    
+ 
+    pc.attach(&ReceiveInt, Serial::RxIrq);      // RxIrq, TxIrq
+    myButton.fall(&Btn1Down);
+    myButton.rise(&Btn1Up);
+    exButton.fall(&Btn2Down);
+    exButton.rise(&Btn2Up);
+    
+    myButton.disable_irq();     // to avoid unexpected interrupt
+    exButton.disable_irq();     // to avoid unexpected interrupt
+    
+    //Go into standby mode to configure the device.
+    accelerometer.setPowerControl(0x00);
+     //Full resolution, +/-16g, 4mg/LSB.
+    accelerometer.setDataFormatControl(0x0B);       // 0b 0000 1011
+    //3.2kHz data rate.
+    accelerometer.setDataRate(ADXL345_3200HZ);
+    //Measurement mode.
+    accelerometer.setPowerControl(0x08);        // 0b 0000 1000
+    
+    Ticker  tickerADXL;
+    tickerADXL.attach(&ADXLInt, 0.05);
+    
+
+    I2C     I2C_Oled(PB_7, PA_15);       // SDA, SCL
+    I2C_Oled.frequency(400000);     // 400kHz clock
+    Adafruit_SSD1306_I2c    myOled(I2C_Oled, PD_2);    //  reset pin doesn't effect
+//    Adafruit_SSD1306_I2c    myOled(I2C_Oled, PD_2, 64, 128);    //  make an error
+
+    myOled.clearDisplay();  // clear buffer     
+    myOled.printf("%u x %u OLED Display\r\n", myOled.width(), myOled.height());
+    myOled.printf("Device ID: 0x%02x\n", accelerometer.getDevId());
+    myOled.display();       // show a image on the OLED
+    wait(1);
+
+    myButton.enable_irq();     // enable IRQ
+    exButton.enable_irq();     // enable IRQ
+    
+    time_t seconds = time(NULL);
+    
+    set_time(1617235200);  // Set RTC time to 2021-04-01, 00:00:00
+    pc.printf("Time as a basic string = %s", ctime(&seconds));
+
+    char buffer[32];
+    strftime(buffer, 32, "%I:%M %p\n", localtime(&seconds));
+    pc.printf("1) Time as a custom formatted string = %s", buffer);
+    strftime(buffer, 32, "%y-%m-%d, %H:%M:%S\n", localtime(&seconds));
+    pc.printf("2) Time as a custom formatted string = %s", buffer);    
+
+//    int preStatus1 = 0;
+//    int preStatus2 = 0;
+    int tempVal = 0;
+    char tmpCommand[3];
+    int rxVal;
+    char    val7Seg[NUM_CHAR] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};
+
+    modeT3 = 1;
+    my7Seg = 0xFF;
+      
+    uint16_t n = 0;
+    
+    char tempVal2[10] = {0,};
+    unsigned int    exLight;
+    unsigned char   posY[2] = {0,};
+    int     ADXLdata[3];    // new added
+//    t3.attach(&tickerFunc3, 0.1);       // ticker3 start for display
+    
+    myOled.clearDisplay();  // clear buffer  
+
+    while(1)
+    {
+        if (1 == flagT3) {
+            flagT3 = 0;
+            n = n + dir;
+//            if (n > 200) n = 0;
+//            myAnalogOut = n*0.005f;
+//            sprintf(tempVal2, "%d, %1.2f\n", n, myAnalogOut.read());
+//            pc.puts(tempVal2);
+            
+            my7Seg = ~val7Seg[n%16] & 0x7F;
+            
+            exLight = lightSensor.read() * 500;     // ADC read & send data : about 300us consume
+            sprintf(tempVal2, "%d\n", exLight);
+            pc.puts(tempVal2);
+            
+            #ifdef OLED_DISPLAY
+            posY[1] = 64 - (unsigned char)((float)(exLight-300) * 0.512f);            // 128/1000 = 0.128
+            myOled.drawLine(n, posY[0], n+1, posY[1], 1);
+            myOled.display();                       // OLED display consumes about 28ms
+            posY[0] = posY[1];
+            if (n > 127) {
+                n = 0;
+                myOled.clearDisplay();
+            }
+            #endif
+            
+            greenLed = !greenLed;
+        }
+        
+        if (1 == flagADXL) {
+            flagADXL = 0;
+            accelerometer.getOutput(ADXLdata);      // ADXL reading consumes about 80us
+            pc.printf("%d, %d, %d\n", (int16_t)ADXLdata[0], (int16_t)ADXLdata[1], (int16_t)ADXLdata[2]);      // sending data consumes about 1ms (worst case)
+            //pc.printf("%d\n",rxVal);
+
+            if (rxVal == 1){
+                //posY[1] = ADXLdata[0];            // 128/500 = 0.256
+                posY[1] = 64 - (((float)ADXLdata[0]+200) * 0.032f);
+                myOled.drawLine(n, posY[0], n+1, posY[1], 1);
+                myOled.display();                       // OLED display consumes about 28ms
+                posY[0] = posY[1];
+                n++;
+                if (n > 127) {
+                    n = 0;
+                    myOled.clearDisplay();
+                }
+            }
+
+            if (rxVal == 2){
+                //posY[1] = ADXLdata[1];            // 128/500 = 0.256
+                posY[1] = 64 - (((float)ADXLdata[1]+200) * 0.032f);
+                myOled.drawLine(n, posY[0], n+1, posY[1], 1);
+                myOled.display();                       // OLED display consumes about 28ms
+                posY[0] = posY[1];
+                n++;
+                if (n > 127) {
+                    n = 0;
+                    myOled.clearDisplay();
+                }
+            }
+
+
+            if (rxVal == 3){
+                //posY[1] = ADXLdata[2];            // 128/500 = 0.256
+                posY[1] = 64 - ((float)ADXLdata[2] * 0.032f);
+                myOled.drawLine(n, posY[0], n+1, posY[1], 1);
+                myOled.display();                       // OLED display consumes about 28ms
+                posY[0] = posY[1];
+                n++;
+                if (n > 127) {
+                    n = 0;
+                    myOled.clearDisplay();
+                }
+            } 
+                
+        if (rxVal == 0){
+            myOled.clearDisplay();
+        }
+            
+            
+        }
+        
+        if (1 == flagRx){
+            flagRx = 0;
+            tmpCommand[0] = rxData[0];
+            tmpCommand[1] = rxData[1];
+            tmpCommand[2] = 0;
+            rxVal = atoi(rxData+2);
+            
+            if (0 == strcmp(tmpCommand, "LD")) {        // control a LED
+                pc.printf("val = %d\n", rxVal);
+                
+                greenLed = (1 == rxVal)? 1:0;
+//                greenLed = rxVal? 1:0;
+            }
+            if (0 == strcmp(tmpCommand, "RE")) {        // reset all variables
+                greenLed = 0;
+                redLed = 1;
+                n = 0;
+            }
+            if (0 == strcmp(tmpCommand, "OL"))
+            {
+                greenLed = 1;
+                redLed = 1;
+            }
+
+    }
+    }        
+       
+    
+}