Innholdsfortegnelse:

Bringebær PI LED værstasjon: 8 trinn
Bringebær PI LED værstasjon: 8 trinn

Video: Bringebær PI LED værstasjon: 8 trinn

Video: Bringebær PI LED værstasjon: 8 trinn
Video: RED RASPBERRY.... #shorts #youtubeshorts 2024, Juli
Anonim
Bringebær PI LED værstasjon
Bringebær PI LED værstasjon

Vi opprettet en Raspberry PI Weather LED -stasjon. Den forteller brukeren hvor varm og kald en by er ved å lyse opp og dimme lysdioder. Det har også en ledelse til å fortelle dem om det regner i byen eller ikke.

Skapt av Michael Andrews og Tio Marello.

Rekvisita

Verktøy

  1. Loddejern
  2. Dremel
  3. Sag

Materialer

  1. Bringebær Pi 3 B+ ~ 40 dollar ~ 30 dollar
  2. Kvinne til mann Jumper ledninger ~ 7 dollar
  3. 3 blå og 2 røde LED -dioder ~ 11 dollar
  4. 100 Ohm motstander ~ 13 dollar
  5. 4 x 4 x 1/4 treplank ~ 5 dollar
  6. Lodde ~ 10 dollar
  7. Kobbertråd ~ 5 dollar

Trinn 1: Koding som problemløsning

Koding er problemløsning

Så, i vårt prosjekt, hva er problemet vårt? Problemet vårt er å få værdata og deretter bruke disse dataene til å fortelle lysdiodene våre om de er av eller på. Så dette deler opp problemet vårt i tre områder.

1. Få værdata

2. Bruke disse dataene

3. Bruke lysdioder

Men språket vi brukte for dette prosjektet, Python, og maskinvaren det kjører på, Python, gir oss en enkel måte å nå disse målene på.

Så, la oss starte med det første problemet, å få værdata.

Trinn 2: Koding: Få værdata

Python i seg selv kan ikke få værdata. Vi må importere to verktøy, samt en ekstern tjeneste, for å få værdata. For å gjøre dette bruker vi tre verktøy.

1. Forespørsler, en python -modul som tillater webscraping

2. Json, en python -modul som lar oss bruke JSON -filformatet

3. OpenWeather, et nettsted som kan gi oss værdata

Så vi bringer de to modulene ved å skrive denne koden øverst i python -skriptet vårt.

importforespørsler

importer json

Før vi bruker disse verktøyene, må vi imidlertid bruke Openweather. For det må vi opprette en konto på nettstedet deres og få en API -nøkkel. Følg instruksjonene på nettstedet deres, så får du en rekke bokstaver og tall som lar oss bruke tjenesten deres. Hvordan?

openweather_api_key = "260a23f27f5324ef2ae763c779c32d7e" #Vår API -nøkkel (ikke ekte)

base_call = "https://api.openweathermap.org/data/2.5/weather?q=" #OpenWeather Call #Her får vi brukerens by i form av tekstutskrift ("Skriv inn en by!") city_name = input () #Her samlet vi adressen vi skal koble til requests.get for å motta værdata full_call = base_call+city_name+"& appid ="+openweather_api_key #Til slutt kaller vi request.get med adressen vår, så konverterer vi den til en json -fil Response = requests.get (full_call) WeatherData = Response.json () #JSON -filer inneholder forskjellige variabler som vi kan få tilgang til ved hjelp av denne syntaksen #Her får vi vær -ID og temperaturen i Kelvin i byen som brukeren skrev inn WeatherID = WeatherData ["weather"] [0] ["id"] City_TemperatureK = WeatherData ["main"] ["temp"]

Her har vi koden som gir oss værdataene våre. Forespørsler, i form av requests.get, tar inn en nettstedsadresse og gir oss en fil fra dette nettstedet tilbake. OpenWeather gir oss en adresse å ringe for å gi oss værdata i form av en json. Vi samler en adresse som vi kobler til forespørsler og får en json -fil tilbake. Deretter oppretter vi to variabler og tildeler dem temperaturen og værværet i brukerens by.

Så nå, med denne koden, har vi to variabler. Vi har et weatherID og en temperatur i Kelvin

Trinn 3: Koding: Bruk av disse dataene

Nå som vi har disse to variablene, må vi forberede dem til bruk for våre lysdioder. For dette aspektet trenger vi ikke å importere noen moduler for dette.

Først konverterer vi kelvin til Fahrenheit.

Vi gjør dette ved å lage en variabel med denne syntaksen

City_TemperatureF = (City_TemperatureK - 273)*1.8 + 32

som konverterer fra Kelvin til Fahrenheit (som virkelig konverterer fra K -> C -> F)

Neste er vårt weatherID. WeatherID er en ID som Openweather gir som forteller oss om værforholdene i en by.

openweathermap.org/weather-conditions Her er en liste over dem.

Vi la merke til at alt under 700 -tallet var en slags nedbør, så vi sjekket bare om koden var under 700 for å se om det regnet.

def CheckRain (IdCode): hvis IdCode <700: return True true: return False

Med det har vi våre to variabler forberedt til bruk med våre Raspberry PI -pinner og LED -dioder.

Trinn 4: Koding: Bruke RPi. GPIO og LED -dioder

Koding: Bruk av RPi. GPIO og LED -dioder
Koding: Bruk av RPi. GPIO og LED -dioder

RaspberryPi kommer med et sett med mannlige pins som vi kan bruke til å kommunisere med en rekke elektriske komponenter, som i dette tilfellet er LED -dioder; Det er beslektet med Arduino og systemet. Imidlertid er Raspberry PI en datamaskin for generelle formål, i motsetning til en mikrokontroller som Arduino. Så vi må gjøre litt mer arbeid for å bruke dem. Dette består av å sette opp pinnene på Raspberry Pi. Vi gjør dette ved å bruke denne koden.

importer RPi. GPIO som GPIO #Vi importerer modulen slik at vi kan bruke den

#Sett opp pinsGPIO.setmode (GPIO. BCM) GPIO.setwarnings (False)

#Pinnene lysdiodene er koblet til. Disse kan være forskjellige hvis du bygger det, så sørg for å sammenligne og endre når det er nødvendig

Extreme_Hot_LED_PIN = 26 Hot_LED_PIN = 16

Extreme_Cold_LED_PIN = 5

Cold_LED_PIN = 6

Rain_LED_PIN = 23

#Vi går gjennom hver pin, ved hjelp av.setup -kommandoen, legger inn nummeret og setter det som en output -pin

GPIO.setup (Rain_LED_PIN, GPIO. OUT) GPIO.setup (Extreme_Cold_LED_PIN, GPIO. OUT) GPIO.setup (Cold_LED_PIN, GPIO. OUT) GPIO.setup (Hot_LED_PIN, GPIO. OUT) GPIO.setup (Extreme_Hot_L_

Imidlertid ville denne koden bare la oss bruke to tilstander med led, det vil si av og på. Vi trenger det imidlertid for å kunne dempe lysene. For å gjøre dette bruker vi Pulse Width Modulation.

Bruke pulsbreddemodulasjon

Pulse Width Modulation lar oss sende ut et analogt signal ved hjelp av en digital pin. I hovedsak slår den på og av signalkilden med høy hastighet, som gjennomsnitt til en viss spenning. RPi. GPIO lar oss bruke dette, om enn med litt ekstra kode.

#Vi lager fire pinneobjekter ved å bruke kommandoen GPIO. PWM, som tar inn et kanalnummer

#Det andre tallet er antall ganger det oppdateres per sekund

ExtremeHotLED = GPIO. PWM (Extreme_Hot_LED_PIN, 100) HotLED = GPIO. PWM (Hot_LED_PIN, 100)

ExtremeColdLED = GPIO. PWM (Extreme_Cold_LED_PIN, 100)

ColdLED = GPIO. PWM (Cold_LED_PIN, 100)

For det neste trinnet må du vite hvordan vi oppdaterer disse pinnene.

Vi oppdaterer pinnene ved hjelp av kommandoen

ExtremeColdLED.start (x) ColdLED.start (x)

ExtremeHotLED.start (x)

HotLED.start (x)

x i dette tilfellet vil være driftssyklusen, som bestemmer hvor mye den pulserer av. Det varierer fra 0-100, så vi må basere vår neste kode på det faktum.

Trinn 5: Koding: Få LED -lysstyrke

Koding: Få LED -lysstyrke
Koding: Få LED -lysstyrke

Fordi vi har fire forskjellige lysdioder, ønsker vi å tenne dem avhengig av hvordan. kaldt eller varmt er det i brukerens by. Vi bestemte oss for å ha fire etapper for ledet.

#Funksjoner

def getmiddleleftledintensity (TemperatureinF): #Left Equation: y = -(50/20) x + 175 #Right Equation: y = (50/20) x -75 return -(50/20)*TemperatureinF + 175

def getmiddlerightledintensity (TemperatureinF):

#Venstre ligning: y = - (50/20) x + 175 #Høyre ligning: y = (50/20) x - 75 retur (50/20)*Temperatur iF - 75

def getextremeleftledintensity (TemperatureinF):

#LeftEquation: y = - (100/30) x + 200 #RightEquation: y = (100/30) x - (400/3)

retur -(100/30)*Temperatur iF + 200

def getextremerightledintensity (TemperatureinF):

# Venstre -ligning: y = - (100/30) x + 200 # Høyre -ligning: y = (100/30) x - (400/3)

retur (100/30)*Temperatur iF - (400/3)

#Stille inn LED -lysene

def GetLEDBrightness (temp):

hvis temp <= 0: extremcoldled = 100 coldled = 100 hotled = 0 extremehotled = 0

print ("Extreme cold led:" + str (extremecoldled))

print ("Cold led:" + str (coldled)) print ("Extreme hot led" + str (extremehotled)) print ("Hot led:" + str (hotled))

ExtremeColdLED.start (extremecoldled)

ColdLED.start (coldled)

ExtremeHotLED.start (extremehotled)

HotLED.start (hotled) elif temp> = 100: extremecoldled = 0 coldled = 0 hotled = 100 extremehotled = 100

print ("Extreme cold led:" + str (extremecoldled))

print ("Cold led:" + str (coldled)) print ("Extreme hot led" + str (extremehotled)) print ("Hot led:" + str (hotled))

ExtremeColdLED.start (extremecoldled)

ColdLED.start (coldled)

ExtremeHotLED.start (extremehotled)

HotLED.start (hotled) elif 0 <temp <= 30: extremecoldled = getextremeleftledintensity (temp) - 100 coldled = 100 hotled = 0 extremehotled = 0

print ("Extreme cold led:" + str (extremecoldled))

print ("Cold led:" + str (coldled)) print ("Extreme hot led" + str (extremehotled)) print ("Hot led:" + str (hotled))

ExtremeColdLED.start (extremecoldled)

ColdLED.start (coldled)

ExtremeHotLED.start (extremehotled)

HotLED.start (hotled) elif 100> temp> = 70: extremecoldled = 0 coldled = 0 hotled = 100 extremehotled = getextremerightledintensity (temp) - 100

print ("Extreme cold led:" + str (extremecoldled))

print ("Cold led:" + str (coldled)) print ("Extreme hot led" + str (extremehotled)) print ("Hot led:" + str (hotled))

ExtremeColdLED.start (extremecoldled)

ColdLED.start (coldled)

ExtremeHotLED.start (extremehotled)

HotLED.start (hotled) elif 30 <temp <50: extremecoldled = 0 coldled = getmiddleleftledintensity (temp) hotled = 100 - coldled extremehotled = 0

print ("Extreme cold led:" + str (extremecoldled))

print ("Cold led:" + str (coldled)) print ("Extreme hot led" + str (extremehotled)) print ("Hot led:" + str (hotled))

ExtremeColdLED.start (extremecoldled)

ColdLED.start (coldled)

ExtremeHotLED.start (extremehotled)

HotLED.start (hotled) elif 50 <temp <70: hotled = getmiddlerightledintensity (temp) extremehotled = 0

coldled = 100 - hotled

ekstrem kaldt = 0

print ("Extreme cold led:" + str (extremecoldled))

print ("Cold led:" + str (coldled)) print ("Extreme hot led" + str (extremehotled)) print ("Hot led:" + str (hotled))

ExtremeColdLED.start (extremecoldled)

ColdLED.start (coldled)

ExtremeHotLED.start (extremehotled)

HotLED.start (hotled) elif temp == 50: extremecoldled = 0 coldled = 50 hotled = 50 extremehotled = 0

print ("Extreme cold led:" + str (extremecoldled))

print ("Cold led:" + str (coldled)) print ("Extreme hot led" + str (extremehotled)) print ("Hot led:" + str (hotled))

ExtremeColdLED.start (extremecoldled)

ColdLED.start (coldled)

ExtremeHotLED.start (extremehotled)

HotLED.start (hotled)

OK, denne delen av koden er veldig lang. Det er også ganske vanskelig å forklare. I hovedsak ser koden ovenfor på temperaturen i Fahrenheit, og avgjør om den er i et sett med områder. Avhengig av områdene, gir den et tall for hver lysdiode og dens lysstyrke og deretter angir lysstyrken ved å ringe kommandoen start (). Det er den raske forklaringen. Hvis det er tilstrekkelig, anbefaler jeg at du går videre til neste trinn, men hvis du vil se den lange og kjedelige forklaringen, fortsett å lese.

Da vi programmerte bestemte vi oss for at den enkleste måten å få en verdi fra en temperatur var i form av en matematisk funksjon. Så vi lagde en graf i GeoGebra for å representere forholdet mellom temperaturen vår og lysstyrken på ledningen; grunnen til at den går over 100 er at den ekstra vil gå inn i den andre ledningen. Vi løp imidlertid inn i spørsmålet om å få en enkelt funksjon til å kartlegge alle disse punktene til en enkelt funksjon. Vi trodde vi kunne bruke en parabel, men vi bestemte oss for å bare nøye oss med å bruke en rekke if -utsagn. I hovedsak er hele denne koden en stykkevis funksjon.

Funksjonene øverst er den respektive linjelegningen. Når vi har bestemt hvor temperaturen er på grafen, kjører vi den gjennom den funksjonen, får lysstyrken og sender den videre til lysdiodene.

Trinn 6: Koding: siste trinn

Til slutt legger vi til denne uttalelsen på slutten.

prøve:

while (True): GetLEDBrightness (City_TemperatureF) GetRainLED (WeatherID) time.sleep (10) unntatt KeyboardInterrupt: avslutt ()

Prøv -og -unntak -utsagnene lar oss avslutte koden ved å bruke en hurtigtast; Uansett måtte vi slå av Raspberry Pi for å starte koden på nytt. Så har vi en stund -sløyfe som går for alltid. Vi oppdaterer lysdiodene, samt oppdaterer regn -LED. Vi stopper i ti sekunder; OpenWeather tillater bare 60 anrop for data per minutt, og 10 sekunder er mange oppdateringer.

Og med det er koden vår ferdig. Nedenfor er den ferdige koden.

RaspberryPIWeatherStation.py

importforespørsler
importRPi. GPIOasGPIO
importjson
importtid
#Oppevær -idKoder mindre enn 700 er alt nedbør
defCheckRain (IdCode):
ifIdCode <700:
returnTrue
ellers:
returner falsk
defgetmiddleleftledintensity (TemperatureinF):
#Venstre ligning: y =-(50/20) x + 175
#Høyre ligning: y = (50/20) x - 75
retur- (50/20)*Temperatur iF+175
defgetmiddlerightledintensity (TemperatureinF):
#Venstre ligning: y =-(50/20) x + 175
#Høyre ligning: y = (50/20) x - 75
retur (50/20)*Temperatur i F-75
defgetextremeleftledintensity (TemperatureinF):
#LeftEquation: y = -(100/30) x + 200
#RettEquation: y = (100/30) x - (400/3)
retur- (100/30)*Temperatur i F+200
defgetextremerightledintensity (TemperatureinF):
# VenstreLigning: y = -(100/30) x + 200
# RightEquation: y = (100/30) x - (400/3)
retur (100/30)*Temperatur iF- (400/3)
#GPIO -oppsett
GPIO.setmode (GPIO. BCM)
GPIO.setwarnings (False)
#Nål
Extreme_Hot_LED_PIN = 26
Hot_LED_PIN = 16
Extreme_Cold_LED_PIN = 5
Cold_LED_PIN = 6
Rain_LED_PIN = 23
#Pin Setup
GPIO.setup (Rain_LED_PIN, GPIO. OUT)
GPIO.setup (Extreme_Cold_LED_PIN, GPIO. OUT)
GPIO.setup (Cold_LED_PIN, GPIO. OUT)
GPIO.setup (Hot_LED_PIN, GPIO. OUT)
GPIO.setup (Extreme_Hot_LED_PIN, GPIO. OUT)
ExtremeHotLED = GPIO. PWM (Extreme_Hot_LED_PIN, 100)
HotLED = GPIO. PWM (Hot_LED_PIN, 100)
ExtremeColdLED = GPIO. PWM (Extreme_Cold_LED_PIN, 100)
ColdLED = GPIO. PWM (Cold_LED_PIN, 100)
defGetLEDBrightness (temp):
iftemp <= 0:
ekstrem kaldt = 100
kaldt = 100
hotled = 0
extremehotled = 0
print ("Extreme cold led:"+str (extremecoldled))
print ("Cold led:"+str (coldled))
print ("Extreme hot led"+str (extremehotled))
print ("Hot led:"+str (hotled))
ExtremeColdLED.start (extremecoldled)
ColdLED.start (coldled)
ExtremeHotLED.start (extremehotled)
HotLED.start (hotled)
eliftemp> = 100:
ekstrem kaldt = 0
kaldt = 0
hotled = 100
extremehotled = 100
print ("Extreme cold led:"+str (extremecoldled))
print ("Cold led:"+str (coldled))
print ("Extreme hot led"+str (extremehotled))
print ("Hot led:"+str (hotled))
ExtremeColdLED.start (extremecoldled)
ColdLED.start (coldled)
ExtremeHotLED.start (extremehotled)
HotLED.start (hotled)
elif0 <temp <= 30:
extremecoldled = getextremeleftledintensity (temp) -100
kaldt = 100
hotled = 0
extremehotled = 0
print ("Extreme cold led:"+str (extremecoldled))
print ("Cold led:"+str (coldled))
print ("Extreme hot led"+str (extremehotled))
print ("Hot led:"+str (hotled))
ExtremeColdLED.start (extremecoldled)
ColdLED.start (coldled)
ExtremeHotLED.start (extremehotled)
HotLED.start (hotled)
elif100> temp> = 70:
ekstrem kaldt = 0
kaldt = 0
hotled = 100
extremehotled = getextremerightledintensity (temp) -100
print ("Extreme cold led:"+str (extremecoldled))
print ("Cold led:"+str (coldled))
print ("Extreme hot led"+str (extremehotled))
print ("Hot led:"+str (hotled))
ExtremeColdLED.start (extremecoldled)
ColdLED.start (coldled)
ExtremeHotLED.start (extremehotled)
HotLED.start (hotled)
elif30 <temp <50:
ekstrem kaldt = 0
coldled = getmiddleleftledintensity (temp)
hotled = 100-coldled
extremehotled = 0
print ("Extreme cold led:"+str (extremecoldled))
print ("Cold led:"+str (coldled))
print ("Extreme hot led"+str (extremehotled))
print ("Hot led:"+str (hotled))
ExtremeColdLED.start (extremecoldled)
ColdLED.start (coldled)
ExtremeHotLED.start (extremehotled)
HotLED.start (hotled)
elif50 <temp <70:
hotled = getmiddlerightledintensity (temp)
extremehotled = 0
coldled = 100-hotled
ekstrem kaldt = 0
print ("Extreme cold led:"+str (extremecoldled))
print ("Cold led:"+str (coldled))
print ("Extreme hot led"+str (extremehotled))
print ("Hot led:"+str (hotled))
ExtremeColdLED.start (extremecoldled)
ColdLED.start (coldled)
ExtremeHotLED.start (extremehotled)
HotLED.start (hotled)
eliftemp == 50:
ekstrem kaldt = 0
kaldt = 50
hotled = 50
extremehotled = 0
print ("Extreme cold led:"+str (extremecoldled))
print ("Cold led:"+str (coldled))
print ("Extreme hot led"+str (extremehotled))
print ("Hot led:"+str (hotled))
ExtremeColdLED.start (extremecoldled)
ColdLED.start (coldled)
ExtremeHotLED.start (extremehotled)
HotLED.start (hotled)
defGetRainLED (idCode):
ifCheckRain (idCode):
GPIO.output (Rain_LED_PIN, GPIO. HIGH)
ellers:
GPIO.output (Rain_LED_PIN, GPIO. LOW)
#Api -informasjon: Repaliser API -nøkkelen med oepnweather api -nøkkelen din
openweather_api_key = "460a23f27ff324ef9ae743c7e9c32d7e"
base_call = "https://api.openweathermap.org/data/2.5/weather?q="
print ("Skriv inn en by!")
bynavn = input ()
full_call = base_call+city_name+"& appid ="+openweather_api_key
#Får værdata
Response = requests.get (full_call)
WeatherData = Response.json ()
WeatherID = WeatherData ["weather"] [0] ["id"]
City_TemperatureK = WeatherData ["main"] ["temp"]
City_TemperatureF = (City_TemperatureK-273)*1.8+32#Konverter til Fahrenheit
#LED/GPIO -ting
print ("K:"+str (City_TemperatureK))
print ("F:"+str (City_TemperatureF))
print (WeatherID)
prøve:
mens (True):
GetLEDBrightness (City_TemperatureF)
GetRainLED (WeatherID)
tid. sover (10)
unntatt tastaturavbrudd:
slutte()

se rawRaspberryPIWeatherStation.py hostet av ❤ av GitHub

Trinn 7: Bygging og tilkobling

Puh! Etter all den kodingen kommer vi til bygningen, som er betydelig lettere. På grunn av corona -hjemmebestillinger, kunne vi ikke få tak i mange av verktøyene vi forventet å ha på skolen. Så denne delen er litt enklere enn det vi hadde tenkt. Spesifikasjonene i seg selv er også fleksible. Først tegnet vi et rektangel på en treplank. Den spesifikke størrelsen spiller egentlig ikke så stor rolle, da den ganske enkelt fungerer som en plattform for å sette lysdioder og elektronikk på.

Deretter boret vi fem 1/8 i hull i treverket vårt.

Vi kuttet deretter ut rektangelet fra planken for å bruke som plattform for elektronikken vår.

(Dette var da vi begynte; vi fant en større sag!)

Vi skyver deretter anode- og katodepinnene på ledningen inn i hullene; lysdiodene skal ligge på toppen, pærene stikker ut; holde oversikt over hvilket ben som er lengre og kortere. Vi begynte deretter å lodde sammen ledninger. Først lodder vi motstandene til LED -anodebenet (det lengre beinet).

Deretter lodder vi katodebenene til lysdiodene til en enkelt kobbertråd som vi skal bruke som jord. Det skal se slik ut.

Etter at vi har gjort det, lodder vi hannendene på hun-mannlige jumperkabler til endene på hver motstand og kobberjordledningen. Når vi har gjort det, kan vi begynne å koble ledningene til bringebær PI GPIO -pinnene. Her er et diagram! Vær imidlertid oppmerksom på at pinnene er de i den tidligere berørte koden.

Når du har gjort det, er alt du trenger å gjøre å få Python -filen til bringebær Pi og åpne terminalen. kjør "python3 RaspberryPIWeatherStation.py" og gjør deretter som det viser.

Trinn 8: Demonstrasjon og konklusjon

Takk for at du leser hele veien! Jeg legger ved python -skriptet nedenfor! Hvis det var ting vi kunne legge til, ville det sannsynligvis vært …

1. Støtte for forskjellige inngangstyper (byer, geografiske punkter, etc.)

2. Støtte for mer værinformasjon

3. Legg til en liten skjerm for å vise informasjon

Gi oss beskjed om tankene dine! Dette var et morsomt prosjekt å bygge. Vi lærte mye om forespørsler og å få internettdokumenter ved hjelp av python, og vi lærte også mye om bruk av lodding.

Anbefalt: