0602 practice 2

Dependencies:   mbed Adafruit_GFX

Committer:
leejieun
Date:
Thu Jun 02 08:33:35 2022 +0000
Revision:
0:14f55a40d9af
0602 practice 2

Who changed what in which revision?

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