2024. április 27., szombat

Gyorskeresés

Raspberry pi pico projekt #0

Írta: | Kulcsszavak: pi pico . DIY . LED strip

[ ÚJ BEJEGYZÉS ]

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.

Hozzászólások

(#1) saja


saja
tag

Itt egy video a működésről is.

Pár hónappal ezelőtt készült a felvétel, azóta kijavítottam a 'zöld' vonal érintkezési hibáját.

keep calm and code erlang

További hozzászólások megtekintése...
Copyright © 2000-2024 PROHARDVER Informatikai Kft.