diff --git a/examples/HMC5883L/HMC5883L.py b/examples/HMC5883L/HMC5883L.py new file mode 100644 index 0000000..cee058e --- /dev/null +++ b/examples/HMC5883L/HMC5883L.py @@ -0,0 +1,183 @@ +''' +HMC5883L 3 Axis Digital Compass +datascheet: https://cdn-shop.adafruit.com/datasheets/HMC5883L_3-Axis_Digital_Compass_IC.pdf +autor: Karol Bieniaszewski +c: 2017 +The MIT License (MIT) +Copyright (c) 2017 Karol Bieniaszewski, liviuslivius at op dot pl +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +''' + +from machine import I2C +from array import array +import math +import gc +import time + +HMC5883L_sampling_mode_continous = bytes([0x00]) +HMC5883L_sampling_mode_single = bytes([0x01]) +HMC5883L_sampling_mode_idle = bytes([0x02]) + +HMC5883L_samples_1 = 0 +HMC5883L_samples_2 = 32 +HMC5883L_samples_4 = 64 +HMC5883L_samples_8 = 96 + +HMC5883L_rate_00_75 = 0 +HMC5883L_rate_01_50 = 4 +HMC5883L_rate_03_00 = 8 +HMC5883L_rate_07_50 = 12 +HMC5883L_rate_15_00 = 16 +HMC5883L_rate_75_00 = 20 + +HMC5883L_measurement_mode_bias_disabled = 0 +HMC5883L_measurement_mode_bias_positive = 1 +HMC5883L_measurement_mode_bias_negative = 2 + +HMC5883L_gauss_gain = { + "0.88": [0, 0.73], + "1.3": [32, 0.92], + "1.9": [64, 1.22], + "2.5": [96, 1.52], + "4.0": [128, 2.27], + "4.7": [160, 2.56], + "5.6": [192, 3.03], + "8.1": [224, 4.35] + } + +def complement2toInt(value, len): + if (value & (1 << len - 1)): + value = value - (1< 2 * math.pi: + headingRad -= 2 * math.pi + + self.headingDeg = headingRad * 180 / math.pi + + def __str__(self): + ''' + first call: + self.readAxes() + self.heading() + ''' + return "X: " + str(self.x) + ", Y: " + str(self.y) + ", Z: " + str(self.z) + " - Heading: " + str(self.headingDeg) + ", Declination: " + str((self.declDegrees,self.declMinutes)) + "\n" diff --git a/examples/HMC5883L/testCompass.py b/examples/HMC5883L/testCompass.py new file mode 100644 index 0000000..c400a49 --- /dev/null +++ b/examples/HMC5883L/testCompass.py @@ -0,0 +1,11 @@ +# execfile('testCompass.py') +import HMC5883L +import gc +import time +m = HMC5883L2.HMC5883L() +while True: + m.readAxes() + m.heading() + print(m) + time.sleep_ms(1000) + gc.collect() diff --git a/lib/onewire/onewire.py b/lib/onewire/onewire.py index 3b75f51..1efcecc 100644 --- a/lib/onewire/onewire.py +++ b/lib/onewire/onewire.py @@ -157,9 +157,15 @@ def _search_rom(self, l_rom, diff): return rom, next_diff class DS18X20(object): - def __init__(self, onewire): + def __init__(self, onewire, useFloat=True): self.ow = onewire self.roms = [rom for rom in self.ow.scan() if rom[0] == 0x10 or rom[0] == 0x28] + self.fp = useFloat + try: + if useFloat: + 1/1 + except TypeError: + self.fp = False # floatingpoint not supported def isbusy(self): """ @@ -174,11 +180,14 @@ def start_convertion(self, rom=None): Pass the 8-byte bytes object with the ROM of the specific device you want to read. If only one DS18x20 device is attached to the bus you may omit the rom parameter. """ - rom = rom or self.roms[0] - ow = self.ow - ow.reset() - ow.select_rom(rom) - ow.write_byte(0x44) # Convert Temp + if (rom==None) and (len(self.roms)>0): + rom=self.roms[0] + if rom!=None: + rom = rom or self.roms[0] + ow = self.ow + ow.reset() + ow.select_rom(rom) + ow.write_byte(0x44) # Convert Temp def read_temp_async(self, rom=None): """ @@ -187,13 +196,17 @@ def read_temp_async(self, rom=None): """ if self.isbusy(): return None - rom = rom or self.roms[0] - ow = self.ow - ow.reset() - ow.select_rom(rom) - ow.write_byte(0xbe) # Read scratch - data = ow.read_bytes(9) - return self.convert_temp(rom[0], data) + if (rom==None) and (len(self.roms)>0): + rom=self.roms[0] + if rom==None: + return None + else: + ow = self.ow + ow.reset() + ow.select_rom(rom) + ow.write_byte(0xbe) # Read scratch + data = ow.read_bytes(9) + return self.convert_temp(rom[0], data) def convert_temp(self, rom0, data): """ @@ -213,6 +226,9 @@ def convert_temp(self, rom0, data): temp = 100 * temp_read - 25 + (count_per_c - count_remain) // count_per_c return temp elif rom0 == 0x28: - return (temp_msb << 8 | temp_lsb) * 100 // 16 + temp = (temp_msb << 8 | temp_lsb) * 100 // 16 + if (temp_msb & 0xf8) == 0xf8: # for negative temperature + temp -= 0x1000 + return temp else: assert False