diff --git a/tmp/bh1750fvi.py b/tmp/bh1750fvi.py new file mode 100644 index 0000000..e30f61d --- /dev/null +++ b/tmp/bh1750fvi.py @@ -0,0 +1,40 @@ +# Copyright 2016 Peter Dahlberg +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import time + +OP_SINGLE_HRES1 = 0x20 +OP_SINGLE_HRES2 = 0x21 +OP_SINGLE_LRES = 0x23 + +DELAY_HMODE = 180 # 180ms in H-mode +DELAY_LMODE = 24 # 24ms in L-mode + + +def sample(i2c, mode=OP_SINGLE_HRES1, i2c_addr=0x23): + """ + Performs a single sampling. returns the result in lux + """ + + i2c.writeto(i2c_addr, b"\x00") # make sure device is in a clean state + i2c.writeto(i2c_addr, b"\x01") # power up + i2c.writeto(i2c_addr, bytes([mode])) # set measurement mode + + time.sleep_ms(DELAY_LMODE if mode == OP_SINGLE_LRES else DELAY_HMODE) + + raw = i2c.readfrom(i2c_addr, 2) + i2c.writeto(i2c_addr, b"\x00") # power down again + + # we must divide the end result by 1.2 to get the lux + return ((raw[0] << 24) | (raw[1] << 16)) // 78642 \ No newline at end of file diff --git a/tmp/bmp280.py b/tmp/bmp280.py new file mode 100644 index 0000000..52d8413 --- /dev/null +++ b/tmp/bmp280.py @@ -0,0 +1,322 @@ +from micropython import const +from ustruct import unpack as unp + +# Author David Stenwall Wahlund (david at dafnet.se) + +# Power Modes +BMP280_POWER_SLEEP = const(0) +BMP280_POWER_FORCED = const(1) +BMP280_POWER_NORMAL = const(3) + +BMP280_SPI3W_ON = const(1) +BMP280_SPI3W_OFF = const(0) + +BMP280_TEMP_OS_SKIP = const(0) +BMP280_TEMP_OS_1 = const(1) +BMP280_TEMP_OS_2 = const(2) +BMP280_TEMP_OS_4 = const(3) +BMP280_TEMP_OS_8 = const(4) +BMP280_TEMP_OS_16 = const(5) + +BMP280_PRES_OS_SKIP = const(0) +BMP280_PRES_OS_1 = const(1) +BMP280_PRES_OS_2 = const(2) +BMP280_PRES_OS_4 = const(3) +BMP280_PRES_OS_8 = const(4) +BMP280_PRES_OS_16 = const(5) + +# Standby settings in ms +BMP280_STANDBY_0_5 = const(0) +BMP280_STANDBY_62_5 = const(1) +BMP280_STANDBY_125 = const(2) +BMP280_STANDBY_250 = const(3) +BMP280_STANDBY_500 = const(4) +BMP280_STANDBY_1000 = const(5) +BMP280_STANDBY_2000 = const(6) +BMP280_STANDBY_4000 = const(7) + +# IIR Filter setting +BMP280_IIR_FILTER_OFF = const(0) +BMP280_IIR_FILTER_2 = const(1) +BMP280_IIR_FILTER_4 = const(2) +BMP280_IIR_FILTER_8 = const(3) +BMP280_IIR_FILTER_16 = const(4) + +# Oversampling setting +BMP280_OS_ULTRALOW = const(0) +BMP280_OS_LOW = const(1) +BMP280_OS_STANDARD = const(2) +BMP280_OS_HIGH = const(3) +BMP280_OS_ULTRAHIGH = const(4) + +# Oversampling matrix +# (PRESS_OS, TEMP_OS, sample time in ms) +_BMP280_OS_MATRIX = [ + [BMP280_PRES_OS_1, BMP280_TEMP_OS_1, 7], + [BMP280_PRES_OS_2, BMP280_TEMP_OS_1, 9], + [BMP280_PRES_OS_4, BMP280_TEMP_OS_1, 14], + [BMP280_PRES_OS_8, BMP280_TEMP_OS_1, 23], + [BMP280_PRES_OS_16, BMP280_TEMP_OS_2, 44] +] + +# Use cases +BMP280_CASE_HANDHELD_LOW = const(0) +BMP280_CASE_HANDHELD_DYN = const(1) +BMP280_CASE_WEATHER = const(2) +BMP280_CASE_FLOOR = const(3) +BMP280_CASE_DROP = const(4) +BMP280_CASE_INDOOR = const(5) + +_BMP280_CASE_MATRIX = [ + [BMP280_POWER_NORMAL, BMP280_OS_ULTRAHIGH, BMP280_IIR_FILTER_4, BMP280_STANDBY_62_5], + [BMP280_POWER_NORMAL, BMP280_OS_STANDARD, BMP280_IIR_FILTER_16, BMP280_STANDBY_0_5], + [BMP280_POWER_FORCED, BMP280_OS_ULTRALOW, BMP280_IIR_FILTER_OFF, BMP280_STANDBY_0_5], + [BMP280_POWER_NORMAL, BMP280_OS_STANDARD, BMP280_IIR_FILTER_4, BMP280_STANDBY_125], + [BMP280_POWER_NORMAL, BMP280_OS_LOW, BMP280_IIR_FILTER_OFF, BMP280_STANDBY_0_5], + [BMP280_POWER_NORMAL, BMP280_OS_ULTRAHIGH, BMP280_IIR_FILTER_16, BMP280_STANDBY_0_5] +] + +_BMP280_REGISTER_ID = const(0xD0) +_BMP280_REGISTER_RESET = const(0xE0) +_BMP280_REGISTER_STATUS = const(0xF3) +_BMP280_REGISTER_CONTROL = const(0xF4) +_BMP280_REGISTER_CONFIG = const(0xF5) # IIR filter config + +_BMP280_REGISTER_DATA = const(0xF7) + + +class BMP280: + def __init__(self, i2c_bus, addr=0x76, use_case=BMP280_CASE_HANDHELD_DYN): + self._bmp_i2c = i2c_bus + self._i2c_addr = addr + + # read calibration data + # < little-endian + # H unsigned short + # h signed short + self._T1 = unp('> 4) + self._t_raw = (d[3] << 12) + (d[4] << 4) + (d[5] >> 4) + + self._t_fine = 0 + self._t = 0 + self._p = 0 + + def reset(self): + self._write(_BMP280_REGISTER_RESET, 0xB6) + + def load_test_calibration(self): + self._T1 = 27504 + self._T2 = 26435 + self._T3 = -1000 + self._P1 = 36477 + self._P2 = -10685 + self._P3 = 3024 + self._P4 = 2855 + self._P5 = 140 + self._P6 = -7 + self._P7 = 15500 + self._P8 = -14600 + self._P9 = 6000 + + def load_test_data(self): + self._t_raw = 519888 + self._p_raw = 415148 + + def print_calibration(self): + print("T1: {} {}".format(self._T1, type(self._T1))) + print("T2: {} {}".format(self._T2, type(self._T2))) + print("T3: {} {}".format(self._T3, type(self._T3))) + print("P1: {} {}".format(self._P1, type(self._P1))) + print("P2: {} {}".format(self._P2, type(self._P2))) + print("P3: {} {}".format(self._P3, type(self._P3))) + print("P4: {} {}".format(self._P4, type(self._P4))) + print("P5: {} {}".format(self._P5, type(self._P5))) + print("P6: {} {}".format(self._P6, type(self._P6))) + print("P7: {} {}".format(self._P7, type(self._P7))) + print("P8: {} {}".format(self._P8, type(self._P8))) + print("P9: {} {}".format(self._P9, type(self._P9))) + + def _calc_t_fine(self): + # From datasheet page 22 + self._gauge() + if self._t_fine == 0: + var1 = (((self._t_raw >> 3) - (self._T1 << 1)) * self._T2) >> 11 + var2 = (((((self._t_raw >> 4) - self._T1) + * ((self._t_raw >> 4) + - self._T1)) >> 12) + * self._T3) >> 14 + self._t_fine = var1 + var2 + + @property + def temperature(self): + self._calc_t_fine() + if self._t == 0: + self._t = ((self._t_fine * 5 + 128) >> 8) / 100. + return self._t + + @property + def pressure(self): + # From datasheet page 22 + self._calc_t_fine() + if self._p == 0: + var1 = self._t_fine - 128000 + var2 = var1 * var1 * self._P6 + var2 = var2 + ((var1 * self._P5) << 17) + var2 = var2 + (self._P4 << 35) + var1 = ((var1 * var1 * self._P3) >> 8) + ((var1 * self._P2) << 12) + var1 = (((1 << 47) + var1) * self._P1) >> 33 + + if var1 == 0: + return 0 + + p = 1048576 - self._p_raw + p = int((((p << 31) - var2) * 3125) / var1) + var1 = (self._P9 * (p >> 13) * (p >> 13)) >> 25 + var2 = (self._P8 * p) >> 19 + + p = ((p + var1 + var2) >> 8) + (self._P7 << 4) + self._p = p / 256.0 + return self._p + + def _write_bits(self, address, value, length, shift=0): + d = self._read(address)[0] + m = int('1' * length, 2) << shift + d &= ~m + d |= m & value << shift + self._write(address, d) + + def _read_bits(self, address, length, shift=0): + d = self._read(address)[0] + return d >> shift & int('1' * length, 2) + + @property + def standby(self): + return self._read_bits(_BMP280_REGISTER_CONFIG, 3, 5) + + @standby.setter + def standby(self, v): + assert 0 <= v <= 7 + self._write_bits(_BMP280_REGISTER_CONFIG, v, 3, 5) + + @property + def iir(self): + return self._read_bits(_BMP280_REGISTER_CONFIG, 3, 2) + + @iir.setter + def iir(self, v): + assert 0 <= v <= 4 + self._write_bits(_BMP280_REGISTER_CONFIG, v, 3, 2) + + @property + def spi3w(self): + return self._read_bits(_BMP280_REGISTER_CONFIG, 1) + + @spi3w.setter + def spi3w(self, v): + assert v in (0, 1) + self._write_bits(_BMP280_REGISTER_CONFIG, v, 1) + + @property + def temp_os(self): + return self._read_bits(_BMP280_REGISTER_CONTROL, 3, 5) + + @temp_os.setter + def temp_os(self, v): + assert 0 <= v <= 5 + self._write_bits(_BMP280_REGISTER_CONTROL, v, 3, 5) + + @property + def press_os(self): + return self._read_bits(_BMP280_REGISTER_CONTROL, 3, 2) + + @press_os.setter + def press_os(self, v): + assert 0 <= v <= 5 + self._write_bits(_BMP280_REGISTER_CONTROL, v, 3, 2) + + @property + def power_mode(self): + return self._read_bits(_BMP280_REGISTER_CONTROL, 2) + + @power_mode.setter + def power_mode(self, v): + assert 0 <= v <= 3 + self._write_bits(_BMP280_REGISTER_CONTROL, v, 2) + + @property + def is_measuring(self): + return bool(self._read_bits(_BMP280_REGISTER_STATUS, 1, 3)) + + @property + def is_updating(self): + return bool(self._read_bits(_BMP280_REGISTER_STATUS, 1)) + + @property + def chip_id(self): + return self._read(_BMP280_REGISTER_ID, 2) + + @property + def in_normal_mode(self): + return self.power_mode == BMP280_POWER_NORMAL + + def force_measure(self): + self.power_mode = BMP280_POWER_FORCED + + def normal_measure(self): + self.power_mode = BMP280_POWER_NORMAL + + def sleep(self): + self.power_mode = BMP280_POWER_SLEEP + + def use_case(self, uc): + assert 0 <= uc <= 5 + pm, oss, iir, sb = _BMP280_CASE_MATRIX[uc] + t_os, p_os, self.read_wait_ms = _BMP280_OS_MATRIX[oss] + self._write(_BMP280_REGISTER_CONFIG, (iir << 2) + (sb << 5)) + self._write(_BMP280_REGISTER_CONTROL, pm + (p_os << 2) + (t_os << 5)) + + def oversample(self, oss): + assert 0 <= oss <= 4 + t_os, p_os, self.read_wait_ms = _BMP280_OS_MATRIX[oss] + self._write_bits(_BMP280_REGISTER_CONTROL, p_os + (t_os << 3), 2) \ No newline at end of file diff --git a/tmp/boot.py b/tmp/boot.py new file mode 100644 index 0000000..f50ed9b --- /dev/null +++ b/tmp/boot.py @@ -0,0 +1,5 @@ +# This file is executed on every boot (including wake-boot from deepsleep) +#import esp +#esp.osdebug(None) +#import webrepl +#webrepl.start() diff --git a/tmp/lcdtest.py b/tmp/lcdtest.py new file mode 100644 index 0000000..ba54f4f --- /dev/null +++ b/tmp/lcdtest.py @@ -0,0 +1,22 @@ +from machine import Pin, SoftI2C +import ssd1306 +from time import sleep + +pin16 = Pin(16, Pin.OUT) +pin16.value(1) + +# ESP32 Pin assignment +i2c = SoftI2C(scl=Pin(15), sda=Pin(4)) + +# ESP8266 Pin assignment +#i2c = SoftI2C(scl=Pin(5), sda=Pin(4)) + +oled_width = 128 +oled_height = 64 +oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c) + +oled.text('Hello, World 1!', 0, 0) +oled.text('Hello, World 2!', 0, 15) +oled.text('Hello, World 3!', 0, 25) + +oled.show() \ No newline at end of file diff --git a/tmp/lux22ttt.py b/tmp/lux22ttt.py new file mode 100644 index 0000000..46da388 --- /dev/null +++ b/tmp/lux22ttt.py @@ -0,0 +1,8 @@ +import bh1750fvi +from machine import I2C,Pin + +scl = Pin(22) +sda = Pin(21) +i2c = I2C(scl=scl, sda=sda) +result = bh1750fvi.sample(i2c) # in lux +print(result) \ No newline at end of file