esp32c3 micropython oled实时天气信息

目录

简介

效果展示

代码

main.py

ssd1306.py

font.py

实现思路


简介

合宙esp32c3 micropython框架,只支持128*64 I2C oled

ssd1306驱动我优化过的,与其他的不一样,为避免出错,使用我的驱动

把下面两个py文件放入单片机内,

搜索心知天气,注册账号,获得免费的key

效果展示

代码

main.py

import network
import urequests
from ssd1306 import SSD1306_I2C
from machine import Pin, I2C
import ujson
from font import textc

i2c = I2C(0, scl=Pin(5), sda=Pin(4))
oled = SSD1306_I2C(i2c)

url = 'https://api.seniverse.com/v3/weather/now.json?key=你的密钥&location=guangzhou&language=zh-Hans&unit=c'


class Weather():
    def __init__(self, ssid, password):
        
        wifi=network.WLAN(network.STA_IF)
        wifi.active(True)
        #连接wifi,有一定几率连接失败
        while not wifi.isconnected():
            wifi.connect(ssid,password)
            oled.fill(0)
            oled.text('connecting...',0,0)
            oled.show()
        #更新显示连接wifi信息   
        oled.fill(0)
        oled.text('connect to szsb',0,0)
        oled.show()

        response = urequests.get(url)
        parsed = ujson.loads(response.text)
        weather_info = parsed['results'][0]['now']
        temperature = weather_info['temperature']
        weather_state = weather_info['text']
        #下面两条语句的作用是一样的,二选一,把unicode编码转为中文字符
        # x=eval('u"%s"' % weather_state)
        x = ujson.loads('"%s"' % weather_state)
        oled.text(temperature + '`c', 80, 48)
        textc(oled, '广', 80, 16)
        textc(oled, '州', 96, 16)
        oled.vline(60, 0, 64)
        if len(weather_state) == 2:
            textc(oled, x[0], 16, 48)
            textc(oled, x[1], 32, 48)
            if x[1] == '雨':
                if weather_state == '大雨':
                    max_rainy = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                 0x00, 0x00,
                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                 0x00, 0x00,
                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0C, 0x10, 0x10, 0x08, 0x08, 0x10, 0x60, 0x80,
                                 0x80, 0x80,
                                 0x80, 0x60, 0x20, 0x10, 0x10, 0x08, 0x08, 0x06, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
                                 0x00, 0x00,
                                 0x00, 0x00, 0x00, 0x60, 0x91, 0x8A, 0x09, 0x08, 0x08, 0x08, 0x08, 0x09, 0x0A, 0x09,
                                 0x08, 0x08,
                                 0x08, 0x08, 0x09, 0x0A, 0x09, 0x08, 0x08, 0x08, 0x08, 0x09, 0x92, 0x61, 0x00, 0x00,
                                 0x00, 0x00,
                                 0x00, 0x00, 0x00, 0xC0, 0x20, 0x20, 0x26, 0xC9, 0x11, 0x09, 0xC6, 0x20, 0x20, 0x26,
                                 0xC9, 0x11,
                                 0x09, 0xC6, 0x20, 0x20, 0x26, 0xC9, 0x11, 0x09, 0xC6, 0x20, 0x20, 0x20, 0xC0, 0x00,
                                 0x00, 0x00
                                 ]
                    oled.p32(max_rainy, 16, 8)
                elif weather_state == '中雨':
                    mid_rainy = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,
                                 0x01, 0x00,
                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                 0x00, 0x00,
                                 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0x08, 0x30, 0x40, 0x40, 0x80, 0x00, 0x00,
                                 0x00, 0x80,
                                 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x30, 0x08, 0x08, 0x08, 0x06, 0x01, 0x01, 0x00,
                                 0x00, 0x00,
                                 0x00, 0x00, 0x60, 0x90, 0x11, 0x12, 0x14, 0x12, 0x11, 0x10, 0x10, 0x10, 0x11, 0x12,
                                 0x14, 0x12,
                                 0x11, 0x10, 0x10, 0x10, 0x11, 0x12, 0x14, 0x12, 0x11, 0x10, 0x10, 0x10, 0x20, 0xC0,
                                 0x00, 0x00,
                                 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x80, 0x40,
                                 0x40, 0x40,
                                 0x80, 0x00, 0x00, 0x00, 0x80, 0x40, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
                                 0x00, 0x00
                                 ]
                    oled.p32(mid_rainy, 16, 8)
                elif weather_state == '小雨':
                    min_rainy = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,
                                 0x01, 0x00,
                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                 0x00, 0x00,
                                 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0x08, 0x30, 0x40, 0x40, 0x80, 0x00, 0x00,
                                 0x00, 0x80,
                                 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x30, 0x08, 0x08, 0x08, 0x06, 0x01, 0x01, 0x00,
                                 0x00, 0x00,
                                 0x00, 0x00, 0x60, 0x90, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x12,
                                 0x14, 0x12,
                                 0x11, 0x10, 0x10, 0x10, 0x11, 0x12, 0x14, 0x12, 0x11, 0x10, 0x10, 0x10, 0x20, 0xC0,
                                 0x00, 0x00,
                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40,
                                 0x40, 0x40,
                                 0x80, 0x00, 0x00, 0x00, 0x80, 0x40, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
                                 0x00, 0x00
                                 ]
                    oled(min_rainy, 16, 8)
            else:
                cloud = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06,
                         0x03, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x06, 0x02, 0x00, 0x00, 0x0E, 0x0E, 0x00, 0x00, 0x00, 0x00,
                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xC4, 0x44, 0x00, 0x00,
                         0x00, 0x7F, 0x40, 0x40, 0x40, 0x47, 0x47, 0x40, 0x40, 0x40, 0x7F, 0x00, 0x23, 0x63, 0xC3, 0x00,
                         0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x07, 0x1F, 0x3F, 0x3F, 0x3F, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF,
                         0x7F, 0xFF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x07, 0x07, 0xFF, 0x00, 0x30, 0x18, 0x08, 0x00,
                         0x00, 0x00, 0x00, 0xE0, 0xF0, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8,
                         0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00
                         ]
                oled.p32(cloud, 16, 8)
        else:
            textc(oled, x, 24, 48)
            if x == '晴':
                sunny = [
                    0x00, 0x00, 0x00, 0x18, 0x1C, 0x0E, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8,
                    0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0E, 0x1C, 0x18, 0x00, 0x00, 0x00,
                    0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x3F, 0x40, 0x80, 0x80, 0x80, 0x80, 0x83, 0x83,
                    0x83, 0x83, 0x80, 0x80, 0x80, 0x80, 0x40, 0x3F, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01,
                    0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0xFC, 0x02, 0x01, 0x01, 0x01, 0x01, 0xC1, 0xC1,
                    0xC1, 0xC1, 0x01, 0x01, 0x01, 0x01, 0x02, 0xFC, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80,
                    0x00, 0x00, 0x00, 0x18, 0x38, 0x70, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
                    0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0x70, 0x38, 0x18, 0x00, 0x00, 0x00
                ]
                oled.p32(sunny, 16, 8)
            elif x == '阴':
                shadow = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                          0x00,
                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                          0x00,
                          0x00, 0x00, 0x01, 0x03, 0x0F, 0x1F, 0x1F, 0x3F, 0x3F, 0x7F, 0x7F, 0x3F, 0x3F, 0x1F, 0x1F,
                          0x0F,
                          0x0F, 0x1F, 0x1F, 0x1F, 0x1F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x03, 0x01, 0x00,
                          0x00,
                          0x18, 0x7C, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
                          0xFF,
                          0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0x7C,
                          0x18,
                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                          0x00,
                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                          0x00]
                oled.p32(shadow, 16, 8)
        oled.show()


w = Weather('szsb', '55555555')

ssd1306.py

import framebuf
# 寄存器定义
SET_CONTRAST        = const(0x81)
SET_ENTIRE_ON       = const(0xa4)
SET_NORM_INV        = const(0xa6)
SET_MEM_ADDR        = const(0x20)
SET_COL_ADDR        = const(0x21)
SET_PAGE_ADDR       = const(0x22)
SET_DISP_START_LINE = const(0x40)
SET_DISP            = const(0xae)
SET_SEG_REMAP       = const(0xa0)
SET_MUX_RATIO       = const(0xa8)
SET_COM_OUT_DIR     = const(0xc0)
SET_DISP_OFFSET     = const(0xd3)
SET_COM_PIN_CFG     = const(0xda)
SET_DISP_CLK_DIV    = const(0xd5)
SET_PRECHARGE       = const(0xd9)
SET_VCOM_DESEL      = const(0xdb)
SET_CHARGE_PUMP     = const(0x8d)


class SSD1306:
    def __init__(self,external_vcc):
        self.width = 128
        self.height = 64
        self.external_vcc = external_vcc
        self.pages = 8
        self.init_display()

    def init_display(self):
        for cmd in (
            SET_DISP | 0x00, #熄屏
            SET_MEM_ADDR, 0x00, #水平寻址
            SET_DISP_START_LINE | 0x00,#显示起始行地址
            SET_SEG_REMAP | 0x01, # column addr 127 mapped to SEG0
            SET_MUX_RATIO, 63,
            SET_COM_OUT_DIR | 0x08, # scan from COM[N] to COM0
            SET_DISP_OFFSET, 0x00,
            SET_COM_PIN_CFG, 0x12,
            # timing and driving scheme
            SET_DISP_CLK_DIV, 0x80,
            SET_PRECHARGE, 0x22 if self.external_vcc else 0xf1,
            SET_VCOM_DESEL, 0x30, # 0.83*Vcc
            # display
            SET_CONTRAST, 0xff, # maximum
            SET_ENTIRE_ON, # output follows RAM contents
            SET_NORM_INV, # not inverted
            # charge pump
            SET_CHARGE_PUMP, 0x10 if self.external_vcc else 0x14,
            0x2e, # 禁止滚动
            0xae | 0x01): #开屏
            self.write_cmd(cmd)
        self.fill(0)
        self.show()
        
    def v_scroll(self, d=1): 
        self.write_cmd(0x2e) # 关闭滚动
        if d:
            self.write_cmd(0x26) # 向左
            self.write_cmd(0x00)
            self.write_cmd(0x07) # 起始页
            self.write_cmd(0x00) # 滚动帧率
            self.write_cmd(0x00) # 结束页
        else:
            self.write_cmd(0x27) # 向左
            self.write_cmd(0x00)
            self.write_cmd(0x00) # 起始页
            self.write_cmd(0x00) # 滚动帧率
            self.write_cmd(0x07) # 结束页
            
        self.write_cmd(0x00)
        self.write_cmd(0xff)
        self.write_cmd(0x2f) # 开启滚动
    
    def poweroff(self):
        self.write_cmd(const(0xae) | 0x00)#熄屏

    def contrast(self, contrast):
        self.write_cmd(SET_CONTRAST)
        self.write_cmd(contrast)

    def invert(self, invert):
        self.write_cmd(SET_NORM_INV | (invert & 1))

    def show(self):
        self.write_cmd(SET_COL_ADDR)
        self.write_cmd(0)
        self.write_cmd(127)
        self.write_cmd(SET_PAGE_ADDR)
        self.write_cmd(0)
        self.write_cmd(63)
        self.write_framebuf()

    def fill(self, c):
        self.framebuf.fill(c)

    def pixel(self, x, y, c):
        self.framebuf.pixel(x, y, c)

    def text(self, string, x, y, c=1):
        self.framebuf.text(string, x, y, c)

    def hline(self,x,y,w,c=1):
        self.framebuf.hline(x,y,w,c)
    
    def vline(self,x,y,h,c=1):
        self.framebuf.vline(x,y,h,c)
        
    def line(self,x1,y1,x2,y2,c=1):
        self.framebuf.line(x1,y1,x2,y2,c)
        
    def rect(self,x,y,w,h,c=1,f=False):
        self.framebuf.rect(x,y,w,h,c,f)
        
    def ellipse(self,x,y,xr,yr,c,f=False,m=15):
        self.framebuf.ellipse(x,y,xr,yr,c,f,m)
        
    def cube(self,x,y,l):
        self.rect(x,y,l,l)
        self.rect(x+int(0.5*l),int(y-0.5*l),l,l)
        self.line(x,y,int(x+0.5*l),int(y-0.5*l),1)
        self.line(x+l,y,int(x+1.5*l),int(y-0.5*l),1)
        self.line(x,y+l,int(x+0.5*l),int(y+0.5*l),1)
        self.line(x+l,y+l,int(x+1.5*l),int(y+0.5*l),1)
    
    def p8(self,page,x,y):
        for e in range(8):
            byte=bin(page[e]).replace('0b','')
            while len(byte)<8:
                byte='0'+byte
            for i in range(8):
                if byte[i]=='1':
                    self.pixel(x+e,y+i,int(byte[i]))
    
    def p16(self,page,x,y):
        for e in range(32):
            byte=bin(page[e]).replace('0b','')
            while len(byte)<8:
                byte='0'+byte
            for i in range(8):
                if byte[i] and e<16:
                    self.pixel(x+e,y+i,int(byte[i]))
                elif byte[i] and e>=16:
                    self.pixel(x-16+e,y+8+i,int(byte[i]))

    def p32(self,page,x,y):
        for e in range(128):
            byte=bin(page[e]).replace('0b','')
            while len(byte)<8:
                byte='0'+byte
            for i in range(8):
                if byte[i] and e<32:
                    self.pixel(x+e,y+i,int(byte[i]))
                elif byte[i] and 32<=e<64:
                    self.pixel(x+e-32,y+8+i,int(byte[i]))
                elif byte[i] and 64<=e<96:
                    self.pixel(x+e-64,y+16+i,int(byte[i]))
                elif byte[i] and 96<=e<128:
                    self.pixel(x+e-96,y+24+i,int(byte[i]))

class SSD1306_I2C(SSD1306):
    def __init__(self,i2c, addr=0x3c, external_vcc=False):
        self.i2c = i2c
        self.addr = addr
        self.temp = bytearray(2)
        # buffer需要8 * 128的显示字节加1字节命令
        self.buffer = bytearray(8 * 128 + 1)
        self.buffer[0] = 0x40  # Co=0, D/C=1
        self.framebuf = framebuf.FrameBuffer1(memoryview(self.buffer)[1:], 128, 64)
        super().__init__(external_vcc)
    def write_cmd(self, cmd):
        self.temp[0] = 0x80 # Co=1, D/C#=0
        self.temp[1] = cmd
        self.i2c.writeto(self.addr, self.temp)

    def write_framebuf(self):
        self.i2c.writeto(self.addr, self.buffer)

        

font.py

def u6674(oled,x,y):     
    oled.rect(x+1,y+2,4,11)
    oled.hline(x+2,y+7,2)
    oled.hline(x+6,y+2,9)
    oled.hline(x+7,y+4,7)
    oled.hline(x+6,y+6,9)
    oled.vline(x+10,y,7)
    oled.rect(x+7,y+8,7,8)
    oled.rect(x+7,y+10,7,3)
    oled.hline(x+8,y+15,4,0)
def u591a(oled,x,y):
    def duo1(x,y):
        oled.line(x+3,y+4,x+7,y)
        oled.hline(x+6,y+2,6)
        oled.line(x+4,y+3,x+6,y+5)
        oled.line(x+11,y+2,x+4,y+9)
    duo1(x,y)
    x+=3
    y+=6
    duo1(x,y)
def u9634(oled,x,y):
    oled.hline(x+2,y+1,11)
    oled.hline(x,y+6,15)
    oled.line(x+7,y+7,x+1,y+13)
    oled.hline(x+2,y+13,10)
    oled.line(x+9,y+10,x+13,y+14)
def u4e91(oled,x,y):
    oled.rect(x+2,y+4,11,7)
    oled.vline(x+7,y,16)
def u5927(oled,x,y):
    oled.hline(x+1,y+5,14)
    oled.vline(x+7,y+1,9)
    oled.line(x+6,y+10,x+1,y+15)
    oled.line(x+8,y+10,x+13,y+15)
    oled.pixel(x+14,y+15,1)
def u5c0f(oled,x,y):
    oled.vline(x+7,y+1,13)
    oled.line(x+5,y+6,x+1,y+10)
    oled.line(x+9,y+4,x+13,y+8)
    oled.line(x+6,y+14,x+5,y+13)
def u96e8(oled,x,y):
    oled.hline(x+1,y+1,14)
    oled.vline(x+7,y+2,13)
    oled.rect(x+1,y+5,13,11)
    oled.hline(x+2,y+15,9,0)
    oled.line(x+4,y+8,x+5,y+9)
    oled.line(x+4,y+11,x+5,y+12)
    oled.line(x+9,y+8,x+10,y+9)
    oled.line(x+9,y+11,x+10,y+12)
def u9634(oled,x,y):
    oled.vline(x+1,y+1,15)
    oled.hline(x+2,y+1,4)
    oled.line(x+5,y+2,x+2,y+5)
    oled.line(x+5,y+8,x+2,y+5)
    oled.hline(x+2,y+9,4)
    oled.vline(x+7,y+1,12)
    oled.line(x+6,y+12,x+4,y+15)
    oled.hline(x+8,y+1,5)
    oled.vline(x+13,y+1,14)
    oled.line(x+12,y+15,x+11,y+14)
    oled.rect(x+7,y+5,7,4)
def u5e7f(oled,x,y):
    oled.line(x+7,y+1,x+8,y+2)
    oled.line(x+1,y+14,x,y+15)
    oled.hline(x+2,y+3,12)
    oled.vline(x+2,y+4,10)
def u5dde(oled,x,y):
    oled.vline(x+1,y+5,3)
    oled.vline(x+3,y+1,12)
    oled.vline(x+6,y+5,3)
    oled.vline(x+8,y+2,12)
    oled.vline(x+10,y+5,3)
    oled.vline(x+12,y+1,14)
    oled.line(x+2,y+13,x+1,y+14)
def u4e0a(oled,x,y):
    oled.vline(x+6,y+1,14)
    oled.hline(x+7,y+6,6)
    oled.hline(x+1,y+14,14)
def u6d77(oled,x,y):
    oled.line(x+2,y+1,x+3,y+2)
    oled.line(x+1,y+5,x+2,y+6)
    oled.line(x+2,y+13,x+4,y+11)
    oled.line(x+9,y,x+5,y+4)
    oled.hline(x+7,y+2,7)
    oled.rect(x+7,y+4,6,9,1,True)
    oled.hline(x+5,y+8,10)
    oled.rect(x+8,y+5,4,3,0)
    oled.rect(x+8,y+9,4,3,0)
    oled.pixel(x+13,y+12,1)
    oled.vline(x+12,y+13,2)
#该字典存储着一些中文的函数指针
cc_dict={'6674':u6674,'591a':u591a,'u9634':u9634,'4e91':u4e91,'5927':u5927,'u5c0f':u5c0f,'96e8':u96e8,'9634':u9634,'5e7f':u5e7f,'5dde':u5dde,'4e0a':u4e0a,'6d77':u6d77}
#显示中文的函数,接受oled对象,要显示的中文,位置
def textc(oled,c,x,y):
    c=hex(ord(c)).replace('0x','')
    cc_dict[c](oled,x,y)
   

实现思路

从网站获取天气数据,根据文本的字典结构,为了方便,转成json进行有效信息的提取。

获取的天气状态一共有小雨,中雨,大雨,阴,晴,多云

按照天气状态分为两组,两个字的和一个字的

设置了一个查找树,对两个字的进行快速查找,优化if结构

如果选择好了天气状态,就在特定位置显示中文(16*16)和天气状态对应的图(32*32)

剩下的就是显示城市和温度了

我的代码默认是广州,你也可以更改其他城市

在font.py中,我以笔画的方式存储了天气状态对应的中文,还有‘广州’对应的中文,相当于自己建立了一个小字库,当然也可以更改为其他方式显示中文,如取模,烧写特殊固件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/80023.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阿里云与中国中医科学院合作,推动中医药行业数字化和智能化发展

据相关媒体消息&#xff0c;阿里云与中国中医科学院的合作旨在推动中医药行业的数字化和智能化发展。随着互联网的进步和相关政策的支持&#xff0c;中医药产业受到了国家的高度关注。这次合作将以“互联网 中医药”为载体&#xff0c;致力于推进中医药文化的传承和创新发展。…

【Java并发编程面试题(60道)】

toc Java并发编程面试题(60道) 基础 1.并行跟并发有什么区别&#xff1f; 从操作系统的角度来看&#xff0c;线程是CPU分配的最小单位。 并行就是同一时刻&#xff0c;两个线程都在执行。这就要求有两个CPU去分别执行两个线程。并发就是同一时刻&#xff0c;只有一个执行&…

基于物理场的动态模式分解(piDMD)研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

自动驾驶港口车辆故障及事故处理机制

1、传感器故障&#xff1a; &#xff08;1&#xff09;单一传感器数据异常处理。自动驾驶电动平板传感方案为冗余设置&#xff0c;有其他传感器能够覆盖故障传感器观测区域&#xff0c;感知/定位模块将数据异常情况发给到规划决策模块&#xff0c;由“大脑”向中控平台上报故障…

ElasticSearch的客户端操作

ElasticSearch的客户端操作 1、客户端介绍 官方文档地址&#xff1a; https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html 实际开发中&#xff0c;有多种方式操作Elasticsearch&#xff1a; 客户端工具&#xff1a;发送http请求(RESTful风格)操作…

source insight 添加宏-文件头加注释

source insight 3.5 自带的一些宏&#xff0c;在安装目录下的 utils.em 文件中&#xff0c;用户也可以自己写文件&#xff0c;命令为xxx.em &#xff0c;然后把这个文件添加到项目中即可&#xff0c;添加后在菜单栏 Options -> Key Assignments 里输入macro 就能显示新添加的…

MongoDB升级经历(4.0.23至5.0.19)

MongoDB从4.0.23至5.0.19升级经历 引子&#xff1a;为了解决MongoDB的两个漏洞决定把MongoDB升级至最新版本&#xff0c;期间也踩了不少坑&#xff0c;在这里分享出来供大家学习与避坑~ 1、MongoDB的两个漏洞 漏洞1&#xff1a;MongoDB Server 安全漏洞(CVE-2021-20330) 漏洞2…

总结,由于顺丰的问题,产生了电脑近期一个月死机问题集锦

由于我搬家&#xff0c;我妈搞顺丰发回家&#xff0c;但是没有检查有没有坏&#xff0c;并且我自己由于不可抗力因素&#xff0c;超过了索赔时间&#xff0c;反馈给顺丰客服&#xff0c;说超过了造成了无法索赔的情况&#xff0c;现在总结发生了损坏配件有几件&#xff0c;显卡…

输入输出+暴力模拟入门:魔法之树、染色の树、矩阵、字母加密、玫瑰鸭

秋招实习刷题网站推荐&#xff1a;codefun2000.com&#xff0c;还有题解博客&#xff1a;blog.codefun2000.com/。以下内容都是来自塔子哥的~ 输入输出 2023.04.15-春招-第三题-魔法之树 //#include<bits/stdc.h> #include<vector> #include<iostream>usin…

AndroidStudio升级Gradle之坑

最近在做旧工程的升级&#xff0c;原来的Gradle版本是4.6的&#xff0c;需要升级到7.6&#xff0c;JDK从8升级到17&#xff0c;一路趟了很多坑&#xff0c;逐个记录下吧 1、Maven仓库需要升级到https 你会遇到这个报错 Using insecure protocols with repositories, without …

openLayers实战(八):坐标系及其转换

坐标系介绍 EPSG: 3857 --web地图&#xff0c;基于球体的、web墨卡托投影&#xff08;伪墨卡托投影Pseudo-Mercator&#xff09;的投影坐标系&#xff0c;范围为纬度85度以下&#xff0c;由于google地图最先使用而成为事实标准。至今&#xff0c;大多互联网地图都使用EPSG3857&…

Android 远程真机调研

背景 现有的安卓测试机器较少&#xff0c;很难满足 SDK 的兼容性测试及线上问题&#xff08;特殊机型&#xff09;验证&#xff0c;基于真机成本较高且数量较多的前提下&#xff0c;可以考虑使用云测平台上的机器进行验证&#xff0c;因此需要针对各云测平台进行调研、比较。 …

【环境配置】Windows10终端和VSCode下能够直接打开Anaconda-Prompt

很多小伙伴在 Windows 下做深度学习开发的时候&#xff0c;遇到终端没有在 Linux 那么方便&#xff0c;那么我们现在就可以来设置一下&#xff1b;这样我们也可以在文件夹内部右键打开终端&#xff0c;也可以在 VS Code 里面新建一个虚拟环境的控制台&#xff1b;这里主要是针对…

VS2015项目中,MFC内存中调用DLL函数(VC6生成的示例DLL)

本例主要讲一下&#xff0c;用VC6如何生成DLL&#xff0c;用工具WinHex取得DLL全部内容&#xff0c;VC2015项目加载内存中的DLL函数&#xff0c;并调用函数的示例。 本例中的示例代码下载&#xff0c;点击可以下载 一、VC6.0生成示例DLL项目 1.新建项目&#xff0c;…

爬虫逆向实战(十四)--某培训平台登录

一、数据接口分析 主页地址&#xff1a;某培训平台 1、抓包 通过抓包可以发现登录是表单提交到j_spring_security_check 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以发现有一个j_password加密参数 请求头是否加密&#xff1f; 无响应是…

SAP MM学习笔记23-购买发注的账户分配类型(勘定Category)

SAP中控制财务凭证过账科目的是 账号分配类型&#xff08;勘定Category&#xff09;栏目。 ・账号分配类型&#xff08;勘定Category&#xff09;有&#xff1a; 1&#xff0c;K 原价Center&#xff08;成本中心。用于消耗物料采购 的过账&#xff09; 2&#xff0c;E 得意先…

TPAMI, 2023 | 用压缩隐逆向神经网络进行高精度稀疏雷达成像

CoIR: Compressive Implicit Radar | IEEE TPAMI, 2023 | 用压缩隐逆向神经网络进行高精度稀疏雷达成像 注1:本文系“无线感知论文速递”系列之一,致力于简洁清晰完整地介绍、解读无线感知领域最新的顶会/顶刊论文(包括但不限于Nature/Science及其子刊;MobiCom, Sigcom, MobiSy…

C++之string类的使用

C之string类的使用 1.为什么要学string类2.标准库中的string类3.string类的接口的使用3.1默认成员函数3.2容量操作3.3访问操作3.4遍历操作3.5修改操作3.6字符串操作3.7非成员函数 1.为什么要学string类 我们所学的字符串是以’\0’结尾的一些字符的集合&#xff0c;为了操作方…

工业视觉相机镜头选型方法

一、相机选型 1、首先&#xff0c;根据检测需求确定选用黑白/彩色、面阵/线阵相机&#xff0c;接口类型一般选择GigE 2、确定检测精度要求&#xff08;最小特征尺寸mm&#xff09;、视野范围&#xff0c;一个测量精度对应几个像素数&#xff08;一般取3-5&#xff09; 3、计…

uni-app根据经纬度逆解析详细地址

uni-app中的getLocation()方法可以获取到用户当前的地理位置&#xff08;经纬度&#xff09;、速度。 但是返回参数中的address在app中才会显示&#xff0c;小程序中不会显示&#xff0c;所以我们需要进行逆解析其地址&#xff0c;解析出它的地址信息。 1.首先要在腾讯位置服务…