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