justinp.io projects about contact


Inkblot is a Ruby gem for interacting with the Waveshare line of e-Paper displays. It provides easy mechanisms to display content on the screen and get input from the buttons, suitable for incorporating into other code workflows.


There are many Components included with Inkblot, which cover a broad variety of basic UI items you'll want to display. You can combine them to create more complex UIs, and take advantage of their ease-of-use methods. You can create objects which have component representations, or create your own components.

There are components for basic menu types and Simple text display, as well as image and data code types

require 'inkblot'
include Inkblot

Components::SimpleText.new do |st|
  st.div_height = st.div_width = 95
  st.gfonts = %w[Pacifico]
  st.font = st.gfonts.first
  st.text = 'Hello'
  st.size = 60
  st.border_size = 10
end

Components::TableList.new(
  items: %w[Apples Oranges Pears Peaches],
  fullscreen: true
)

Components::IconGrid.new do |ig|
  ig.fullscreen = true
  ig.icons = %i[alarm extension face grade]
end

Components::ScrollMenu.new do |sc|
  sc.fullscreen = true
  sc.items = (1..10).map { |x| "Option #{x}" }
end

Components::BarCode.new(
  fullscreen: true,
  code: "978054538866"
)

Components::QrCode.new do |qr|
  qr.margin_top = qr.margin_left = -5
  qr.div_height = qr.div_width = 95

  qr.message = "https://youtu.be/zt2uIhAvQZ8"
end

Components::FullScreenImage.new(
  fullscreen: true,
  path: Inkblot.vendor_path('chris_kim.bmp')
)

Components::FullScreenImage.new do |fsi|
  fsi.fullscreen = true
  fsi.url = 'https://live.staticflickr.com/'
  fsi.url << '2753/4177140189_f5fd431b26_o_d.jpg'
end






Inkblot can also interact with the buttons on the HAT if present. This is done through interaction with the GPIO pins on the Raspberry Pi. System level tools like raspi-gpio let us get and set pin state, and exporting the pins by echoing into their sysfs entries lets us keep track of button state.

require 'inkblot'

# Run once to export GPIO pins
Inkblot::Buttons.init

text = Inkblot::Components::SimpleText.new do |txt|
         txt.fullscreen = true
         txt.size = 60

         # Get input with a 30 second timeout
         txt.text = case Inkblot::Buttons.get_input(30)
                    when 0
                     "First"
                    when 1
                     "Second"
                    when 2
                     "Third"
                    when 3
                     "Fourth"
                    when nil
                     "None"
                    end
end

Inkblot::Display.show(text)

# Run before exit to unexport GPIO
Inkblot::Buttons.release


Example projects, including a stock ticker and weather display, can show you how to get started.



Also included in the project are scripts to help you set up your Raspberry Pi for use with the gem. Refer to RASPI_SETUP for steps.