This repository was archived by the owner on Sep 10, 2024. It is now read-only.
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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Sep 10, 2024. It is now read-only.
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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Sep 10, 2024. It is now read-only.
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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Sep 10, 2024. It is now read-only.
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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on Sep 10, 2024. It is now read-only.
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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Sep 10, 2024. It is now read-only.
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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Sep 10, 2024. It is now read-only.
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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on Sep 10, 2024. It is now read-only.
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 numberDiff line numberDiff 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 numberDiff line numberDiff 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 numberDiff line numberDiff 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)