
class
Dependencies: mbed ADXL345 Adafruit_GFX
main.cpp
- Committer:
- hunjang
- Date:
- 2021-06-15
- Revision:
- 2:0e750a9195a3
- Parent:
- 1:880f220d437a
File content as of revision 2:0e750a9195a3:
#include "mbed.h" #include "Adafruit_SSD1306.h" // Adafruit_GFX library #include "ADXL345.h" // ADXL, SPI library #include "serial.h" // Serial com. func. #define NUM_CHAR 16 #define OLED_DISPLAY #define PWM_TEST Serial pc(SERIAL_TX, SERIAL_RX); Serial bt(PC_4, PC_5); DigitalOut greenLed(LED1); #ifdef PWM_TEST PwmOut redLed(PA_12); PwmOut myAnalogOut(PA_4); #else DigitalOut redLed(PA_12); AnalogOut myAnalogOut(PA_4); #endif 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 AnalogIn lightSensor(PA_0); ADXL345 accelerometer(PB_5, PB_4, PB_3, PB_6); // MOSI, MISO, SCK, CS char PC_rxData[5]; char BT_rxData[5]; bool flagPC_Rx = 0; bool flagBT_Rx = 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 tickerFunc3() { flagT3 = 1; } void Btn1Down() { // pc.puts("1 pushed\n"); // for debugging dir = -1*dir; } void Btn1Up() { // pc.puts("1 released\n"); // for debugging #ifndef PWM_OUT greenLed = !greenLed; #endif } 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 #ifndef PWM_TEST redLed = !redLed; #endif } void DACInt() { flagDAC = 1; } void ADCint() { flagADC = 1; } // new added void ADXLInt() { flagADXL = 1; } int main() { pc.baud(115200); bt.baud(115200); pc.attach(&PC_ReceiveInt, Serial::RxIrq); // RxIrq, TxIrq bt.attach(&BT_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); pc.puts("\n<< BT_PWM Test Start>>\n"); pc.printf("ADXL Device ID: 0x%02x\n", accelerometer.getDevId()); // 0xE5 myOled.clearDisplay(); // clear buffer float 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[20] = {0,}; unsigned int exLight; unsigned char posY[2] = {0,}; int ADXLdata[3]; // new added // t3.attach(&tickerFunc3, 0.1); // ticker3 start for display #ifdef PWM_TEST redLed.period_ms(20); myAnalogOut.period_ms(10); myAnalogOut.write(0.5); #endif 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.256f); // 128/500 = 0.256 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 sprintf(tempVal2, "%d, %d, %d\n", (int16_t)ADXLdata[0], (int16_t)ADXLdata[1], (int16_t)ADXLdata[2]); // sending data consumes about 1ms (worst case) bt.puts(tempVal2); #ifdef PWM_TEST tempVal = ((int16_t)ADXLdata[0]+100) * 0.01f; redLed.write(tempVal); if (tempVal < 0.1) tempVal = 0.1; myAnalogOut.period_ms((int)(tempVal*10)); // sprintf(tempVal2,"%d\n", (int)(tempVal*10)); // pc.puts(tempVal2); #else redLed = !redLed; #endif } if (1 == flagPC_Rx){ flagPC_Rx = 0; tmpCommand[0] = PC_rxData[0]; tmpCommand[1] = PC_rxData[1]; tmpCommand[2] = 0; rxVal = atoi(PC_rxData+2); if (0 == strcmp(tmpCommand, "LD")) { // control a LED pc.printf("val = %d\n", rxVal); greenLed = (1 == rxVal)? 1:0; } else if (0 == strcmp(tmpCommand, "RE")) { // reset all variables greenLed = 0; #ifndef PWM_TEST redLed = 1; #endif n = 0; } else if (0 == strcmp(tmpCommand, "BT")) { // check the BT operation greenLed = !greenLed; pc.puts(">> Sending a data to BT: Hello World!\n"); bt.puts("Hello World!\n"); } else if (0 == strcmp(tmpCommand, "PW")) { // check the BT operation #ifdef PWM_TEST redLed.period_ms(rxVal); #endif } } if (1 == flagBT_Rx){ flagBT_Rx = 0; pc.puts(">> BT sent data.\n"); flagBT_Rx = 0; tmpCommand[0] = BT_rxData[0]; tmpCommand[1] = BT_rxData[1]; tmpCommand[2] = 0; rxVal = atoi(BT_rxData+2); if (0 == strcmp(tmpCommand, "AD")) { // control ADXL if (1 == rxVal) { tickerADXL.attach(&ADXLInt, 0.05); pc.puts(">> Start ADXL operation\n"); } else { tickerADXL.detach(); pc.puts(">> Stop ADXL operation\n"); } } else if (0 == strcmp(tmpCommand, "BB")) { // your command // add your code } } } }