"""
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Raspberry Pi Pico SSD1306 OLED Display (MicroPython) ┃
┃ ┃
┃ A program to display Raspberry Pi logo, text, and a ┃
┃ simple timer animation on an SSD1306 OLED display ┃
┃ connected to a Raspberry Pi Pico. ┃
┃ ┃
┃ Copyright (c) 2023 Anderson Costa ┃
┃ GitHub: github.com/arcostasi ┃
┃ License: MIT ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
"""
from machine import Pin, I2C, ADC
from ssd1306 import SSD1306_I2C
from dht import DHT22
import framebuf, sys
import utime
from toggle import *
pix_res_x = 128
pix_res_y = 64
led = Pin(0, Pin.OUT)
multiplex = Pin(1, Pin.OUT)
relais = Pin(2, Pin.OUT)
spg = ADC(Pin(26))
d = DHT22(Pin(3))
dht_data = [0,0]
messung_ok = False
run = True
def init_i2c(scl_pin, sda_pin):
# Initialize I2C device
i2c_dev = I2C(1, scl=Pin(scl_pin), sda=Pin(sda_pin), freq=200000)
i2c_addr = [hex(ii) for ii in i2c_dev.scan()]
if not i2c_addr:
print('No I2C Display Found')
sys.exit()
else:
print("I2C Address : {}".format(i2c_addr[0]))
print("I2C Configuration: {}".format(i2c_dev))
return i2c_dev
def display_logo(oled):
# Display the Raspberry Pi logo on the OLED
buffer = bytearray(b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00|?\x00\x01\x86@\x80\x01\x01\x80\x80\x01\x11\x88\x80\x01\x05\xa0\x80\x00\x83\xc1\x00\x00C\xe3\x00\x00~\xfc\x00\x00L'\x00\x00\x9c\x11\x00\x00\xbf\xfd\x00\x00\xe1\x87\x00\x01\xc1\x83\x80\x02A\x82@\x02A\x82@\x02\xc1\xc2@\x02\xf6>\xc0\x01\xfc=\x80\x01\x18\x18\x80\x01\x88\x10\x80\x00\x8c!\x00\x00\x87\xf1\x00\x00\x7f\xf6\x00\x008\x1c\x00\x00\x0c \x00\x00\x03\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
fb = framebuf.FrameBuffer(buffer, 32, 32, framebuf.MONO_HLSB)
oled.fill(0)
oled.blit(fb, 96, 0)
oled.show()
def display_text(oled):
# Display text on the OLED
oled.text("Raspberry Pi", 5, 5)
oled.text("Pico", 5, 20)
oled.show()
def display_anima(oled):
# Display a simple timer animation on the OLED
start_time = utime.ticks_ms()
while True:
elapsed_time = (utime.ticks_diff(utime.ticks_ms(), start_time) // 1000) + 1
# Clear the specific line by drawing a filled black rectangle
oled.fill_rect(5, 40, oled.width - 5, 8, 0)
oled.text("Timer:", 5, 30)
oled.text(str(elapsed_time) + " sec", 5, 40)
oled.show()
utime.sleep_ms(1000)
def display_daten(oled, data, dht_daten):
oled.rect(2, 2, 125, 61, 1)
oled.hline(3, 16, 124, 1)
oled.fill_rect(18, 18, 100, 12, 0)
oled.text("Spannungen", 5, 5)
oled.text("1:", 5, 20)
oled.text(data, 20, 20)
oled.text("Temperatur:", 5, 35)
oled.text(str(dht_daten[0]), 100, 35)
oled.text("Humidity:", 5, 50)
oled.text(str(dht_daten[1]), 100,50)
oled.show()
i2c_dev = init_i2c(scl_pin=19, sda_pin=18)
oled = SSD1306_I2C(pix_res_x, pix_res_y, i2c_dev)
display_logo(oled)
display_text(oled)
#display_anima(oled)
oled.fill(0)
oled.show()
while True:
run = status_toggle()
led.value(run)
if run:
led.value(True)
multiplex.value(False)
if messung_ok == False:
d.measure()
dht_data[0] = d.temperature()
dht_data[1] = d.humidity()
print("Temperatur: {:.1f}°C / Humidity: {:.1f}%".format(dht_data[0], dht_data[1]))
spg_wert = (spg.read_u16()/65536)*3.3
print ("Spgwert: {:1.2f} V".format(spg_wert))
temp = str("{:1.2f} V".format(spg_wert))
display_daten(oled, temp, dht_data)
messung_ok = True
if (spg_wert < 0.3) or (spg_wert > 3.0):
relais.value(True)
else:
relais.value(False)
else:
led.value(False)
multiplex.value(True)
if messung_ok == True:
messung_ok = False
'''
if __name__ == '__main__':
main()
'''