class

Dependencies:   mbed ADXL345 Adafruit_GFX

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?

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