SenseHAT paint

SenseHAT paint

Here’s a very simple ‘paint’ project for the RaspberryPi SenseHAT. I was trying to draw icons for a graphical weather project, and I felt the need of some kind of paint program that would allow me to draw on the computer screen and light pixels on the SenseHAT.

SenseHAT paint

Here’s my attempt. I almost hesitate to post it, as it’s coded with brute force and ignorance. There may already be a better paint program for the SenseHAT. There may be a way of doing it in 5 lines of code. But here’s my (ham-fisted) attempt.

To use it, you pick a colour by pressing a keyboard letter – b is black, w is white, r red, g green, y yellow and, confusingly, L is blue. You could easily add more colours. The selected colour is shown on the right. You then click in the squares to light the pixels your chosen colour. You then have 2 other buttons – ‘clear’ clears the screen, and the beautifully-named ‘dump’ dumps the pixel values into the console, so you can copy and paste them and use them in another project. My next step is probably to allow you to save the images to a file – and possibly load images as well, not in PNG format but as a list of tuples (threeples?)

SenseHAT paint

It uses PyGame, so you’ll need to use Python 2 not 3 – just open it in IDLE for Python 2 on your Raspberry Pi. I did look at Tkinter, but decided I didn’t have time to learn enough of it. PyGame is much easier to get going with. I probably should have used sprites, but instead I just draw coloured rectangles and then check to see if each mouse click falls in the area for that square, and then light the appropriate light. Very inefficient coding, but it seems to work.

You can see it in action in this exciting video:

This is what the image in the video looked like on the SenseHAT:

SenseHAT paint

Here’s the rotten code. Read it and weep! You can also download it here.

# SenseHAT paint by Giles Booth / @blogmywiki
# www.suppertime.co.uk/blogmywiki
# This work is licensed under a Creative Commons
# Attribution-NonCommercial 4.0 International License.

from sense_hat import SenseHat
import pygame, sys
from pygame.locals import *

sense = SenseHat()

b = [0, 0, 0]
green = [0, 255, 0]
red = [255, 0, 0]
white = [255, 255, 255]
yellow = [255, 255, 0]
blue = [0, 0, 255]

def clearscreen():
    sense.clear()
    global pixels
    pixels = [
    b,b,b,b,b,b,b,b,
    b,b,b,b,b,b,b,b,
    b,b,b,b,b,b,b,b,
    b,b,b,b,b,b,b,b,
    b,b,b,b,b,b,b,b,
    b,b,b,b,b,b,b,b,
    b,b,b,b,b,b,b,b,
    b,b,b,b,b,b,b,b,
    ]

clearscreen()

sense.set_pixels(pixels)

pygame.init()

screen = pygame.display.set_mode((300,170))
pygame.display.set_caption('SenseHAT paint')
font = pygame.font.Font(None,16)
screen.fill((200,200,200))

inklabel = font.render("Colour", 1, (0,0,0))
screen.blit(inklabel, (160,20))
keylabel = font.render("Keys: b", 1, (0,0,0))
screen.blit(keylabel, (160,36))
keylabel = font.render("w", 1, white)
screen.blit(keylabel, (205,36))
keylabel = font.render("r", 1, red)
screen.blit(keylabel, (220,36))
keylabel = font.render("g", 1, green)
screen.blit(keylabel, (235,36))
keylabel = font.render("l", 1, blue)
screen.blit(keylabel, (250,36))
keylabel = font.render("y", 1, yellow)
screen.blit(keylabel, (265,36))
pygame.draw.rect(screen, b, (160,55,45,15))
keylabel = font.render("Clear", 1, white)
screen.blit(keylabel, (163,55))
pygame.draw.rect(screen, b, (220,55,45,15))
keylabel = font.render("Dump", 1, white)
screen.blit(keylabel, (223,55))

def drawink():
    pygame.draw.rect(screen, ink, (200,20,15,15))
    pygame.display.update()

def drawgrid():
    z = 0
    xpos = 0
    ypos = 20

    for colours in pixels:
        z = z + 1
        if z == 9:
            xpos = 0
            ypos = ypos + 16
        if z == 17:
            xpos = 0
            ypos = ypos + 16
        if z == 25:
            xpos = 0
            ypos = ypos + 16
        if z == 33:
            xpos = 0
            ypos = ypos + 16
        if z == 41:
            xpos = 0
            ypos = ypos + 16
        if z == 49:
            xpos = 0
            ypos = ypos + 16
        if z == 57:
            xpos = 0
            ypos = ypos + 16
        xpos = xpos + 16
        pygame.draw.rect(screen, colours, (xpos,ypos,15,15))
    pygame.display.update()

#pygame.draw.rect(windowObj, r, (10,10,20,20))

ink = white

drawgrid()
drawink()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_w:
                ink = white
            elif event.key == pygame.K_b:
                ink = b
            elif event.key == pygame.K_y:
                ink = yellow
            elif event.key == pygame.K_r:
                ink = red
            elif event.key == pygame.K_g:
                ink = green
            elif event.key == pygame.K_l:
                ink = blue
            drawink()
##        elif event.type == pygame.MOUSEMOTION:
##            print (pygame.mouse.get_pos())
        elif event.type == pygame.MOUSEBUTTONDOWN:
            x, y = event.pos
#           1st row
            if (x>15 and x<30) and (y>20 and y<35):
                pixels[0] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>31 and x<46) and (y>20 and y<35):
                pixels[1] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>47 and x<62) and (y>20 and y<35):
                pixels[2] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>63 and x<78) and (y>20 and y<35):
                pixels[3] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>79 and x<94) and (y>20 and y<35):
                pixels[4] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>95 and x<110) and (y>20 and y<35):
                pixels[5] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>111 and x<126) and (y>20 and y<35):
                pixels[6] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>127 and x<142) and (y>20 and y<35):
                pixels[7] = ink
                sense.set_pixels(pixels)
                drawgrid()
#           2nd row
            if (x>15 and x<30) and (y>36 and y<51):
                pixels[8] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>31 and x<46) and (y>36 and y<51):
                pixels[9] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>47 and x<62) and (y>36 and y<51):
                pixels[10] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>63 and x<78) and (y>36 and y<51):
                pixels[11] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>79 and x<94) and (y>36 and y<51):
                pixels[12] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>95 and x<110) and (y>36 and y<51):
                pixels[13] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>111 and x<126) and (y>36 and y<51):
                pixels[14] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>127 and x<142) and (y>36 and y<51):
                pixels[15] = ink
                sense.set_pixels(pixels)
                drawgrid()
#           3rd row
            if (x>15 and x<30) and (y>52 and y<67):
                pixels[16] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>31 and x<46) and (y>52 and y<67):
                pixels[17] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>47 and x<62) and (y>52 and y<67):
                pixels[18] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>63 and x<78) and (y>52 and y<67):
                pixels[19] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>79 and x<94) and (y>52 and y<67):
                pixels[20] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>95 and x<110) and (y>52 and y<67):
                pixels[21] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>111 and x<126) and (y>52 and y<67):
                pixels[22] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>127 and x<142) and (y>52 and y<67):
                pixels[23] = ink
                sense.set_pixels(pixels)
                drawgrid()
#           4th row
            if (x>15 and x<30) and (y>68 and y<83):
                pixels[24] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>31 and x<46) and (y>68 and y<83):
                pixels[25] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>47 and x<62) and (y>68 and y<83):
                pixels[26] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>63 and x<78) and (y>68 and y<83):
                pixels[27] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>79 and x<94) and (y>68 and y<83):
                pixels[28] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>95 and x<110) and (y>68 and y<83):
                pixels[29] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>111 and x<126) and (y>68 and y<83):
                pixels[30] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>127 and x<142) and (y>68 and y<83):
                pixels[31] = ink
                sense.set_pixels(pixels)
                drawgrid()
#           5th row
            if (x>15 and x<30) and (y>84 and y<99):
                pixels[32] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>31 and x<46) and (y>84 and y<99):
                pixels[33] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>47 and x<62) and (y>84 and y<99):
                pixels[34] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>63 and x<78) and (y>84 and y<99):
                pixels[35] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>79 and x<94) and (y>84 and y<99):
                pixels[36] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>95 and x<110) and (y>84 and y<99):
                pixels[37] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>111 and x<126) and (y>84 and y<99):
                pixels[38] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>127 and x<142) and (y>84 and y<99):
                pixels[39] = ink
                sense.set_pixels(pixels)
                drawgrid()
#           6th row
            if (x>15 and x<30) and (y>100 and y<115):
                pixels[40] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>31 and x<46) and (y>100 and y<115):
                pixels[41] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>47 and x<62) and (y>100 and y<115):
                pixels[42] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>63 and x<78) and (y>100 and y<115):
                pixels[43] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>79 and x<94) and (y>100 and y<115):
                pixels[44] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>95 and x<110) and (y>100 and y<115):
                pixels[45] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>111 and x<126) and (y>100 and y<115):
                pixels[46] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>127 and x<142) and (y>100 and y<115):
                pixels[47] = ink
                sense.set_pixels(pixels)
                drawgrid()
#           7th row
            if (x>15 and x<30) and (y>116 and y<131):
                pixels[48] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>31 and x<46) and (y>116 and y<131):
                pixels[49] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>47 and x<62) and (y>116 and y<131):
                pixels[50] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>63 and x<78) and (y>116 and y<131):
                pixels[51] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>79 and x<94) and (y>116 and y<131):
                pixels[52] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>95 and x<110) and (y>116 and y<131):
                pixels[53] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>111 and x<126) and (y>116 and y<131):
                pixels[54] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>127 and x<142) and (y>116 and y<131):
                pixels[55] = ink
                sense.set_pixels(pixels)
                drawgrid()
#           8th row
            if (x>15 and x<30) and (y>132 and y<147):
                pixels[56] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>31 and x<46) and (y>132 and y<147):
                pixels[57] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>47 and x<62) and (y>132 and y<147):
                pixels[58] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>63 and x<78) and (y>132 and y<147):
                pixels[59] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>79 and x<94) and (y>132 and y<147):
                pixels[60] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>95 and x<110) and (y>132 and y<147):
                pixels[61] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>111 and x<126) and (y>132 and y<147):
                pixels[62] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>127 and x<142) and (y>132 and y<147):
                pixels[63] = ink
                sense.set_pixels(pixels)
                drawgrid()
            elif (x>160 and x<205) and (y>55 and y<70):
                clearscreen()
                drawgrid()
            elif (x>220 and x<265) and (y>55 and y<70):
                print
                print pixels

pygame.quit()
This entry was posted in Raspberry Pi and tagged , , , . Bookmark the permalink.

One Response to SenseHAT paint

  1. Here’s the way that I did lots of buttons for a LED example:

    https://github.com/JulianNicholls/Raspberry-Pi-Misc/tree/master/python/pygame/led_ui

    If you run main.py, you’ll see several arrays of buttons that turn LEDs on and off. In button.py, it has several button types which draw themselves and return when they have been clicked.

Leave a Reply