
0608 practice 1
Dependencies: mbed ADXL345 Adafruit_GFX
main.cpp
- Committer:
- leejieun
- Date:
- 2022-06-08
- Revision:
- 0:6f82db07119a
File content as of revision 0:6f82db07119a:
#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; } } } }