Writing Text to the OLED Display

In this expriment, we’ll be figuring out how to start up the OLED Expansion’s screen and writing some text to it using Onion’s Python module for the OLED Expansion. By the end, you’ll be able to boot it up, and write whatever you wish!

The OLED Display

The OLED Expansion has a resolution of 128x64 pixels. It is addressable by 128 vertical columns and 8 horizontal pages.

display

Each page consists of 8 horizontal pixel rows. When a byte is written to the display, the Least Significant Byte (LSB) corresponds to the top-most pixel of the page in the current column. The Most Significant Byte (MSB) corresponds to the bottom-most pixel of the page in the current column.

display

The display keeps a cursor pointer in memory that indicates the current page and column being addressed. The cursor will automatically be incremented after each byte is written, the cursor can also be moved by the user through functions discussed later. When writing text to the display, each character is 6 columns wide and 1 page long. This means that 8 lines of text each 21 characters long, can be written to the OLED display.

Building the Circuit

This expriment does not require you to use a breadboard as the OLED Expansion is a complete circuit. Plug it into your Expansion Dock and you’re good to go!

What You’ll Need

  • 1x Omega2 plugged into Expansion Dock
  • 1x OLED Expansion plugged into Expansion Dock above

Writing the Code

The code we’ll be writing is straightforward: we’ll be calling on the oledExp class from the OmegaExpansion Python Module and using the built in functions to print a bunch of text. For more details on the Oled Expansion Python Class and Module, check out the software module reference in the Omega2 Docs.

Create a file called MAK04-oledWriteText.py and paste the following code in it:

from OmegaExpansion import oledExp
import time
import datetime
import math

# array of quotes that we will be displaying
quoteArray = ['Banging your head against a wall burns 150 calories an hour.',
'In the UK, it is illegal to eat mince pies on Christmas Day!',
'When hippos are upset, their sweat turns red.',
'Cherophobia is the fear of fun.',
'If you lift a kangaroos tail off the ground it cannot hop.']

def main():
    # instantiate datetime object that represents a snapshot of the time when this line is run
    #   we'll be displaying the data (hours, minutes, etc) on the OLED
    dateTimeObj = datetime.datetime.now()
    hour = dateTimeObj.hour
    sec = dateTimeObj.second

    # The minute data is stored as an integer in the datetime object, however it needs to have a leading zero for numbers less than 10
    #   This section first converts the minute to a string, and adds a leading zero if the number is less than 10
    minute = str(dateTimeObj.minute)
    if dateTimeObj.minute < 10:
        minute = "0" + minute

    # The 'hour' attribute of dateTimeObj is stored in 24hr format, this part checks for AM/PM differences and converts the time to 12hr format, creating a variable to store the 'AM/PM' string along the way
    if(hour/12 == 0):
        day = "AM"
        hour = str(hour % 12)
    else:
        day = "PM"
        hour = str(hour % 12)

    # assembling the time data into a properly formatted time string
    dateTimeStr = hour + ":" + minute + " " + day

    # create a greeting based on the time of day
    if(dateTimeObj.hour < 12):
        greeting = "Good Morning"
    elif(17 > dateTimeObj.hour >= 12):
        greeting = "Good Afternoon"
    else:
        greeting = "Good Evening"

    # Initialize the display
    oledExp.driverInit()

    # Preps the OLED screen to display text
    oledExp.setTextColumns()

    # Writes out the time of day to the OLED display in a specific location
    oledExp.setCursor(0,13)
    oledExp.write(dateTimeStr)

    # Writes the greeting to a different location so it doesn't overwrite the time of day
    oledExp.setCursor(2,0)
    oledExp.write(greeting)

    # Writes out one of our quotes 'randomly', again in a new location
    oledExp.setCursor(4,0)
    oledExp.write(quoteArray[sec%5])


if __name__ == '__main__':
    main()

What to Expect

After running the Python code, you should see the current current time on the right side of the top row, a greeting on the third row and a random fact on the fifth row.

A Closer Look at the Code

To get the current time, we use the datetime library that is provided standard with Python. We create a datetime object storing the current date and time using the datetime.datetime.now() constructor. We then access the object’s hour and minutes attributes to the retrieve the time values of interest. The we use some logic and mathematical conversion to decide if it is AM or PM and which greeting to display.

For the quote, we use a rudimentary way of generating random numbers to select which one to display.

Date, Time, and Logic

When we check the time in real life, it’s likely because we want to make a decision based on it. Timing is just as important in software and automation. Python’s time library pulls the time from low level operating system commands, and there are built-in functions to parse them into readable strings. We use the time function to make a decision to show ‘Afternoon’, ‘Evening’, or ‘Morning’. You can apply the exact same idea and code to make timing decisions in your own projects to do cooler stuff!

Generating Random Numbers

Random numbers are an integral part of many pieces of software. They are used to generate unique IDs, testing, statistics, and even games (dice rolls, card shuffles are all random!). Here we generate a random number in two steps. First, we get the time in seconds. Next we take the remainder of the current time (in seconds) divided by 5. The resultant number is relatively unordered, and we use that to select which quote we show.

This is a very rudimentary way of generating a random number, and it is not actually truly random! This kind of random number is often called a ‘pseudo-random’ number.

Pseudo-Random vs. True Random

Securing messages on the internet is currently the biggest way random numbers are used right now. Almost all methods of sending and receiving secure messages need truly random numbers. If the numbers used are generated from an algorithm (like the one above), the secure message can be decoded by copying the algorithm and predicting the random number output. Cyber-security is a muchm much larger topic than we can cover here. If you are interested, there’s a great deal of resources available online from very qualified sources. Cloudflare has a great blog post with an excellent example of where pseudo-random numbers fall short in security if you want to read more about it.

Next time, we fiddle with the screen.