Android Things with Raspberry Pi: Workshop Basics Part 5 (Small Displays with the ssd1306)

ANDROID-THINGSssdsingle 128x64-oled-led-display-module-for-arduino-ssd1306-0-96-i2c-iic-blue-yellow-b398127fb9599b54119d7cbadb8d1579 ID931_LRG-half sizeIn our last post we looked at using the temperature sensor, but what if we want to display that data? We could display it on a attached hi resolution screen, but, what if we are using a SOM that doesn’t have display hardware built in? Also, what if we only need a small display and want to use a low cost option? You could use a tm1637 segment display if you only have a small amount of data to display, but what if you want more versatility? That is where the ssd1306 comes in.

The SSD1306

Most ssd1306 displays come with OLED displays that are either 128×64 dots in resolution or 128×32. The displays are designed for monochromatic operation which means that each dot can either be on or off. You can adjust the brightness of the entire display, but not individual pixels. Some displays will give you a multicolor effect by having one section of the display set to one color,  such as yellow, and the other one set to another, such as blue. Depending on the display and vendor you can purchase these for as little as $3.

Getting started

The Android Things drivers-samples repository has good information for getting started (follow the link). While these examples can get you started they don’t give you a lot of information on how to display text. If you’ve worked with raw canvas graphics before it will be really easy to translate that knowledge. Many Android developers don’t need to do that, so for those who haven’t here is a quick rundown. First, for this display you are going to need a bitmap to paint into. Here is an example to create one for a 128×64 display

val mBitmap = Bitmap.createBitmap(128, 64, conf)

next you are going to need to create a canvas object

val canvas = Canvas(mBitmap)

now, create a paint object specifying the color(white), style(fill), and a fontsize.

val paint = TextPaint()
paint.color = Color.WHITE
paint.style = Paint.Style.FILL
paint.textSize = fontSize

use a DynamicLayout to paint the text on the screen. We are letting it take care of the text centering etc., but it does allow for position adjustments (see the documentation).

val dynamicLayout = DynamicLayout(text,
paint, 128, Layout.Alignment.ALIGN_CENTER, 1f, 0f, false)
dynamicLayout.draw(canvas)

finally we will paint this on our screen

BitmapHelper.setBmpData(mScreen, 0, 0, mBitmap, false)
        mScreen.show()

To see a full example that prints out text and graphics head over to our example on Github here. These examples have been designed for the 128×64 displays which tend to be more common. When you run it you should see the following.

ezgif.com-optimize (3)We also designed them to work with one of the two color displays.  In the photo below we have a display with 48 rows of blue pixels and 16 of yellow.

ezgif.com-optimize (2)

The contrast feature was not initially in the driver, so we added the functionality into the driver. At the time of this writing it is still under Google code review. If you would like to use it before it is pulled into the main driver clone this repo in the directory that hosts this example (the directory should have contrib-drivers and ssd1306_example in it), build the driver and reference the .aar file (see the comments in the project). The contrast can be set anytime you have initialized the display.  Valid values are between 0 (for the lowest contrast level) to 255 (for the highest).

mScreen.setContrast(255)

Stay tuned for our next post as we explore more of the Android Things Platform.

About Me: I am a Atlanta based, native Android/IOS developer with AngularJS/Ruby experience and am founder of Polyglot Programming Inc.. Many of my projects focus on IOT and Wearables. You will often find me purr programming and I regularly speak at conferences around the world. I am available for hire! More Posts

Follow Me:
TwitterLinkedInGoogle Plus

I am a Atlanta based, native Android/IOS developer with AngularJS/Ruby experience and am founder of Polyglot Programming Inc.. Many of my projects focus on IOT and Wearables. You will often find me purr programming and I regularly speak at conferences around the world. I am available for hire!

Posted in Android, Android Things, Kotlin Tagged with: , ,