import random
from machine import Pin, I2C, PWM, time_pulse_us
from ssd1306 import SSD1306_I2C
import dht
import time
count = 0
# US Pin
trigger = Pin(20, Pin.OUT)
echo = Pin(21, Pin.IN)
SOUND_SPEED = 340
TRIG_PULSE_DURATION_US = 10
# DHT22 Pin
data_pin = Pin(13, Pin.IN, Pin.PULL_UP)
sensor = dht.DHT22(data_pin)
# Buzzer Pin
buzzer_pin = Pin(12, Pin.OUT)
buzzer = PWM(buzzer_pin)
# RGB LED Pins
red_pin = Pin(2, Pin.OUT)
green_pin = Pin(1, Pin.OUT)
blue_pin = Pin(0, Pin.OUT)
# Display
WIDTH = 128
HEIGHT = 64
i2c = I2C(0, scl=Pin(17), sda=Pin(16), freq=200000)
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c)
CRITICAL_DISTANCE = 10
MAJOR_DISTANCE = 20
MINOR_DISTANCE = 30
def generate_random_distance():
return random.uniform(0, 100)
def ultra(test_mode=False):
if test_mode:
distance_cm = generate_random_distance()
else:
trigger.value(0)
time.sleep_us(5)
trigger.value(1)
time.sleep_us(TRIG_PULSE_DURATION_US)
trigger.value(0)
ultrason_duration = time_pulse_us(echo, 1, 30000)
distance_cm = SOUND_SPEED * ultrason_duration / 20000
print(f"Distance : {distance_cm} cm")
oled.fill_rect(0, 55, 128, 10, 0)
oled.text("{:.2f} cm".format(distance_cm), 4, 56)
oled.show()
if distance_cm < CRITICAL_DISTANCE:
print('critical buzzing')
buzzer.duty_u16(65535) # 100%
red_pin.value(1)
green_pin.value(0)
blue_pin.value(0)
elif distance_cm < MAJOR_DISTANCE:
print('major buzzing')
buzzer.duty_u16(49151) #~75%
red_pin.value(0)
green_pin.value(0)
blue_pin.value(1)
elif distance_cm < MINOR_DISTANCE:
print('minor buzzing')
buzzer.duty_u16(32768) # ~50%
red_pin.value(0)
green_pin.value(1)
blue_pin.value(0)
else:
red_pin.value(0)
green_pin.value(0)
blue_pin.value(0)
time.sleep_ms(500)
def read_DHT22sensor():
try:
sensor.measure()
temperature = sensor.temperature()
humidity = sensor.humidity()
print_dht22_data(temperature, humidity)
except OSError as e:
print("Error reading data from the sensor")
def print_dht22_data(temperature, humidity):
print("Temperature:{}, Humidity:{}".format(temperature, humidity))
oled.fill_rect(0, 0, 128, 55, 0)
oled.text("Temp.", 4, 8)
oled.text("Humid.", 4, 20)
oled.text(str(temperature), 65, 8)
oled.text(str(humidity), 65, 20)
oled.show()
while True:
ultra(test_mode=True)
count += 1
if count == 25:
read_DHT22sensor()
count = 0