在线时间150 小时
UID2083228
注册时间2014-4-2
NXP金币286
该用户从未签到
金牌会员
- 积分
- 2606
- 最后登录
- 2023-6-23
|
发表于 2020-12-2 18:44:59
|
显示全部楼层
给大家看个好玩的
以下是代码:
- from cup import I2C
- import utime
- I2C_MS5611 = 0b1110111 # Address of MS5611
- MS5xxx_CMD_RESET = 0x1E # perform reset
- MS5xxx_CMD_ADC_READ=0x00 # initiate read sequence
- MS5xxx_CMD_ADC_CONV=0x40 # start conversion
- MS5xxx_CMD_ADC_D1 = 0x00 # read ADC 1
- MS5xxx_CMD_ADC_D2 = 0x10 # read ADC 2
- MS5xxx_CMD_ADC_256 =0x00 # set ADC oversampling ratio to 256
- MS5xxx_CMD_ADC_512 =0x02 # set ADC oversampling ratio to 512
- MS5xxx_CMD_ADC_1024=0x04 # set ADC oversampling ratio to 1024
- MS5xxx_CMD_ADC_2048=0x06 # set ADC oversampling ratio to 2048
- MS5xxx_CMD_ADC_4096=0x08 # set ADC oversampling ratio to 4096
- MS5xxx_CMD_PROM_RD =0xA0 # initiate readout of PROM registers
- def ms5611_send_cmd(i2c, cmd):
- i2c.send(cmd, I2C_MS5611)
- def ms5611_read_prom(i2c):
- ms5611_send_cmd(i2c, MS5xxx_CMD_RESET)
- utime.sleep_ms(3)
- for loop_count in range(8):
- ms5611_send_cmd(i2c, MS5xxx_CMD_PROM_RD+2*loop_count)
- read_buffer = i2c.recv(2, I2C_MS5611)
- ms5611_read_buffer[loop_count] = ((read_buffer[0] & 0xFF) << 8) | (read_buffer[1] & 0xFF)
- def ms5611_read_adc(i2c, cmd):
- ms5611_send_cmd(i2c, MS5xxx_CMD_ADC_CONV + cmd)
- cmd &= 0x0F
- if cmd == MS5xxx_CMD_ADC_256:
- utime.sleep_us(900)
- elif cmd == MS5xxx_CMD_ADC_512:
- utime.sleep_ms(3)
- elif cmd == MS5xxx_CMD_ADC_1024:
- utime.sleep_ms(4)
- elif cmd == MS5xxx_CMD_ADC_2048:
- utime.sleep_ms(6)
- elif cmd == MS5xxx_CMD_ADC_4096:
- utime.sleep_ms(10)
- ms5611_send_cmd(i2c, MS5xxx_CMD_ADC_READ)
- func_data_buffer = i2c.recv(3, I2C_MS5611)
- value = (func_data_buffer[0] & 0xFF) << 16
- value |= (func_data_buffer[1] & 0xFF) << 8
- return value | (func_data_buffer[2] & 0xFF)
- def ms5611_read_out(i2c):
- # Reserve these float variables
- dT = float(0.0)
- OFF = float(0.0)
- SENS = float(0.0)
- T2 = float(0.0)
- OFF2 = float(0.0)
- SENS2 = float(0.0)
- data2 = ms5611_read_adc(i2c, MS5xxx_CMD_ADC_D2+MS5xxx_CMD_ADC_4096)
- data1 = ms5611_read_adc(i2c, MS5xxx_CMD_ADC_D1+MS5xxx_CMD_ADC_4096)
- dT = data2 - (ms5611_read_buffer[5] << 8)
- OFF = (ms5611_read_buffer[2] << 16) + (dT*ms5611_read_buffer[4] / 0x80)
- SENS = (ms5611_read_buffer[1] << 15) + (dT*ms5611_read_buffer[3] / 0x100)
- ms5611_temperature = (2000 + (dT * ms5611_read_buffer[6] / 0x800000))
- ms5611_pressure = (((data1 * SENS) / 0x200000 - OFF) / 0x8000)
- if ms5611_temperature < 2000:
- T2 = dT * dT / 0x80000000
- OFF2 = 5 * (ms5611_temperature - 2000) * (ms5611_temperature - 2000) / 0x02
- SENS2 = 5 * (ms5611_temperature - 2000) * (ms5611_temperature - 2000) / 0x04
- if ms5611_temperature < -1500:
- OFF2 += 7 * (ms5611_temperature + 1500) * (ms5611_temperature + 1500)
- SENS2 += 11 * (ms5611_temperature + 1500) * (ms5611_temperature + 1500) / 0x02
- ms5611_temperature -= T2
- OFF -= OFF2
- SENS -= SENS2
- ms5611_pressure = (((data1 * SENS) / 0x200000 - OFF) / 0x8000)
- return ms5611_temperature, ms5611_pressure
- ms5611_read_buffer = [0,] * 8
- i2c = I2C(1, I2C.MASTER, baudrate=50000)
- ms5611_send_cmd(i2c, MS5xxx_CMD_RESET)
- utime.sleep_ms(1)
- ms5611_read_prom(i2c)
- for _ in range(5):
- temperature, pressure = ms5611_read_out(i2c)
- print("ms5611_get_temperature: %d.%d." % (temperature/100, temperature%100))
- print("ms5611_get_pressure : %d." % pressure)
- utime.sleep_ms(1000)
复制代码
|
|