“Weather:bit”的版本间的差异

来自Labplus盛思维基百科
跳转至: 导航搜索
第8行: 第8行:
 
* 操作范围(全精度):压力:300-1100 hPa 、温度:-40-85°C
 
* 操作范围(全精度):压力:300-1100 hPa 、温度:-40-85°C
  
== 场景套件清单 ==
+
== 气象站套件清单 ==
 
# weather:bit扩展板(板载气压、温度、湿度传感器)
 
# weather:bit扩展板(板载气压、温度、湿度传感器)
 
# micro:bit主板 x2
 
# micro:bit主板 x2
 +
# extend:bitⅡ
 
# 风速、风向、降雨量采集器(含支架
 
# 风速、风向、降雨量采集器(含支架
# 土壤湿度传感器
+
# blue:bit-土壤湿度
# DS18B20温度探头
+
# blue:bit-音乐播放
 +
# blue:bit-按键
 +
# NTC温度探头
 
# 32x16 RGB LED 点阵屏
 
# 32x16 RGB LED 点阵屏
 +
 +
== 气象站连接示意图 ==
 +
 +
== 气象站场景 ==
 +
weather:bit气象站实时接收气象数据(风速、风向、降雨量、土壤湿度、土壤温度、大气压强、气温、空气湿度),并利用microbit无线传输将气象数据显示在32x16全彩点阵屏上<br />
 +
<br />
 +
* 气象站端micro:bit数据采集程序
 +
<pre style="color:blue">
 +
from microbit import *
 +
import struct
 +
import math
 +
import radio
 +
T1=T2=T3=P1=P2=P3=P4=P5=P6=P7=P8=P9=H1=H2=H3=H4=H5=H6=tF=1
 +
tCnt=tCnt1=wScnt=rAcnt=wsBefore=raBefore=0
 +
 +
def BME280Init():
 +
    global T1,T2,T3,H1,H2,H3,H4,H5,H6,tF
 +
    global P1,P2,P3,P4,P5,P6,P7,P8,P9
 +
    i2c.write(0x76, bytearray([0xF2, 0x01]))
 +
    i2c.write(0x76, bytearray([0xF4, 0x27]))
 +
    i2c.write(0x76, bytearray([0xF5, 0]))
 +
   
 +
    i2c.write(0x76, bytearray([0x88]))
 +
    T = i2c.read(0x76, 24)
 +
    T1 = (T[1]<<8) | T[0]   
 +
    T2 = cvt2int16(T[3],T[2])
 +
    T3 = cvt2int16(T[5],T[4])
 +
    P1 = T[6] | (T[7]<<8)   
 +
    P2 = cvt2int16(T[9],T[8])     
 +
    P3 = cvt2int16(T[11],T[10]) 
 +
    P4 = cvt2int16(T[13],T[12])     
 +
    P5 = cvt2int16(T[15],T[14])   
 +
    P6 = cvt2int16(T[17],T[16]) 
 +
    P7 = cvt2int16(T[19],T[18]) 
 +
    P8 = cvt2int16(T[21],T[20]) 
 +
    P9 = cvt2int16(T[23],T[22]) 
 +
    i2c.write(0x76, bytearray([0xA1]))
 +
    tmp = i2c.read(0x76, 1)   
 +
    H1 = tmp[0]
 +
    i2c.write(0x76, bytearray([0xE1]))
 +
    H = i2c.read(0x76, 7)
 +
    H2 = cvt2int16(H[1],H[0])
 +
    H3 = H[2]
 +
    H4 = struct.unpack("h", struct.pack("H",(H[3]<<4)|(H[4]&0xf)))[0]
 +
    H5 = struct.unpack("h", struct.pack("H",(H[5]<<4)|(H[4]>>4)))[0]
 +
    H6 = H[6]
 +
    getTemp()
 +
    tCnt = tCnt1 = running_time()
 +
 +
def getTemp():
 +
    global tF,T1,T2,T3
 +
    i2c.write(0x76, bytearray([0xFA]))
 +
    tmp = i2c.read(0x76, 3)
 +
    T = (((tmp[0]<<8)|tmp[1])<<4)|(tmp[2]>>4)
 +
    tmp1 = ((T >> 4) - T1)
 +
    c1 = (((T >> 3) - (T1 << 1)) * T2) >> 11
 +
    c2 = (((tmp1*tmp1) >> 12) * T3) >> 14
 +
    tF = c1+c2
 +
    return ((tF * 5 + 128) >> 8)
 +
 +
def getHumidity():
 +
    global H1,H2,H3,H4,H5,H6,tF
 +
    i2c.write(0x76, bytearray([0xFD]))
 +
    tmp=i2c.read(0x76, 2)
 +
    h=(tmp[0]<<8)|tmp[1]
 +
    hum = tF - 76800
 +
    tmp = (((h<<14)-(H4<<20)-(H5*hum))+16384)>>15
 +
    tmp1 =((((hum*H6)>>10)*(((hum*H3)>>11)+32768))>>10)+2097152
 +
    tmp1 = (tmp1*H2+8192)>>14
 +
    var1 = tmp*tmp1
 +
    hum1 = var1 - (((var1 >> 15) * (var1 >> 15)) >> 7) * (H1 >> 4)
 +
    if hum1<0:
 +
        hum1=0
 +
    if hum1>419430400:
 +
        hum1=419430400
 +
    return (hum1>>12)//100
 +
   
 +
def getPressure():
 +
    global P1,P2,P3,P4,P5,P6,P7,P8,P9,tF
 +
    i2c.write(0x76, bytearray([0xF7]))
 +
    tmp = i2c.read(0x76, 3)
 +
    P = (((tmp[0]<<8)|tmp[1])<<4)|(tmp[2]>>4)
 +
    var1 = tF - 128000
 +
    var2 = var1 * var1 * P6
 +
    var2 = var2 + ((var1 * P5)<<17)
 +
    var2 = var2 + (P4<<35)
 +
    var1 = ((var1 * var1 * P3)>>8) + ((var1 * P2)<<12)
 +
    var1 = ((((1<<47)+var1))*P1)>>33
 +
    if (var1 == 0):
 +
        return 0
 +
    p_acc = 1048576 - P
 +
    p_acc = int((((p_acc<<31) - var2)*3125)/var1)
 +
    var1 = (P9 * (p_acc>>13) * (p_acc>>13)) >> 25
 +
    var2 = (P8 * p_acc) >> 19;
 +
    p_acc = ((p_acc + var1 + var2) >> 8) + (P7<<4)
 +
    return (p_acc>>8)//100
 +
 +
def cvt2int16(d1,d2):
 +
    d = (d1<<8) | d2
 +
    return struct.unpack("h", struct.pack("H",d))[0]
 +
 +
BME280Init()
 +
display.off()
 +
pin13.read_digital()
 +
pin13.set_pull(pin13.PULL_UP)
 +
pin8.read_digital()
 +
pin8.set_pull(pin8.PULL_UP)
 +
radio.config(length=32, queue=3, channel=7, power=0, data_rate=radio.RATE_1MBIT)
 +
radio.on()
 +
while True:
 +
    s = struct.pack("h", getTemp())
 +
    s = s+struct.pack("h", getHumidity())
 +
    s = s+struct.pack("h", getPressure())
 +
    if (wsBefore != pin8.read_digital()):
 +
        wScnt += 1
 +
        wsBefore = pin8.read_digital()     
 +
    if (raBefore != pin13.read_digital()):
 +
        rAcnt += 1
 +
        raBefore = pin13.read_digital()
 +
    if ((running_time()-tCnt)>2000):
 +
        s = s+struct.pack("H", pin1.read_analog())
 +
        s = s+struct.pack("H", pin2.read_analog())
 +
        pin16.write_digital(1)
 +
        sleep(10)
 +
        s = s+struct.pack("H", pin0.read_analog())
 +
        pin16.write_digital(0)
 +
        s = s+struct.pack("H", wScnt)
 +
        s = s+struct.pack("H", rAcnt)
 +
        radio.send_bytes(s)
 +
        wScnt = 0
 +
        tCnt = running_time()
 +
    if ((running_time()-tCnt1)>86400000):
 +
        rAcnt = 0
 +
        tCnt1 = runing_time()
 +
</pre>

2018年1月23日 (二) 14:36的版本

Weather bit.png

概述

该套件以micro:bit为主控,拓展建立一个微型气象站。Weather:bit内集成环境传感器可测量气压、 气温、相对湿度。可外接风速、风向计和雨量计、土壤湿度传感器、防水温度传感器。

技术参数

  • 压力传感器:±0.25%(在400m高度变化时相当于1m)
  • 湿度传感器:±3%相对湿度
  • 操作范围(全精度):压力:300-1100 hPa 、温度:-40-85°C

气象站套件清单

  1. weather:bit扩展板(板载气压、温度、湿度传感器)
  2. micro:bit主板 x2
  3. extend:bitⅡ
  4. 风速、风向、降雨量采集器(含支架
  5. blue:bit-土壤湿度
  6. blue:bit-音乐播放
  7. blue:bit-按键
  8. NTC温度探头
  9. 32x16 RGB LED 点阵屏

气象站连接示意图

气象站场景

weather:bit气象站实时接收气象数据(风速、风向、降雨量、土壤湿度、土壤温度、大气压强、气温、空气湿度),并利用microbit无线传输将气象数据显示在32x16全彩点阵屏上

  • 气象站端micro:bit数据采集程序
from microbit import *
import struct
import math
import radio
T1=T2=T3=P1=P2=P3=P4=P5=P6=P7=P8=P9=H1=H2=H3=H4=H5=H6=tF=1
tCnt=tCnt1=wScnt=rAcnt=wsBefore=raBefore=0

def BME280Init():
    global T1,T2,T3,H1,H2,H3,H4,H5,H6,tF
    global P1,P2,P3,P4,P5,P6,P7,P8,P9
    i2c.write(0x76, bytearray([0xF2, 0x01]))
    i2c.write(0x76, bytearray([0xF4, 0x27]))
    i2c.write(0x76, bytearray([0xF5, 0]))
    
    i2c.write(0x76, bytearray([0x88]))
    T = i2c.read(0x76, 24)
    T1 = (T[1]<<8) | T[0]    
    T2 = cvt2int16(T[3],T[2])
    T3 = cvt2int16(T[5],T[4])
    P1 = T[6] | (T[7]<<8)    
    P2 = cvt2int16(T[9],T[8])      
    P3 = cvt2int16(T[11],T[10])  
    P4 = cvt2int16(T[13],T[12])      
    P5 = cvt2int16(T[15],T[14])     
    P6 = cvt2int16(T[17],T[16])   
    P7 = cvt2int16(T[19],T[18])  
    P8 = cvt2int16(T[21],T[20])   
    P9 = cvt2int16(T[23],T[22])  
    i2c.write(0x76, bytearray([0xA1]))
    tmp = i2c.read(0x76, 1)    
    H1 = tmp[0]
    i2c.write(0x76, bytearray([0xE1]))
    H = i2c.read(0x76, 7)
    H2 = cvt2int16(H[1],H[0])
    H3 = H[2]
    H4 = struct.unpack("h", struct.pack("H",(H[3]<<4)|(H[4]&0xf)))[0]
    H5 = struct.unpack("h", struct.pack("H",(H[5]<<4)|(H[4]>>4)))[0]
    H6 = H[6]
    getTemp()
    tCnt = tCnt1 = running_time()

def getTemp():
    global tF,T1,T2,T3
    i2c.write(0x76, bytearray([0xFA]))
    tmp = i2c.read(0x76, 3) 
    T = (((tmp[0]<<8)|tmp[1])<<4)|(tmp[2]>>4)
    tmp1 = ((T >> 4) - T1)
    c1 = (((T >> 3) - (T1 << 1)) * T2) >> 11
    c2 = (((tmp1*tmp1) >> 12) * T3) >> 14
    tF = c1+c2
    return ((tF * 5 + 128) >> 8)

def getHumidity():
    global H1,H2,H3,H4,H5,H6,tF
    i2c.write(0x76, bytearray([0xFD]))
    tmp=i2c.read(0x76, 2)
    h=(tmp[0]<<8)|tmp[1]
    hum = tF - 76800
    tmp = (((h<<14)-(H4<<20)-(H5*hum))+16384)>>15
    tmp1 =((((hum*H6)>>10)*(((hum*H3)>>11)+32768))>>10)+2097152
    tmp1 = (tmp1*H2+8192)>>14
    var1 = tmp*tmp1
    hum1 = var1 - (((var1 >> 15) * (var1 >> 15)) >> 7) * (H1 >> 4)
    if hum1<0:
        hum1=0
    if hum1>419430400:
        hum1=419430400
    return (hum1>>12)//100
    
def getPressure():
    global P1,P2,P3,P4,P5,P6,P7,P8,P9,tF
    i2c.write(0x76, bytearray([0xF7]))
    tmp = i2c.read(0x76, 3) 
    P = (((tmp[0]<<8)|tmp[1])<<4)|(tmp[2]>>4)
    var1 = tF - 128000
    var2 = var1 * var1 * P6
    var2 = var2 + ((var1 * P5)<<17)
    var2 = var2 + (P4<<35)
    var1 = ((var1 * var1 * P3)>>8) + ((var1 * P2)<<12)
    var1 = ((((1<<47)+var1))*P1)>>33
    if (var1 == 0):
        return 0
    p_acc = 1048576 - P
    p_acc = int((((p_acc<<31) - var2)*3125)/var1)
    var1 = (P9 * (p_acc>>13) * (p_acc>>13)) >> 25
    var2 = (P8 * p_acc) >> 19;
    p_acc = ((p_acc + var1 + var2) >> 8) + (P7<<4)
    return (p_acc>>8)//100

def cvt2int16(d1,d2):
    d = (d1<<8) | d2
    return struct.unpack("h", struct.pack("H",d))[0]

BME280Init()
display.off()
pin13.read_digital()
pin13.set_pull(pin13.PULL_UP)
pin8.read_digital()
pin8.set_pull(pin8.PULL_UP)
radio.config(length=32, queue=3, channel=7, power=0, data_rate=radio.RATE_1MBIT)
radio.on()
while True:
    s = struct.pack("h", getTemp()) 
    s = s+struct.pack("h", getHumidity())
    s = s+struct.pack("h", getPressure())
    if (wsBefore != pin8.read_digital()):
        wScnt += 1
        wsBefore = pin8.read_digital()      
    if (raBefore != pin13.read_digital()):
        rAcnt += 1
        raBefore = pin13.read_digital()
    if ((running_time()-tCnt)>2000):
        s = s+struct.pack("H", pin1.read_analog())
        s = s+struct.pack("H", pin2.read_analog())
        pin16.write_digital(1)
        sleep(10)
        s = s+struct.pack("H", pin0.read_analog())
        pin16.write_digital(0)
        s = s+struct.pack("H", wScnt)
        s = s+struct.pack("H", rAcnt)
        radio.send_bytes(s)
        wScnt = 0
        tCnt = running_time()
    if ((running_time()-tCnt1)>86400000):
        rAcnt = 0
        tCnt1 = runing_time()