0608 practice 1
Dependencies: mbed ADXL345 Adafruit_GFX
main.cpp@0:6f82db07119a, 2022-06-08 (annotated)
- Committer:
- leejieun
- Date:
- Wed Jun 08 08:14:15 2022 +0000
- Revision:
- 0:6f82db07119a
0608 practice 1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
leejieun | 0:6f82db07119a | 1 | #include "mbed.h" |
leejieun | 0:6f82db07119a | 2 | #include "Adafruit_SSD1306.h" // Adafruit_GFX library |
leejieun | 0:6f82db07119a | 3 | #include "ADXL345.h" // ADXL, SPI library |
leejieun | 0:6f82db07119a | 4 | |
leejieun | 0:6f82db07119a | 5 | #define NUM_CHAR 16 |
leejieun | 0:6f82db07119a | 6 | |
leejieun | 0:6f82db07119a | 7 | #define OLED_DISPLAY |
leejieun | 0:6f82db07119a | 8 | #define ADC_TEST |
leejieun | 0:6f82db07119a | 9 | |
leejieun | 0:6f82db07119a | 10 | Serial pc(SERIAL_TX, SERIAL_RX); |
leejieun | 0:6f82db07119a | 11 | DigitalOut greenLed(LED1); |
leejieun | 0:6f82db07119a | 12 | DigitalOut redLed(PA_12); |
leejieun | 0:6f82db07119a | 13 | Timer t1, t2; |
leejieun | 0:6f82db07119a | 14 | Ticker t3, t4; |
leejieun | 0:6f82db07119a | 15 | InterruptIn myButton(PC_13); |
leejieun | 0:6f82db07119a | 16 | InterruptIn exButton(PC_11); |
leejieun | 0:6f82db07119a | 17 | |
leejieun | 0:6f82db07119a | 18 | BusOut my7Seg(PA_8, PA_9, PA_10, PC_9, PC_8, PC_7, PC_6, PA_11); // 8bit data |
leejieun | 0:6f82db07119a | 19 | // LSB, , MSB |
leejieun | 0:6f82db07119a | 20 | |
leejieun | 0:6f82db07119a | 21 | AnalogOut myAnalogOut(PA_4); |
leejieun | 0:6f82db07119a | 22 | AnalogIn lightSensor(PA_0); |
leejieun | 0:6f82db07119a | 23 | ADXL345 accelerometer(PB_5, PB_4, PB_3, PB_6); // MOSI, MISO, SCK, CS |
leejieun | 0:6f82db07119a | 24 | |
leejieun | 0:6f82db07119a | 25 | char rxData[5]; |
leejieun | 0:6f82db07119a | 26 | bool flagRx = 0; |
leejieun | 0:6f82db07119a | 27 | int dir = 1; // 1: increase, -1: decrease |
leejieun | 0:6f82db07119a | 28 | bool flagT3 = 0; |
leejieun | 0:6f82db07119a | 29 | bool modeT3 = 0; // 0: stop, 1: working |
leejieun | 0:6f82db07119a | 30 | bool flagDAC = 0; |
leejieun | 0:6f82db07119a | 31 | bool flagADC = 0; |
leejieun | 0:6f82db07119a | 32 | bool flagADXL = 0; // new added |
leejieun | 0:6f82db07119a | 33 | |
leejieun | 0:6f82db07119a | 34 | void ReceiveInt() { |
leejieun | 0:6f82db07119a | 35 | char inChar; |
leejieun | 0:6f82db07119a | 36 | static char rxCount = 0; |
leejieun | 0:6f82db07119a | 37 | static char rxBuf[4]; |
leejieun | 0:6f82db07119a | 38 | |
leejieun | 0:6f82db07119a | 39 | while(1 == pc.readable()) { |
leejieun | 0:6f82db07119a | 40 | inChar = pc.getc(); |
leejieun | 0:6f82db07119a | 41 | if ('<' == inChar){ |
leejieun | 0:6f82db07119a | 42 | rxCount = 1; |
leejieun | 0:6f82db07119a | 43 | } |
leejieun | 0:6f82db07119a | 44 | else if (rxCount > 0 && rxCount < 5) { |
leejieun | 0:6f82db07119a | 45 | rxBuf[rxCount-1] = inChar; |
leejieun | 0:6f82db07119a | 46 | rxCount++; |
leejieun | 0:6f82db07119a | 47 | } |
leejieun | 0:6f82db07119a | 48 | else if (5 == rxCount && '>' == inChar) { |
leejieun | 0:6f82db07119a | 49 | rxCount = 0; |
leejieun | 0:6f82db07119a | 50 | flagRx = 1; |
leejieun | 0:6f82db07119a | 51 | memcpy(rxData, rxBuf, 4); |
leejieun | 0:6f82db07119a | 52 | // pc.putc(rxData[0]); |
leejieun | 0:6f82db07119a | 53 | // pc.putc(rxData[1]); |
leejieun | 0:6f82db07119a | 54 | // pc.putc(rxData[2]); |
leejieun | 0:6f82db07119a | 55 | // pc.putc(rxData[3]); |
leejieun | 0:6f82db07119a | 56 | |
leejieun | 0:6f82db07119a | 57 | // pc.puts(rxData); |
leejieun | 0:6f82db07119a | 58 | } |
leejieun | 0:6f82db07119a | 59 | else { |
leejieun | 0:6f82db07119a | 60 | rxCount = 0; |
leejieun | 0:6f82db07119a | 61 | } |
leejieun | 0:6f82db07119a | 62 | } |
leejieun | 0:6f82db07119a | 63 | } |
leejieun | 0:6f82db07119a | 64 | |
leejieun | 0:6f82db07119a | 65 | void tickerFunc3() { |
leejieun | 0:6f82db07119a | 66 | flagT3 = 1; |
leejieun | 0:6f82db07119a | 67 | } |
leejieun | 0:6f82db07119a | 68 | |
leejieun | 0:6f82db07119a | 69 | void Btn1Down() { |
leejieun | 0:6f82db07119a | 70 | // pc.puts("1 pushed\n"); // for debugging |
leejieun | 0:6f82db07119a | 71 | dir = -1*dir; |
leejieun | 0:6f82db07119a | 72 | } |
leejieun | 0:6f82db07119a | 73 | |
leejieun | 0:6f82db07119a | 74 | void Btn1Up() { |
leejieun | 0:6f82db07119a | 75 | // pc.puts("1 released\n"); // for debugging |
leejieun | 0:6f82db07119a | 76 | greenLed = !greenLed; |
leejieun | 0:6f82db07119a | 77 | } |
leejieun | 0:6f82db07119a | 78 | |
leejieun | 0:6f82db07119a | 79 | void Btn2Down() { |
leejieun | 0:6f82db07119a | 80 | // pc.puts("2 pushed\n"); // for debugging |
leejieun | 0:6f82db07119a | 81 | if (1 == modeT3) t3.detach(); |
leejieun | 0:6f82db07119a | 82 | else t3.attach(tickerFunc3, 0.1); |
leejieun | 0:6f82db07119a | 83 | modeT3 = !modeT3; |
leejieun | 0:6f82db07119a | 84 | } |
leejieun | 0:6f82db07119a | 85 | |
leejieun | 0:6f82db07119a | 86 | void Btn2Up() { |
leejieun | 0:6f82db07119a | 87 | // pc.puts("2 released\n"); // for debugging |
leejieun | 0:6f82db07119a | 88 | redLed = !redLed; |
leejieun | 0:6f82db07119a | 89 | } |
leejieun | 0:6f82db07119a | 90 | |
leejieun | 0:6f82db07119a | 91 | void DACInt() { |
leejieun | 0:6f82db07119a | 92 | flagDAC = 1; |
leejieun | 0:6f82db07119a | 93 | } |
leejieun | 0:6f82db07119a | 94 | |
leejieun | 0:6f82db07119a | 95 | void ADCint() { |
leejieun | 0:6f82db07119a | 96 | flagADC = 1; |
leejieun | 0:6f82db07119a | 97 | } |
leejieun | 0:6f82db07119a | 98 | |
leejieun | 0:6f82db07119a | 99 | // new added |
leejieun | 0:6f82db07119a | 100 | void ADXLInt() |
leejieun | 0:6f82db07119a | 101 | { |
leejieun | 0:6f82db07119a | 102 | flagADXL = 1; |
leejieun | 0:6f82db07119a | 103 | } |
leejieun | 0:6f82db07119a | 104 | |
leejieun | 0:6f82db07119a | 105 | int main() |
leejieun | 0:6f82db07119a | 106 | { |
leejieun | 0:6f82db07119a | 107 | pc.baud(115200); |
leejieun | 0:6f82db07119a | 108 | pc.puts("\n<< ADXL Test Start>>\n"); |
leejieun | 0:6f82db07119a | 109 | pc.printf("Device ID: 0x%02x\n", accelerometer.getDevId()); // 0xE5 |
leejieun | 0:6f82db07119a | 110 | |
leejieun | 0:6f82db07119a | 111 | pc.attach(&ReceiveInt, Serial::RxIrq); // RxIrq, TxIrq |
leejieun | 0:6f82db07119a | 112 | myButton.fall(&Btn1Down); |
leejieun | 0:6f82db07119a | 113 | myButton.rise(&Btn1Up); |
leejieun | 0:6f82db07119a | 114 | exButton.fall(&Btn2Down); |
leejieun | 0:6f82db07119a | 115 | exButton.rise(&Btn2Up); |
leejieun | 0:6f82db07119a | 116 | |
leejieun | 0:6f82db07119a | 117 | myButton.disable_irq(); // to avoid unexpected interrupt |
leejieun | 0:6f82db07119a | 118 | exButton.disable_irq(); // to avoid unexpected interrupt |
leejieun | 0:6f82db07119a | 119 | |
leejieun | 0:6f82db07119a | 120 | //Go into standby mode to configure the device. |
leejieun | 0:6f82db07119a | 121 | accelerometer.setPowerControl(0x00); |
leejieun | 0:6f82db07119a | 122 | //Full resolution, +/-16g, 4mg/LSB. |
leejieun | 0:6f82db07119a | 123 | accelerometer.setDataFormatControl(0x0B); // 0b 0000 1011 |
leejieun | 0:6f82db07119a | 124 | //3.2kHz data rate. |
leejieun | 0:6f82db07119a | 125 | accelerometer.setDataRate(ADXL345_3200HZ); |
leejieun | 0:6f82db07119a | 126 | //Measurement mode. |
leejieun | 0:6f82db07119a | 127 | accelerometer.setPowerControl(0x08); // 0b 0000 1000 |
leejieun | 0:6f82db07119a | 128 | |
leejieun | 0:6f82db07119a | 129 | Ticker tickerADXL; |
leejieun | 0:6f82db07119a | 130 | tickerADXL.attach(&ADXLInt, 0.05); |
leejieun | 0:6f82db07119a | 131 | |
leejieun | 0:6f82db07119a | 132 | |
leejieun | 0:6f82db07119a | 133 | I2C I2C_Oled(PB_7, PA_15); // SDA, SCL |
leejieun | 0:6f82db07119a | 134 | I2C_Oled.frequency(400000); // 400kHz clock |
leejieun | 0:6f82db07119a | 135 | Adafruit_SSD1306_I2c myOled(I2C_Oled, PD_2); // reset pin doesn't effect |
leejieun | 0:6f82db07119a | 136 | // Adafruit_SSD1306_I2c myOled(I2C_Oled, PD_2, 64, 128); // make an error |
leejieun | 0:6f82db07119a | 137 | |
leejieun | 0:6f82db07119a | 138 | myOled.clearDisplay(); // clear buffer |
leejieun | 0:6f82db07119a | 139 | myOled.printf("%u x %u OLED Display\r\n", myOled.width(), myOled.height()); |
leejieun | 0:6f82db07119a | 140 | myOled.printf("Device ID: 0x%02x\n", accelerometer.getDevId()); |
leejieun | 0:6f82db07119a | 141 | myOled.display(); // show a image on the OLED |
leejieun | 0:6f82db07119a | 142 | wait(1); |
leejieun | 0:6f82db07119a | 143 | |
leejieun | 0:6f82db07119a | 144 | myButton.enable_irq(); // enable IRQ |
leejieun | 0:6f82db07119a | 145 | exButton.enable_irq(); // enable IRQ |
leejieun | 0:6f82db07119a | 146 | |
leejieun | 0:6f82db07119a | 147 | time_t seconds = time(NULL); |
leejieun | 0:6f82db07119a | 148 | |
leejieun | 0:6f82db07119a | 149 | set_time(1617235200); // Set RTC time to 2021-04-01, 00:00:00 |
leejieun | 0:6f82db07119a | 150 | pc.printf("Time as a basic string = %s", ctime(&seconds)); |
leejieun | 0:6f82db07119a | 151 | |
leejieun | 0:6f82db07119a | 152 | char buffer[32]; |
leejieun | 0:6f82db07119a | 153 | strftime(buffer, 32, "%I:%M %p\n", localtime(&seconds)); |
leejieun | 0:6f82db07119a | 154 | pc.printf("1) Time as a custom formatted string = %s", buffer); |
leejieun | 0:6f82db07119a | 155 | strftime(buffer, 32, "%y-%m-%d, %H:%M:%S\n", localtime(&seconds)); |
leejieun | 0:6f82db07119a | 156 | pc.printf("2) Time as a custom formatted string = %s", buffer); |
leejieun | 0:6f82db07119a | 157 | |
leejieun | 0:6f82db07119a | 158 | // int preStatus1 = 0; |
leejieun | 0:6f82db07119a | 159 | // int preStatus2 = 0; |
leejieun | 0:6f82db07119a | 160 | int tempVal = 0; |
leejieun | 0:6f82db07119a | 161 | char tmpCommand[3]; |
leejieun | 0:6f82db07119a | 162 | int rxVal; |
leejieun | 0:6f82db07119a | 163 | char val7Seg[NUM_CHAR] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71}; |
leejieun | 0:6f82db07119a | 164 | |
leejieun | 0:6f82db07119a | 165 | modeT3 = 1; |
leejieun | 0:6f82db07119a | 166 | my7Seg = 0xFF; |
leejieun | 0:6f82db07119a | 167 | |
leejieun | 0:6f82db07119a | 168 | uint16_t n = 0; |
leejieun | 0:6f82db07119a | 169 | |
leejieun | 0:6f82db07119a | 170 | char tempVal2[10] = {0,}; |
leejieun | 0:6f82db07119a | 171 | unsigned int exLight; |
leejieun | 0:6f82db07119a | 172 | unsigned char posY[2] = {0,}; |
leejieun | 0:6f82db07119a | 173 | int ADXLdata[3]; // new added |
leejieun | 0:6f82db07119a | 174 | // t3.attach(&tickerFunc3, 0.1); // ticker3 start for display |
leejieun | 0:6f82db07119a | 175 | |
leejieun | 0:6f82db07119a | 176 | myOled.clearDisplay(); // clear buffer |
leejieun | 0:6f82db07119a | 177 | |
leejieun | 0:6f82db07119a | 178 | while(1) |
leejieun | 0:6f82db07119a | 179 | { |
leejieun | 0:6f82db07119a | 180 | if (1 == flagT3) { |
leejieun | 0:6f82db07119a | 181 | flagT3 = 0; |
leejieun | 0:6f82db07119a | 182 | n = n + dir; |
leejieun | 0:6f82db07119a | 183 | // if (n > 200) n = 0; |
leejieun | 0:6f82db07119a | 184 | // myAnalogOut = n*0.005f; |
leejieun | 0:6f82db07119a | 185 | // sprintf(tempVal2, "%d, %1.2f\n", n, myAnalogOut.read()); |
leejieun | 0:6f82db07119a | 186 | // pc.puts(tempVal2); |
leejieun | 0:6f82db07119a | 187 | |
leejieun | 0:6f82db07119a | 188 | my7Seg = ~val7Seg[n%16] & 0x7F; |
leejieun | 0:6f82db07119a | 189 | |
leejieun | 0:6f82db07119a | 190 | exLight = lightSensor.read() * 500; // ADC read & send data : about 300us consume |
leejieun | 0:6f82db07119a | 191 | sprintf(tempVal2, "%d\n", exLight); |
leejieun | 0:6f82db07119a | 192 | pc.puts(tempVal2); |
leejieun | 0:6f82db07119a | 193 | |
leejieun | 0:6f82db07119a | 194 | #ifdef OLED_DISPLAY |
leejieun | 0:6f82db07119a | 195 | posY[1] = 64 - (unsigned char)((float)(exLight-300) * 0.512f); // 128/1000 = 0.128 |
leejieun | 0:6f82db07119a | 196 | myOled.drawLine(n, posY[0], n+1, posY[1], 1); |
leejieun | 0:6f82db07119a | 197 | myOled.display(); // OLED display consumes about 28ms |
leejieun | 0:6f82db07119a | 198 | posY[0] = posY[1]; |
leejieun | 0:6f82db07119a | 199 | if (n > 127) { |
leejieun | 0:6f82db07119a | 200 | n = 0; |
leejieun | 0:6f82db07119a | 201 | myOled.clearDisplay(); |
leejieun | 0:6f82db07119a | 202 | } |
leejieun | 0:6f82db07119a | 203 | #endif |
leejieun | 0:6f82db07119a | 204 | |
leejieun | 0:6f82db07119a | 205 | greenLed = !greenLed; |
leejieun | 0:6f82db07119a | 206 | } |
leejieun | 0:6f82db07119a | 207 | |
leejieun | 0:6f82db07119a | 208 | if (1 == flagADXL) { |
leejieun | 0:6f82db07119a | 209 | flagADXL = 0; |
leejieun | 0:6f82db07119a | 210 | accelerometer.getOutput(ADXLdata); // ADXL reading consumes about 80us |
leejieun | 0:6f82db07119a | 211 | 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) |
leejieun | 0:6f82db07119a | 212 | //pc.printf("%d\n",rxVal); |
leejieun | 0:6f82db07119a | 213 | |
leejieun | 0:6f82db07119a | 214 | if (rxVal == 1){ |
leejieun | 0:6f82db07119a | 215 | //posY[1] = ADXLdata[0]; // 128/500 = 0.256 |
leejieun | 0:6f82db07119a | 216 | posY[1] = 64 - (((float)ADXLdata[0]+200) * 0.032f); |
leejieun | 0:6f82db07119a | 217 | myOled.drawLine(n, posY[0], n+1, posY[1], 1); |
leejieun | 0:6f82db07119a | 218 | myOled.display(); // OLED display consumes about 28ms |
leejieun | 0:6f82db07119a | 219 | posY[0] = posY[1]; |
leejieun | 0:6f82db07119a | 220 | n++; |
leejieun | 0:6f82db07119a | 221 | if (n > 127) { |
leejieun | 0:6f82db07119a | 222 | n = 0; |
leejieun | 0:6f82db07119a | 223 | myOled.clearDisplay(); |
leejieun | 0:6f82db07119a | 224 | } |
leejieun | 0:6f82db07119a | 225 | } |
leejieun | 0:6f82db07119a | 226 | |
leejieun | 0:6f82db07119a | 227 | if (rxVal == 2){ |
leejieun | 0:6f82db07119a | 228 | //posY[1] = ADXLdata[1]; // 128/500 = 0.256 |
leejieun | 0:6f82db07119a | 229 | posY[1] = 64 - (((float)ADXLdata[1]+200) * 0.032f); |
leejieun | 0:6f82db07119a | 230 | myOled.drawLine(n, posY[0], n+1, posY[1], 1); |
leejieun | 0:6f82db07119a | 231 | myOled.display(); // OLED display consumes about 28ms |
leejieun | 0:6f82db07119a | 232 | posY[0] = posY[1]; |
leejieun | 0:6f82db07119a | 233 | n++; |
leejieun | 0:6f82db07119a | 234 | if (n > 127) { |
leejieun | 0:6f82db07119a | 235 | n = 0; |
leejieun | 0:6f82db07119a | 236 | myOled.clearDisplay(); |
leejieun | 0:6f82db07119a | 237 | } |
leejieun | 0:6f82db07119a | 238 | } |
leejieun | 0:6f82db07119a | 239 | |
leejieun | 0:6f82db07119a | 240 | |
leejieun | 0:6f82db07119a | 241 | if (rxVal == 3){ |
leejieun | 0:6f82db07119a | 242 | //posY[1] = ADXLdata[2]; // 128/500 = 0.256 |
leejieun | 0:6f82db07119a | 243 | posY[1] = 64 - ((float)ADXLdata[2] * 0.032f); |
leejieun | 0:6f82db07119a | 244 | myOled.drawLine(n, posY[0], n+1, posY[1], 1); |
leejieun | 0:6f82db07119a | 245 | myOled.display(); // OLED display consumes about 28ms |
leejieun | 0:6f82db07119a | 246 | posY[0] = posY[1]; |
leejieun | 0:6f82db07119a | 247 | n++; |
leejieun | 0:6f82db07119a | 248 | if (n > 127) { |
leejieun | 0:6f82db07119a | 249 | n = 0; |
leejieun | 0:6f82db07119a | 250 | myOled.clearDisplay(); |
leejieun | 0:6f82db07119a | 251 | } |
leejieun | 0:6f82db07119a | 252 | } |
leejieun | 0:6f82db07119a | 253 | |
leejieun | 0:6f82db07119a | 254 | if (rxVal == 0){ |
leejieun | 0:6f82db07119a | 255 | myOled.clearDisplay(); |
leejieun | 0:6f82db07119a | 256 | } |
leejieun | 0:6f82db07119a | 257 | |
leejieun | 0:6f82db07119a | 258 | |
leejieun | 0:6f82db07119a | 259 | } |
leejieun | 0:6f82db07119a | 260 | |
leejieun | 0:6f82db07119a | 261 | if (1 == flagRx){ |
leejieun | 0:6f82db07119a | 262 | flagRx = 0; |
leejieun | 0:6f82db07119a | 263 | tmpCommand[0] = rxData[0]; |
leejieun | 0:6f82db07119a | 264 | tmpCommand[1] = rxData[1]; |
leejieun | 0:6f82db07119a | 265 | tmpCommand[2] = 0; |
leejieun | 0:6f82db07119a | 266 | rxVal = atoi(rxData+2); |
leejieun | 0:6f82db07119a | 267 | |
leejieun | 0:6f82db07119a | 268 | if (0 == strcmp(tmpCommand, "LD")) { // control a LED |
leejieun | 0:6f82db07119a | 269 | pc.printf("val = %d\n", rxVal); |
leejieun | 0:6f82db07119a | 270 | |
leejieun | 0:6f82db07119a | 271 | greenLed = (1 == rxVal)? 1:0; |
leejieun | 0:6f82db07119a | 272 | // greenLed = rxVal? 1:0; |
leejieun | 0:6f82db07119a | 273 | } |
leejieun | 0:6f82db07119a | 274 | if (0 == strcmp(tmpCommand, "RE")) { // reset all variables |
leejieun | 0:6f82db07119a | 275 | greenLed = 0; |
leejieun | 0:6f82db07119a | 276 | redLed = 1; |
leejieun | 0:6f82db07119a | 277 | n = 0; |
leejieun | 0:6f82db07119a | 278 | } |
leejieun | 0:6f82db07119a | 279 | if (0 == strcmp(tmpCommand, "OL")) |
leejieun | 0:6f82db07119a | 280 | { |
leejieun | 0:6f82db07119a | 281 | greenLed = 1; |
leejieun | 0:6f82db07119a | 282 | redLed = 1; |
leejieun | 0:6f82db07119a | 283 | } |
leejieun | 0:6f82db07119a | 284 | |
leejieun | 0:6f82db07119a | 285 | } |
leejieun | 0:6f82db07119a | 286 | } |
leejieun | 0:6f82db07119a | 287 | |
leejieun | 0:6f82db07119a | 288 | |
leejieun | 0:6f82db07119a | 289 | } |