From bda248ccf7e8ab3d752917153b0887fc7b846feb Mon Sep 17 00:00:00 2001 From: Benjamyn Love Date: Sun, 6 Feb 2022 20:59:59 +1100 Subject: [PATCH] initial --- .vscode/launch.json | 0 backup.py | 65 ++++++++++++++++++++++ code.py | 66 +++++++++++++++++++++++ font5x8.bin | Bin 0 -> 1282 bytes lib/adafruit_bitmap_font/__init__.py | 0 lib/adafruit_bitmap_font/bdf.mpy | Bin 0 -> 2216 bytes lib/adafruit_bitmap_font/bitmap_font.mpy | Bin 0 -> 452 bytes lib/adafruit_bitmap_font/glyph_cache.mpy | Bin 0 -> 394 bytes lib/adafruit_bitmap_font/pcf.mpy | Bin 0 -> 4065 bytes lib/adafruit_bitmap_font/ttf.mpy | Bin 0 -> 688 bytes lib/adafruit_displayio_ssd1306.mpy | Bin 0 -> 750 bytes lib/adafruit_framebuf.mpy | Bin 0 -> 4796 bytes lib/adafruit_ssd1306.mpy | Bin 0 -> 2846 bytes lib/bitmap_font.mpy | Bin 0 -> 452 bytes lib/font5x8.bin | Bin 0 -> 1282 bytes lib/neopixel.mpy | Bin 0 -> 1401 bytes upload.sh | 23 ++++++++ 17 files changed, 154 insertions(+) create mode 100644 .vscode/launch.json create mode 100644 backup.py create mode 100644 code.py create mode 100644 font5x8.bin create mode 100644 lib/adafruit_bitmap_font/__init__.py create mode 100644 lib/adafruit_bitmap_font/bdf.mpy create mode 100644 lib/adafruit_bitmap_font/bitmap_font.mpy create mode 100644 lib/adafruit_bitmap_font/glyph_cache.mpy create mode 100644 lib/adafruit_bitmap_font/pcf.mpy create mode 100644 lib/adafruit_bitmap_font/ttf.mpy create mode 100644 lib/adafruit_displayio_ssd1306.mpy create mode 100644 lib/adafruit_framebuf.mpy create mode 100644 lib/adafruit_ssd1306.mpy create mode 100644 lib/bitmap_font.mpy create mode 100644 lib/font5x8.bin create mode 100644 lib/neopixel.mpy create mode 100644 upload.sh diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..e69de29 diff --git a/backup.py b/backup.py new file mode 100644 index 0000000..0cc1a9f --- /dev/null +++ b/backup.py @@ -0,0 +1,65 @@ +# SPDX-FileCopyrightText: 2021 Kattni Rembor for Adafruit Industries +# SPDX-License-Identifier: Unlicense +"""CircuitPython I2C Device Address Scan""" +import board +import adafruit_ssd1306 +import neopixel +import rotaryio +import busio +import digitalio +import time + +# Setup the i2c bus +i2c = busio.I2C(board.A3, board.A2) + +# Get the oled +oled = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c) + +# Setup the NeoPixel +neopixel = neopixel.NeoPixel(board.NEOPIXEL, 1) + +# Setup the encoder +enc = rotaryio.IncrementalEncoder(board.D5, board.D4) + +# Setup the encoder button +enc_btn = digitalio.DigitalInOut(board.D3) +enc_btn.direction = digitalio.Direction.INPUT + + +# Start the main loop +last_position = None +colour = [0,0,0] +menu_item = 0 +sub_menu = False +while True: + if menu_item == 0: + menu = "[R] G B" + if menu_item == 1: + menu = "R [G] B" + if menu_item == 2: + menu = "R G [B]" + oled.fill(0) + oled.text(menu, 0, 0, 1) + current_value = neopixel[0] + oled.text(f"{current_value[0]}:{current_value[1]}:{current_value[2]}", 0, 10, 1) + position = enc.position + if last_position == None or position != last_position: + print(position) + last_position = position + if not enc_btn.value: + sub_menu = not sub_menu + enc.position = 0 + if not sub_menu: + menu_item = position % 3 + else: + colour[menu_item] = position + if enc.position < 0: + position = 0 + enc.position = 0 + if enc.position > 255: + position = 255 + enc.position = 255 + + neopixel.fill((colour[0],colour[1],colour[2])) + # oled.text(f'Position: {position}', 0, 0, 1) + oled.show() diff --git a/code.py b/code.py new file mode 100644 index 0000000..323d07b --- /dev/null +++ b/code.py @@ -0,0 +1,66 @@ +# SPDX-FileCopyrightText: 2021 Kattni Rembor for Adafruit Industries +# SPDX-License-Identifier: Unlicense +"""CircuitPython I2C Device Address Scan""" +import board +import adafruit_ssd1306 +import neopixel +import rotaryio +import busio +import digitalio +import time + +# Setup the i2c bus +i2c = busio.I2C(board.A3, board.A2) + +# Get the oled +oled = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c) + +# Setup the NeoPixel +neopixel = neopixel.NeoPixel(board.NEOPIXEL, 1) + +# Setup the encoder +enc = rotaryio.IncrementalEncoder(board.D5, board.D4) + +# Setup the encoder button +enc_btn = digitalio.DigitalInOut(board.D3) +enc_btn.direction = digitalio.Direction.INPUT + + +# Start the main loop +last_position = None +colour = [0,0,0] +menu_item = 0 +sub_menu = False +while True: + if menu_item == 0: + menu = "[R] G B" + if menu_item == 1: + menu = "R [G] B" + if menu_item == 2: + menu = "R G [B]" + oled.fill(0) + oled.text(menu, 0, 0, 1) + current_value = neopixel[0] + oled.text(f"{current_value[0]}:{current_value[1]}:{current_value[2]}", 0, 10, 1) + position = enc.position + if last_position == None or position != last_position: + print(position) + last_position = position + if not enc_btn.value: + sub_menu = not sub_menu + enc.position = 0 + time.sleep(0.1) + if not sub_menu: + menu_item = position % 3 + else: + colour[menu_item] = position + if enc.position < 0: + position = 0 + enc.position = 0 + if enc.position > 255: + position = 255 + enc.position = 255 + + neopixel.fill((colour[0],colour[1],colour[2])) + # oled.text(f'Position: {position}', 0, 0, 1) + oled.show() diff --git a/font5x8.bin b/font5x8.bin new file mode 100644 index 0000000000000000000000000000000000000000..9a0563ba2dae1dc1d0b1b7ecb2e54e5113f3f540 GIT binary patch literal 1282 zcmXw3F>l*e5I$10{Ai>OqY^L;uo9&xs-z5NTtlD*ih5KiLlo?$F36^GP|Jyf4E0jD zLuHrZ%h+xn(jh<#Btfzi{RKsb0$utax^(lZ!Ki^k0DC8(cjWQCyLaDxJf5_~fW&+B z;F0H@JUH=8FY!#nObZw6zn4 zjUs@K#rYN*rdNEO1Pkd*mPTsc^S>BBnV1y6d{|k5ZDVrxgKR8=zjT7sOycL8lr6GBq8Oxc(z-zxK-+Mhj)*4rXS~& ziIRIf3is{<)s(5DfD56>lB^Iqhuks)D~cvu)Pulrf*`1)sS78HA_G{e%EsHbKTZTw zlnDe=j{JBBgjNr*o!F)XYfKV~Qm!*Ms#SyTIr-QCQL2j44XQ5ZR$?MQ)8#gIgE}JY zUR+!x!P96r0M^3K1K;57w-^vT*{$8Kxy9G79~at~dya(SQ8|v!{0h?Tm1E>=Me!NG zQT+6@upP(oXdA1Iw&N)J9H5{0Aor&|kopOq;s=<{>UZk1B#Qg=zDbmK zdviD#*lpi0pSOG5n!r!5UQIi_Ua!-^E_K{$R;>=w@cy&A8}p63ncDcr`u)39%^}no zG7qM{Js1o(9nLG~aK5r~I(={b-n7R#eXjlxWKa*xLD)u7-ocauKs%Vu#rfD;6hTA#%t}%>Prt4SAT-VpMl7?3aqa{k4 zVLqUXoV3*lk5&uG7F(QN1fXMU0CVMvP}T_ViUQXNMRL7Zt?B>6U*QUAP+Ey<&~IRl z27O3ULqd9nM;1YJW+XEbeBx1r&Tf+6&^W<-I2>-JvYgM$De7??`o|b>6`oo}i=6Vy zcbD&8n$56j?w(4gyY_Hz&$b7Xf&JT)gPo3tpAk|?lF}wg5R8L>?+*jcgW*2MVp8t! r=UA7qlM~h|w5qNAP4y=Jc^C##(KN7mCP`3|q#~?;uvP#Ug;>IW4$UpB literal 0 HcmV?d00001 diff --git a/lib/adafruit_bitmap_font/__init__.py b/lib/adafruit_bitmap_font/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lib/adafruit_bitmap_font/bdf.mpy b/lib/adafruit_bitmap_font/bdf.mpy new file mode 100644 index 0000000000000000000000000000000000000000..33bbd9f44c65e860262c97aac4762a98294d7cbd GIT binary patch literal 2216 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 literal 0 HcmV?d00001 diff --git a/lib/adafruit_bitmap_font/ttf.mpy b/lib/adafruit_bitmap_font/ttf.mpy new file mode 100644 index 0000000000000000000000000000000000000000..e91cee29590a40ed5de84b0fdd314c9e3d3c7f93 GIT binary patch literal 688 zcmXYvPfrs;7{=e(ZcC#LOxI;86lGjRSmd5mLzzXzPcFlG>-G;xo z)bLmA_M+Qb^{@H9n`^HHef5VBl#(&e?{pnsL**&Jk#f0cN*XFTfZEWH!q5644nrDf zIHbYI6lf3^XV3M&`W=Xef`Lr2$n^Al+DK2{C}lGFd_I?(&t{E<^aPo>nY}(y1e8K* z)MIQpuuwIHb`nvy(PWdblTe+y-LV~?b-Z0Yg5LJ9JUwTkcRhS=dX_H}<>mJuK7LYQ zW6wm@N%*`M6mr46FFhQaHodtyUYwV|9)J7JD-P6HjXA9v!|=jFN~F%7yfV?@kttUX zkFwJK!QJg&_aB_h9B);t`$njemwr&pqYb>~v4kVXo$_d$D)a(X&r+01!h;S{jSkU- z(CU1hYQuDdCg~{mCc|WeB*`fE>ftEQE(${QBE3Y%dN{(b@V!KJdU@ZFxicN72Dd&> z#<_RlaUl8;SWy|9cDvQ_SxpyzYCBQDu$c)4v!Gm6v12zKud&W{E%ZhSsakin ZZ9B`0Zl|@fn*tR!Us}kL8~_MI`5*MPvLFBe literal 0 HcmV?d00001 diff --git a/lib/adafruit_displayio_ssd1306.mpy b/lib/adafruit_displayio_ssd1306.mpy new file mode 100644 index 0000000000000000000000000000000000000000..c916d4857134d4fc9d38ca3b8d181a337b474286 GIT binary patch literal 750 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 literal 0 HcmV?d00001 diff --git a/lib/bitmap_font.mpy b/lib/bitmap_font.mpy new file mode 100644 index 0000000000000000000000000000000000000000..fec35b4f4b5d1944b37f7e49248890430123751b GIT binary patch literal 452 zcmY+AOG^S#7>3WW(QYmV8^(oQ2Fxgl8A6+&RXQ@zrku2etJ7TdkaJKkxOfxRBW~ z0ljj-AMzs0BGfhg0J{!CS-{c=`KIS0q~u|(0NGUARgI~QqC*&zTZDMQu^==tX>~MS zcWq&oDU@d6687~;iE59uCbs3Miae>pPh|J>58Q{#;l|0foXhVP&i1Bv3Wm~Z7%G{R zfdj9t_OScl*e5I$10{Ai>OqY^L;uo9&xs-z5NTtlD*ih5KiLlo?$F36^GP|Jyf4E0jD zLuHrZ%h+xn(jh<#Btfzi{RKsb0$utax^(lZ!Ki^k0DC8(cjWQCyLaDxJf5_~fW&+B z;F0H@JUH=8FY!#nObZw6zn4 zjUs@K#rYN*rdNEO1Pkd*mPTsc^S>BBnV1y6d{|k5ZDVrxgKR8=zjT7sOycL8lr6GBq8Oxc(z-zxK-+Mhj)*4rXS~& ziIRIf3is{<)s(5DfD56>lB^Iqhuks)D~cvu)Pulrf*`1)sS78HA_G{e%EsHbKTZTw zlnDe=j{JBBgjNr*o!F)XYfKV~Qm!*Ms#SyTIr-QCQL2j44XQ5ZR$?MQ)8#gIgE}JY zUR+!x!P96r0M^3K1K;57w-^vT*{$8Kxy9G79~at~dya(SQ8|v!{0h?Tm1E>=Me!NG zQT+6@upP(oXdA1Iw&N)J9H5{0Aor&|kopOq;s=<{>UZk1B#Qg=zDbmK zdviD#*lpi0pSOG5n!r!5UQIi_Ua!-^E_K{$R;>=w@cy&A8}p63ncDcr`u)39%^}no zG7qM{Js1o(9nLG~aK5r~I(={b-n7R#eXjlxWKa*xLD)u7-ocauKs%Vu#rfD;6hTA#%t}%>Prt4SAT-VpMl7?3aqa{k4 zVLqUXoV3*lk5&uG7F(QN1fXMU0CVMvP}T_ViUQXNMRL7Zt?B>6U*QUAP+Ey<&~IRl z27O3ULqd9nM;1YJW+XEbeBx1r&Tf+6&^W<-I2>-JvYgM$De7??`o|b>6`oo}i=6Vy zcbD&8n$56j?w(4gyY_Hz&$b7Xf&JT)gPo3tpAk|?lF}wg5R8L>?+*jcgW*2MVp8t! r=UA7qlM~h|w5qNAP4y=Jc^C##(KN7mCP`3|q#~?;uvP#Ug;>IW4$UpB literal 0 HcmV?d00001 diff --git a/lib/neopixel.mpy b/lib/neopixel.mpy new file mode 100644 index 0000000000000000000000000000000000000000..f4610e675e2e1f7164e6eb5128512f6102fde5f1 GIT binary patch literal 1401 zcmZ8hUvC>l5TCVU$4MNszH=^V?IfnozXr!nj4@CUZJdjmgwoilLuysk#Xhg&Qyt&w z?%dQBh=mA9DjtzQ2qc91P>BcZLJ5Hvcq;G>DkS9?t!8Iu_O~;$zu6_1 zV?2Bi_|+jouTUeZrraUbnAV`Z)H5?PlZoUaIc@3H`CMs=gs0lyHqdO)Z8Qu4u}ObX zE$AhC%9WHI#Vk}6m8m#%3McL9ib-Zs5QUI{@+$+@{&R&=p{&;xQ?idN*2@A~n};nw zOg$B+X~&D}TAgb{9jlk-8NgH*pz#dCxrX4THCB>9F<#e9MXeR8*pq8$WY!V%n#{Mh z6LJa28hMJ(=JbM0iUs+W?Sg{+%!L>sr)A9s$95H2S7o(k>T0!0bQa`bCyXANw@$+S zsaPVG6a-1SO>~2uCrJ?yuq5e3QzZ$zH!i0Igx!}nEa73=mL-|WWG;a)zDm@LRd@d= zkL^jiUQRj%S5`*IxL7ew&A1Scv(i@T#h9$_#!pj^FP;{0Nzr9i%uK_qumDa0V{Fg< zrSJlp`y@p#RJQl%*oPj%{(HS-8^9040*llsz}ah2*vIaorWGTA14UigshBll7{v`7 zDAY~0eTT&?7VKI}s$L>`vH3hg0{9aS!CN9qO)(P;%bVyCU@+klAn3=Mu4+U#8wqz3 z365H#SAhEokHAT$UZ@$nirJKrr|eva%^%Es`6)fP^a}WSdUxW*=+s-2;rVQIVj?;b znY$t04bQ>R5>J2Fe&X8zWF)z0pu-Saq#j}vBN74zL?*RQ8nznl7 zL5~jx5q-drx=tZ-M<#YlOIDMPb=BL2YMpS5Q|(rM=e!Ssee_$vjvKfq8fJ7zpk@-K z&wcEFJi)l|(F|f7%I&emv=<-)#d2x7gNpSbhxm5q-4H!aDOT f_Uq?-T|T?$FTnlp>1*<%t)!!qsh2%