“Weather:bit”的版本间的差异
来自Labplus盛思维基百科
Tangliufeng(讨论 | 贡献) |
Tangliufeng(讨论 | 贡献) |
||
第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-土壤湿度 |
− | # | + | # 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的版本
概述
该套件以micro:bit为主控,拓展建立一个微型气象站。Weather:bit内集成环境传感器可测量气压、 气温、相对湿度。可外接风速、风向计和雨量计、土壤湿度传感器、防水温度传感器。
技术参数
- 压力传感器:±0.25%(在400m高度变化时相当于1m)
- 湿度传感器:±3%相对湿度
- 操作范围(全精度):压力:300-1100 hPa 、温度:-40-85°C
气象站套件清单
- weather:bit扩展板(板载气压、温度、湿度传感器)
- micro:bit主板 x2
- extend:bitⅡ
- 风速、风向、降雨量采集器(含支架
- blue:bit-土壤湿度
- blue:bit-音乐播放
- blue:bit-按键
- NTC温度探头
- 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()