micropython :esp8266 OLED体验


之前买的esp8266一直没用,最近移植micropython试试。

按照网上教程,下载BIN固件,然后刷进去。串口使得是TQ210开发板里的一个串口软件:SecureCRT,很好用。

然后按照网上教程连了无线网,才能上传文件,发现很不好用,非常不好用。就在网上找了几个别人写的软件,很好用,叫MicroPython File Uploader,关上串口软件,用这个连上,就可以直接快速上传文件了,很快,而且不需要用os.remove()先删除一便,也不用官网提供的那个需要连接局域网的那个方法,每次进去都要 import 一大串来打开网络再上传文件了。

micropython 最大的困惑是模拟C语言的按位操作,比如python的 & 操作,和C语言很不一样,由于python水平一般般,将一个16进制的数转换为引脚的高低点平真是愁死我了。但是应该是我脑子不好使的原因,看到了别人的例子才恍然大悟,可以这么用啊。例子:

def ByteOpera(num,dat):
    byte= [0x01,0x02,0x04,0x8,0x10,0x20,0x40,0x80]
    if dat&byte[num]:
        return 1
    else:
        return 0

  num表示要看第几位,dat是要传入的十六进制数。

  进制数的按位运算很重要,比如引脚的操作,比如字模的处理等。现在按位操作没问题了,那micropython用起来方便多了,比如操作OLED就方便了。

  手头有个I2C的OLED,正好试试。

  说是有官方的SSD1306的支持,import 一下,真有,试了试,真能用。网上有教程,就不多说了。下面是我自己写的一点GUI,基于官网的SSD1306的函数。

  1 from machine import I2C,Pin
  2 from ssd1306 import SSD1306_I2C
  3 import math
  4 
  5 chine=[
  6 #/*--  文字:  执  --*/
  7 #/*--  新宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  8 0x10,0x10,0x10,0xFF,0x10,0x90,0x00,0x10,0x10,0xFF,0x10,0x10,0xF0,0x00,0x00,0x00,
  9 0x04,0x44,0x82,0x7F,0x01,0x80,0x40,0x21,0x1A,0x07,0x18,0x00,0x3F,0x40,0xF0,0x00,
 10 
 11 #/*--  文字:  念  --*/
 12 #/*--  新宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
 13 0x40,0x40,0x20,0x20,0x90,0x88,0x94,0xE3,0x84,0x88,0x90,0x20,0x20,0x40,0x40,0x00,
 14 0x40,0x30,0x00,0x00,0x38,0x40,0x40,0x44,0x5A,0x41,0x40,0x70,0x00,0x08,0x30,0x00,
 15 
 16 #/*--  文字:  执  --*/
 17 #/*--  新宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
 18 0x10,0x10,0x10,0xFF,0x10,0x90,0x00,0x10,0x10,0xFF,0x10,0x10,0xF0,0x00,0x00,0x00,
 19 0x04,0x44,0x82,0x7F,0x01,0x80,0x40,0x21,0x1A,0x07,0x18,0x00,0x3F,0x40,0xF0,0x00,
 20 
 21 #/*--  文字:  战  --*/
 22 #/*--  新宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
 23 0x00,0x00,0x00,0xFF,0x08,0x08,0x08,0x40,0x40,0x40,0xFF,0x20,0x22,0xAC,0x20,0x00,
 24 0x00,0x7F,0x21,0x21,0x21,0x21,0x7F,0x80,0x40,0x20,0x17,0x18,0x26,0x41,0xF0,0x00,
 25 
 26 
 27     ]
 28 i2c=I2C(-1, sda=Pin(4), scl=Pin(5), freq=400000)  
 29 oled = SSD1306_I2C(128, 64, i2c)
 30 def ByteOpera(num,dat):
 31     byte= [0x01,0x02,0x04,0x8,0x10,0x20,0x40,0x80]
 32     if dat&byte[num]:
 33         return 1
 34     else:
 35         return 0
 36 def hline(x0,y0,le,color):
 37     for i in range(le):
 38         oled.pixel(x0+i,y0,color)
 39             
 40 def shuline(x0,y0,le,color):
 41     for i in range(le):
 42         oled.pixel(x0,y0+i,color)
 43         
 44         
 45         
 46         
 47         
 48         
 49 class GUI:
 50     #画点
 51     def DrawDot(x,y):
 52         oled.pixel(x,y)
 53     #横线
 54     def hline(x0,y0,le,color):
 55         for i in range(le):
 56             oled.pixel(x0+i,y0,color)
 57      #竖线       
 58     def shuline(x0,y0,le,color):
 59         for i in range(le):
 60             oled.pixel(x0,y0+i,color)
 61             
 62      ##########################
 63      #函数:Line
 64      #功能:任意画线
 65      #描述:
 66      #      x0,y0:起始位置
 67      #      x1,y1:终止位置
 68      #      color:颜色
 69      #
 70     def Line(x0,y0,x1,y1,color):
 71         dx=x1-x0
 72         if(dx>0):
 73             s1=1
 74         else:
 75             s1=-1
 76         dy=y1-y0
 77         if(dy>0):
 78             s2=1
 79         else:
 80             s2=-1
 81         dx=math.fabs(x1-x0)
 82         dy=math.fabs(y1-y0)
 83         if(dy>dx):
 84             temp=dx
 85             dx=dy
 86             dy=temp
 87             status=1
 88         else:
 89             status=0
 90             
 91         
 92         if(dx==0):
 93             hline(x0,y0,y1-y0,color)
 94         if(dy==0):
 95             shuline(x0,y0,x1-x0,color)
 96         
 97         sub=2*dy-dx
 98         for i in range(dx):
 99             oled.pixel(x0,y0,color)
100             if(sub>0):
101                 if(status==1):
102                     x0+=s1
103                 else:
104                     y0+=s2
105                 sub-=2*dx
106             if(status==1):
107                 y0+=s2
108             else:
109                 x0+=s1
110             sub+=2*dy
111           #oled.show()  
112           
113           #######################
114           #画矩形函数
115           #fill为是否填充,默认不填充
116     def DrawBox(x0,y0,x1,y1,color=1,fill=0):
117         if (fill==1):
118             for i in range(y1-y0):
119                 hline(x0,y0+i,x1-x0,color)
120         else:
121             hline(x0,y0,x1-x0,color)
122             hline(x0,y1,x1-x0,color)
123             shuline(x0,y0,y1-y0,color)
124             shuline(x1,y0,y1-y0,color)
125             
126         ##############################
127         #画圆函数,很占CPU
128         #fill 为是否填充
129         #画两遍,是因为只画一遍的话中间有点画不上
130     def DrawCircle_math(x,y,r,color,fill=0):
131         if(fill==0):
132             for i in range(x-r,x+r+1):
133                 oled.pixel(i,int(y-math.sqrt(r*r-(x-i)*(x-i))),color)
134                 oled.pixel(i,int(y+math.sqrt(r*r-(x-i)*(x-i))),color)
135             for i in range(y-r,y+r+1):
136                 oled.pixel(int(x-math.sqrt(r*r-(y-i)*(y-i))),i,color)
137                 oled.pixel(int(x+math.sqrt(r*r-(y-i)*(y-i))),i,color)
138         else:
139             for i in range(x-r,x+r+1):
140                 a=int(math.sqrt(r*r-(x-i)*(x-i)))
141                 shuline(i,y-a,a*2,color)
142 
143             for i in range(y-r,y+r+1):
144                 a=int(math.sqrt(r*r-(y-i)*(y-i)))
145                 hline(x-a,i,a*2,color)             
146                 
147                 
148     #########################
149     #画圆函数
150     #网上的算法,不怎么圆
151     def DrawCircle(x,y,r,color):
152         a=0
153         b=r
154         di=3-2*r
155         while a<b:
156             oled.pixel(x-b,y-a,color)
157             oled.pixel(x+b,y-a,color)
158             oled.pixel(x-a,y+b,color)
159             oled.pixel(x-b,y-a,color)
160             oled.pixel(x-a,y-b,color)
161             oled.pixel(x+b,y+a,color)
162             oled.pixel(x+a,y-b,color)
163             oled.pixel(x+a,y+b,color)
164             oled.pixel(x-b,y+a,color)
165             a=a+1
166             if(di<0):
167                 di+=4*a+6
168             else:
169                 di+=10+4*(a-b)
170                 b=b-1
171             oled.pixel(x+a,y+b,color)  
172         #oled.show()
173     ############################
174     #16x16中文字符函数
175     def ShowChar16x16(x,y,n):
176         for i in range(2):
177             for a in range(16):
178                 for b in range(8):
179                     if(ByteOpera(b,chine[n*32+i*16+a])):
180                         oled.pixel(x+a,y+i*8+b,1)
181                     else:
182                         oled.pixel(x+a,y+i*8+b,0)
183         #oled.show()
184     ######################
185     #任意大小图片显示
186     def ShowPic(x,y,w,h,color,pic):
187         a=h/8
188         if(h%8>0):
189             a+=1
190         for i in range(a):
191             for n in range(w):
192                 for z in range(8):
193                     if(ByteOpera(z,pic[a*w+n])):
194                         oled.pixel(w,y+a*8+z,1)
195                     else:
196                         oled.pixel(w,y+a*8+z,0)
197                     
198     
199         
200         
201         
202     #奇数时反相显示,偶数时正常显示
203     def invert(n):
204         oled.invert(n)
205     #调整亮度。0最暗,255最亮
206     def contrast(n):
207         oled.contrast(n)
208     #在(x, y)处显示字符串,注意text()函数内置的字体是8x8的,暂时不能替换
209     def text(char,x,y):
210         oled.text(char,x,y)
211      #n=0,清空屏幕,n大于0,填充屏幕   
212     def fill(n):
213         oled.fill(n)
214           #######################
215       #显示函数
216     def show():
217         oled.show()
218         #关屏函数
219     def poweroff():
220         oled.poweroff()
221     def poweron():
222         oled.poweron()

使用如下:

import micropythonGUI

from micropythonGUI import GUI

GUI.DrawBox(0,0,20,20,1,0)

GUI.text('Draw A Rectangle'0,25)

GUI.show()

 

一直在想,为什么没有人做一个带小屏的运行micropython的esp8266或STM32F4的板子,能直接在小屏上显示命令行,支持普通键盘直接输入的小板子,能直接插上电就运行micropython,多好。我得理解理解micropython的运行机制,自己看看能不能改改底层驱动,在屏幕上显示需要电脑才能显示的命令行和键盘输入,甚至能用命令行实现屏幕叠加操控和直接文件编写等功能,直接在小板子上写代码,多好玩!!!!!

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM