OLED_MISSION2
Dependencies: mbed Adafruit_GFX
main.cpp
- Committer:
- leejieun
- Date:
- 2022-05-08
- Revision:
- 0:a69af42d193a
- Child:
- 1:8d6620a8f26b
File content as of revision 0:a69af42d193a:
#include "mbed.h" #include "Adafruit_SSD1306.h" // Adafruit_GFX library #define NUM_CHAR 16 Serial pc(SERIAL_TX, SERIAL_RX); DigitalOut greenLed(LED1); DigitalOut redLed(PA_12); AnalogOut myAnalogOut(PA_4); AnalogIn lightSensor(PA_0); Timer t1, t2; Ticker t3, t4; 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 char rxData[5]; bool flagRx = 0; int dir = 1; // 1: increase, -1: decrease bool flagT3 = 0; bool modeT3 = 0; // 0: stop, 1: working 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; } // 버튼1을 2초 이상 누르면 LED 변환 (led1, led2 선택) // 버튼2를 2초 이상 누르면 현재 LED 초기화 (초기 깜빡임 속도 0.5초) // 버튼1을 살짝 누르면 깜빡임 속도 감소, 버튼2를 살짝 누르면 깜빡임 속도 증가 (0.1초 ~ 1초, 0.1초 단계) //// 스위치 플래그 int flagDown = 0; // 1: speed down, 2: change LED int flagUp = 0; // 1: speed up, 2: reset biliking speed void Btn1Down() { // pc.puts("1 pushed\n"); // for debugging t1.start(); } void Btn1Up() { // pc.puts("1 released\n"); // for debugging float tempT1 = t1.read(); if (tempT1 > 2.0f) { flagDown = 2; } else if (tempT1 > 0) { flagDown = 1; } t1.stop(); t1.reset(); } void Btn2Down() { // pc.puts("2 pushed\n"); // for debugging t2.start(); } //플래그 업이 2가 되면 설정모드. void Btn2Up() { // pc.puts("2 released\n"); // for debugging float tempT2 = t2.read(); if (tempT2 > 2.0f) { flagUp = 2; } //플래그 업이 1이면 그냥 눌렀을때 else if (tempT2 > 0) { flagUp = 1; } t2.stop(); t2.reset(); } // int main() { pc.baud(115200); pc.puts("\nStart!\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); I2C I2C_Oled(PB_7, PA_15); // SDA, SCL I2C_Oled.frequency(400000); // 400kHz clock Adafruit_SSD1306_I2c myOled(I2C_Oled, PD_2, 0x78, 64, 128); // reset pin doesn't effect myOled.splash(); // logo output myOled.display(); wait(0.5); myOled.clearDisplay(); // clear buffer myOled.printf("%u x %u OLED Display\r\n", myOled.width(), myOled.height()); myOled.display(); // show a image on the OLED wait(1); myButton.enable_irq(); // enable IRQ exButton.enable_irq(); // enable IRQ t3.attach(&tickerFunc3, 0.1); // ticker3 start 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}; modeT3 = 1; my7Seg = 0xFF; // 엔이 여깄음 uint16_t n = 0; //커서 설정 int cursor = 0; //에딧 모드 설정 int edit = 0; //뇌절 int brain = 0; while(1) { //if (1 == flagT3) { //flagT3 = 0; //n = n + dir; //myOled.clearDisplay(); //myOled.setTextCursor(1, 5); //myOled.printf("%S",buffer); //myOled.display(); //my7Seg = ~val7Seg[n%16] & 0x7F; //} 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); greenLed = (1 == rxVal)? 1:0; // greenLed = rxVal? 1:0; } if (0 == strcmp(tmpCommand, "RE")) { // reset all variables greenLed = 0; redLed = 1; n = 0; } //greenLed = !greenLed; //time_t seconds = time(NULL); //pc.printf("\nTime as seconds since Janurary 1, 1970 = %u\n", (unsigned int)seconds); //pc.printf("Time as a basic string = %s" , ctime(&seconds)); } greenLed = !greenLed; time_t seconds = time(NULL); pc.printf("\nTime as seconds since Janurary 1, 1970 = %u\n", (unsigned int)seconds); 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 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); // 오엘이디 나오는거 평상시 if (1 == flagT3) { flagT3 = 0; n = n + dir; myOled.clearDisplay(); myOled.setTextCursor(1, 5); myOled.printf("%S",buffer); pc.printf(buffer); myOled.display(); my7Seg = ~val7Seg[n%16] & 0x7F; } // 2초 이상 누른거 (버튼 1) if (2 == flagDown) { edit = edit + 1; } if (edit == 2){ edit = 0; } switch(edit){ case 0: pc.puts("edit mode off"); flagDown = 0; brain = 0; break; case 1: pc.puts("edit mode on"); brain = 1; edit = 1; // flagDown = 0; // currentLED = !currentLED; // pc.puts(selLED[currentLED]); { // 오엘이디 외부 버튼을 눌렀다. // 살짝 누른거 (버튼 1) flagDown = 0; break; } if (1 == brain && edit == 1) { flagDown = 0; pc.puts("Cursor Select.\n"); // float tempVal = blinkSpeed[currentLED]; // tempVal = tempVal + 0.1f; // if (tempVal > 1.0f) tempVal = 1.0f; // if (0 == currentLED) t3.attach(&BlinkLED1, tempVal); // else t4.attach(&BlinkLED2, tempVal); // blinkSpeed[currentLED] = tempVal; switch(cursor){ case 0: pc.puts(" second.\n"); break; case 1: pc.puts(" minute.\n"); break; case 2: pc.puts(" hour.\n"); break; case 3: pc.puts(" day.\n"); break; case 4: pc.puts(" month.\n"); break; case 5: pc.puts(" year.\n"); break; } brain = 0; cursor += 1; if (cursor == 6){ cursor = 0; } //에딧 모드 끄기 }//큰 이프 닫는애 } // 살짝 누른거 (버튼 2) if (1 == flagUp) { flagUp = 0; pc.puts("Speed increase\n"); // float tempVal = blinkSpeed[currentLED]; // tempVal = tempVal - 0.1f; // if (tempVal < 0.1f) tempVal = 0.1f; // if (0 == currentLED) t3.attach(&BlinkLED1, tempVal); // else t4.attach(&BlinkLED2, tempVal); // blinkSpeed[currentLED] = tempVal; } // 2초 이상 누른거 (버튼 2) else if (2 == flagUp) { // flagUp = 0; // blinkSpeed[currentLED] = 0.5; // if (0 == currentLED) t3.attach(&BlinkLED1, 0.5); // else t4.attach(&BlinkLED2, 0.5); // pc.puts(selLED[currentLED]); pc.puts(" : the speed is reset to 0.5s\n"); } wait(1); } } // 버튼1을 2초 이상 누르면 LED 변환 (led1, led2 선택) // 버튼2를 2초 이상 누르면 현재 LED 초기화 (초기 깜빡임 속도 0.5초) // 버튼1을 살짝 누르면 깜빡임 속도 감소, 버튼2를 살짝 누르면 깜빡임 속도 증가 (0.1초 ~ 1초, 0.1초 단계)