OLED_MISSION1
Dependencies: mbed Adafruit_GFX
main.cpp@0:be32e7347942, 2022-05-08 (annotated)
- Committer:
- leejieun
- Date:
- Sun May 08 09:36:18 2022 +0000
- Revision:
- 0:be32e7347942
OLED_MISSION1;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
leejieun | 0:be32e7347942 | 1 | #include "mbed.h" |
leejieun | 0:be32e7347942 | 2 | #include "Adafruit_SSD1306.h" // Adafruit_GFX library |
leejieun | 0:be32e7347942 | 3 | |
leejieun | 0:be32e7347942 | 4 | #define NUM_CHAR 16 |
leejieun | 0:be32e7347942 | 5 | |
leejieun | 0:be32e7347942 | 6 | Serial pc(SERIAL_TX, SERIAL_RX); |
leejieun | 0:be32e7347942 | 7 | DigitalOut greenLed(LED1); |
leejieun | 0:be32e7347942 | 8 | DigitalOut redLed(PA_12); |
leejieun | 0:be32e7347942 | 9 | AnalogOut myAnalogOut(PA_4); |
leejieun | 0:be32e7347942 | 10 | AnalogIn lightSensor(PA_0); |
leejieun | 0:be32e7347942 | 11 | Timer t1, t2; |
leejieun | 0:be32e7347942 | 12 | Ticker t3, t4; |
leejieun | 0:be32e7347942 | 13 | InterruptIn myButton(PC_13); |
leejieun | 0:be32e7347942 | 14 | InterruptIn exButton(PC_11); |
leejieun | 0:be32e7347942 | 15 | |
leejieun | 0:be32e7347942 | 16 | BusOut my7Seg(PA_8, PA_9, PA_10, PC_9, PC_8, PC_7, PC_6, PA_11); // 8bit data |
leejieun | 0:be32e7347942 | 17 | // LSB, , MSB |
leejieun | 0:be32e7347942 | 18 | |
leejieun | 0:be32e7347942 | 19 | char rxData[5]; |
leejieun | 0:be32e7347942 | 20 | bool flagRx = 0; |
leejieun | 0:be32e7347942 | 21 | int dir = 1; // 1: increase, -1: decrease |
leejieun | 0:be32e7347942 | 22 | bool flagT3 = 0; |
leejieun | 0:be32e7347942 | 23 | bool modeT3 = 0; // 0: stop, 1: working |
leejieun | 0:be32e7347942 | 24 | |
leejieun | 0:be32e7347942 | 25 | void ReceiveInt() { |
leejieun | 0:be32e7347942 | 26 | char inChar; |
leejieun | 0:be32e7347942 | 27 | static char rxCount = 0; |
leejieun | 0:be32e7347942 | 28 | static char rxBuf[4]; |
leejieun | 0:be32e7347942 | 29 | |
leejieun | 0:be32e7347942 | 30 | while(1 == pc.readable()) { |
leejieun | 0:be32e7347942 | 31 | inChar = pc.getc(); |
leejieun | 0:be32e7347942 | 32 | if ('<' == inChar){ |
leejieun | 0:be32e7347942 | 33 | rxCount = 1; |
leejieun | 0:be32e7347942 | 34 | } |
leejieun | 0:be32e7347942 | 35 | else if (rxCount > 0 && rxCount < 5) { |
leejieun | 0:be32e7347942 | 36 | rxBuf[rxCount-1] = inChar; |
leejieun | 0:be32e7347942 | 37 | rxCount++; |
leejieun | 0:be32e7347942 | 38 | } |
leejieun | 0:be32e7347942 | 39 | else if (5 == rxCount && '>' == inChar) { |
leejieun | 0:be32e7347942 | 40 | rxCount = 0; |
leejieun | 0:be32e7347942 | 41 | flagRx = 1; |
leejieun | 0:be32e7347942 | 42 | memcpy(rxData, rxBuf, 4); |
leejieun | 0:be32e7347942 | 43 | // pc.putc(rxData[0]); |
leejieun | 0:be32e7347942 | 44 | // pc.putc(rxData[1]); |
leejieun | 0:be32e7347942 | 45 | // pc.putc(rxData[2]); |
leejieun | 0:be32e7347942 | 46 | // pc.putc(rxData[3]); |
leejieun | 0:be32e7347942 | 47 | |
leejieun | 0:be32e7347942 | 48 | // pc.puts(rxData); |
leejieun | 0:be32e7347942 | 49 | } |
leejieun | 0:be32e7347942 | 50 | else { |
leejieun | 0:be32e7347942 | 51 | rxCount = 0; |
leejieun | 0:be32e7347942 | 52 | } |
leejieun | 0:be32e7347942 | 53 | } |
leejieun | 0:be32e7347942 | 54 | } |
leejieun | 0:be32e7347942 | 55 | |
leejieun | 0:be32e7347942 | 56 | void tickerFunc3() { |
leejieun | 0:be32e7347942 | 57 | flagT3 = 1; |
leejieun | 0:be32e7347942 | 58 | } |
leejieun | 0:be32e7347942 | 59 | |
leejieun | 0:be32e7347942 | 60 | void Btn1Down() { |
leejieun | 0:be32e7347942 | 61 | // pc.puts("1 pushed\n"); // for debugging |
leejieun | 0:be32e7347942 | 62 | dir = -1*dir; |
leejieun | 0:be32e7347942 | 63 | } |
leejieun | 0:be32e7347942 | 64 | |
leejieun | 0:be32e7347942 | 65 | void Btn1Up() { |
leejieun | 0:be32e7347942 | 66 | // pc.puts("1 released\n"); // for debugging |
leejieun | 0:be32e7347942 | 67 | greenLed = !greenLed; |
leejieun | 0:be32e7347942 | 68 | } |
leejieun | 0:be32e7347942 | 69 | |
leejieun | 0:be32e7347942 | 70 | void Btn2Down() { |
leejieun | 0:be32e7347942 | 71 | // pc.puts("2 pushed\n"); // for debugging |
leejieun | 0:be32e7347942 | 72 | if (1 == modeT3) t3.detach(); |
leejieun | 0:be32e7347942 | 73 | else t3.attach(tickerFunc3, 0.1); |
leejieun | 0:be32e7347942 | 74 | modeT3 = !modeT3; |
leejieun | 0:be32e7347942 | 75 | } |
leejieun | 0:be32e7347942 | 76 | |
leejieun | 0:be32e7347942 | 77 | void Btn2Up() { |
leejieun | 0:be32e7347942 | 78 | // pc.puts("2 released\n"); // for debugging |
leejieun | 0:be32e7347942 | 79 | redLed = !redLed; |
leejieun | 0:be32e7347942 | 80 | } |
leejieun | 0:be32e7347942 | 81 | |
leejieun | 0:be32e7347942 | 82 | |
leejieun | 0:be32e7347942 | 83 | // |
leejieun | 0:be32e7347942 | 84 | int main() |
leejieun | 0:be32e7347942 | 85 | { |
leejieun | 0:be32e7347942 | 86 | pc.baud(115200); |
leejieun | 0:be32e7347942 | 87 | pc.puts("\nStart!\n"); |
leejieun | 0:be32e7347942 | 88 | |
leejieun | 0:be32e7347942 | 89 | myButton.disable_irq(); // to avoid unexpected interrupt |
leejieun | 0:be32e7347942 | 90 | exButton.disable_irq(); // to avoid unexpected interrupt |
leejieun | 0:be32e7347942 | 91 | |
leejieun | 0:be32e7347942 | 92 | pc.attach(&ReceiveInt, Serial::RxIrq); // RxIrq, TxIrq |
leejieun | 0:be32e7347942 | 93 | myButton.fall(&Btn1Down); |
leejieun | 0:be32e7347942 | 94 | myButton.rise(&Btn1Up); |
leejieun | 0:be32e7347942 | 95 | exButton.fall(&Btn2Down); |
leejieun | 0:be32e7347942 | 96 | exButton.rise(&Btn2Up); |
leejieun | 0:be32e7347942 | 97 | |
leejieun | 0:be32e7347942 | 98 | I2C I2C_Oled(PB_7, PA_15); // SDA, SCL |
leejieun | 0:be32e7347942 | 99 | I2C_Oled.frequency(400000); // 400kHz clock |
leejieun | 0:be32e7347942 | 100 | Adafruit_SSD1306_I2c myOled(I2C_Oled, PD_2, 0x78, 64, 128); // reset pin doesn't effect |
leejieun | 0:be32e7347942 | 101 | |
leejieun | 0:be32e7347942 | 102 | myOled.splash(); // logo output |
leejieun | 0:be32e7347942 | 103 | myOled.display(); |
leejieun | 0:be32e7347942 | 104 | wait(0.5); |
leejieun | 0:be32e7347942 | 105 | |
leejieun | 0:be32e7347942 | 106 | myOled.clearDisplay(); // clear buffer |
leejieun | 0:be32e7347942 | 107 | myOled.printf("%u x %u OLED Display\r\n", myOled.width(), myOled.height()); |
leejieun | 0:be32e7347942 | 108 | myOled.display(); // show a image on the OLED |
leejieun | 0:be32e7347942 | 109 | wait(1); |
leejieun | 0:be32e7347942 | 110 | |
leejieun | 0:be32e7347942 | 111 | myButton.enable_irq(); // enable IRQ |
leejieun | 0:be32e7347942 | 112 | exButton.enable_irq(); // enable IRQ |
leejieun | 0:be32e7347942 | 113 | |
leejieun | 0:be32e7347942 | 114 | t3.attach(&tickerFunc3, 0.1); // ticker3 start |
leejieun | 0:be32e7347942 | 115 | |
leejieun | 0:be32e7347942 | 116 | time_t seconds = time(NULL); |
leejieun | 0:be32e7347942 | 117 | |
leejieun | 0:be32e7347942 | 118 | set_time(1651121217); // Set RTC time to 2022-4월-28, PM 1:46:57 |
leejieun | 0:be32e7347942 | 119 | pc.printf("Time as a basic string = %s", ctime(&seconds)); |
leejieun | 0:be32e7347942 | 120 | |
leejieun | 0:be32e7347942 | 121 | char buffer[32]; |
leejieun | 0:be32e7347942 | 122 | strftime(buffer, 32, "%I:%M %p\n", localtime(&seconds)); |
leejieun | 0:be32e7347942 | 123 | pc.printf("1) Time as a custom formatted string = %s", buffer); |
leejieun | 0:be32e7347942 | 124 | strftime(buffer, 32, "%y-%m-%d, %H:%M:%S\n", localtime(&seconds)); |
leejieun | 0:be32e7347942 | 125 | pc.printf("2) Time as a custom formatted string = %s", buffer); |
leejieun | 0:be32e7347942 | 126 | |
leejieun | 0:be32e7347942 | 127 | char tmpCommand[3]; |
leejieun | 0:be32e7347942 | 128 | int rxVal; |
leejieun | 0:be32e7347942 | 129 | char val7Seg[NUM_CHAR] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71}; |
leejieun | 0:be32e7347942 | 130 | |
leejieun | 0:be32e7347942 | 131 | modeT3 = 1; |
leejieun | 0:be32e7347942 | 132 | my7Seg = 0xFF; |
leejieun | 0:be32e7347942 | 133 | |
leejieun | 0:be32e7347942 | 134 | uint16_t n = 0; |
leejieun | 0:be32e7347942 | 135 | |
leejieun | 0:be32e7347942 | 136 | while(1) |
leejieun | 0:be32e7347942 | 137 | { |
leejieun | 0:be32e7347942 | 138 | //if (1 == flagT3) { |
leejieun | 0:be32e7347942 | 139 | //flagT3 = 0; |
leejieun | 0:be32e7347942 | 140 | //n = n + dir; |
leejieun | 0:be32e7347942 | 141 | //myOled.clearDisplay(); |
leejieun | 0:be32e7347942 | 142 | //myOled.setTextCursor(1, 5); |
leejieun | 0:be32e7347942 | 143 | //myOled.printf("%S",buffer); |
leejieun | 0:be32e7347942 | 144 | //myOled.display(); |
leejieun | 0:be32e7347942 | 145 | //my7Seg = ~val7Seg[n%16] & 0x7F; |
leejieun | 0:be32e7347942 | 146 | //} |
leejieun | 0:be32e7347942 | 147 | |
leejieun | 0:be32e7347942 | 148 | if (1 == flagRx){ |
leejieun | 0:be32e7347942 | 149 | flagRx = 0; |
leejieun | 0:be32e7347942 | 150 | tmpCommand[0] = rxData[0]; |
leejieun | 0:be32e7347942 | 151 | tmpCommand[1] = rxData[1]; |
leejieun | 0:be32e7347942 | 152 | tmpCommand[2] = 0; |
leejieun | 0:be32e7347942 | 153 | rxVal = atoi(rxData+2); |
leejieun | 0:be32e7347942 | 154 | |
leejieun | 0:be32e7347942 | 155 | if (0 == strcmp(tmpCommand, "LD")) { // control a LED |
leejieun | 0:be32e7347942 | 156 | pc.printf("val = %d\n", rxVal); |
leejieun | 0:be32e7347942 | 157 | |
leejieun | 0:be32e7347942 | 158 | greenLed = (1 == rxVal)? 1:0; |
leejieun | 0:be32e7347942 | 159 | // greenLed = rxVal? 1:0; |
leejieun | 0:be32e7347942 | 160 | } |
leejieun | 0:be32e7347942 | 161 | if (0 == strcmp(tmpCommand, "RE")) { // reset all variables |
leejieun | 0:be32e7347942 | 162 | greenLed = 0; |
leejieun | 0:be32e7347942 | 163 | redLed = 1; |
leejieun | 0:be32e7347942 | 164 | n = 0; |
leejieun | 0:be32e7347942 | 165 | } |
leejieun | 0:be32e7347942 | 166 | //greenLed = !greenLed; |
leejieun | 0:be32e7347942 | 167 | //time_t seconds = time(NULL); |
leejieun | 0:be32e7347942 | 168 | |
leejieun | 0:be32e7347942 | 169 | //pc.printf("\nTime as seconds since Janurary 1, 1970 = %u\n", (unsigned int)seconds); |
leejieun | 0:be32e7347942 | 170 | |
leejieun | 0:be32e7347942 | 171 | //pc.printf("Time as a basic string = %s" , ctime(&seconds)); |
leejieun | 0:be32e7347942 | 172 | |
leejieun | 0:be32e7347942 | 173 | |
leejieun | 0:be32e7347942 | 174 | |
leejieun | 0:be32e7347942 | 175 | } |
leejieun | 0:be32e7347942 | 176 | |
leejieun | 0:be32e7347942 | 177 | greenLed = !greenLed; |
leejieun | 0:be32e7347942 | 178 | time_t seconds = time(NULL); |
leejieun | 0:be32e7347942 | 179 | |
leejieun | 0:be32e7347942 | 180 | pc.printf("\nTime as seconds since Janurary 1, 1970 = %u\n", (unsigned int)seconds); |
leejieun | 0:be32e7347942 | 181 | |
leejieun | 0:be32e7347942 | 182 | pc.printf("Time as a basic string = %s" , ctime(&seconds)); |
leejieun | 0:be32e7347942 | 183 | |
leejieun | 0:be32e7347942 | 184 | char buffer[32]; |
leejieun | 0:be32e7347942 | 185 | strftime(buffer, 32, "%I:%M %p\n", localtime(&seconds)); |
leejieun | 0:be32e7347942 | 186 | pc.printf("1) Time as custom formatted string = %s", buffer); |
leejieun | 0:be32e7347942 | 187 | strftime(buffer, 32, "%y-%m-%d, %H:%M:%S\n", localtime(&seconds)); |
leejieun | 0:be32e7347942 | 188 | pc.printf("2) Time as a custom formatted string = %s", buffer); |
leejieun | 0:be32e7347942 | 189 | if (1 == flagT3) { |
leejieun | 0:be32e7347942 | 190 | flagT3 = 0; |
leejieun | 0:be32e7347942 | 191 | n = n + dir; |
leejieun | 0:be32e7347942 | 192 | myOled.clearDisplay(); |
leejieun | 0:be32e7347942 | 193 | myOled.setTextCursor(1, 5); |
leejieun | 0:be32e7347942 | 194 | myOled.printf("%S",buffer); |
leejieun | 0:be32e7347942 | 195 | myOled.display(); |
leejieun | 0:be32e7347942 | 196 | my7Seg = ~val7Seg[n%16] & 0x7F; |
leejieun | 0:be32e7347942 | 197 | } |
leejieun | 0:be32e7347942 | 198 | wait(1); |
leejieun | 0:be32e7347942 | 199 | } |
leejieun | 0:be32e7347942 | 200 | |
leejieun | 0:be32e7347942 | 201 | } |