Merge pull request #527 from pimoroni/driver/inky-frame-4.0
Support for Inky Frame 4.0"
This commit is contained in:
commit
1ac55c49ea
|
@ -88,16 +88,35 @@ namespace pimoroni {
|
||||||
reset();
|
reset();
|
||||||
busy_wait();
|
busy_wait();
|
||||||
|
|
||||||
command(0x00, {0xE3, 0x08});
|
uint8_t dimensions[4] = {
|
||||||
command(0x01, {0x37, 0x00, 0x23, 0x23});
|
uint8_t(width >> 8),
|
||||||
command(0x03, {0x00});
|
uint8_t(width),
|
||||||
command(0x06, {0xC7, 0xC7, 0x1D});
|
uint8_t(height >> 8),
|
||||||
command(0x30, {0x3C});
|
uint8_t(height)
|
||||||
command(0x40, {0x00});
|
};
|
||||||
command(0x50, {0x37});
|
|
||||||
command(0x60, {0x22});
|
if (width == 600) {
|
||||||
command(0x61, {0x02, 0x58, 0x01, 0xC0});
|
if (rotation == ROTATE_0) {
|
||||||
command(0xE3, {0xAA});
|
command(PSR, {0xE3, 0x08});
|
||||||
|
} else {
|
||||||
|
command(PSR, {0xEF, 0x08});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (rotation == ROTATE_0) {
|
||||||
|
command(PSR, {0xA3, 0x08});
|
||||||
|
} else {
|
||||||
|
command(PSR, {0xAF, 0x08});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
command(PWR, {0x37, 0x00, 0x23, 0x23});
|
||||||
|
command(PFS, {0x00});
|
||||||
|
command(BTST, {0xC7, 0xC7, 0x1D});
|
||||||
|
command(PLL, {0x3C});
|
||||||
|
command(TSC, {0x00});
|
||||||
|
command(CDI, {0x37});
|
||||||
|
command(TCON, {0x22});
|
||||||
|
command(TRES, 4, dimensions);
|
||||||
|
command(PWS, {0xAA});
|
||||||
|
|
||||||
sleep_ms(100);
|
sleep_ms(100);
|
||||||
|
|
||||||
|
@ -154,6 +173,15 @@ namespace pimoroni {
|
||||||
spi_write_blocking(spi, ®, 1);
|
spi_write_blocking(spi, ®, 1);
|
||||||
|
|
||||||
gpio_put(DC, 1); // data mode
|
gpio_put(DC, 1); // data mode
|
||||||
|
|
||||||
|
// HACK: Output 48 rows of data since our buffer is 400px tall
|
||||||
|
// but the display has no offset configuration and H/V scan
|
||||||
|
// are reversed.
|
||||||
|
// Any garbage data will do.
|
||||||
|
// 2px per byte, so we need width * 24 bytes
|
||||||
|
if(height == 400 && rotation == ROTATE_0) {
|
||||||
|
spi_write_blocking(spi, (uint8_t *)graphics->frame_buffer, width * 24);
|
||||||
|
}
|
||||||
graphics->frame_convert(PicoGraphics::PEN_P4, [this](void *buf, size_t length) {
|
graphics->frame_convert(PicoGraphics::PEN_P4, [this](void *buf, size_t length) {
|
||||||
if (length > 0) {
|
if (length > 0) {
|
||||||
spi_write_blocking(spi, (const uint8_t*)buf, length);
|
spi_write_blocking(spi, (const uint8_t*)buf, length);
|
||||||
|
|
|
@ -42,10 +42,12 @@ namespace pimoroni {
|
||||||
CLEAN = 7
|
CLEAN = 7
|
||||||
};
|
};
|
||||||
|
|
||||||
UC8159(uint16_t width, uint16_t height) : UC8159(width, height, {PIMORONI_SPI_DEFAULT_INSTANCE, SPI_BG_FRONT_CS, SPI_DEFAULT_SCK, SPI_DEFAULT_MOSI, PIN_UNUSED, 28, PIN_UNUSED}) {};
|
UC8159(uint16_t width, uint16_t height) : UC8159(width, height, ROTATE_0, {PIMORONI_SPI_DEFAULT_INSTANCE, SPI_BG_FRONT_CS, SPI_DEFAULT_SCK, SPI_DEFAULT_MOSI, PIN_UNUSED, 28, PIN_UNUSED}) {};
|
||||||
|
|
||||||
UC8159(uint16_t width, uint16_t height, SPIPins pins, uint busy=PIN_UNUSED, uint reset=27) :
|
UC8159(uint16_t width, uint16_t height, SPIPins pins, uint busy=PIN_UNUSED, uint reset=27) : UC8159(width, height, ROTATE_0, pins, busy, reset) {};
|
||||||
DisplayDriver(width, height, ROTATE_0),
|
|
||||||
|
UC8159(uint16_t width, uint16_t height, Rotation rotation, SPIPins pins, uint busy=PIN_UNUSED, uint reset=27) :
|
||||||
|
DisplayDriver(width, height, rotation),
|
||||||
spi(pins.spi),
|
spi(pins.spi),
|
||||||
CS(pins.cs), DC(pins.dc), SCK(pins.sck), MOSI(pins.mosi), BUSY(busy), RESET(reset) {
|
CS(pins.cs), DC(pins.dc), SCK(pins.sck), MOSI(pins.mosi), BUSY(busy), RESET(reset) {
|
||||||
init();
|
init();
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
using namespace pimoroni;
|
using namespace pimoroni;
|
||||||
|
|
||||||
InkyFrame inky;
|
InkyFrame inky(640, 400);
|
||||||
datetime_t now;
|
datetime_t now;
|
||||||
datetime_t today;
|
datetime_t today;
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ int days_in_month(datetime_t &dt)
|
||||||
|
|
||||||
void center_text(std::string message, int y, float scale = 1.0f) {
|
void center_text(std::string message, int y, float scale = 1.0f) {
|
||||||
int32_t tw = inky.measure_text(message, scale);
|
int32_t tw = inky.measure_text(message, scale);
|
||||||
inky.text(message, {(600 / 2) - (tw / 2), y}, scale);
|
inky.text(message, {(inky.width / 2) - (tw / 2), y}, scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
void center_text(std::string message, int x, int y, int w, float scale = 1.0f) {
|
void center_text(std::string message, int x, int y, int w, float scale = 1.0f) {
|
||||||
|
@ -94,7 +94,7 @@ void render_calendar_view() {
|
||||||
//inky.text_aspect(1.1f);
|
//inky.text_aspect(1.1f);
|
||||||
|
|
||||||
inky.set_pen(InkyFrame::RED);
|
inky.set_pen(InkyFrame::RED);
|
||||||
inky.rectangle({0, 0, width, 448});
|
inky.rectangle({0, 0, width, inky.height});
|
||||||
|
|
||||||
inky.set_pen(InkyFrame::WHITE);
|
inky.set_pen(InkyFrame::WHITE);
|
||||||
|
|
||||||
|
@ -343,7 +343,7 @@ void render_calendar_entries() {
|
||||||
int spacing = 5;
|
int spacing = 5;
|
||||||
int xoff = 240 + spacing;
|
int xoff = 240 + spacing;
|
||||||
int yoff = spacing;
|
int yoff = spacing;
|
||||||
int width = 600 - xoff - spacing;
|
int width = inky.width - xoff - spacing;
|
||||||
int row_height = 50;
|
int row_height = 50;
|
||||||
|
|
||||||
//inky.text_tracking(1.0f);
|
//inky.text_tracking(1.0f);
|
||||||
|
|
|
@ -142,7 +142,7 @@ namespace pimoroni {
|
||||||
|
|
||||||
// Display an image that fills the screen (286*128)
|
// Display an image that fills the screen (286*128)
|
||||||
void InkyFrame::image(const uint8_t* data) {
|
void InkyFrame::image(const uint8_t* data) {
|
||||||
image(data, WIDTH, 0, 0, WIDTH, HEIGHT, 0, 0);
|
image(data, width, 0, 0, width, height, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Display an image smaller than the screen (sw*sh) at dx, dy
|
// Display an image smaller than the screen (sw*sh) at dx, dy
|
||||||
|
|
|
@ -89,14 +89,26 @@ namespace pimoroni {
|
||||||
I2C i2c;
|
I2C i2c;
|
||||||
PCF85063A rtc;
|
PCF85063A rtc;
|
||||||
|
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
|
||||||
|
[[deprecated("Use instance variable width.")]]
|
||||||
static const int WIDTH = 600;
|
static const int WIDTH = 600;
|
||||||
|
[[deprecated("Use instance variable height.")]]
|
||||||
static const int HEIGHT = 448;
|
static const int HEIGHT = 448;
|
||||||
|
|
||||||
InkyFrame() :
|
// Default 5.7" constructor
|
||||||
PicoGraphics_Pen3Bit(WIDTH, HEIGHT, nullptr),
|
InkyFrame() : InkyFrame(600, 448) {};
|
||||||
uc8159(WIDTH, HEIGHT, {spi0, EINK_CS, CLK, MOSI, PIN_UNUSED, EINK_DC, PIN_UNUSED}),
|
|
||||||
|
// 600x448 for 5.7"
|
||||||
|
// 640x400 for 4.0"
|
||||||
|
InkyFrame(int width, int height) :
|
||||||
|
PicoGraphics_Pen3Bit(width, height, nullptr),
|
||||||
|
uc8159(width, height, {spi0, EINK_CS, CLK, MOSI, PIN_UNUSED, EINK_DC, PIN_UNUSED}),
|
||||||
i2c(4, 5),
|
i2c(4, 5),
|
||||||
rtc(&i2c) {
|
rtc(&i2c),
|
||||||
|
width(width),
|
||||||
|
height(height) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void init();
|
void init();
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
# This example shows you a simple, non-interrupt way of reading Inky Frame's buttons with a loop that checks to see if buttons are pressed.
|
||||||
|
|
||||||
|
from pimoroni import ShiftRegister
|
||||||
|
from picographics import PicoGraphics, DISPLAY_INKY_FRAME as DISPLAY # 5.7"
|
||||||
|
# from picographics import PicoGraphics, DISPLAY_INKY_FRAME_4 as DISPLAY # 4.0"
|
||||||
|
from machine import Pin
|
||||||
|
|
||||||
|
display = PicoGraphics(display=DISPLAY)
|
||||||
|
|
||||||
|
display.set_font("bitmap8")
|
||||||
|
|
||||||
|
# Inky Frame uses a shift register to read the buttons
|
||||||
|
SR_CLOCK = 8
|
||||||
|
SR_LATCH = 9
|
||||||
|
SR_OUT = 10
|
||||||
|
|
||||||
|
sr = ShiftRegister(SR_CLOCK, SR_LATCH, SR_OUT)
|
||||||
|
|
||||||
|
# set up the button LEDs
|
||||||
|
button_a_led = Pin(11, Pin.OUT)
|
||||||
|
button_b_led = Pin(12, Pin.OUT)
|
||||||
|
button_c_led = Pin(13, Pin.OUT)
|
||||||
|
button_d_led = Pin(14, Pin.OUT)
|
||||||
|
button_e_led = Pin(15, Pin.OUT)
|
||||||
|
|
||||||
|
|
||||||
|
# a handy function we can call to clear the screen
|
||||||
|
# display.set_pen(1) is white and display.set_pen(0) is black
|
||||||
|
def clear():
|
||||||
|
display.set_pen(1)
|
||||||
|
display.clear()
|
||||||
|
|
||||||
|
|
||||||
|
# set up
|
||||||
|
clear()
|
||||||
|
display.set_pen(0)
|
||||||
|
display.text("Press any button!", 10, 10, scale=4)
|
||||||
|
display.update()
|
||||||
|
|
||||||
|
while True:
|
||||||
|
button_a_led.off()
|
||||||
|
button_b_led.off()
|
||||||
|
button_c_led.off()
|
||||||
|
button_d_led.off()
|
||||||
|
button_e_led.off()
|
||||||
|
|
||||||
|
# read the shift register
|
||||||
|
# we can tell which button has been pressed by checking if a specific bit is 0 or 1
|
||||||
|
result = sr.read()
|
||||||
|
button_a = sr[7]
|
||||||
|
button_b = sr[6]
|
||||||
|
button_c = sr[5]
|
||||||
|
button_d = sr[4]
|
||||||
|
button_e = sr[3]
|
||||||
|
|
||||||
|
if button_a == 1: # if a button press is detected then...
|
||||||
|
button_a_led.on()
|
||||||
|
clear() # clear to white
|
||||||
|
display.set_pen(4) # change the pen colour
|
||||||
|
display.text("Button A pressed", 10, 10, scale=4) # display some text on the screen
|
||||||
|
display.update() # update the display
|
||||||
|
elif button_b == 1:
|
||||||
|
button_b_led.on()
|
||||||
|
clear()
|
||||||
|
display.set_pen(6)
|
||||||
|
display.text("Button B pressed", 10, 50, scale=4)
|
||||||
|
display.update()
|
||||||
|
elif button_c == 1:
|
||||||
|
button_c_led.on()
|
||||||
|
clear()
|
||||||
|
display.set_pen(5)
|
||||||
|
display.text("Button C pressed", 10, 90, scale=4)
|
||||||
|
display.update()
|
||||||
|
elif button_d == 1:
|
||||||
|
button_d_led.on()
|
||||||
|
clear()
|
||||||
|
display.set_pen(2)
|
||||||
|
display.text("Button D pressed", 10, 130, scale=4)
|
||||||
|
display.update()
|
||||||
|
elif button_e == 1:
|
||||||
|
button_e_led.on()
|
||||||
|
clear()
|
||||||
|
display.set_pen(3)
|
||||||
|
display.text("Button E pressed", 10, 170, scale=4)
|
||||||
|
display.update()
|
|
@ -1,12 +1,10 @@
|
||||||
# This example shows you a simple, non-interrupt way of reading Inky Frame's buttons with a loop that checks to see if buttons are pressed.
|
# This example allows you to test Inky Frame's buttons
|
||||||
|
# It does not update the screen.
|
||||||
|
|
||||||
from pimoroni import ShiftRegister
|
from pimoroni import ShiftRegister
|
||||||
from picographics import PicoGraphics, DISPLAY_INKY_FRAME
|
|
||||||
from machine import Pin
|
from machine import Pin
|
||||||
|
import time
|
||||||
|
|
||||||
display = PicoGraphics(display=DISPLAY_INKY_FRAME)
|
|
||||||
|
|
||||||
display.set_font("bitmap8")
|
|
||||||
|
|
||||||
# Inky Frame uses a shift register to read the buttons
|
# Inky Frame uses a shift register to read the buttons
|
||||||
SR_CLOCK = 8
|
SR_CLOCK = 8
|
||||||
|
@ -15,70 +13,47 @@ SR_OUT = 10
|
||||||
|
|
||||||
sr = ShiftRegister(SR_CLOCK, SR_LATCH, SR_OUT)
|
sr = ShiftRegister(SR_CLOCK, SR_LATCH, SR_OUT)
|
||||||
|
|
||||||
# set up the button LEDs
|
|
||||||
button_a_led = Pin(11, Pin.OUT)
|
# Simple class to debounce button input and handle LED
|
||||||
button_b_led = Pin(12, Pin.OUT)
|
class Button:
|
||||||
button_c_led = Pin(13, Pin.OUT)
|
def __init__(self, idx, led, debounce=50):
|
||||||
button_d_led = Pin(14, Pin.OUT)
|
self.led = Pin(led, Pin.OUT) # LEDs are just regular IOs
|
||||||
button_e_led = Pin(15, Pin.OUT)
|
self.led.on()
|
||||||
|
self._idx = idx
|
||||||
|
self._debounce_time = debounce
|
||||||
|
self._changed = time.ticks_ms()
|
||||||
|
self._last_value = None
|
||||||
|
|
||||||
|
def debounced(self):
|
||||||
|
return time.ticks_ms() - self._changed > self._debounce_time
|
||||||
|
|
||||||
|
def get(self, sr):
|
||||||
|
value = sr[self._idx]
|
||||||
|
if value != self._last_value and self.debounced():
|
||||||
|
self._last_value = value
|
||||||
|
self._changed = time.ticks_ms()
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
# a handy function we can call to clear the screen
|
button_a = Button(7, 11)
|
||||||
# display.set_pen(1) is white and display.set_pen(0) is black
|
button_b = Button(6, 12)
|
||||||
def clear():
|
button_c = Button(5, 13)
|
||||||
display.set_pen(1)
|
button_d = Button(4, 14)
|
||||||
display.clear()
|
button_e = Button(3, 15)
|
||||||
|
|
||||||
|
|
||||||
# set up
|
|
||||||
clear()
|
|
||||||
display.set_pen(0)
|
|
||||||
display.text("Press any button!", 10, 10, scale=4)
|
|
||||||
display.update()
|
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
button_a_led.off()
|
sr.read()
|
||||||
button_b_led.off()
|
|
||||||
button_c_led.off()
|
|
||||||
button_d_led.off()
|
|
||||||
button_e_led.off()
|
|
||||||
|
|
||||||
# read the shift register
|
if button_a.get(sr):
|
||||||
# we can tell which button has been pressed by checking if a specific bit is 0 or 1
|
button_a.led.toggle()
|
||||||
result = sr.read()
|
if button_b.get(sr):
|
||||||
button_a = sr[7]
|
button_b.led.toggle()
|
||||||
button_b = sr[6]
|
if button_c.get(sr):
|
||||||
button_c = sr[5]
|
button_c.led.toggle()
|
||||||
button_d = sr[4]
|
if button_d.get(sr):
|
||||||
button_e = sr[3]
|
button_d.led.toggle()
|
||||||
|
if button_e.get(sr):
|
||||||
|
button_e.led.toggle()
|
||||||
|
|
||||||
if button_a == 1: # if a button press is detected then...
|
time.sleep(1.0 / 60) # Poll 60 times/second
|
||||||
button_a_led.on()
|
|
||||||
clear() # clear to white
|
|
||||||
display.set_pen(4) # change the pen colour
|
|
||||||
display.text("Button A pressed", 10, 10, scale=4) # display some text on the screen
|
|
||||||
display.update() # update the display
|
|
||||||
elif button_b == 1:
|
|
||||||
button_b_led.on()
|
|
||||||
clear()
|
|
||||||
display.set_pen(6)
|
|
||||||
display.text("Button B pressed", 10, 50, scale=4)
|
|
||||||
display.update()
|
|
||||||
elif button_c == 1:
|
|
||||||
button_c_led.on()
|
|
||||||
clear()
|
|
||||||
display.set_pen(5)
|
|
||||||
display.text("Button C pressed", 10, 90, scale=4)
|
|
||||||
display.update()
|
|
||||||
elif button_d == 1:
|
|
||||||
button_d_led.on()
|
|
||||||
clear()
|
|
||||||
display.set_pen(2)
|
|
||||||
display.text("Button D pressed", 10, 130, scale=4)
|
|
||||||
display.update()
|
|
||||||
elif button_e == 1:
|
|
||||||
button_e_led.on()
|
|
||||||
clear()
|
|
||||||
display.set_pen(3)
|
|
||||||
display.text("Button E pressed", 10, 170, scale=4)
|
|
||||||
display.update()
|
|
||||||
|
|
|
@ -4,7 +4,8 @@ from network_manager import NetworkManager
|
||||||
import uasyncio
|
import uasyncio
|
||||||
import ujson
|
import ujson
|
||||||
from urllib import urequest
|
from urllib import urequest
|
||||||
from picographics import PicoGraphics, DISPLAY_INKY_FRAME
|
from picographics import PicoGraphics, DISPLAY_INKY_FRAME as DISPLAY # 5.7"
|
||||||
|
# from picographics import PicoGraphics, DISPLAY_INKY_FRAME_4 as DISPLAY # 4.0"
|
||||||
from machine import Pin
|
from machine import Pin
|
||||||
from pimoroni_i2c import PimoroniI2C
|
from pimoroni_i2c import PimoroniI2C
|
||||||
from pcf85063a import PCF85063A
|
from pcf85063a import PCF85063A
|
||||||
|
@ -38,7 +39,7 @@ def status_handler(mode, status, ip):
|
||||||
network_manager = NetworkManager(WIFI_CONFIG.COUNTRY, status_handler=status_handler)
|
network_manager = NetworkManager(WIFI_CONFIG.COUNTRY, status_handler=status_handler)
|
||||||
|
|
||||||
gc.collect()
|
gc.collect()
|
||||||
graphics = PicoGraphics(DISPLAY_INKY_FRAME)
|
graphics = PicoGraphics(DISPLAY)
|
||||||
WIDTH, HEIGHT = graphics.get_bounds()
|
WIDTH, HEIGHT = graphics.get_bounds()
|
||||||
gc.collect()
|
gc.collect()
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
from picographics import PicoGraphics, DISPLAY_INKY_FRAME
|
from picographics import PicoGraphics, DISPLAY_INKY_FRAME as DISPLAY # 5.7"
|
||||||
|
# from picographics import PicoGraphics, DISPLAY_INKY_FRAME_4 as DISPLAY # 4.0"
|
||||||
from network_manager import NetworkManager
|
from network_manager import NetworkManager
|
||||||
import uasyncio
|
import uasyncio
|
||||||
from urllib import urequest
|
from urllib import urequest
|
||||||
|
@ -27,7 +28,7 @@ URL = "http://feeds.bbci.co.uk/news/technology/rss.xml"
|
||||||
# Frequent updates will reduce battery life!
|
# Frequent updates will reduce battery life!
|
||||||
UPDATE_INTERVAL = 60 * 1
|
UPDATE_INTERVAL = 60 * 1
|
||||||
|
|
||||||
graphics = PicoGraphics(DISPLAY_INKY_FRAME)
|
graphics = PicoGraphics(DISPLAY)
|
||||||
WIDTH, HEIGHT = graphics.get_bounds()
|
WIDTH, HEIGHT = graphics.get_bounds()
|
||||||
graphics.set_font("bitmap8")
|
graphics.set_font("bitmap8")
|
||||||
code = qrcode.QRCode()
|
code = qrcode.QRCode()
|
||||||
|
|
|
@ -8,7 +8,8 @@ import sdcard
|
||||||
import WIFI_CONFIG
|
import WIFI_CONFIG
|
||||||
from urllib import urequest
|
from urllib import urequest
|
||||||
from network_manager import NetworkManager
|
from network_manager import NetworkManager
|
||||||
from picographics import PicoGraphics, DISPLAY_INKY_FRAME as DISPLAY
|
from picographics import PicoGraphics, DISPLAY_INKY_FRAME as DISPLAY # 5.7"
|
||||||
|
# from picographics import PicoGraphics, DISPLAY_INKY_FRAME_4 as DISPLAY # 4.0"
|
||||||
|
|
||||||
"""
|
"""
|
||||||
random placekitten (from a very small set)
|
random placekitten (from a very small set)
|
||||||
|
|
|
@ -5,7 +5,8 @@ import uasyncio
|
||||||
import WIFI_CONFIG
|
import WIFI_CONFIG
|
||||||
from urllib import urequest
|
from urllib import urequest
|
||||||
from network_manager import NetworkManager
|
from network_manager import NetworkManager
|
||||||
from picographics import PicoGraphics, DISPLAY_INKY_FRAME
|
from picographics import PicoGraphics, DISPLAY_INKY_FRAME as DISPLAY # 5.7"
|
||||||
|
# from picographics import PicoGraphics, DISPLAY_INKY_FRAME_4 as DISPLAY # 4.0"
|
||||||
|
|
||||||
|
|
||||||
ENDPOINT = "https://en.wikiquote.org/w/api.php?format=json&action=expandtemplates&prop=wikitext&text={{{{Wikiquote:Quote%20of%20the%20day/{3}%20{2},%20{0}}}}}"
|
ENDPOINT = "https://en.wikiquote.org/w/api.php?format=json&action=expandtemplates&prop=wikitext&text={{{{Wikiquote:Quote%20of%20the%20day/{3}%20{2},%20{0}}}}}"
|
||||||
|
@ -31,7 +32,7 @@ def status_handler(mode, status, ip):
|
||||||
network_manager = NetworkManager(WIFI_CONFIG.COUNTRY, status_handler=status_handler)
|
network_manager = NetworkManager(WIFI_CONFIG.COUNTRY, status_handler=status_handler)
|
||||||
|
|
||||||
gc.collect()
|
gc.collect()
|
||||||
graphics = PicoGraphics(DISPLAY_INKY_FRAME)
|
graphics = PicoGraphics(DISPLAY)
|
||||||
WIDTH, HEIGHT = graphics.get_bounds()
|
WIDTH, HEIGHT = graphics.get_bounds()
|
||||||
graphics.set_font("bitmap8")
|
graphics.set_font("bitmap8")
|
||||||
gc.collect()
|
gc.collect()
|
||||||
|
|
|
@ -6,7 +6,8 @@ import jpegdec
|
||||||
import WIFI_CONFIG
|
import WIFI_CONFIG
|
||||||
import uasyncio
|
import uasyncio
|
||||||
from network_manager import NetworkManager
|
from network_manager import NetworkManager
|
||||||
from picographics import PicoGraphics, DISPLAY_INKY_FRAME as DISPLAY
|
from picographics import PicoGraphics, DISPLAY_INKY_FRAME as DISPLAY # 5.7"
|
||||||
|
# from picographics import PicoGraphics, DISPLAY_INKY_FRAME_4 as DISPLAY # 4.0"
|
||||||
from urllib import urequest
|
from urllib import urequest
|
||||||
|
|
||||||
|
|
||||||
|
@ -27,7 +28,7 @@ WIDTH, HEIGHT = graphics.get_bounds()
|
||||||
FILENAME = "/sd/random-joke.jpg"
|
FILENAME = "/sd/random-joke.jpg"
|
||||||
|
|
||||||
JOKE_IDS = "https://pimoroni.github.io/feed2image/jokeapi-ids.txt"
|
JOKE_IDS = "https://pimoroni.github.io/feed2image/jokeapi-ids.txt"
|
||||||
JOKE_IMG = "https://pimoroni.github.io/feed2image/jokeapi-{}-600x448.jpg"
|
JOKE_IMG = "https://pimoroni.github.io/feed2image/jokeapi-{}-{}x{}.jpg"
|
||||||
|
|
||||||
import sdcard # noqa: E402 - putting this at the top causes an MBEDTLS OOM error!?
|
import sdcard # noqa: E402 - putting this at the top causes an MBEDTLS OOM error!?
|
||||||
sd_spi = machine.SPI(0, sck=machine.Pin(18, machine.Pin.OUT), mosi=machine.Pin(19, machine.Pin.OUT), miso=machine.Pin(16, machine.Pin.OUT))
|
sd_spi = machine.SPI(0, sck=machine.Pin(18, machine.Pin.OUT), mosi=machine.Pin(19, machine.Pin.OUT), miso=machine.Pin(16, machine.Pin.OUT))
|
||||||
|
@ -59,7 +60,7 @@ socket.close()
|
||||||
|
|
||||||
print("Random joke ID: {}".format(random_joke_id))
|
print("Random joke ID: {}".format(random_joke_id))
|
||||||
|
|
||||||
url = JOKE_IMG.format(random_joke_id)
|
url = JOKE_IMG.format(random_joke_id, WIDTH, HEIGHT)
|
||||||
|
|
||||||
socket = urequest.urlopen(url)
|
socket = urequest.urlopen(url)
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
import gc
|
import gc
|
||||||
import uos
|
import uos
|
||||||
import random
|
|
||||||
import machine
|
import machine
|
||||||
import jpegdec
|
import jpegdec
|
||||||
import uasyncio
|
import uasyncio
|
||||||
|
@ -8,7 +7,8 @@ import sdcard
|
||||||
import WIFI_CONFIG
|
import WIFI_CONFIG
|
||||||
from urllib import urequest
|
from urllib import urequest
|
||||||
from network_manager import NetworkManager
|
from network_manager import NetworkManager
|
||||||
from picographics import PicoGraphics, DISPLAY_INKY_FRAME as DISPLAY
|
from picographics import PicoGraphics, DISPLAY_INKY_FRAME as DISPLAY # 5.7"
|
||||||
|
# from picographics import PicoGraphics, DISPLAY_INKY_FRAME_4 as DISPLAY # 4.0"
|
||||||
|
|
||||||
"""
|
"""
|
||||||
xkcd daily
|
xkcd daily
|
||||||
|
@ -46,7 +46,10 @@ uos.mount(sd, "/sd")
|
||||||
gc.collect() # Claw back some RAM!
|
gc.collect() # Claw back some RAM!
|
||||||
|
|
||||||
|
|
||||||
url = ENDPOINT.format(WIDTH, HEIGHT + random.randint(0, 10))
|
url = ENDPOINT
|
||||||
|
|
||||||
|
if (WIDTH, HEIGHT) != (600, 448):
|
||||||
|
url = url.replace("xkcd-", f"xkcd-{WIDTH}x{HEIGHT}-")
|
||||||
|
|
||||||
socket = urequest.urlopen(url)
|
socket = urequest.urlopen(url)
|
||||||
|
|
||||||
|
|
|
@ -18,10 +18,16 @@ led_e = PWM(Pin(15))
|
||||||
|
|
||||||
led_activity.freq(1000)
|
led_activity.freq(1000)
|
||||||
|
|
||||||
|
leds = [led_activity, led_connect, led_a, led_b, led_c, led_d, led_e]
|
||||||
|
n = 0
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
for duty in range(65025):
|
for _ in range(2):
|
||||||
led_activity.duty_u16(duty)
|
for duty in range(65025, 2):
|
||||||
sleep(0.0001)
|
leds[n].duty_u16(duty)
|
||||||
for duty in range(65025, 0, -1):
|
sleep(0.0001)
|
||||||
led_activity.duty_u16(duty)
|
for duty in range(65025, 0, -2):
|
||||||
sleep(0.0001)
|
leds[n].duty_u16(duty)
|
||||||
|
sleep(0.0001)
|
||||||
|
n += 1
|
||||||
|
n %= len(leds)
|
||||||
|
|
|
@ -124,6 +124,7 @@ STATIC const mp_map_elem_t picographics_globals_table[] = {
|
||||||
{ MP_ROM_QSTR(MP_QSTR_DISPLAY_I2C_OLED_128X128), MP_ROM_INT(DISPLAY_I2C_OLED_128X128) },
|
{ MP_ROM_QSTR(MP_QSTR_DISPLAY_I2C_OLED_128X128), MP_ROM_INT(DISPLAY_I2C_OLED_128X128) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_DISPLAY_INKY_PACK), MP_ROM_INT(DISPLAY_INKY_PACK) },
|
{ MP_ROM_QSTR(MP_QSTR_DISPLAY_INKY_PACK), MP_ROM_INT(DISPLAY_INKY_PACK) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_DISPLAY_INKY_FRAME), MP_ROM_INT(DISPLAY_INKY_FRAME) },
|
{ MP_ROM_QSTR(MP_QSTR_DISPLAY_INKY_FRAME), MP_ROM_INT(DISPLAY_INKY_FRAME) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_DISPLAY_INKY_FRAME_4), MP_ROM_INT(DISPLAY_INKY_FRAME_4) },
|
||||||
|
|
||||||
{ MP_ROM_QSTR(MP_QSTR_PEN_1BIT), MP_ROM_INT(PEN_1BIT) },
|
{ MP_ROM_QSTR(MP_QSTR_PEN_1BIT), MP_ROM_INT(PEN_1BIT) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_PEN_P4), MP_ROM_INT(PEN_P4) },
|
{ MP_ROM_QSTR(MP_QSTR_PEN_P4), MP_ROM_INT(PEN_P4) },
|
||||||
|
|
|
@ -105,6 +105,13 @@ bool get_display_settings(PicoGraphicsDisplay display, int &width, int &height,
|
||||||
if(rotate == -1) rotate = (int)Rotation::ROTATE_0;
|
if(rotate == -1) rotate = (int)Rotation::ROTATE_0;
|
||||||
if(pen_type == -1) pen_type = PEN_P4;
|
if(pen_type == -1) pen_type = PEN_P4;
|
||||||
break;
|
break;
|
||||||
|
case DISPLAY_INKY_FRAME_4:
|
||||||
|
width = 640;
|
||||||
|
height = 400;
|
||||||
|
bus_type = BUS_SPI;
|
||||||
|
if(rotate == -1) rotate = (int)Rotation::ROTATE_0;
|
||||||
|
if(pen_type == -1) pen_type = PEN_P4;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -187,7 +194,7 @@ mp_obj_t ModPicoGraphics_make_new(const mp_obj_type_t *type, size_t n_args, size
|
||||||
self->i2c = (_PimoroniI2C_obj_t *)MP_OBJ_TO_PTR(PimoroniI2C_make_new(&PimoroniI2C_type, 0, 0, nullptr));
|
self->i2c = (_PimoroniI2C_obj_t *)MP_OBJ_TO_PTR(PimoroniI2C_make_new(&PimoroniI2C_type, 0, 0, nullptr));
|
||||||
i2c_bus = (pimoroni::I2C *)(self->i2c->i2c);
|
i2c_bus = (pimoroni::I2C *)(self->i2c->i2c);
|
||||||
} else if (bus_type == BUS_SPI) {
|
} else if (bus_type == BUS_SPI) {
|
||||||
if(display == DISPLAY_INKY_FRAME) {
|
if(display == DISPLAY_INKY_FRAME || display == DISPLAY_INKY_FRAME_4) {
|
||||||
spi_bus = {PIMORONI_SPI_DEFAULT_INSTANCE, SPI_BG_FRONT_CS, SPI_DEFAULT_SCK, SPI_DEFAULT_MOSI, PIN_UNUSED, 28, PIN_UNUSED};
|
spi_bus = {PIMORONI_SPI_DEFAULT_INSTANCE, SPI_BG_FRONT_CS, SPI_DEFAULT_SCK, SPI_DEFAULT_MOSI, PIN_UNUSED, 28, PIN_UNUSED};
|
||||||
} else if (display == DISPLAY_INKY_PACK) {
|
} else if (display == DISPLAY_INKY_PACK) {
|
||||||
spi_bus = {PIMORONI_SPI_DEFAULT_INSTANCE, SPI_BG_FRONT_CS, SPI_DEFAULT_SCK, SPI_DEFAULT_MOSI, PIN_UNUSED, 20, PIN_UNUSED};
|
spi_bus = {PIMORONI_SPI_DEFAULT_INSTANCE, SPI_BG_FRONT_CS, SPI_DEFAULT_SCK, SPI_DEFAULT_MOSI, PIN_UNUSED, 20, PIN_UNUSED};
|
||||||
|
@ -196,10 +203,10 @@ mp_obj_t ModPicoGraphics_make_new(const mp_obj_type_t *type, size_t n_args, size
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try to create an appropriate display driver
|
// Try to create an appropriate display driver
|
||||||
if (display == DISPLAY_INKY_FRAME) {
|
if (display == DISPLAY_INKY_FRAME || display == DISPLAY_INKY_FRAME_4) {
|
||||||
pen_type = PEN_3BIT; // FORCE to 3BIT
|
pen_type = PEN_3BIT; // FORCE to 3BIT
|
||||||
// TODO grab BUSY and RESET from ARG_extra_pins
|
// TODO grab BUSY and RESET from ARG_extra_pins
|
||||||
self->display = m_new_class(UC8159, width, height, spi_bus);
|
self->display = m_new_class(UC8159, width, height, (Rotation)rotate, spi_bus);
|
||||||
|
|
||||||
} else if (display == DISPLAY_TUFTY_2040) {
|
} else if (display == DISPLAY_TUFTY_2040) {
|
||||||
self->display = m_new_class(ST7789, width, height, (Rotation)rotate, parallel_bus);
|
self->display = m_new_class(ST7789, width, height, (Rotation)rotate, parallel_bus);
|
||||||
|
@ -273,7 +280,7 @@ mp_obj_t ModPicoGraphics_make_new(const mp_obj_type_t *type, size_t n_args, size
|
||||||
self->graphics->clear();
|
self->graphics->clear();
|
||||||
|
|
||||||
// Update the LCD from the graphics library
|
// Update the LCD from the graphics library
|
||||||
if (display != DISPLAY_INKY_FRAME && display != DISPLAY_INKY_PACK) {
|
if (display != DISPLAY_INKY_FRAME && display != DISPLAY_INKY_FRAME_4 && display != DISPLAY_INKY_PACK) {
|
||||||
self->display->update(self->graphics);
|
self->display->update(self->graphics);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,8 @@ enum PicoGraphicsDisplay {
|
||||||
DISPLAY_LCD_160X80,
|
DISPLAY_LCD_160X80,
|
||||||
DISPLAY_I2C_OLED_128X128,
|
DISPLAY_I2C_OLED_128X128,
|
||||||
DISPLAY_INKY_PACK,
|
DISPLAY_INKY_PACK,
|
||||||
DISPLAY_INKY_FRAME
|
DISPLAY_INKY_FRAME,
|
||||||
|
DISPLAY_INKY_FRAME_4
|
||||||
};
|
};
|
||||||
|
|
||||||
enum PicoGraphicsPenType {
|
enum PicoGraphicsPenType {
|
||||||
|
|
Loading…
Reference in New Issue