Raspberry pi pico projekt #0

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.

Hirdetés

3 pénzügyi döntés, amit minden kisvállalkozónak érdemes átgondolnia az év végéig

PR Ahogy az év vége közeledik, itt az ideje, hogy egy pillanatra megálljunk és áttekintsük vállalkozásunk pénzügyi helyzetét. Ne hagyjuk, hogy az év utolsó hónapjai elússzanak a sürgető feladatok és elfeledett határidők között!

Tovább a fórumba.