diff --git a/lib/adxl345/adxl345.py b/lib/adxl345/adxl345.py new file mode 100644 index 0000000..1a7b076 --- /dev/null +++ b/lib/adxl345/adxl345.py @@ -0,0 +1,102 @@ +### This is an I2C driver for the Adafruit ADXL345 Accelerometer. +### Made by Joachim Kristensen 2017, https://www.hackster.io/lokefar +### Git: https://github.com/lokefar +### Inspired by https://github.com/pimoroni/adxl345-python +### At the moment it is possible to set the data range going from 2G to 16G +### Optimizations that could be done: +### - Write the binaries for the other output data rates +### - Write a calibration part +### - Make it possible to call the initiate the changes to data range and +### bandwidth from main program + +### Code do use in main.py +### import adxl345 +### data = adxl345.ADXL345(i2c) +### axes = data.getAxes(True) <-- If you want in G, else False for acc + + + +#The address of the ADXL345 given in the datasheet +ADXL345_ADDR = 0x53 + + +#The bytes for making the ADXL345 send at 100Hz output data rate +BW_RATE_100HZ = 0x0B + +#The address for making changes to POWER_CTL +POWER_CTL = 0x2D +#The byte "code" for starting the measurements +MEASURE = 0x08 + +#The address for changing the DATA_FORMAT. This is used together with the ranges +DATA_FORMAT = 0x31 + +#The address where the measurement data starts from. Each axis has two bytes for the given value +AXES_DATA = 0x32 + +#The address for accessing and setting the bandwidth rate +BW_RATE = 0x2C + +#Decide the range of measurements ie the precision. Possible options +#2G +RANGE_2G = 0x08 +#4G +RANGE_4G = 0x09 +#8G +RANGE_8G = 0x0A +#16G +RANGE_16G = 0x0F + +SCALE_MULTIPLIER = 0.004 + +#Standard gravity constant for going from G-force to m/s^2 +EARTH_GRAVITY_MS2 = 9.80665 + + + +class ADXL345: + + def __init__(self, i2c): + self.i2c = i2c + self.addr = ADXL345_ADDR + self.setBandwidthRate(BW_RATE_100HZ) + self.setRange(RANGE_2G) + self.enableMeasurement() + + def enableMeasurement(self): + self.i2c.writeto_mem(self.addr, POWER_CTL, bytes([MEASURE])) + + def setBandwidthRate(self, rate_flag): + self.i2c.writeto_mem(self.addr, BW_RATE, bytes([rate_flag])) + + def setRange(self, range_flag): + self.i2c.writeto_mem(self.addr, DATA_FORMAT, bytes([range_flag])) + + def getAxes(self, gforce = False): + bytes = self.i2c.readfrom_mem(self.addr, AXES_DATA, 6) + x = bytes[0] | (bytes[1] << 8) + if(x & (1 << 16 - 1)): + x = x - (1<<16) + + y = bytes[2] | (bytes[3] << 8) + if(y & (1 << 16 - 1)): + y = y - (1<<16) + + z = bytes[4] | (bytes[5] << 8 ) + if(z & (1 << 16 - 1)): + z = z - (1<<16) + + x = x * SCALE_MULTIPLIER + y = y * SCALE_MULTIPLIER + z = z * SCALE_MULTIPLIER + + if gforce == False: + x = x * EARTH_GRAVITY_MS2 + y = y * EARTH_GRAVITY_MS2 + z = z * EARTH_GRAVITY_MS2 + + x = round(x,4) + y = round(y,4) + z = round(z,4) + + return {"x": x, "y": y, "z": z} \ No newline at end of file diff --git a/lib/serial7segment/serial7segment.py b/lib/serial7segment/serial7segment.py new file mode 100644 index 0000000..c113e80 --- /dev/null +++ b/lib/serial7segment/serial7segment.py @@ -0,0 +1,111 @@ +### Library for using Sparkfun Serial 7-Segment ### +### Made by Joachim Kristensen 2017, https://www.hackster.io/lokefar +### Git: https://github.com/lokefar +### using the Sparkfun Tutorial for reference/beginning +### https://learn.sparkfun.com/tutorials/using-the-serial-7-segment-display#example-1-serial-uart ### +### Special commands: https://github.com/sparkfun/Serial7SegmentDisplay/wiki/Special-Commands ### + +### Suggestion for improvement: +### - Change decimal actions to be controlled via a bitwise operator so it is possible to have both +### colon, decimal points and apostrophe on at the same time + + +### Code to use in main.py +### import serial7segment +### serial7segment.SERIAL7SEGMENT(uart, 'clearDisplay') <-- I recommend to clearDisplay before writing new stuff +### serial7segment.SERIAL7SEGMENT(uart, '1234') <-- Most basic +### serial7segment.SERIAL7SEGMENT(uart, '1234', 5, 1, 50) <-- turns on the colon, moves the cursor places to 1 (string starts at 2) +### and sets the brightness at half (brightness is at the moment inverse, so 1 is brightest and 100 is darkest) + + +#Clear display +CLEAR_DISPLAY = 0x76 + +#Decimal control +DECIMAL_CONTROL = 0x77 + +#Cursor control +CURSOR_CONTROL = 0x79 + +#Brightness control +BRIGHTNESS = 0x7A + +#Digit 1 control +DIGIT_1 = 0x00 + +#Digit 2 control +DIGIT_2 = 0x01 + +#Digit 3 control +DIGIT_3 = 0x02 + +#Digit 4 control +DIGIT_4 = 0x03 + +#Baud rate config +BAUD_RATE = 0x7F + +#Decimal point place +#Place 1 +DECIMAL_1 = 0x1 + +#Place 2 +DECIMAL_2 = 0x2 + +#Place 3 +DECIMAL_3 = 0x4 + +#Place 4 +DECIMAL_4 = 0x8 + +#Colon +DECIMAL_COLON = 0x10 + +class SERIAL7SEGMENT: + def __init__(self, uart, text, decimal=None, offset=None, pwm=None): + self.uart = uart + self.text = text + self.decimal = decimal + self.offset = offset + self.pwm = pwm + if self.text == 'clearDisplay': + self.clearDisplay(self.text) + else: + self.decimalPoint(self.decimal) + self.offsetCursor(self.offset) + self.writeNumber(self.text) + + def clearDisplay(self, text): + self.uart.write(bytes([CLEAR_DISPLAY])) + self.uart.write(bytes([DECIMAL_CONTROL, 0x0])) + + def decimalPoint(self, decimal): + if decimal == 1: + self.uart.write(bytes([DECIMAL_CONTROL, DECIMAL_1])) + elif decimal == 2: + self.uart.write(bytes([DECIMAL_CONTROL, DECIMAL_2])) + elif decimal == 3: + self.uart.write(bytes([DECIMAL_CONTROL, DECIMAL_3])) + elif decimal == 4: + self.uart.write(bytes([DECIMAL_CONTROL, DECIMAL_4])) + elif decimal == 5: + self.uart.write(bytes([DECIMAL_CONTROL, DECIMAL_COLON])) + + def offsetCursor(self, offset): + if offset == 1: + self.uart.write(bytes([CURSOR_CONTROL, DIGIT_1])) + elif offset == 2: + self.uart.write(bytes([CURSOR_CONTROL, DIGIT_2])) + elif offset == 3: + self.uart.write(bytes([CURSOR_CONTROL, DIGIT_3])) + elif offset == 4: + self.uart.write(bytes([CURSOR_CONTROL, DIGIT_4])) + + def pwmPower(self, pwm): + if pwm != None: + self.uart.write(bytes([BRIGHTNESS, DIGIT_4])) + + def writeNumber(self, text): + self.uart.write(text) + return self.text + diff --git a/lib/textstar/textstar.py b/lib/textstar/textstar.py new file mode 100644 index 0000000..8ce89e1 --- /dev/null +++ b/lib/textstar/textstar.py @@ -0,0 +1,28 @@ +### Textstar display ### +### Inspired by http://jeremyblythe.blogspot.dk/2012/07/raspberry-pi-with-textstar-serial-lcd.html ### +### Made by Joachim Kristensen 2017, https://www.hackster.io/lokefar +### Git: https://github.com/lokefar +### Ideas for optimization: +### - Set cursor starting point +### - Make graphs/special characters + +### Code to use in main program +### import textstar +### textstar.TEXTSTAR(uart, 'clearDisplay') <-- I recommend always clearing before writing new string +### textstar.TEXTSTAR(uart, 'MyString') + +#Adresse for clearing display +CLEARDISPLAY = chr(12) + + +class TEXTSTAR: + def __init__(self, uart, text): + self.uart = uart + self.text = text + if self.text == 'clearDisplay': + self.uart.write(CLEARDISPLAY) + else: + self.writeText(self.text) + + def writeText(self, text): + self.uart.write(text) \ No newline at end of file