Szekrény díszvilágítás gyerekszobába.
Ez volt a legelső projekt, amit ezzel a mikrovezérlővel terveztem megvalósítani. Eredetileg egy sima pi pico-t akartam volna berakni. Ám amikor többet rendeltem a wifi-s verzióból, kitaláltam, hogy lehessen wifi-n keresztül is vezérelni. Egy nagyon egyszerű, buta REST api-on keresztül. Aztán hozzácsaptam még egy dht11-es szenzort is, mert miért ne.
Magát az alap vezetékezést, LED vezérlést a wc lámpás projekt során sikerült nagyjából kikísérleteznem. 5V ugye megy a vsys-ről, kell egy tranzisztor, hogy ki- és be- lehessen kapcsolni a kört.
A szenzort már ismertem régebbről, amikor először játszottam raspberry pi 3-mal. Bekötéséről sok anyagot találni neten. Itt egy példa:
Én a GP16 PIN-t használtam bemenő adat csatlakozáshoz.
Kapott egy gombot is a GP15-höz. Ezzel lehet kapcsolni a lámpát manuálisan, illetve hosszan tartva (>3sec) vált 3 előre definiált szín között.
Ehhez a projekthez Micropython alapú firmware-t használtam.
A temp.py nevű fájlban a szenzor kezeléséhez, adatok kiolvasásához szükséges függvényeket definiáltam:from machine import Pin, I2C
import time
from dht import DHT11, InvalidChecksum
pin = Pin(16, Pin.OUT, Pin.PULL_DOWN)
def getMeasurement():
sensor = DHT11(pin)
try:
temp = sensor.temperature
humidity = sensor.humidity
return (temp, humidity)
except:
#print("couldn't read sensor data")
return (-273.15, 0.0)
def getTemp():
data = (-273.15, 0.0)
retry = 5
while retry > 0 and data[0] < -273 and data[1] < 1:
data = getMeasurement()
retry -1
time.sleep(1)
return data
def getTempText():
data = getTemp()
tempStr = "Temperature: {}".format(data[0])
humStr = "Humidity: {}".format(data[1])
return str(tempStr) + "\n" + str(humStr)
A main.py: a fő programkódot tartalmazza (lehetne még tovább rendezni a kódot, mert így egy kissé átláthatatlan):import netman
import urequests as requests
import uasyncio as asyncio
import temp
from machine import Pin
import ledControl
print(asyncio.__version__)
button = Pin(15, Pin.IN, Pin.PULL_DOWN)
tra0 = Pin(6, Pin.OUT)
country = 'HU'
ssid = ______
password = ********
def turnDownAll():
ledControl.turnOffGreen()
ledControl.turnOffBlue()
ledControl.turnOffRed()
def lightPurple():
ledControl.turnBluePercentage(25)
ledControl.turnRedPercentage(20)
def lightTeal():
ledControl.turnBluePercentage(30)
ledControl.turnGreenPercentage(20)
def orange():
ledControl.turnRedPercentage(65)
ledControl.turnGreenPercentage(30)
async def listenButton():
defaultOpts = [lightPurple, lightTeal, orange]
currentOption = 0
ledOpt = 0
while True:
button_state = button.value()
if button_state == 1:
currentOption = 1
opDelayCount = 50
while opDelayCount < 2000:
await asyncio.sleep_ms(50)
button_state = button.value()
opDelayCount = opDelayCount+50
if button_state == 1:
currentOption = 2
await asyncio.sleep_ms(200)
if currentOption == 1:
tra0.toggle()
await asyncio.sleep_ms(500)
if currentOption == 2:
turnDownAll()
await asyncio.sleep_ms(200)
defaultOpts[ledOpt]()
await asyncio.sleep_ms(500)
ledOpt = ledOpt+1
if ledOpt == 3:
ledOpt = 0
currentOption = 0
await asyncio.sleep_ms(50)
temperature = temp.getTempText()
temp_humidity = temp.getTemp()
wifi_connection = netman.connectWiFi(ssid,password,country)
async def getTempData():
json = """{temp: %s, humidity: %s}"""
temp_humidity = temp.getTemp()
data = json % temp_humidity
resp = b"HTTP/1.0 200 OK\r\nContent-type: application/json\r\n\r\n" + "{JSON}\r\n".format(JSON=data)
await asyncio.sleep_ms(50)
return resp
async def getOutputFormatted():
json = """%s"""
temperature = temp.getTempText()
data = json % temperature
resp = b"HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n" +\
"<html><head></head><body><h1>{JSON}</h1><p></p>".format(JSON=data) +\
"<p><a href='http://{IPADDR}/color/red'>Red</a></p>".format(IPADDR=wifi_connection[0]) +\
"<p><a href='http://{IPADDR}/color/green'>Green</a></p>".format(IPADDR=wifi_connection[0]) +\
"<p><a href='http://{IPADDR}/color/blue'>Blue</a></p>".format(IPADDR=wifi_connection[0]) +\
"</body></html>\r\n"
return resp
async def serve(reader, writer):
resp = await getOutputFormatted()
l = await reader.read(256)
path = l.decode().split("HTTP")[0].split("GET")[1].strip()
pathArray = path.split("/")
print(pathArray)
if (pathArray[1] == "gettemp"):
resp = await getTempData()
if (pathArray[1] == "switch"):
tra0.toggle()
if (pathArray[1] == "turnoffall"):
turnDownAll()
if (pathArray[1] == "color"):
if (pathArray[2] == "red"):
ledControl.toggleRed()
if (pathArray[2] == "green"):
ledControl.toggleGreen()
if (pathArray[2] == "blue"):
ledControl.toggleBlue()
if (pathArray[2] == "purple"):
turnDownAll()
lightPurple()
if (pathArray[2] == "teal"):
turnDownAll()
lightTeal()
if (pathArray[2] == "orange"):
turnDownAll()
orange()
if (pathArray[2] == "greenpow"):
ledpow = int(pathArray[3])
ledControl.turnGreenPercentage(ledpow)
if (pathArray[2] == "bluepow"):
ledpow = int(pathArray[3])
ledControl.turnBluePercentage(ledpow)
if (pathArray[2] == "redpow"):
ledpow = int(pathArray[3])
ledControl.turnRedPercentage(ledpow)
await asyncio.sleep_ms(50)
await writer.awrite(resp)
await asyncio.sleep(0.2)
await writer.wait_closed()
loop = asyncio.get_event_loop()
loop.create_task(asyncio.start_server(serve, "0.0.0.0", 80))
loop.create_task(listenButton())
try:
loop.run_forever()
except KeyboardInterrupt:
print("closing")
loop.close()
És így néz ki a ledControl.py:from machine import Pin, PWM
from time import sleep
redPWM = PWM(Pin(1))
greenPWM = PWM(Pin(7))
bluePWM = PWM(Pin(0))
bluePWM.freq(1000)
greenPWM.freq(1000)
redPWM.freq(1000)
def setLEDPercentage(percVal, ledPWM):
fullPWM = 65535
maxVal = int(fullPWM*(100-percVal)/100)
ledPWM.duty_u16(maxVal)
sleep(0.1)
def initLEDPWM(pinNum):
ledPWM = PWM(Pin(pinNum))
ledPWM.freq(1000)
return ledPWM
def turnGreenPercentage(percVal):
greenPWM = initLEDPWM(7)
setLEDPercentage(percVal, greenPWM)
def turnRedPercentage(percVal):
redPWM = initLEDPWM(1)
setLEDPercentage(percVal, redPWM)
def turnBluePercentage(percVal):
bluePWM = initLEDPWM(0)
setLEDPercentage(percVal, bluePWM)
def toggleGreen():
green = Pin(7, Pin.OUT)
print("toggle green")
sleep(0.5)
green.toggle()
def toggleBlue():
blue = Pin(0, Pin.OUT)
print("toggle blue")
sleep(0.5)
blue.toggle()
def toggleRed():
red = Pin(1, Pin.OUT)
print("toggle red")
sleep(0.5)
red.toggle()
def turnOffGreen():
greenPWM = initLEDPWM(7)
greenPWM.duty_u16(65535)
def turnOffBlue():
bluePWM = initLEDPWM(0)
bluePWM.duty_u16(65535)
def turnOffRed():
redPWM = initLEDPWM(1)
redPWM.duty_u16(65535)
Aztán rendeltem szenzorhoz való dobozt. Pont belefért minden, aminek kell!
Később a LED szalag csatlakozását lecseréltem, mert a forrasztásmentes összenyomós kapocs eléggé megbízhatatlannak bizonyult. Inkább jumper tüskéket és "anyákat" forrasztottam, amivel lehet szétszedni egyszerűen, ha valamit javítani kell. A piros szigszalagokat leváltotta pár zsugorcső.
A vezetékeket még el kell rejteni. A kódot is át fogom még írni, hogy az eszköz feliratkozzon a szerveren, amikor csatlakozik a hálózathoz és készen áll. Illetve még egy kliens programot is írni fogok a kezeléséhez.