0602 practice 2
Dependencies: mbed Adafruit_GFX
2.cpp@0:14f55a40d9af, 2022-06-02 (annotated)
- Committer:
- leejieun
- Date:
- Thu Jun 02 08:33:35 2022 +0000
- Revision:
- 0:14f55a40d9af
0602 practice 2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
leejieun | 0:14f55a40d9af | 1 | #include "mbed.h" |
leejieun | 0:14f55a40d9af | 2 | #include "Adafruit_SSD1306.h" // Adafruit_GFX library |
leejieun | 0:14f55a40d9af | 3 | #include "unist.h" |
leejieun | 0:14f55a40d9af | 4 | |
leejieun | 0:14f55a40d9af | 5 | #define NUM_CHAR 16 |
leejieun | 0:14f55a40d9af | 6 | |
leejieun | 0:14f55a40d9af | 7 | Serial pc(SERIAL_TX, SERIAL_RX); |
leejieun | 0:14f55a40d9af | 8 | DigitalOut myled(LED1); |
leejieun | 0:14f55a40d9af | 9 | DigitalOut redLed(PA_12); |
leejieun | 0:14f55a40d9af | 10 | Timer t1, t2; |
leejieun | 0:14f55a40d9af | 11 | Ticker t3, t4; |
leejieun | 0:14f55a40d9af | 12 | Ticker ADCtimer; |
leejieun | 0:14f55a40d9af | 13 | |
leejieun | 0:14f55a40d9af | 14 | InterruptIn myButton(PC_13); |
leejieun | 0:14f55a40d9af | 15 | InterruptIn exButton(PC_11); |
leejieun | 0:14f55a40d9af | 16 | |
leejieun | 0:14f55a40d9af | 17 | BusOut my7Seg(PA_8, PA_9, PA_10, PC_9, PC_8, PC_7, PC_6, PA_11); // 8bit data |
leejieun | 0:14f55a40d9af | 18 | // LSB, , MSB |
leejieun | 0:14f55a40d9af | 19 | |
leejieun | 0:14f55a40d9af | 20 | I2C I2C_Oled(PB_7, PA_15); // SDA, SCL |
leejieun | 0:14f55a40d9af | 21 | AnalogOut myAnalogOut(PA_4); // new added |
leejieun | 0:14f55a40d9af | 22 | AnalogIn lightSensor(PA_0); |
leejieun | 0:14f55a40d9af | 23 | |
leejieun | 0:14f55a40d9af | 24 | |
leejieun | 0:14f55a40d9af | 25 | char rxData[5]; |
leejieun | 0:14f55a40d9af | 26 | bool flagRx = 0; |
leejieun | 0:14f55a40d9af | 27 | int dir = 1; // 1: increase, -1: decrease |
leejieun | 0:14f55a40d9af | 28 | bool flagT3 = 0; |
leejieun | 0:14f55a40d9af | 29 | bool modeT3 = 0; // 0: stop, 1: working |
leejieun | 0:14f55a40d9af | 30 | bool modeADC = 0; |
leejieun | 0:14f55a40d9af | 31 | bool flagADC = 0; // new added |
leejieun | 0:14f55a40d9af | 32 | const float samplingTime = 0.00005; |
leejieun | 0:14f55a40d9af | 33 | |
leejieun | 0:14f55a40d9af | 34 | void GetADC(void) |
leejieun | 0:14f55a40d9af | 35 | { |
leejieun | 0:14f55a40d9af | 36 | flagADC = 1; |
leejieun | 0:14f55a40d9af | 37 | |
leejieun | 0:14f55a40d9af | 38 | } |
leejieun | 0:14f55a40d9af | 39 | void ReceiveInt() { |
leejieun | 0:14f55a40d9af | 40 | char inChar; |
leejieun | 0:14f55a40d9af | 41 | static char rxCount = 0; |
leejieun | 0:14f55a40d9af | 42 | static char rxBuf[4]; |
leejieun | 0:14f55a40d9af | 43 | |
leejieun | 0:14f55a40d9af | 44 | while(1 == pc.readable()) { |
leejieun | 0:14f55a40d9af | 45 | inChar = pc.getc(); |
leejieun | 0:14f55a40d9af | 46 | if ('<' == inChar){ |
leejieun | 0:14f55a40d9af | 47 | rxCount = 1; |
leejieun | 0:14f55a40d9af | 48 | } |
leejieun | 0:14f55a40d9af | 49 | else if (rxCount > 0 && rxCount < 5) { |
leejieun | 0:14f55a40d9af | 50 | rxBuf[rxCount-1] = inChar; |
leejieun | 0:14f55a40d9af | 51 | rxCount++; |
leejieun | 0:14f55a40d9af | 52 | } |
leejieun | 0:14f55a40d9af | 53 | else if (5 == rxCount && '>' == inChar) { |
leejieun | 0:14f55a40d9af | 54 | rxCount = 0; |
leejieun | 0:14f55a40d9af | 55 | flagRx = 1; |
leejieun | 0:14f55a40d9af | 56 | memcpy(rxData, rxBuf, 4); |
leejieun | 0:14f55a40d9af | 57 | // pc.putc(rxData[0]); |
leejieun | 0:14f55a40d9af | 58 | // pc.putc(rxData[1]); |
leejieun | 0:14f55a40d9af | 59 | // pc.putc(rxData[2]); |
leejieun | 0:14f55a40d9af | 60 | // pc.putc(rxData[3]); |
leejieun | 0:14f55a40d9af | 61 | |
leejieun | 0:14f55a40d9af | 62 | // pc.puts(rxData); |
leejieun | 0:14f55a40d9af | 63 | } |
leejieun | 0:14f55a40d9af | 64 | else { |
leejieun | 0:14f55a40d9af | 65 | rxCount = 0; |
leejieun | 0:14f55a40d9af | 66 | } |
leejieun | 0:14f55a40d9af | 67 | } |
leejieun | 0:14f55a40d9af | 68 | } |
leejieun | 0:14f55a40d9af | 69 | |
leejieun | 0:14f55a40d9af | 70 | void tickerFunc3() { |
leejieun | 0:14f55a40d9af | 71 | flagT3 = 1; |
leejieun | 0:14f55a40d9af | 72 | } |
leejieun | 0:14f55a40d9af | 73 | |
leejieun | 0:14f55a40d9af | 74 | void Btn1Down() { |
leejieun | 0:14f55a40d9af | 75 | // pc.puts("1 pushed\n"); // for debugging |
leejieun | 0:14f55a40d9af | 76 | dir = -1*dir; |
leejieun | 0:14f55a40d9af | 77 | } |
leejieun | 0:14f55a40d9af | 78 | |
leejieun | 0:14f55a40d9af | 79 | void Btn1Up() { |
leejieun | 0:14f55a40d9af | 80 | // pc.puts("1 released\n"); // for debugging |
leejieun | 0:14f55a40d9af | 81 | myled = !myled; |
leejieun | 0:14f55a40d9af | 82 | } |
leejieun | 0:14f55a40d9af | 83 | |
leejieun | 0:14f55a40d9af | 84 | void Btn2Down() { |
leejieun | 0:14f55a40d9af | 85 | // pc.puts("2 pushed\n"); // for debugging |
leejieun | 0:14f55a40d9af | 86 | if (1 == modeT3) t3.detach(); |
leejieun | 0:14f55a40d9af | 87 | else t3.attach(tickerFunc3, 0.1); |
leejieun | 0:14f55a40d9af | 88 | modeT3 = !modeT3; |
leejieun | 0:14f55a40d9af | 89 | } |
leejieun | 0:14f55a40d9af | 90 | |
leejieun | 0:14f55a40d9af | 91 | void Btn2Up() { |
leejieun | 0:14f55a40d9af | 92 | // pc.puts("2 released\n"); // for debugging |
leejieun | 0:14f55a40d9af | 93 | redLed = !redLed; |
leejieun | 0:14f55a40d9af | 94 | } |
leejieun | 0:14f55a40d9af | 95 | |
leejieun | 0:14f55a40d9af | 96 | // new added |
leejieun | 0:14f55a40d9af | 97 | void ADCInt() |
leejieun | 0:14f55a40d9af | 98 | { |
leejieun | 0:14f55a40d9af | 99 | flagADC = 1; |
leejieun | 0:14f55a40d9af | 100 | } |
leejieun | 0:14f55a40d9af | 101 | |
leejieun | 0:14f55a40d9af | 102 | // new added |
leejieun | 0:14f55a40d9af | 103 | int ADCcontrol(int val); |
leejieun | 0:14f55a40d9af | 104 | |
leejieun | 0:14f55a40d9af | 105 | |
leejieun | 0:14f55a40d9af | 106 | int main() |
leejieun | 0:14f55a40d9af | 107 | { |
leejieun | 0:14f55a40d9af | 108 | pc.baud(115200); |
leejieun | 0:14f55a40d9af | 109 | pc.puts("\n<< ADC Test Start>>\n"); |
leejieun | 0:14f55a40d9af | 110 | |
leejieun | 0:14f55a40d9af | 111 | myButton.disable_irq(); // to avoid unexpected interrupt |
leejieun | 0:14f55a40d9af | 112 | exButton.disable_irq(); // to avoid unexpected interrupt |
leejieun | 0:14f55a40d9af | 113 | |
leejieun | 0:14f55a40d9af | 114 | pc.attach(&ReceiveInt, Serial::RxIrq); // RxIrq, TxIrq |
leejieun | 0:14f55a40d9af | 115 | myButton.fall(&Btn1Down); |
leejieun | 0:14f55a40d9af | 116 | myButton.rise(&Btn1Up); |
leejieun | 0:14f55a40d9af | 117 | exButton.fall(&Btn2Down); |
leejieun | 0:14f55a40d9af | 118 | exButton.rise(&Btn2Up); |
leejieun | 0:14f55a40d9af | 119 | |
leejieun | 0:14f55a40d9af | 120 | ADCtimer.attach(&GetADC, 0.01); // new added |
leejieun | 0:14f55a40d9af | 121 | |
leejieun | 0:14f55a40d9af | 122 | float exLight; // new added |
leejieun | 0:14f55a40d9af | 123 | |
leejieun | 0:14f55a40d9af | 124 | I2C_Oled.frequency(400000); // 400kHz clock |
leejieun | 0:14f55a40d9af | 125 | // Adafruit_SSD1306_I2c myOled(I2C_Oled, PD_2, 0x78, 64, 128); // reset pin doesn't effect |
leejieun | 0:14f55a40d9af | 126 | // |
leejieun | 0:14f55a40d9af | 127 | // myOled.clearDisplay(); |
leejieun | 0:14f55a40d9af | 128 | // myOled.drawBitmap(0, 0, unistLogo, 128, 64, 1); |
leejieun | 0:14f55a40d9af | 129 | // myOled.display(); |
leejieun | 0:14f55a40d9af | 130 | // wait(1); |
leejieun | 0:14f55a40d9af | 131 | |
leejieun | 0:14f55a40d9af | 132 | myButton.enable_irq(); // enable IRQ |
leejieun | 0:14f55a40d9af | 133 | exButton.enable_irq(); // enable IRQ |
leejieun | 0:14f55a40d9af | 134 | |
leejieun | 0:14f55a40d9af | 135 | time_t seconds = time(NULL); |
leejieun | 0:14f55a40d9af | 136 | |
leejieun | 0:14f55a40d9af | 137 | set_time(1651121217); // Set RTC time to 2022-4월-28, PM 1:46:57 |
leejieun | 0:14f55a40d9af | 138 | pc.printf("Time as a basic string = %s", ctime(&seconds)); |
leejieun | 0:14f55a40d9af | 139 | |
leejieun | 0:14f55a40d9af | 140 | char buffer[32]; |
leejieun | 0:14f55a40d9af | 141 | strftime(buffer, 32, "%I:%M %p\n", localtime(&seconds)); |
leejieun | 0:14f55a40d9af | 142 | pc.printf("1) Time as a custom formatted string = %s", buffer); |
leejieun | 0:14f55a40d9af | 143 | strftime(buffer, 32, "%y-%m-%d, %H:%M:%S\n", localtime(&seconds)); |
leejieun | 0:14f55a40d9af | 144 | pc.printf("2) Time as a custom formatted string = %s", buffer); |
leejieun | 0:14f55a40d9af | 145 | |
leejieun | 0:14f55a40d9af | 146 | char tmpCommand[3]; |
leejieun | 0:14f55a40d9af | 147 | int rxVal; |
leejieun | 0:14f55a40d9af | 148 | char val7Seg[NUM_CHAR] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71}; |
leejieun | 0:14f55a40d9af | 149 | |
leejieun | 0:14f55a40d9af | 150 | my7Seg = 0xFF; |
leejieun | 0:14f55a40d9af | 151 | |
leejieun | 0:14f55a40d9af | 152 | uint16_t n = 0; |
leejieun | 0:14f55a40d9af | 153 | uint16_t k = 0; |
leejieun | 0:14f55a40d9af | 154 | |
leejieun | 0:14f55a40d9af | 155 | char tempVal2[10] = {0,}; |
leejieun | 0:14f55a40d9af | 156 | float tempVal3; |
leejieun | 0:14f55a40d9af | 157 | |
leejieun | 0:14f55a40d9af | 158 | // ADCtimer.attach(&ADCInt, samplingTime); // 50us is appropriate for F303RE (20kHz) |
leejieun | 0:14f55a40d9af | 159 | |
leejieun | 0:14f55a40d9af | 160 | float soundFreq = 500; // Hz |
leejieun | 0:14f55a40d9af | 161 | pc.printf("smapling time = %dus, sound frequency = %dHz\n", (int)(samplingTime*1000000), (int)soundFreq); |
leejieun | 0:14f55a40d9af | 162 | |
leejieun | 0:14f55a40d9af | 163 | while(1) |
leejieun | 0:14f55a40d9af | 164 | { |
leejieun | 0:14f55a40d9af | 165 | /////////////////////////////////////////////////////////////////// |
leejieun | 0:14f55a40d9af | 166 | if (1 == flagADC) { |
leejieun | 0:14f55a40d9af | 167 | flagADC = 0; |
leejieun | 0:14f55a40d9af | 168 | exLight = lightSensor.read()*3.3; |
leejieun | 0:14f55a40d9af | 169 | myled = !myled; |
leejieun | 0:14f55a40d9af | 170 | |
leejieun | 0:14f55a40d9af | 171 | pc.printf("%f\n", exLight); |
leejieun | 0:14f55a40d9af | 172 | } |
leejieun | 0:14f55a40d9af | 173 | |
leejieun | 0:14f55a40d9af | 174 | if (exLight > 2){ |
leejieun | 0:14f55a40d9af | 175 | myled = 0; |
leejieun | 0:14f55a40d9af | 176 | redLed = 0; |
leejieun | 0:14f55a40d9af | 177 | } |
leejieun | 0:14f55a40d9af | 178 | else if (exLight < 0.5){ |
leejieun | 0:14f55a40d9af | 179 | myled = 1; |
leejieun | 0:14f55a40d9af | 180 | redLed = 1; |
leejieun | 0:14f55a40d9af | 181 | } |
leejieun | 0:14f55a40d9af | 182 | else{ |
leejieun | 0:14f55a40d9af | 183 | myled = 0; |
leejieun | 0:14f55a40d9af | 184 | redLed = 1; |
leejieun | 0:14f55a40d9af | 185 | } |
leejieun | 0:14f55a40d9af | 186 | |
leejieun | 0:14f55a40d9af | 187 | /////////////////////////////////////////////////////////////////// |
leejieun | 0:14f55a40d9af | 188 | |
leejieun | 0:14f55a40d9af | 189 | if (exLight < 0.5){ |
leejieun | 0:14f55a40d9af | 190 | soundFreq = 400; |
leejieun | 0:14f55a40d9af | 191 | } |
leejieun | 0:14f55a40d9af | 192 | else if (exLight < 1){ |
leejieun | 0:14f55a40d9af | 193 | soundFreq = 800; |
leejieun | 0:14f55a40d9af | 194 | } |
leejieun | 0:14f55a40d9af | 195 | else{ |
leejieun | 0:14f55a40d9af | 196 | soundFreq = 2000; |
leejieun | 0:14f55a40d9af | 197 | } |
leejieun | 0:14f55a40d9af | 198 | |
leejieun | 0:14f55a40d9af | 199 | |
leejieun | 0:14f55a40d9af | 200 | if (1 == flagADC) { |
leejieun | 0:14f55a40d9af | 201 | flagADC = 0; |
leejieun | 0:14f55a40d9af | 202 | tempVal3 = soundFreq*n*samplingTime; |
leejieun | 0:14f55a40d9af | 203 | myAnalogOut = 0.3*(sin(2*3.14159*tempVal3)*0.5+0.5); // an angle is expressed in radians. 2*pi*f*t, 10~20 times amplication |
leejieun | 0:14f55a40d9af | 204 | if (tempVal3 > 1.0f) n = 0; // to prevent a phase shift due to overflow of the unsinged int variable |
leejieun | 0:14f55a40d9af | 205 | n++; |
leejieun | 0:14f55a40d9af | 206 | } |
leejieun | 0:14f55a40d9af | 207 | if (1 == flagT3) { |
leejieun | 0:14f55a40d9af | 208 | flagT3 = 0; |
leejieun | 0:14f55a40d9af | 209 | k = k + dir; |
leejieun | 0:14f55a40d9af | 210 | tempVal3 = soundFreq*k*samplingTime*0.1f; // general float calculation |
leejieun | 0:14f55a40d9af | 211 | // tempVal3 = soundFreq*k*samplingTime*0.1; // double precision calculation |
leejieun | 0:14f55a40d9af | 212 | myAnalogOut = sin(2*3.14159*tempVal3)*0.5+0.5; // 100 times slower |
leejieun | 0:14f55a40d9af | 213 | sprintf(tempVal2, "%1.2f, %1.2f\n", tempVal3, myAnalogOut.read()); |
leejieun | 0:14f55a40d9af | 214 | pc.puts(tempVal2); |
leejieun | 0:14f55a40d9af | 215 | |
leejieun | 0:14f55a40d9af | 216 | if (tempVal3 > 1.0f) k = 0; // to prevent a phase shift due to overflow of the unsinged int variable |
leejieun | 0:14f55a40d9af | 217 | k++; |
leejieun | 0:14f55a40d9af | 218 | } |
leejieun | 0:14f55a40d9af | 219 | |
leejieun | 0:14f55a40d9af | 220 | if (1 == flagRx){ |
leejieun | 0:14f55a40d9af | 221 | flagRx = 0; |
leejieun | 0:14f55a40d9af | 222 | tmpCommand[0] = rxData[0]; |
leejieun | 0:14f55a40d9af | 223 | tmpCommand[1] = rxData[1]; |
leejieun | 0:14f55a40d9af | 224 | tmpCommand[2] = 0; |
leejieun | 0:14f55a40d9af | 225 | rxVal = atoi(rxData+2); |
leejieun | 0:14f55a40d9af | 226 | |
leejieun | 0:14f55a40d9af | 227 | if (0 == strcmp(tmpCommand, "LD")) { // control a LED |
leejieun | 0:14f55a40d9af | 228 | pc.printf("val = %d\n", rxVal); |
leejieun | 0:14f55a40d9af | 229 | |
leejieun | 0:14f55a40d9af | 230 | myled = (1 == rxVal)? 1:0; |
leejieun | 0:14f55a40d9af | 231 | // myled = rxVal? 1:0; |
leejieun | 0:14f55a40d9af | 232 | } |
leejieun | 0:14f55a40d9af | 233 | else if (0 == strcmp(tmpCommand, "RE")) { // reset all variables |
leejieun | 0:14f55a40d9af | 234 | myled = 0; |
leejieun | 0:14f55a40d9af | 235 | redLed = 1; |
leejieun | 0:14f55a40d9af | 236 | n = 0; |
leejieun | 0:14f55a40d9af | 237 | k = 0; |
leejieun | 0:14f55a40d9af | 238 | } |
leejieun | 0:14f55a40d9af | 239 | else if (0 == strcmp(tmpCommand, "DA")) { // ADC control |
leejieun | 0:14f55a40d9af | 240 | int tempVal; |
leejieun | 0:14f55a40d9af | 241 | |
leejieun | 0:14f55a40d9af | 242 | tempVal = ADCcontrol(rxVal); |
leejieun | 0:14f55a40d9af | 243 | if (1 != tempVal) pc.puts(">> Wrong command\n"); |
leejieun | 0:14f55a40d9af | 244 | else my7Seg = ~val7Seg[rxVal%16] & 0x7F; |
leejieun | 0:14f55a40d9af | 245 | } |
leejieun | 0:14f55a40d9af | 246 | } |
leejieun | 0:14f55a40d9af | 247 | } |
leejieun | 0:14f55a40d9af | 248 | } |
leejieun | 0:14f55a40d9af | 249 | |
leejieun | 0:14f55a40d9af | 250 | int ADCcontrol(int val) { |
leejieun | 0:14f55a40d9af | 251 | if (val<1 || val>2) return 0; |
leejieun | 0:14f55a40d9af | 252 | switch (val) { |
leejieun | 0:14f55a40d9af | 253 | case 1: // sound out On/Off |
leejieun | 0:14f55a40d9af | 254 | if (0 == modeADC) { |
leejieun | 0:14f55a40d9af | 255 | modeADC = 1; |
leejieun | 0:14f55a40d9af | 256 | |
leejieun | 0:14f55a40d9af | 257 | // for 10kHz sine wave generation, it's needed to have |
leejieun | 0:14f55a40d9af | 258 | // a sampling frequency in 10 times of that frequency, |
leejieun | 0:14f55a40d9af | 259 | // or 100kHz -> 10us period |
leejieun | 0:14f55a40d9af | 260 | ADCtimer.attach(&ADCInt, samplingTime); |
leejieun | 0:14f55a40d9af | 261 | pc.puts(">> Sound On\n"); |
leejieun | 0:14f55a40d9af | 262 | } |
leejieun | 0:14f55a40d9af | 263 | else { |
leejieun | 0:14f55a40d9af | 264 | modeADC = 0; |
leejieun | 0:14f55a40d9af | 265 | ADCtimer.detach(); |
leejieun | 0:14f55a40d9af | 266 | pc.puts(">> Sound Off\n"); |
leejieun | 0:14f55a40d9af | 267 | } |
leejieun | 0:14f55a40d9af | 268 | break; |
leejieun | 0:14f55a40d9af | 269 | case 2: |
leejieun | 0:14f55a40d9af | 270 | if (0 == modeT3) { |
leejieun | 0:14f55a40d9af | 271 | modeT3 = 1; |
leejieun | 0:14f55a40d9af | 272 | t3.attach(&tickerFunc3, 0.02); // ticker3 start |
leejieun | 0:14f55a40d9af | 273 | pc.puts(">> Plotting Start\n"); |
leejieun | 0:14f55a40d9af | 274 | } |
leejieun | 0:14f55a40d9af | 275 | else { |
leejieun | 0:14f55a40d9af | 276 | modeT3 = 0; |
leejieun | 0:14f55a40d9af | 277 | t3.detach(); |
leejieun | 0:14f55a40d9af | 278 | pc.puts(">> Plotting Stop\n"); |
leejieun | 0:14f55a40d9af | 279 | } |
leejieun | 0:14f55a40d9af | 280 | break; |
leejieun | 0:14f55a40d9af | 281 | default: |
leejieun | 0:14f55a40d9af | 282 | break; |
leejieun | 0:14f55a40d9af | 283 | } |
leejieun | 0:14f55a40d9af | 284 | return 1; |
leejieun | 0:14f55a40d9af | 285 | } |