You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
2.7 KiB
109 lines
2.7 KiB
from pinouts import NodeMCU as pins |
|
from hcsr04 import HCSR04 |
|
import machine |
|
import time |
|
|
|
|
|
class Table: |
|
def __init__(self): |
|
# Distance sensor |
|
self.hcsr04 = HCSR04(trigger_pin=pins.D2, echo_pin=pins.D3) |
|
|
|
# Movement sensor |
|
self.movement_sensor = machine.Pin(pins.D4, mode=machine.Pin.IN) |
|
|
|
# Relay to move up and down |
|
self.relay_up = machine.Pin(pins.D5, mode=machine.Pin.OUT) |
|
self.relay_down = machine.Pin(pins.D6, mode=machine.Pin.OUT) |
|
|
|
# Reset both relays on set up |
|
self.triggerRelay(0) |
|
|
|
|
|
def currentHeight(self): |
|
""" |
|
Get current height of the table in CM. |
|
|
|
Might return False if measuring error. |
|
""" |
|
|
|
distances = [] |
|
|
|
# Measure a bunch of times... |
|
for x in range(0, 20): |
|
distances.append(self.hcsr04.distance_cm()) |
|
|
|
# Take the longest distance, I've not seen any that is too far |
|
distance = max(distances) |
|
|
|
if distance > 0: |
|
return distance |
|
|
|
return False |
|
|
|
|
|
def getMovement(self): |
|
""" |
|
Get movement from sensor. |
|
""" |
|
return self.movement_sensor.value() |
|
|
|
|
|
def triggerRelay(self, direction): |
|
""" |
|
Direction should be an integer: |
|
- 1 to move up |
|
- 0 to stop movement |
|
- -1 to move down |
|
""" |
|
|
|
if direction == 1: |
|
self.relay_down.value(0) |
|
self.relay_up.value(1) |
|
elif direction == -1: |
|
self.relay_down.value(1) |
|
self.relay_up.value(0) |
|
else: |
|
self.relay_up.value(1) |
|
self.relay_down.value(1) |
|
|
|
|
|
def move(self, distance): |
|
""" |
|
Move distance centimeters: |
|
- Positive distances is up |
|
- Negative distances is down |
|
- Zero distances is stop |
|
""" |
|
|
|
# Calculate target height (Assuming we're measuring the distance |
|
# to the ceiling) |
|
targetHeight = self.currentHeight() - distance |
|
|
|
# Default to not move in any direction |
|
direction = 0 |
|
|
|
while True: |
|
# Calculate how far to move |
|
currentHeightDiff = (self.currentHeight() - targetHeight) * -1 |
|
|
|
# Calculate which direction to move in (Assuming that we're |
|
# measuring the diff height to the ceiling) |
|
if currentHeightDiff > 1: |
|
direction = -1 |
|
elif currentHeightDiff < -1: |
|
direction = 1 |
|
else: |
|
# Reset the relays |
|
self.triggerRelay(0) |
|
|
|
# Break the loop |
|
break |
|
|
|
# Move up or down |
|
self.triggerRelay(direction) |
|
|
|
# Sleep for a bit |
|
time.sleep(0.1) |
|
|
|
print("my work is done")
|
|
|