import time
import board
import analogio
import digitalio
import pwmio
import busio
import adafruit_ds18x20
from adafruit_motor import servo
from adafruit_onewire.bus import OneWireBus
from lcd.lcd import LCD
from lcd.i2c_pcf8574_interface import I2CPCF8574Interface
# ==================================================
# RGB LED
# YOUR RGB = COMMON CATHODE
#
# COMMON PIN ---> GND
#
# True = ON
# False = OFF
# ==================================================
ledR = digitalio.DigitalInOut(board.GP10)
ledG = digitalio.DigitalInOut(board.GP11)
ledB = digitalio.DigitalInOut(board.GP12)
ledR.direction = digitalio.Direction.OUTPUT
ledG.direction = digitalio.Direction.OUTPUT
ledB.direction = digitalio.Direction.OUTPUT
# ==================================================
# PUSH BUTTON
#
# GP15 ---> BUTTON ---> GND
# ==================================================
button = digitalio.DigitalInOut(board.GP15)
button.direction = digitalio.Direction.INPUT
button.pull = digitalio.Pull.UP
# ==================================================
# LDR SENSOR
# GP26
#
# ==================================================
ldr = analogio.AnalogIn(board.GP26)
R = 10000
# ==================================================
# POTENTIOMETER
#
# LEFT ---> GND
# MIDDLE ---> GP27
# RIGHT ---> 3.3V
# ==================================================
pot = analogio.AnalogIn(board.GP27)
# ==================================================
# LCD I2C
#
# SDA ---> GP0
# SCL ---> GP1
# ==================================================
i2c = busio.I2C(scl=board.GP1, sda=board.GP0)
lcd = LCD(
I2CPCF8574Interface(i2c, 0x27),
num_rows=2,
num_cols=16
)
# ==================================================
# DS18B20 TEMPERATURE SENSOR
#
# DATA (AO) ---> GP16
# VCC - 3.3
# IMPORTANT:
# 10k resistor between 3.3V and DATA
# ==================================================
ow_bus = OneWireBus(board.GP16)
devices = ow_bus.scan()
ds18 = adafruit_ds18x20.DS18X20(
ow_bus,
devices[0]
)
# ==================================================
# SERVO MOTOR
#
# SIGNAL ---> GP17
#
# Servo VCC ---> VBUS (5V)
# Servo GND ---> GND
# ==================================================
pwm = pwmio.PWMOut(
board.GP17,
duty_cycle=2 ** 15,
frequency=50
)
my_servo = servo.Servo(pwm)
# ==================================================
# MODE
#
# 0 = AUTO
# 1 = MANUAL
# ==================================================
mode = 0
last_button = True
# ==================================================
# RGB FUNCTIONS
# COMMON CATHODE VERSION
# ==================================================
def clearRGB():
ledR.value = False
ledG.value = False
ledB.value = False
# MAGENTA = RED + BLUE
def magenta():
clearRGB()
ledR.value = True
ledB.value = True
# CYAN = GREEN + BLUE
def cyan():
clearRGB()
ledG.value = True
ledB.value = True
# RED ONLY
def red():
clearRGB()
ledR.value = True
# ==================================================
# VOLTAGE FUNCTION
# ==================================================
def get_voltage(raw):
return (raw * 3.3) / 65536
# ==================================================
# LUX FUNCTION
# ==================================================
def rtolux(rawval):
vout = get_voltage(rawval)
RLDR = (R * (3.3 - vout)) / vout
lux = 4000 / (RLDR / 10000)
return lux
# ==================================================
# AVERAGE LUX FUNCTION
# MAKE SENSOR MORE STABLE
# ==================================================
def average_lux():
total = 0
for i in range(10):
raw = ldr.value
lux = rtolux(raw)
total += lux
time.sleep(0.05)
average = total / 10
return average
# ==================================================
# MAIN LOOP
# ==================================================
while True:
# ==============================================
# BUTTON TOGGLE
# AUTO <--> MANUAL
# ==============================================
current_button = button.value
if last_button == True and current_button == False:
mode = not mode
print("MODE CHANGED")
time.sleep(0.5)
last_button = current_button
# ==============================================
# READ LDR
# ==============================================
raw = ldr.value
volts = get_voltage(raw)
luxval = average_lux()
# ==============================================
# READ TEMPERATURE
# ==============================================
temp = ds18.temperature
# ==============================================
# AUTO MODE
# ==============================================
if mode == 0:
mode_text = "AUTO"
# ==========================================
# RGB CONTROL BY LDR
# ==========================================
# BELOW 100 = MAGENTA
if luxval < 100:
magenta()
color_text = "MAGENTA"
# 100 TO 500 = CYAN
elif luxval <= 500:
cyan()
color_text = "CYAN"
# ABOVE 500 = RED
else:
red()
color_text = "RED"
# ==========================================
# SERVO CONTROL BY TEMPERATURE
# ==========================================
if temp >= 32:
my_servo.angle = 90
else:
my_servo.angle = 0
# ==============================================
# MANUAL MODE
# ==============================================
else:
mode_text = "MANUAL"
# ==========================================
# POTENTIOMETER CONTROL SERVO
# ==========================================
pot_value = pot.value
angle = (pot_value / 65535) * 180
my_servo.angle = angle
# MANUAL RGB INDICATOR
red()
color_text = "MANUAL"
# ==============================================
# SERIAL MONITOR
# ==============================================
print("raw = {:5d} volts = {:.2f} light = {:.2f}".format(
raw,
volts,
luxval
))
print("Temperature = {:.2f} C".format(temp))
print("MODE =", mode_text)
print("========================")
# ==============================================
# LCD DISPLAY
# ==============================================
lcd.clear()
lcd.print("MODE:" + mode_text)
lcd.set_cursor_pos(1, 0)
lcd.print("TEMP:{:.1f}C".format(temp))
time.sleep(0.75)