之前买的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的运行机制,自己看看能不能改改底层驱动,在屏幕上显示需要电脑才能显示的命令行和键盘输入,甚至能用命令行实现屏幕叠加操控和直接文件编写等功能,直接在小板子上写代码,多好玩!!!!!