While the v1 version of our slouch detector works, there are a few features we need to add. The first is to account for the fact that the Circuit Playground may not sit perfectly vertical when being worn.
To deal with this, we need to generalize the problem a little further. Here is another version of our SFoE with some more angle definitions.
The dashed lines represent the SFoE sitting with good posture, which we are defining as the targetAngle. We want to determine if the SFoE exceeds the slouchAngle (SLOUCH_ANGLE), but the Circuit Playground only reports the angle relative to the vertical line, currentAngle.
If we could determine the targetAngle, we could compute the slouchAngle from the currentAngle as follows:
currentAngle = targetAngle + slouchAngle
(rearrange)
slouchAngle = targetAngle - currentAngle
So how do we come up with the targetAngle? We will make this settable by using the buttons on the Circuit Playground. The idea will be:
- Attach Circuit Playground to clothing.
- Sit with good posture.
- Press either button to set current_angle as target_angle.
- Do math shown above to compute slouch_angle.
- Compare slouch_angle to preset value, SLOUCH_ANGLE.
- Sound alarm if vaue exceeded.
Here is the code that adds this feature:
# Circuit Playground Slouch Detector v2 # # Push button(s) to set a target angle. # Compute current angle using accelerometer and compare # to preset slouch angle. Sound alarm if slouching. # # Author: Carter Nelson # MIT License (https://opensource.org/licenses/MIT) import time import math from adafruit_circuitplayground.express import cpx SLOUCH_ANGLE = 10.0 SLOUCH_TIME = 3 GRAVITY = 9.80665 # Initialize target angle to zero. target_angle = 0 # Loop forever while True: # Compute current angle current_angle = math.asin(-cpx.acceleration[2] / GRAVITY) current_angle = math.degrees(current_angle) # Set target angle on button press if cpx.button_a or cpx.button_b: target_angle = current_angle cpx.play_tone(900,0.1) time.sleep(0.1) cpx.play_tone(900,0.1) time.sleep(0.1) # Check if slouching if current_angle - target_angle > SLOUCH_ANGLE: cpx.play_tone(800, 0.5)
Page last edited March 08, 2024
Text editor powered by tinymce.