- 
      
 - 
        
Save adam-buckley/f591515be832b355b2d0ccb751782a40 to your computer and use it in GitHub Desktop.  
| /** | |
| * A small demo of a dot bouncing inside a 128x64 OLED screen, using the Onion Omega 2. Note this isn't using the | |
| * OLED expansion, but a cheapo screen I bought from China, using the SSD1306 (as far as I could tell) driver. | |
| * This was only a personal exercise to see how easy it is to setup, it might be handly to someone else learning! | |
| * | |
| * To compile: | |
| * - install gcc and make (See: https://docs.onion.io/omega2-docs/c-compiler-on-omega.html) | |
| * - install git (Follow this: https://docs.onion.io/omega2-docs/installing-and-using-git.html) | |
| * - install python-dev | |
| * - git clone the i2c exp driver (https://github.com/OnionIoT/i2c-exp-driver) | |
| * - (At the time of writing) Alter the makefile according to this bug report (https://github.com/OnionIoT/i2c-exp-driver/issues/18) | |
| * - go into the "i2c-exp-driver" project and compile with `make` | |
| * - copy bin, include, lib directories to /usr | |
| * - compile gist below with `gcc bouncing_dot.c -loniondebug -lonioni2c -lonionoledexp` | |
| * - Run! | |
| * | |
| * @author Adam Buckley <[email protected]> | |
| */ | |
| // #include <stdio.h> | |
| #include <unistd.h> | |
| #include <oled-exp.h> | |
| int main() { | |
| // Init the OLED | |
| int status = oledDriverInit(); | |
| status |= oledSetDisplayPower(1); | |
| int x = 0, y = 0; | |
| int delta_x = 1, delta_y = 1; | |
| // Run forever | |
| while(1) { | |
| x += delta_x; | |
| y += delta_y; | |
| // When X hits a boundary on the OLED, flip the delta position | |
| if (x == 0 || x == 63) { | |
| delta_x *= -1; | |
| } | |
| // Do the same for the y coordinate | |
| if (y == 0 || y == 127) { | |
| delta_y *= -1; | |
| } | |
| // Set cursor to correct position | |
| // The way this works is that while the height of the OLED is 64px, there | |
| // is 8 logical rows, each with 8 addressable pixels. So the code below is just | |
| // working out where a pixel (e.g x = 57) should be placed | |
| // See https://docs.onion.io/omega2-docs/oled-expansion-c-library.html#understanding-the-display-1 for more info | |
| status |= oledSetCursorByPixel(((int) x / 8), y); | |
| switch(x % 8) { | |
| case 0: | |
| status |= oledWriteByte(0x01); | |
| break; | |
| case 1: | |
| status |= oledWriteByte(0x02); | |
| break; | |
| case 2: | |
| status |= oledWriteByte(0x04); | |
| break; | |
| case 3: | |
| status |= oledWriteByte(0x08); | |
| break; | |
| case 4: | |
| status |= oledWriteByte(0x10); | |
| break; | |
| case 5: | |
| status |= oledWriteByte(0x20); | |
| break; | |
| case 6: | |
| status |= oledWriteByte(0x40); | |
| break; | |
| case 7: | |
| status |= oledWriteByte(0x80); | |
| break; | |
| } | |
| // A larger usleep value will make the dot move slower | |
| usleep(10000); | |
| // Clear the current dot on the screen | |
| status |= oledSetCursorByPixel(((int) x / 8), y); | |
| status |= oledWriteByte(0x00); | |
| // Clear below for some reason will cause the screen to not print anything | |
| // status |= oledClear(); | |
| } | |
| return 0; | |
| } | 
Awesome project, love it!
If you take a peek at /usr/lib on the Omega, you'll see that it already has the shared objects for liboniondebug, libonioni2c, and libonionoledexp.
Haven't tried it myself, but it should work if you just grab the header files from the i2c-exp-driver repo!
Thanks @greenbreakfast!
I had a feeling that was the case regarding libonionoledexp, my knowledge of C and Omega internals are pretty limited so I just followed the tutorial. I'll fire up my other Omega when I get home and see if I can do this without having to compile external libraries.
A third way to do it: cross-compile your program. We just put out a guide: https://onion.io/2bt-cross-compiling-c-programs-part-3/
Thanks for the very clear compilation instructions.
However, I just noticed that the OLED Expansion Python Module commands to setCursor stopped working after I followed your compilation steps (gcc, make, git, python-dev installs).
In a Python shell, the OLED command "oledExp.setCursor(0,0)" (for example) now returns: "IOError: I2C transaction failed." Same for setCursorByPixel(...)." I tried the Sierpinski triangle example in the i2c-exp-driver Github repo, and it fails as well, at the same point. Other commands still work (driverInit, clear, write, wWriteByte, etc.).
Any ideas?
I wrote the code above on the Omega itself, nano has its limits, please let me know if you have any issues.