0608 practice 1

Dependencies:   mbed ADXL345 Adafruit_GFX

Committer:
leejieun
Date:
Wed Jun 08 08:14:15 2022 +0000
Revision:
0:6f82db07119a
0608 practice 1

Who changed what in which revision?

UserRevisionLine numberNew 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 }