0602 practice 2
Dependencies: mbed Adafruit_GFX
Diff: 2.cpp
- Revision:
- 0:14f55a40d9af
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/2.cpp Thu Jun 02 08:33:35 2022 +0000 @@ -0,0 +1,285 @@ +#include "mbed.h" +#include "Adafruit_SSD1306.h" // Adafruit_GFX library +#include "unist.h" + +#define NUM_CHAR 16 + +Serial pc(SERIAL_TX, SERIAL_RX); +DigitalOut myled(LED1); +DigitalOut redLed(PA_12); +Timer t1, t2; +Ticker t3, t4; +Ticker ADCtimer; + +InterruptIn myButton(PC_13); +InterruptIn exButton(PC_11); + +BusOut my7Seg(PA_8, PA_9, PA_10, PC_9, PC_8, PC_7, PC_6, PA_11); // 8bit data + // LSB, , MSB + +I2C I2C_Oled(PB_7, PA_15); // SDA, SCL +AnalogOut myAnalogOut(PA_4); // new added +AnalogIn lightSensor(PA_0); + + +char rxData[5]; +bool flagRx = 0; +int dir = 1; // 1: increase, -1: decrease +bool flagT3 = 0; +bool modeT3 = 0; // 0: stop, 1: working +bool modeADC = 0; +bool flagADC = 0; // new added +const float samplingTime = 0.00005; + +void GetADC(void) +{ + flagADC = 1; + +} +void ReceiveInt() { + char inChar; + static char rxCount = 0; + static char rxBuf[4]; + + while(1 == pc.readable()) { + inChar = pc.getc(); + if ('<' == inChar){ + rxCount = 1; + } + else if (rxCount > 0 && rxCount < 5) { + rxBuf[rxCount-1] = inChar; + rxCount++; + } + else if (5 == rxCount && '>' == inChar) { + rxCount = 0; + flagRx = 1; + memcpy(rxData, rxBuf, 4); +// pc.putc(rxData[0]); +// pc.putc(rxData[1]); +// pc.putc(rxData[2]); +// pc.putc(rxData[3]); + +// pc.puts(rxData); + } + else { + rxCount = 0; + } + } +} + +void tickerFunc3() { + flagT3 = 1; +} + +void Btn1Down() { +// pc.puts("1 pushed\n"); // for debugging + dir = -1*dir; +} + +void Btn1Up() { +// pc.puts("1 released\n"); // for debugging + myled = !myled; +} + +void Btn2Down() { +// pc.puts("2 pushed\n"); // for debugging + if (1 == modeT3) t3.detach(); + else t3.attach(tickerFunc3, 0.1); + modeT3 = !modeT3; +} + +void Btn2Up() { +// pc.puts("2 released\n"); // for debugging + redLed = !redLed; +} + +// new added +void ADCInt() +{ + flagADC = 1; +} + +// new added +int ADCcontrol(int val); + + +int main() +{ + pc.baud(115200); + pc.puts("\n<< ADC Test Start>>\n"); + + myButton.disable_irq(); // to avoid unexpected interrupt + exButton.disable_irq(); // to avoid unexpected interrupt + + pc.attach(&ReceiveInt, Serial::RxIrq); // RxIrq, TxIrq + myButton.fall(&Btn1Down); + myButton.rise(&Btn1Up); + exButton.fall(&Btn2Down); + exButton.rise(&Btn2Up); + + ADCtimer.attach(&GetADC, 0.01); // new added + + float exLight; // new added + + I2C_Oled.frequency(400000); // 400kHz clock +// Adafruit_SSD1306_I2c myOled(I2C_Oled, PD_2, 0x78, 64, 128); // reset pin doesn't effect +// +// myOled.clearDisplay(); +// myOled.drawBitmap(0, 0, unistLogo, 128, 64, 1); +// myOled.display(); +// wait(1); + + myButton.enable_irq(); // enable IRQ + exButton.enable_irq(); // enable IRQ + + time_t seconds = time(NULL); + + set_time(1651121217); // Set RTC time to 2022-4월-28, PM 1:46:57 + pc.printf("Time as a basic string = %s", ctime(&seconds)); + + char buffer[32]; + strftime(buffer, 32, "%I:%M %p\n", localtime(&seconds)); + pc.printf("1) Time as a custom formatted string = %s", buffer); + strftime(buffer, 32, "%y-%m-%d, %H:%M:%S\n", localtime(&seconds)); + pc.printf("2) Time as a custom formatted string = %s", buffer); + + char tmpCommand[3]; + int rxVal; + char val7Seg[NUM_CHAR] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71}; + + my7Seg = 0xFF; + + uint16_t n = 0; + uint16_t k = 0; + + char tempVal2[10] = {0,}; + float tempVal3; + +// ADCtimer.attach(&ADCInt, samplingTime); // 50us is appropriate for F303RE (20kHz) + + float soundFreq = 500; // Hz + pc.printf("smapling time = %dus, sound frequency = %dHz\n", (int)(samplingTime*1000000), (int)soundFreq); + + while(1) + { +/////////////////////////////////////////////////////////////////// + if (1 == flagADC) { + flagADC = 0; + exLight = lightSensor.read()*3.3; + myled = !myled; + + pc.printf("%f\n", exLight); + } + + if (exLight > 2){ + myled = 0; + redLed = 0; + } + else if (exLight < 0.5){ + myled = 1; + redLed = 1; + } + else{ + myled = 0; + redLed = 1; + } + +/////////////////////////////////////////////////////////////////// + + if (exLight < 0.5){ + soundFreq = 400; + } + else if (exLight < 1){ + soundFreq = 800; + } + else{ + soundFreq = 2000; + } + + + if (1 == flagADC) { + flagADC = 0; + tempVal3 = soundFreq*n*samplingTime; + 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 + if (tempVal3 > 1.0f) n = 0; // to prevent a phase shift due to overflow of the unsinged int variable + n++; + } + if (1 == flagT3) { + flagT3 = 0; + k = k + dir; + tempVal3 = soundFreq*k*samplingTime*0.1f; // general float calculation +// tempVal3 = soundFreq*k*samplingTime*0.1; // double precision calculation + myAnalogOut = sin(2*3.14159*tempVal3)*0.5+0.5; // 100 times slower + sprintf(tempVal2, "%1.2f, %1.2f\n", tempVal3, myAnalogOut.read()); + pc.puts(tempVal2); + + if (tempVal3 > 1.0f) k = 0; // to prevent a phase shift due to overflow of the unsinged int variable + k++; + } + + if (1 == flagRx){ + flagRx = 0; + tmpCommand[0] = rxData[0]; + tmpCommand[1] = rxData[1]; + tmpCommand[2] = 0; + rxVal = atoi(rxData+2); + + if (0 == strcmp(tmpCommand, "LD")) { // control a LED + pc.printf("val = %d\n", rxVal); + + myled = (1 == rxVal)? 1:0; +// myled = rxVal? 1:0; + } + else if (0 == strcmp(tmpCommand, "RE")) { // reset all variables + myled = 0; + redLed = 1; + n = 0; + k = 0; + } + else if (0 == strcmp(tmpCommand, "DA")) { // ADC control + int tempVal; + + tempVal = ADCcontrol(rxVal); + if (1 != tempVal) pc.puts(">> Wrong command\n"); + else my7Seg = ~val7Seg[rxVal%16] & 0x7F; + } + } + } +} + +int ADCcontrol(int val) { + if (val<1 || val>2) return 0; + switch (val) { + case 1: // sound out On/Off + if (0 == modeADC) { + modeADC = 1; + + // for 10kHz sine wave generation, it's needed to have + // a sampling frequency in 10 times of that frequency, + // or 100kHz -> 10us period + ADCtimer.attach(&ADCInt, samplingTime); + pc.puts(">> Sound On\n"); + } + else { + modeADC = 0; + ADCtimer.detach(); + pc.puts(">> Sound Off\n"); + } + break; + case 2: + if (0 == modeT3) { + modeT3 = 1; + t3.attach(&tickerFunc3, 0.02); // ticker3 start + pc.puts(">> Plotting Start\n"); + } + else { + modeT3 = 0; + t3.detach(); + pc.puts(">> Plotting Stop\n"); + } + break; + default: + break; + } + return 1; +}