Skip to content

Commit

Permalink
refactor to individual projects
Browse files Browse the repository at this point in the history
  • Loading branch information
Max Rye committed Sep 28, 2022
1 parent cbd327a commit 6ccd735
Show file tree
Hide file tree
Showing 11 changed files with 967 additions and 84 deletions.
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
# micropython
# micropython

### playing around with micropython and some sensors
8 changes: 0 additions & 8 deletions buttons.py

This file was deleted.

63 changes: 63 additions & 0 deletions buttons/buttons.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# This example shows you a simple, non-interrupt way of reading Pico Explorer's buttons with a loop that checks to see if buttons are pressed.

import time
from pimoroni import Button
from picographics import PicoGraphics, DISPLAY_PICO_EXPLORER, PEN_P4

# We're only using a few colours so we can use a 4 bit/16 colour palette and save RAM!
display = PicoGraphics(display=DISPLAY_PICO_EXPLORER, pen_type=PEN_P4)

button_a = Button(12)
button_b = Button(13)
button_x = Button(14)
button_y = Button(15)

WHITE = display.create_pen(255, 255, 255)
BLACK = display.create_pen(0, 0, 0)
CYAN = display.create_pen(0, 255, 255)
MAGENTA = display.create_pen(255, 0, 255)
YELLOW = display.create_pen(255, 255, 0)
GREEN = display.create_pen(0, 255, 0)


# sets up a handy function we can call to clear the screen
def clear():
display.set_pen(BLACK)
display.clear()
display.update()


# set up
clear()
display.set_font("bitmap8")

count = 0
while True:
if button_a.read(): # if a button press is detected then...
clear() # clear to black
display.set_pen(WHITE) # change the pen colour
display.text("Button A pressed", 10, 10, 240, 4) # display some text on the screen
display.update() # update the display
elif button_b.read():
clear()
display.set_pen(CYAN)
display.text("Button B pressed", 10, 10, 240, 4)
display.update()
elif button_x.read():
clear()
display.set_pen(MAGENTA)
display.text("Button X pressed", 10, 10, 240, 4)
display.update()
elif button_y.read():
clear()
display.set_pen(YELLOW)
display.text("Button Y pressed", 10, 10, 240, 4)
display.update()
if count > 500:
clear()
display.set_pen(GREEN)
display.text("Press any button!", 10, 10, 240, 4)
display.update()
count=0
time.sleep(0.01)
count+=1
File renamed without changes.
File renamed without changes.
File renamed without changes.
44 changes: 44 additions & 0 deletions distance_detection/distance_detection.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
from hcsr04 import HCSR04
from time import sleep
import machine
from picographics import PicoGraphics, DISPLAY_PICO_EXPLORER, PEN_P8
from pimoroni import Buzzer

display = PicoGraphics(display=DISPLAY_PICO_EXPLORER, pen_type=PEN_P8)

WIDTH, HEIGHT = display.get_bounds()
BLACK = display.create_pen(0, 0, 0)
WHITE = display.create_pen(255, 255, 255)

STATUS_LED = machine.Pin(25, machine.Pin.OUT)
RED_LED = machine.Pin(2, machine.Pin.OUT)
GREEN_LED = machine.Pin(6, machine.Pin.OUT)
BUZZER = Buzzer(5)

# BUZZER.set_tone(4970)
# BUZZER.set_tone(-1)
# STATUS_LED.value(1)
# RED_LED.value(1)
# GREEN_LED.value(1)

sensor = HCSR04(trigger_pin=4, echo_pin=0)

while True:
STATUS_LED.value(1)
distance = sensor.distance_cm()
display.set_pen(BLACK)
display.clear()
display.set_pen(WHITE)
display.text(f"Distance: {distance}cm", 10, 10, 240, 4)
display.update()

if distance < 10:
GREEN_LED.value(0)
RED_LED.value(1)
BUZZER.set_tone(4970)
else:
RED_LED.value(0)
GREEN_LED.value(1)
BUZZER.set_tone(-1)

sleep(0.01)
80 changes: 80 additions & 0 deletions distance_detection/hcsr04.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
from machine import Pin, time_pulse_us
from utime import sleep_us

__version__ = '0.2.1'
__author__ = 'Roberto Sánchez'
__license__ = "Apache License 2.0. https://www.apache.org/licenses/LICENSE-2.0"

class HCSR04:
"""
Driver to use the untrasonic sensor HC-SR04.
The sensor range is between 2cm and 4m.
The timeouts received listening to echo pin are converted to OSError('Out of range')
"""
# echo_timeout_us is based in chip range limit (400cm)
def __init__(self, trigger_pin, echo_pin, echo_timeout_us=500*2*30):
"""
trigger_pin: Output pin to send pulses
echo_pin: Readonly pin to measure the distance. The pin should be protected with 1k resistor
echo_timeout_us: Timeout in microseconds to listen to echo pin.
By default is based in sensor limit range (4m)
"""
self.echo_timeout_us = echo_timeout_us
# Init trigger pin (out)
self.trigger = Pin(trigger_pin, mode=Pin.OUT, pull=None)
self.trigger.value(0)

# Init echo pin (in)
self.echo = Pin(echo_pin, mode=Pin.IN, pull=None)

def _send_pulse_and_wait(self):
"""
Send the pulse to trigger and listen on echo pin.
We use the method `machine.time_pulse_us()` to get the microseconds until the echo is received.
"""
self.trigger.value(0) # Stabilize the sensor
sleep_us(5)
self.trigger.value(1)
# Send a 10us pulse.
sleep_us(10)
self.trigger.value(0)
try:
pulse_time = time_pulse_us(self.echo, 1, self.echo_timeout_us)
# time_pulse_us returns -2 if there was timeout waiting for condition; and -1 if there was timeout during the main measurement. It DOES NOT raise an exception
# ...as of MicroPython 1.17: http://docs.micropython.org/en/v1.17/library/machine.html#machine.time_pulse_us
if pulse_time < 0:
MAX_RANGE_IN_CM = const(500) # it's really ~400 but I've read people say they see it working up to ~460
pulse_time = int(MAX_RANGE_IN_CM * 29.1) # 1cm each 29.1us
return pulse_time
except OSError as ex:
if ex.args[0] == 110: # 110 = ETIMEDOUT
raise OSError('Out of range')
raise ex

def distance_mm(self):
"""
Get the distance in milimeters without floating point operations.
"""
pulse_time = self._send_pulse_and_wait()

# To calculate the distance we get the pulse_time and divide it by 2
# (the pulse walk the distance twice) and by 29.1 becasue
# the sound speed on air (343.2 m/s), that It's equivalent to
# 0.34320 mm/us that is 1mm each 2.91us
# pulse_time // 2 // 2.91 -> pulse_time // 5.82 -> pulse_time * 100 // 582
mm = pulse_time * 100 // 582
return mm

def distance_cm(self):
"""
Get the distance in centimeters with floating point operations.
It returns a float
"""
pulse_time = self._send_pulse_and_wait()

# To calculate the distance we get the pulse_time and divide it by 2
# (the pulse walk the distance twice) and by 29.1 becasue
# the sound speed on air (343.2 m/s), that It's equivalent to
# 0.034320 cm/us that is 1cm each 29.1us
cms = (pulse_time / 2) / 29.1
return cms
75 changes: 0 additions & 75 deletions main.py
Original file line number Diff line number Diff line change
@@ -1,75 +0,0 @@
import time
import machine
import dht
import random
from picographics import PicoGraphics, DISPLAY_PICO_EXPLORER, PEN_P8

sensor = dht.DHT11(machine.Pin(2))

display = PicoGraphics(display=DISPLAY_PICO_EXPLORER, pen_type=PEN_P8)

WIDTH, HEIGHT = display.get_bounds()
BLACK = display.create_pen(0, 0, 0)
WHITE = display.create_pen(255, 255, 255)

STATUS_LED = machine.Pin(25, machine.Pin.OUT)
YELLOW_LED = machine.Pin(3, machine.Pin.OUT)
GREEN_LED = machine.Pin(4, machine.Pin.OUT)
BLUE_LED = machine.Pin(7, machine.Pin.OUT)
RED_LED = machine.Pin(0, machine.Pin.OUT)

def turn_of_leds():
# check all leds
RED_LED.value(0)
YELLOW_LED.value(0)
GREEN_LED.value(0)
BLUE_LED.value(0)

def test_leds():
# check all leds
RED_LED.value(1)
time.sleep(1)
RED_LED.value(1)
YELLOW_LED.value(1)
time.sleep(1)
YELLOW_LED.value(0)
GREEN_LED.value(1)
time.sleep(1)
GREEN_LED.value(0)
BLUE_LED.value(1)
time.sleep(1)
BLUE_LED.value(0)

test_leds()
while True:
# show the program has started
STATUS_LED.value(1)
try:
time.sleep(2)
sensor.measure()
t = sensor.temperature()
h = sensor.humidity()
display.set_pen(BLACK)
display.clear()
display.set_pen(WHITE)
display.text(f"Temp: {t} C \nHum: {h} %", 10, 10, 240, 4)
display.update()
# print('Temperature: %3.1f C' %t)
# print('Humidity: %3.1f %%' %h)

turn_of_leds()
if t < 18:
# cold boi
BLUE_LED.value(1)
elif t >= 18 and t <= 20:
YELLOW_LED.value(1)
elif t > 20 and t <= 24:
# perfect
GREEN_LED.value(1)
elif t > 24:
# hot boi
RED_LED.value(1)
except OSError as e:
print('Sensor Reading Failed')
print(e)

Loading

0 comments on commit 6ccd735

Please sign in to comment.