ESP8266+MicroPython开发:ESP8266使用软件模拟SPI驱动TFT屏幕

2023-05-16

屏幕图片如下
在这里插入图片描述

这款屏幕是由ST7735进行驱动的,驱动方式有3线SPI,4线SPI,还有8线,16线,9线,18线驱动。由于是买的模块,所以采用4线SPI进行驱动。

ESP8266使用软件模拟SPI驱动TFT屏幕

  • 引脚连接
  • SPI的模拟
    • MYSPI.py
  • TFT的驱动
    • LCD.py
    • CODE.py
    • main.py
  • 效果
  • 工程文件

引脚连接

在这里插入图片描述

ESP8266TFT
GPIO16SCL
GPIO5SDA
GPIO4RES
GPIO0DC
GPIO2CS
GPIO14BL
VCC3.3V
GNDGND

SPI的模拟

下图为四线SPI的写时序:
在这里插入图片描述
下图为四线SPI的8位读时序,在手册中还有24位读和32位读,由于本次未使用读,不做强调:
在这里插入图片描述

MYSPI.py

from machine import Pin

class MySPI:
    def __init__(self,scl=16,sda=5,res=4,dc=0,cs=2,bl=14):
        self.SCL=Pin(scl,Pin.OUT)
        self.SDA=Pin(sda,Pin.OUT)
        self.RES=Pin(res,Pin.OUT)
        self.DC=Pin(dc,Pin.OUT)
        self.CS=Pin(cs,Pin.OUT)
        self.BL=Pin(bl,Pin.OUT)
        
    def SPI_sendData(self,Data):
        self.CS.off()
        for i in range(8):
            self.SCL.off()
            if Data&0x80==0x80:  
                self.SDA.on()
            else:
                self.SDA.off()
            self.SCL.on()
            Data <<=1
        self.CS.on()
            
    ##未使用
    def SPI_getData(self):
        Data=0
        self.CS=0
        for i in range(8):
            if(self.SDA.value()):
                Data+=1
            self.SCL=1
            Data <<=1
            self.SCL=0
        self.CS=1
        return Data

TFT的驱动

驱动的话主要是写命令和写数据,手册中也说明了DC高电平写数据,低电平写命令,然后使用的话主要是对哪个位置设置哪一种颜色。

LCD.py

from MYSPI  import MySPI
from time import sleep_us
from CODE import StringCode


class LCD(MySPI):
    def __init__(self):
        #颜色定义查找字典
        self.RGB={'white':[31,63,31],'black':[0,0,0],'red':[31,0,0],'green':[0,63,0],'blue':[0,0,31]}
        super().__init__()
    
    #作用:8位数据传输
    #参数:
    #Data:传入的8位数据
    def LCD_Send8Data(self,Data):
        self.DC.on()
        self.SPI_sendData(Data)

    #作用:16位数据传输
    #参数:
    #Data:传入的16位数据
    def LCD_Send16Data(self,Data):
        self.DC.on()
        self.SPI_sendData(Data//256)
        self.SPI_sendData(Data%256)

    #作用:命令传输
    #参数:
    #Com:传入的命令
    def LCD_SendComm(self,Com):
        self.DC.off()
        self.SPI_sendData(Com)

    #作用:设置XY范围
    #参数:
    #xs:x的起始范围
    #xe:x的终止范围
    #ys:y的起始范围
    #ye:y的终止范围
    def LCD_SetXY(self,xs,xe,ys,ye):
        self.LCD_SendComm(0X2A) #设置x范围
        self.LCD_Send16Data(xs+1)
        self.LCD_Send16Data(xe+2)
        self.LCD_SendComm(0X2B) #设置y范围
        self.LCD_Send16Data(ys+1)
        self.LCD_Send16Data(ye+2)
        self.LCD_SendComm(0X2C)#打开内存写入
    
    '''
    0  0  0       黑色
    31 63 31      白色
    31 0  0       红色
    0  63 0       绿色
    0  0  31      蓝色
    '''
    #作用:指定范围颜色填充颜色
    #参数:
    #xs:x的起始范围
    #xe:x的终止范围
    #ys:y的起始范围
    #ye:y的终止范围
    #color: 颜色字符串
    #RGB:颜色数组
    def LCD_FullColor(self,xs,xe,ys,ye,color='',RGB=[]):
        if self.RGB.get(color):
            RGB=self.RGB.get(color)
            color=RGB[2]+RGB[1]*32+RGB[0]*2048
        elif RGB:
            color=RGB[2]+RGB[1]*32+RGB[0]*2048
        if color>=0 or RGB[0]<=31 and RGB[1]<=63 and RGB[2]<=31:
            self.LCD_SetXY(xs,xe,ys,ye)
            for i in range(ys,ye):
                for i in range(xs,xe):
                    self.LCD_Send16Data(color)
        else:
            print("颜色不在范围内")

    #作用:画一个颜色点
    #参数:
    #x:x的坐标
    #y:y的坐标
    #color: 颜色字符串
    #RGB:颜色数组
    def LCD_DrawPoint(self,x,y,color='',RGB=[]):
        if self.RGB.get(color):
            RGB=self.RGB.get(color)
            color=RGB[2]+RGB[1]*32+RGB[0]*2048
        elif RGB:
            color=RGB[2]+RGB[1]*32+RGB[0]*2048
        self.LCD_SetXY(x,x+1,y,y+1)
        self.LCD_Send16Data(color)


    #作用:指定范围颜色填充颜色
    #参数:
    #xs:x的起始坐标
    #ys:y的起始坐标
    #strcolor: 字体颜色字符串
    #RGB:字体颜色数组
    #background:背景色字符串
    def LCD_WriteString(self,x,y,string=str,strcolor='',background='',RGB=[]):
        if self.RGB.get(strcolor):
            RGB=self.RGB.get(strcolor)
            color=RGB[2]+RGB[1]*32+RGB[0]*2048
        elif RGB:
            color=RGB[2]+RGB[1]*32+RGB[0]*2048
        if self.RGB.get(background):
            RGB=self.RGB.get(background)
            background=RGB[2]+RGB[1]*32+RGB[0]*2048            
        for i in range(len(string)):
            self.LCD_SetXY(x+(8*i),x+(8*(i+1)),y,y+16)
            var=StringCode.get(string[i])
            for j in range(16):
                data=var[j]
                for k in range(8):
                    if data&0x01:
                        self.LCD_DrawPoint(x+(8*i)+k,y+j,color)
                    elif background:
                        self.LCD_DrawPoint(x+(8*i)+k,y+j,background)
                    data >>=1
        
    '''
    (xs,ys)------(xe,ys)
    |             |
    |             |
    |             |
    |             |
    |             |
    (xs,ye)------ (xe,ye)
    '''
    #作用:画矩形
    #参数:
    #xs:左上点x坐标
    #ys:左上点y坐标
    #xe:右上点x坐标
    #ye:右上点y坐标
    #size:大小
    #color: 颜色字符串
    #RGB:颜色数组
    def LCD_DrawRect(self,xs,ys,xe,ye,size=2,color='',RGB=[]):
        if self.RGB.get(color):
            RGB=self.RGB.get(color)
            color=RGB[2]+RGB[1]*32+RGB[0]*2048
        elif RGB:
            color=RGB[2]+RGB[1]*32+RGB[0]*2048
        self.LCD_DrawLine(xs,ys,xe-2,ys,int(size*2),color)
        self.LCD_DrawLine(xe,ys,xe,ye,size,color)
        self.LCD_DrawLine(xe,ye,xs-2,ye,int(size*2),color)
        self.LCD_DrawLine(xs,ye,xs,ys,size,color)
        
    
    def Change_num(self,x1,x2):
        var=max(x1,x2)
        minx=min(x1,x2)
        maxx=var
        return minx,maxx

    #作用:画直线
    #参数:
    #xs:起始点x坐标
    #ys:起始点y坐标
    #xe:结束点x坐标
    #ye:结束点y坐标
    #size:大小
    #color: 颜色字符串
    #RGB:颜色数组
    def LCD_DrawLine(self,xs,ys,xe,ye,size=1,color='',RGB=[]):
        xs,xe=self.Change_num(xs,xe)
        ys,ye=self.Change_num(ys,ye)
        if self.RGB.get(color):
            RGB=self.RGB.get(color)
            color=RGB[2]+RGB[1]*32+RGB[0]*2048
        elif RGB:
            color=RGB[2]+RGB[1]*32+RGB[0]*2048
        if xs==xe:
            for j in range(ys,ye):
                self.LCD_FullColor(xs,xs+size,j,j+size,color)             
        elif ys==ye:
            for i in range(xs,xe):
                self.LCD_FullColor(i,i+size,ys,ys+size,color)              
        else:
            tan=(ye-ys)/(xe-xs)
            for i in range(xs,xe):
                for j in range(ys,ye):
                    if (j-ys) <= (tan*(i-xs))+size and (j-ys) >= (tan*(i-xs))-size:
                        self.LCD_FullColor(i,i+size,j,j+size,color)

    #作用:显示图片
    #参数:
    #x:起始点x坐标
    #y:起始点y坐标
    #w:图片宽
    #h:图片高
    #img: 要显示的图片
    def LCD_ShowImage(self,x,y,w,h,img):
        self.LCD_SetXY(x,y,x+w,y+h)
        k=0
        for i in range(h):
            for j in range(w):
                self.LCD_Send8Data(img[2*k])
                self.LCD_Send8Data(img[2*k+1])
                k+=1

    #作用:初始化
    #参数:
    #inversion:颜色反转
    def LCD_init(self,inversion=False):
        self.RES.on()
        sleep_us(10)
        self.RES.off()
        self.RES.on()
        sleep_us(10)
        self.BL.on()#打开背光
        self.LCD_SendComm(0X11)##退出睡眠模式
        self.LCD_SendComm(0x13)#普通模式全屏显示
        if inversion:
            self.LCD_SendComm(0x21)#颜色反转
        else:
            self.LCD_SendComm(0x20)#颜色不反转
        self.LCD_SendComm(0x38)#怠速模式关闭
        self.LCD_SendComm(0x3a)#改变颜色模式
        self.LCD_Send8Data(0x05)#16位颜色
        self.LCD_SendComm(0xb4)
        self.LCD_Send8Data(0x00)
        
        self.LCD_SendComm(0x29)##显示打开

CODE.py

字模使用的是去字模软件获取的,长宽是16*8,设置为字典方便读取,目前只有英文和数字没有符号,需要可以自己补充。

StringCode={'0':[0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00],#0,0#
'1':[0x00,0x00,0x00,0x10,0x1C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00],#1,1#
'2':[0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x40,0x20,0x10,0x08,0x04,0x42,0x7E,0x00,0x00],#2,2#
'3':[0x00,0x00,0x00,0x3C,0x42,0x42,0x40,0x20,0x18,0x20,0x40,0x42,0x42,0x3C,0x00,0x00],#3,3#
'4':[0x00,0x00,0x00,0x20,0x30,0x30,0x28,0x24,0x24,0x22,0xFE,0x20,0x20,0xF8,0x00,0x00],#4,4#
'5':[0x00,0x00,0x00,0x7E,0x02,0x02,0x02,0x1E,0x22,0x40,0x40,0x42,0x22,0x1C,0x00,0x00],#5,5#
'6':[0x00,0x00,0x00,0x18,0x24,0x02,0x02,0x3A,0x46,0x42,0x42,0x42,0x44,0x38,0x00,0x00],#6,6#
'7':[0x00,0x00,0x00,0x7E,0x42,0x20,0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x00,0x00],#7,7#
'8':[0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x3C,0x00,0x00],#8,8#
'9':[0x00,0x00,0x00,0x1C,0x22,0x42,0x42,0x42,0x62,0x5C,0x40,0x40,0x24,0x18,0x00,0x00],#9,9#
'a':[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x22,0x30,0x2C,0x22,0x32,0x6C,0x00,0x00],#a,10#
'b':[0x00,0x00,0x00,0x00,0x03,0x02,0x02,0x1A,0x26,0x42,0x42,0x42,0x26,0x1A,0x00,0x00],#b,11#
'c':[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x02,0x02,0x02,0x44,0x38,0x00,0x00],#c,12#
'd':[0x00,0x00,0x00,0x00,0x60,0x40,0x40,0x7C,0x42,0x42,0x42,0x42,0x62,0xDC,0x00,0x00],#d,13#
'e':[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x7E,0x02,0x42,0x3C,0x00,0x00],#e,14#
'f':[0x00,0x00,0x00,0x00,0x30,0x48,0x08,0x3E,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00],#f,15#
'g':[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x22,0x22,0x1C,0x02,0x3C,0x42,0x42,0x3C],#g,16#
'h':[0x00,0x00,0x00,0x00,0x03,0x02,0x02,0x3A,0x46,0x42,0x42,0x42,0x42,0xE7,0x00,0x00],#h,17#
'i':[0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x0E,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00],#i,18#
'j':[0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x1E],#j,19#
'k':[0x00,0x00,0x00,0x00,0x03,0x02,0x02,0x72,0x12,0x0A,0x0E,0x12,0x22,0x77,0x00,0x00],#k,20#
'l':[0x00,0x00,0x00,0x08,0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00],#l,21#
'm':[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x92,0x92,0x92,0x92,0x92,0xB7,0x00,0x00],#m,22#
'n':[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3B,0x46,0x42,0x42,0x42,0x42,0xE7,0x00,0x00],#n,23#
'o':[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00],#o,24#
'p':[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1B,0x26,0x42,0x42,0x42,0x26,0x1A,0x02,0x07],#p,25#
'q':[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x64,0x42,0x42,0x42,0x64,0x58,0x40,0xE0],#q,26#
'r':[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x4C,0x04,0x04,0x04,0x04,0x1F,0x00,0x00],#r,27#
's':[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x42,0x02,0x3C,0x40,0x42,0x3E,0x00,0x00],#s,28#
't':[0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x3E,0x08,0x08,0x08,0x08,0x48,0x30,0x00,0x00],#t,29#
'u':[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x42,0x42,0x42,0x42,0x62,0xDC,0x00,0x00],#u,30#
'v':[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x22,0x22,0x14,0x14,0x08,0x08,0x00,0x00],#v,31#
'w':[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDB,0x91,0x52,0x5A,0x2A,0x24,0x24,0x00,0x00],#w,32#
'x':[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x24,0x18,0x18,0x18,0x24,0x76,0x00,0x00],#x,33#
'y':[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x18,0x18,0x08,0x08,0x06],#y,34#
'z':[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x22,0x10,0x08,0x08,0x44,0x7E,0x00,0x00],#z,35#
'A':[0x00,0x00,0x00,0x08,0x08,0x18,0x14,0x14,0x24,0x3C,0x22,0x42,0x42,0xE7,0x00,0x00],#A,36#
'B':[0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x1E,0x22,0x42,0x42,0x42,0x22,0x1F,0x00,0x00],#B,37#
'C':[0x00,0x00,0x00,0x7C,0x42,0x42,0x01,0x01,0x01,0x01,0x01,0x42,0x22,0x1C,0x00,0x00],#C,38#
'D':[0x00,0x00,0x00,0x1F,0x22,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x22,0x1F,0x00,0x00],#D,39#
'E':[0x00,0x00,0x00,0x3F,0x42,0x12,0x12,0x1E,0x12,0x12,0x02,0x42,0x42,0x3F,0x00,0x00],#E,40#
'F':[0x00,0x00,0x00,0x3F,0x42,0x12,0x12,0x1E,0x12,0x12,0x02,0x02,0x02,0x07,0x00,0x00],#F,41#
'G':[0x00,0x00,0x00,0x3C,0x22,0x22,0x01,0x01,0x01,0x71,0x21,0x22,0x22,0x1C,0x00,0x00],#G,42#
'H':[0x00,0x00,0x00,0xE7,0x42,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x42,0xE7,0x00,0x00],#H,43#
'I':[0x00,0x00,0x00,0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00],#I,44#
'J':[0x00,0x00,0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x11,0x0F],#J,45#
'K':[0x00,0x00,0x00,0x77,0x22,0x12,0x0A,0x0E,0x0A,0x12,0x12,0x22,0x22,0x77,0x00,0x00],#K,46#
'L':[0x00,0x00,0x00,0x07,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x42,0x7F,0x00,0x00],#L,47#
'M':[0x00,0x00,0x00,0x77,0x36,0x36,0x36,0x36,0x36,0x2A,0x2A,0x2A,0x2A,0x6B,0x00,0x00],#M,48#
'N':[0x00,0x00,0x00,0xE3,0x46,0x46,0x4A,0x4A,0x52,0x52,0x52,0x62,0x62,0x47,0x00,0x00],#N,49#
'O':[0x00,0x00,0x00,0x1C,0x22,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x22,0x1C,0x00,0x00],#O,50#
'P':[0x00,0x00,0x00,0x3F,0x42,0x42,0x42,0x42,0x3E,0x02,0x02,0x02,0x02,0x07,0x00,0x00],#P,51#
'Q':[0x00,0x00,0x00,0x1C,0x22,0x41,0x41,0x41,0x41,0x41,0x41,0x4D,0x32,0x1C,0x60,0x00],#Q,52#
'R':[0x00,0x00,0x00,0x3F,0x42,0x42,0x42,0x3E,0x12,0x12,0x22,0x22,0x42,0xC7,0x00,0x00],#R,53#
'S':[0x00,0x00,0x00,0x7C,0x42,0x42,0x02,0x04,0x18,0x20,0x40,0x42,0x42,0x3E,0x00,0x00],#S,54#
'T':[0x00,0x00,0x00,0x7F,0x49,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x1C,0x00,0x00],#T,55#
'U':[0x00,0x00,0x00,0xE7,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00],#U,56#
'V':[0x00,0x00,0x00,0xE7,0x42,0x42,0x22,0x24,0x24,0x14,0x14,0x18,0x08,0x08,0x00,0x00],#V,57#
'W':[0x00,0x00,0x00,0x6B,0x2A,0x2A,0x2A,0x2A,0x2A,0x36,0x14,0x14,0x14,0x14,0x00,0x00],#W,58#
'X':[0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x18,0x18,0x18,0x24,0x24,0x42,0xE7,0x00,0x00],#X,59#
'Y':[0x00,0x00,0x00,0x77,0x22,0x22,0x14,0x14,0x08,0x08,0x08,0x08,0x08,0x1C,0x00,0x00],#Y,60#
'Z':[0x00,0x00,0x00,0x7E,0x21,0x20,0x10,0x10,0x08,0x04,0x04,0x42,0x42,0x3F,0x00,0x00],#Z,61#
' ':[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]}# ,62#

main.py

from LCD import LCD
import machine 

machine.freq()          
machine.freq(160000000) 
lcd=LCD()
lcd.LCD_init()
lcd.LCD_FullColor(0,131,0,161,'white')
lcd.LCD_WriteString(20,20,'hello world','red')

然后颜色数据有以下三种,12位,16位,18位,这里使用的是16位。
在这里插入图片描述
在这里插入图片描述
关于这个16位颜色,如图所示其中前四位代表R,中间五位代表G,最后四位代表B,代码的RGB列表就是这样的,比如RGB=[0,0,0]就是黑色。

效果

在这里插入图片描述

工程文件

工程文件

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ESP8266+MicroPython开发:ESP8266使用软件模拟SPI驱动TFT屏幕 的相关文章

  • 又搞定一块屏幕 micropython 驱动 sharp memory lcd

    先来学学C是怎么写的 核心代码 void lcd refresh void uint16 t i 0 ln 0 SCS 1 delay us 5 write byte 0x80 for ln 0 ln lt 128 ln write byt
  • spi,ClassLoader,双亲委托模式

    转载 https www cnblogs com hiyujie p wo xueJava1ClassLoader yu shuang qin wei tuo mo sh html 1 ClassLoader分类 Java虚拟机会创建三类C
  • Micropython——报错解决:TypeError: object with buffer protocol required

    报错 检查报错处代码 仔细检查可以发现 是括号放错位置 导致函数无法正常执行 故报错 一般情况下 Micropython除硬件如定时器中断内存溢出等硬件本身报错外 其他均为语法错误
  • 通过AT指令控制ESP8266

    目录 简介 1 串口无线 WIFI COM WIFI AP 1 1串口无线 WIFI AP 模式 TCP 服务器配置 1 2 串口无线 WIFI AP 模式 TCP 客户端配置 1 3 串口无线 WIFI AP 模式 UDP 配置 2 串口
  • 树莓派Pico入手

    树莓派Pico入手 树莓派 Pico 中文站 一 介绍 1 1 价格 开发板 19 00 1 2 型号 目前主要有两个型号 Pico 基础版 Pico W 板载WIFI芯片 H的是指给你焊好排针 1 3 性能 核心 双核 Arm Corte
  • ESP-NOW:竟然还有如此好用的无线通信方式

    用 Arduino 玩转 ESP32 系列历史文章目录 ESP32 概述与 Arduino 软件准备 ESP32 GPIO接口编程入门 蓝牙翻页笔 蓝牙键盘与PPT 控制器 B 站粉丝计数器 Siri 语音识别控制 LED 灯 Siri 语
  • ESP8266基础开发(一)---读DHT11温湿度传感器

    注 对于ESP8266开源技术感兴趣的可以加群 我们一起探索交流学习 群号 579932824 群名 ESP8266开源技术交流群 这篇文章的目的是展示如何将DHT11传感器连接到ESP8266并编写一个简单的程序来测量温度和湿度 我们假设
  • 基于STM32、OV2640及ESP8266的无线图传

    一 简介 本文利用STM32F407单片机 OV2640摄像机模块以及ESP8266 WIFI模块 并基于C 编写的TCP上位机服务 来实现图像的无线传输 本文受启发于博客 ESP8266 STM32F407 OV7670实现图片传输 在此
  • ESP8266_MQTT协议

    1 了解下MQTT协议 虽然上一篇用起来了MQTT 但是并不十分了解 基本就局限于 发布主题是发送数据 订阅主题是接收数据 今天就再好好了解一下吧 分享下网页版的 MQTT协议中文版 链接 Introduction MQTT协议中文版 1
  • 难懂?这样理解SPI与CAN很简单!

    难懂 这样理解SPI与CAN很简单 什么是串行通讯 为什么仍需使用串行通讯 SPI与CAN SPI 接口特点 CAN现场总线特点 什么是串行通讯 在正式进入主题前 我么先来介绍一下什么叫做 串行通信 串行通信是计算机的一种数据传输通信方式
  • wifi类物联产品配网前言

    文章目录 1 SmartConfig配网 仅支持2 4G 2 web方式配网 3 一键配网 BLE 传统蓝牙和wifi 3 1 BLE方式 3 2 传统蓝牙方式 3 3 wifi方式 3 4 4G 网口或其他直连设备 3 5 其他配网方式
  • 解决VSCode中查看ESP32日志乱码

    问题现象 在VSCode的Monitor中查看ESP32输出的日志乱码 如下图 原因 在VSCode中IDF默认的Monitor串口波特率为460800 然而ESP32输出Log的串口波特率默认为115200 因串口波特率不匹配导致Moni
  • 【MicroPython RP2040】可编程IOs(PIO)示例介绍

    MicroPython RP2040 可编程IOs PIO 原文链接 https www cnx software com 2021 01 27 a closer look at raspberry pi rp2040 programmab
  • SD卡系列之---SD初始化(SPI)

    SD卡分为SDIO模式与SPI模式 SDIO模式使用SD总线协议 使用4根数据线进行数据传输 SPI使用1收1发2根数据线数据传输 理论上SDIO模式会比SPI模式速度快4倍 但SDIO模式还牵扯到CRC校验位的计算 所以 如果使用CPU有
  • Arduino for ESP8266&ESP32适用库ESPAsyncWebServer:快速入门

    文章目录 目的 特征 安装 快速体验 注意事项 总结 目的 Arduino for ESP8266 和 Arduino for ESP32 中默认就有WebServer 不过这些WebServer都是同步的 不支持同时处理多个连接 这在很多
  • ESP8266 烧录 (关于BearPi扩展Wifi模块的烧录方式)

    简介 ESP 12F 模块是BearPI IOT购买的一个套餐所带的扩展模块 用来接通网络 但是默认电路不支持重新烧录 下面就是可支持重新烧录的方式 ESP 12F 电路原理图 如上图 GPIO15 gt GND gt 高电平 GPIO2
  • Android 连接一加 (Android 6.0.1) 上的 ESP8266

    Android 6 0 上的 Retrofit 在连接到 Access Point 后进行 Http 调用时出现问题 重现步骤 连接到 Esp8266 接入点 进行 http 调用http 192 168 4 1 http 192 168
  • Python - 如何使用 ioctl 或 spidev 从设备读取输入?

    我有一个提供它的供应商提供了一些 C 代码来监听按钮按下 该代码使用ioctl 该设备具有 SSD1289 控制器 按钮不需要额外的引脚 可以通过 SPI 读取其状态 这就是我想要的 读取按下了哪个按钮 我试图在 Python 中为我自己的
  • 使用 SPIFFS 加载文件时出现问题 (ERR_CONTENT_LENGTH_MISMATCH)

    好吧 这两天我一直在研究这个问题 但我仍然觉得我一无所获 我最近开始使用SPIFFS 文件系统 for Arduino开发于呼扎 ESP8266像FSBrowser ino例如 虽然它在分离代码方面非常出色 但随着我的代码不断增长 它在稳定
  • STM32F4 板上的 SPI 从机设置

    我正在尝试通过主从配置中的 SPI 在两个 STM32F4 发现板之间进行通信 我已经有了主设备的代码 但我对需要对从设备的 SPI 初始化进行的更改感到有点困惑 我还想在主机发送数据时实现中断 而不是让从机一直轮询 RXNE 寄存器 但是

随机推荐