Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed Adafruit_GFX0
main.cpp@0:806ae74bb791, 2021-12-13 (annotated)
- Committer:
- lule
- Date:
- Mon Dec 13 16:07:39 2021 +0000
- Revision:
- 0:806ae74bb791
..
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
lule | 0:806ae74bb791 | 1 | /* Moving the rectangle previewed on the OLED display |
lule | 0:806ae74bb791 | 2 | * by using potentiometers POT1 and POT2 |
lule | 0:806ae74bb791 | 3 | * |
lule | 0:806ae74bb791 | 4 | * November, 2021. |
lule | 0:806ae74bb791 | 5 | */ |
lule | 0:806ae74bb791 | 6 | #include "mbed.h" |
lule | 0:806ae74bb791 | 7 | #include "Adafruit_GFX.h" |
lule | 0:806ae74bb791 | 8 | #include "Adafruit_GFX_Config.h" |
lule | 0:806ae74bb791 | 9 | #include "Adafruit_SSD1306.h" |
lule | 0:806ae74bb791 | 10 | |
lule | 0:806ae74bb791 | 11 | // I2C bus pins: |
lule | 0:806ae74bb791 | 12 | #define D_SDA PB_14 |
lule | 0:806ae74bb791 | 13 | #define D_SCL PB_13 |
lule | 0:806ae74bb791 | 14 | // I2C address, 60d or 0x3c: |
lule | 0:806ae74bb791 | 15 | #define I2C_REAL_ADD 0x3c |
lule | 0:806ae74bb791 | 16 | #define I2C_ADDRESS I2C_REAL_ADD << 1 |
lule | 0:806ae74bb791 | 17 | // Set OLED width and heigth [pixel]: |
lule | 0:806ae74bb791 | 18 | #define OLED_WIDTH_PX 128 |
lule | 0:806ae74bb791 | 19 | #define OLED_HEIGHT_PX 64 |
lule | 0:806ae74bb791 | 20 | // I2C frequency: |
lule | 0:806ae74bb791 | 21 | #define I2C_FREQUENCY 400000 |
lule | 0:806ae74bb791 | 22 | // Multipliers of POT1 and POT2 for OLED rectangle position: |
lule | 0:806ae74bb791 | 23 | #define WIDTH_SCALER 128 |
lule | 0:806ae74bb791 | 24 | #define HEIGHT_SCALER 64 |
lule | 0:806ae74bb791 | 25 | // Initial rectangle position: |
lule | 0:806ae74bb791 | 26 | #define INITIAL_X_POSITION OLED_WIDTH_PX / 2 |
lule | 0:806ae74bb791 | 27 | #define INITIAL_Y_POSITION OLED_HEIGHT_PX / 2 |
lule | 0:806ae74bb791 | 28 | // Refresh rate: |
lule | 0:806ae74bb791 | 29 | #define REFRESH_RATE_MS 5 |
lule | 0:806ae74bb791 | 30 | // Half of the potentiometer return value: |
lule | 0:806ae74bb791 | 31 | #define HALF_INTERVAL 0.5f |
lule | 0:806ae74bb791 | 32 | // x and y max values |
lule | 0:806ae74bb791 | 33 | #define XMAX 127 |
lule | 0:806ae74bb791 | 34 | #define YMAX 63 |
lule | 0:806ae74bb791 | 35 | #define XMIN 0 |
lule | 0:806ae74bb791 | 36 | #define YMIN 0 |
lule | 0:806ae74bb791 | 37 | |
lule | 0:806ae74bb791 | 38 | // Initialize potentiometers' pins: |
lule | 0:806ae74bb791 | 39 | AnalogIn POT1(PA_0); |
lule | 0:806ae74bb791 | 40 | AnalogIn POT2(PA_1); |
lule | 0:806ae74bb791 | 41 | |
lule | 0:806ae74bb791 | 42 | // Initialize I2C: |
lule | 0:806ae74bb791 | 43 | I2C i2c(D_SDA,D_SCL); |
lule | 0:806ae74bb791 | 44 | |
lule | 0:806ae74bb791 | 45 | // Initialize OLED display: |
lule | 0:806ae74bb791 | 46 | Adafruit_SSD1306_I2c myOled(i2c,PB_5,I2C_ADDRESS,OLED_HEIGHT_PX,OLED_WIDTH_PX); |
lule | 0:806ae74bb791 | 47 | |
lule | 0:806ae74bb791 | 48 | void screenSaver(){ |
lule | 0:806ae74bb791 | 49 | int x = 7, y = 12, r = 5, xk = 1, yk = 1, dx = 4, dy = 3; |
lule | 0:806ae74bb791 | 50 | |
lule | 0:806ae74bb791 | 51 | while(true){ |
lule | 0:806ae74bb791 | 52 | myOled.drawRect(0, 0, OLED_WIDTH_PX - 1, OLED_HEIGHT_PX - 1, WHITE); |
lule | 0:806ae74bb791 | 53 | |
lule | 0:806ae74bb791 | 54 | if((x - r) <= XMIN) xk = 1; |
lule | 0:806ae74bb791 | 55 | if((x + r) >= XMAX) xk = -1; |
lule | 0:806ae74bb791 | 56 | |
lule | 0:806ae74bb791 | 57 | if((y - r) <= YMIN) yk = 1; |
lule | 0:806ae74bb791 | 58 | if((y + r) >= YMAX) yk = -1; |
lule | 0:806ae74bb791 | 59 | |
lule | 0:806ae74bb791 | 60 | y += dy * yk; |
lule | 0:806ae74bb791 | 61 | x += dx * xk; |
lule | 0:806ae74bb791 | 62 | |
lule | 0:806ae74bb791 | 63 | myOled.fillCircle(x, y, r, WHITE); |
lule | 0:806ae74bb791 | 64 | |
lule | 0:806ae74bb791 | 65 | myOled.display(); |
lule | 0:806ae74bb791 | 66 | |
lule | 0:806ae74bb791 | 67 | wait_ms(REFRESH_RATE_MS); |
lule | 0:806ae74bb791 | 68 | myOled.clearDisplay(); |
lule | 0:806ae74bb791 | 69 | } |
lule | 0:806ae74bb791 | 70 | } |
lule | 0:806ae74bb791 | 71 | |
lule | 0:806ae74bb791 | 72 | void bounce(){ |
lule | 0:806ae74bb791 | 73 | int x = 7, y = 12, r = 5, xk = 1, yk = 1, dx = 4, dy = 3, g = 3; |
lule | 0:806ae74bb791 | 74 | |
lule | 0:806ae74bb791 | 75 | while(true){ |
lule | 0:806ae74bb791 | 76 | myOled.drawRect(0, 0, OLED_WIDTH_PX - 1, OLED_HEIGHT_PX - 1, WHITE); |
lule | 0:806ae74bb791 | 77 | |
lule | 0:806ae74bb791 | 78 | if((x - r) <= XMIN) xk = 1; |
lule | 0:806ae74bb791 | 79 | if((x + r) >= XMAX) xk = -1; |
lule | 0:806ae74bb791 | 80 | |
lule | 0:806ae74bb791 | 81 | if((y + r) <= YMAX){ |
lule | 0:806ae74bb791 | 82 | dy += g; |
lule | 0:806ae74bb791 | 83 | y += dy; |
lule | 0:806ae74bb791 | 84 | } else { |
lule | 0:806ae74bb791 | 85 | dy = -dy; |
lule | 0:806ae74bb791 | 86 | y = 2 * YMAX - y; |
lule | 0:806ae74bb791 | 87 | } |
lule | 0:806ae74bb791 | 88 | |
lule | 0:806ae74bb791 | 89 | y += dy * yk; |
lule | 0:806ae74bb791 | 90 | x += dx * xk; |
lule | 0:806ae74bb791 | 91 | |
lule | 0:806ae74bb791 | 92 | myOled.fillCircle(x, y, r, WHITE); |
lule | 0:806ae74bb791 | 93 | |
lule | 0:806ae74bb791 | 94 | myOled.display(); |
lule | 0:806ae74bb791 | 95 | |
lule | 0:806ae74bb791 | 96 | wait_ms(REFRESH_RATE_MS); |
lule | 0:806ae74bb791 | 97 | myOled.clearDisplay(); |
lule | 0:806ae74bb791 | 98 | } |
lule | 0:806ae74bb791 | 99 | } |
lule | 0:806ae74bb791 | 100 | |
lule | 0:806ae74bb791 | 101 | int main() { |
lule | 0:806ae74bb791 | 102 | |
lule | 0:806ae74bb791 | 103 | // Initialize OLED: |
lule | 0:806ae74bb791 | 104 | myOled.begin(); |
lule | 0:806ae74bb791 | 105 | myOled.setTextCursor(0, 0); |
lule | 0:806ae74bb791 | 106 | i2c.frequency(I2C_FREQUENCY); |
lule | 0:806ae74bb791 | 107 | |
lule | 0:806ae74bb791 | 108 | //screenSaver(); |
lule | 0:806ae74bb791 | 109 | bounce(); |
lule | 0:806ae74bb791 | 110 | } |