Skip to content
This repository was archived by the owner on Sep 10, 2024. It is now read-only.

Libraries for ADXL345 Textstar and Serial7Segment #14

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
102 changes: 102 additions & 0 deletions lib/adxl345/adxl345.py
Original file line number Diff line number Diff line change
@@ -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}
111 changes: 111 additions & 0 deletions lib/serial7segment/serial7segment.py
Original file line number Diff line number Diff line change
@@ -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

28 changes: 28 additions & 0 deletions lib/textstar/textstar.py
Original file line number Diff line number Diff line change
@@ -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)