Indholdsfortegnelse:

Hindbær PI LED vejrstation: 8 trin
Hindbær PI LED vejrstation: 8 trin

Video: Hindbær PI LED vejrstation: 8 trin

Video: Hindbær PI LED vejrstation: 8 trin
Video: Земляника из семян 🔴 Посев ремонтантной земляники на рассаду 🔴 Сорта земляники Рюген и Фреска F1 2024, Juli
Anonim
Hindbær PI LED vejrstation
Hindbær PI LED vejrstation

Vi skabte en Raspberry PI Weather LED Station. Det fortæller brugeren, hvor varm og kold en by er ved at oplyse og dæmpe lysdioder. Det har også ført til at fortælle dem, om det regner i byen eller ikke.

Skabt af Michael Andrews og Tio Marello.

Forbrugsvarer

Værktøjer

  1. Loddekolbe
  2. Dremel
  3. Sav

Materialer

  1. Hindbær Pi 3 B+ ~ 40 Dollars ~ 30 Dollars
  2. Kvinde til mand Jumper ledninger ~ 7 Dollars
  3. 3 blå og 2 røde LED -dioder ~ 11 dollars
  4. 100 Ohm modstande ~ 13 Dollars
  5. 4 x 4 x 1/4 træplank ~ 5 dollar
  6. Lodde ~ 10 Dollars
  7. Kobbertråd ~ 5 Dollars

Trin 1: Kodning som problemløsning

Kodning er problemløsning

Så hvad er vores problem i vores projekt? Vores problem er at få vejrdata og derefter bruge disse data til at fortælle vores lysdioder, om de er slukket eller tændt. Så dette opdeler vores problem i tre områder.

1. Få vejrdata

2. Brug af disse data

3. Brug af lysdioder

Men det sprog, vi brugte til dette projekt, Python, og den hardware, det kører på, Python, giver os en nem måde at nå disse mål på.

Så lad os starte med det første problem med at hente vejrdata.

Trin 2: Kodning: Få vejrdata

Python i sig selv kan ikke få vejrdata. Vi skal importere to værktøjer samt en ekstern service for at få vejrdata. For at gøre dette bruger vi tre værktøjer.

1. Anmodninger, et python -modul, der tillader webscraping

2. Json, et python -modul, som giver os mulighed for at bruge JSON -filformatet

3. OpenWeather, et websted, der kan give os vejrdata

Så vi bringer de to moduler ved at skrive denne kode øverst i vores python -script.

importanmodninger

import json

Inden vi bruger disse værktøjer, skal vi dog bruge Openweather. Til det skal vi oprette en konto på deres websted og få en API -nøgle. Følg instruktionerne på deres websted, og du får en række bogstaver og tal, der lader os bruge deres service. Hvordan?

openweather_api_key = "260a23f27f5324ef2ae763c779c32d7e" #Vores API -nøgle (ikke rigtig)

base_call = "https://api.openweathermap.org/data/2.5/weather?q=" #OpenWeather Call #Her får vi brugerens by i form af tekstudskrivning ("Indtast en by!") city_name = input () #Her samlede vi den adresse, vi vil tilslutte requests.get for at modtage vejrdata full_call = base_call+city_name+"& appid ="+openweather_api_key #Endelig kalder vi requests.get med vores adresse, så konverterer vi dem til en json -fil Response = requests.get (full_call) WeatherData = Response.json () #JSON -filer indeholder forskellige variabler, som vi kan få adgang til ved hjælp af denne syntaks #Her får vi vejr -id og temperaturen i Kelvin i byen, som brugeren skrev i WeatherID = WeatherData ["weather"] [0] ["id"] City_TemperatureK = WeatherData ["main"] ["temp"]

Her har vi koden, der giver os vores vejrdata. Anmodninger, i form af requests.get, indtager en webstedsadresse og giver os en fil fra dette websted tilbage. OpenWeather giver os en adresse at ringe til for at give os vejrdata i form af en json. Vi samler en adresse, som vi tilslutter anmodninger og får en json -fil tilbage. Derefter opretter vi to variabler og tildeler dem temperaturen og vejret i brugerens by.

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

Trin 3: Kodning: Brug af disse data

Nu hvor vi har disse to variabler, skal vi forberede dem til brug til vores LED'er. For dette aspekt behøver vi ikke importere moduler til dette.

Først konverterer vi kelvin til Fahrenheit.

Vi gør dette ved at oprette en variabel med denne syntaks

City_TemperatureF = (City_TemperatureK - 273)*1,8 + 32

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

Næste er vores weatherID. WeatherID er et ID, som Openweather giver, som fortæller os om vejrforholdene i en by.

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

Vi lagde mærke til, at alt under 700 -tallet var en slags nedbør, så vi tjekkede bare, om koden var under 700 for at se, om det regnede.

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

Med det har vi vores to variabler klar til brug med vores Raspberry PI -ben og LED -dioder.

Trin 4: Kodning: Brug af RPi. GPIO og LED -dioder

Kodning: Brug af RPi. GPIO og LED -dioder
Kodning: Brug af RPi. GPIO og LED -dioder

RaspberryPi leveres med et sæt hanstifter, som vi kan bruge til at kommunikere med et væld af elektriske komponenter, som i dette tilfælde er LED -dioder; det ligner Arduino og dets system. Raspberry PI er imidlertid en computer til generelle formål, i modsætning til en mikrokontroller som Arduino. Så vi skal gøre lidt mere arbejde for at bruge dem. Dette består i at opsætte benene på Raspberry Pi. Vi gør dette ved at bruge denne kode.

importer RPi. GPIO som GPIO #Vi importerer modulet, så vi kan bruge det

#Opsæt pinsGPIO.setmode (GPIO. BCM) GPIO.setwarnings (False)

#De ben, lysdioderne er tilsluttet. Disse kan være forskellige, hvis du bygger det, så sørg for at sammenligne og ændre, når det er nødvendigt

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 igennem hver pin, ved hjælp af.setup -kommandoen, indtaster nummeret og indstiller 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 kode kun lade os bruge to tilstande med led, det vil sige til og fra. Vi har dog brug for det for at kunne dæmpe lysene. For at gøre dette bruger vi Pulse Width Modulation.

Brug af pulsbreddemodulation

Pulse Width Modulation lader os udsende et analogt signal ved hjælp af en digital pin. I det væsentlige tænder og slukker den for signalkilden med en høj hastighed, som er gennemsnitlig til en bestemt spænding. RPi. GPIO giver os mulighed for at bruge dette, omend med en ekstra kode.

#Vi opretter fire pin -objekter ved hjælp af kommandoen GPIO. PWM, som optager et kanalnummer

#Det andet nummer er antallet af gange, det opdateres pr. 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)

I det næste trin skal du vide, hvordan vi opdaterer disse pins.

Vi opdaterer stifterne ved hjælp af kommandoen

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

ExtremeHotLED.start (x)

HotLED.start (x)

x i dette tilfælde ville være driftscyklussen, som bestemmer, hvor meget den pulserer af. Det spænder fra 0-100, så vi er nødt til at basere vores næste kode på det faktum.

Trin 5: Kodning: Få LED -lysstyrke

Kodning: Få LED -lysstyrke
Kodning: Få LED -lysstyrke

Fordi vi har fire forskellige lysdioder, vil vi tænde dem alt efter hvordan. koldt eller varmt er det i brugerens by. Vi besluttede at have fire etaper til led.

#Funktioner

def getmiddeleleftledintensity (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øjre 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 i F + 200

def getextremerightledintensity (TemperatureinF):

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

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

#Indstilling af LED -lys

def GetLEDBrightness (temp):

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

print ("Ekstrem kold LED:" + str (ekstremkold)

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

ExtremeColdLED.start (ekstremkold)

ColdLED.start (coldled)

ExtremeHotLED.start (extremehotled)

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

print ("Ekstrem kold LED:" + str (ekstremkold)

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

ExtremeColdLED.start (ekstremkold)

ColdLED.start (coldled)

ExtremeHotLED.start (extremehotled)

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

print ("Ekstrem kold LED:" + str (ekstremkold)

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

ExtremeColdLED.start (ekstremkold)

ColdLED.start (coldled)

ExtremeHotLED.start (extremehotled)

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

print ("Ekstrem kold LED:" + str (ekstremkold)

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

ExtremeColdLED.start (ekstremkold)

ColdLED.start (coldled)

ExtremeHotLED.start (extremehotled)

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

print ("Ekstrem kold LED:" + str (ekstremkold)

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

ExtremeColdLED.start (ekstremkold)

ColdLED.start (coldled)

ExtremeHotLED.start (extremehotled)

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

coldled = 100 - hotled

ekstremkoldt = 0

print ("Ekstrem kold LED:" + str (ekstremkold)

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

ExtremeColdLED.start (ekstremkold)

ColdLED.start (coldled)

ExtremeHotLED.start (extremehotled)

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

print ("Ekstrem kold LED:" + str (ekstremkold)

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

ExtremeColdLED.start (ekstremkold)

ColdLED.start (coldled)

ExtremeHotLED.start (extremehotled)

HotLED.start (hotled)

Okay, denne del af koden er virkelig lang. Det er også ret svært at forklare. I det væsentlige ser koden ovenover på temperaturen i Fahrenheit og afgør, om den er i et sæt intervaller. Afhængigt af områderne giver det et tal for hver LED og dens lysstyrke og indstiller derefter lysstyrken ved at kalde kommandoen start (). Det er den hurtige forklaring. Hvis det er tilstrækkeligt, anbefaler jeg, at du går videre til det næste trin, men hvis du vil se den lange og kedelige forklaring, skal du fortsætte med at læse.

Da vi programmerede, besluttede vi, at den nemmeste måde at få en værdi fra en temperatur var i form af en matematisk funktion. Så vi skabte en graf i GeoGebra for at repræsentere forholdet mellem vores temperatur og vores LED -lysstyrke; grunden til at den går over 100 er, at den ekstra ville gå ind i den anden led. Vi løb dog ind i spørgsmålet om at få en enkelt funktion til at kortlægge alle disse punkter til en enkelt funktion. Vi troede, at vi kunne bruge en parabel, men vi besluttede at nøjes med at bruge en række if -udsagn. I det væsentlige er hele denne kode en stykkevis funktion.

Funktionerne øverst er den respektive ligning af linjer. Når vi har fundet ud af, hvor temperaturen er på grafen, kører vi den gennem den funktion, får lysstyrken og sender den videre til lysdioderne.

Trin 6: Kodning: sidste trin

Endelig tilføjer vi denne erklæring i slutningen.

prøve:

while (True): GetLEDBrightness (City_TemperatureF) GetRainLED (WeatherID) time.sleep (10) undtagen KeyboardInterrupt: afslut ()

Forsøg og undtagelser -sætningerne giver os mulighed for at afslutte koden ved hjælp af en tastaturgenvej; Uanset hvad skulle vi lukke Raspberry Pi ned for at genstarte koden. Så har vi et stykke loop, der løber for evigt. Vi opdaterer lysdioderne, samt opdaterer regn -LED'en. Vi holder pause i ti sekunder; OpenWeather tillader kun 60 opkald til data i minuttet, og 10 sekunder er masser af opdateringer.

Og dermed er vores kode færdig. Nedenfor er den færdige kode.

HindbærPIWeatherStation.py

importanmodninger
importRPi. GPIOasGPIO
importjson
importtid
#Åbent vejr idKoder mindre end 700 er alle nedbør
defCheckRain (IdCode):
ifIdCode <700:
returnTrue
andet:
returnFalse
defgetmiddeleleftledintensity (TemperatureinF):
#Venstre ligning: y =-(50/20) x + 175
#Retteligning: y = (50/20) x - 75
retur- (50/20)*Temperatur iF+175
defgetmiddlerightledintensity (TemperatureinF):
#Venstre ligning: y =-(50/20) x + 175
#Retteligning: y = (50/20) x - 75
retur (50/20)*Temperatur i F-75
defgetextremeleftledintensity (TemperatureinF):
#LeftEquation: y = -(100/30) x + 200
#RightEquation: 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 Opsætning
GPIO.setmode (GPIO. BCM)
GPIO.setwarnings (falsk)
#Pins
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:
ekstremkoldt = 100
forkølet = 100
hotled = 0
extremehotled = 0
print ("Ekstrem kold LED:"+str (ekstremkold)
print ("Cold led:"+str (coldled))
print ("Extreme hot led"+str (extremehotled))
print ("Hot led:"+str (hotled))
ExtremeColdLED.start (ekstremkold)
ColdLED.start (coldled)
ExtremeHotLED.start (extremehotled)
HotLED.start (hotled)
eliftemp> = 100:
ekstremkoldt = 0
forkølet = 0
hotled = 100
extremehotled = 100
print ("Ekstrem kold LED:"+str (ekstremkold)
print ("Cold led:"+str (coldled))
print ("Extreme hot led"+str (extremehotled))
print ("Hot led:"+str (hotled))
ExtremeColdLED.start (ekstremkold)
ColdLED.start (coldled)
ExtremeHotLED.start (extremehotled)
HotLED.start (hotled)
elif0 <temp <= 30:
extremecoldled = getextremeleftledintensity (temp) -100
forkølet = 100
hotled = 0
extremehotled = 0
print ("Ekstrem kold LED:"+str (ekstremkold)
print ("Cold led:"+str (coldled))
print ("Extreme hot led"+str (extremehotled))
print ("Hot led:"+str (hotled))
ExtremeColdLED.start (ekstremkold)
ColdLED.start (coldled)
ExtremeHotLED.start (extremehotled)
HotLED.start (hotled)
elif100> temp> = 70:
ekstremkoldt = 0
forkølet = 0
hotled = 100
extremehotled = getextremerightledintensity (temp) -100
print ("Ekstrem kold LED:"+str (ekstremkold)
print ("Cold led:"+str (coldled))
print ("Extreme hot led"+str (extremehotled))
print ("Hot led:"+str (hotled))
ExtremeColdLED.start (ekstremkold)
ColdLED.start (coldled)
ExtremeHotLED.start (extremehotled)
HotLED.start (hotled)
elif30 <temp <50:
ekstremkoldt = 0
coldled = getmiddeleleftledintensity (temp)
hotled = 100-coldled
extremehotled = 0
print ("Ekstrem kold LED:"+str (ekstremkold)
print ("Cold led:"+str (coldled))
print ("Extreme hot led"+str (extremehotled))
print ("Hot led:"+str (hotled))
ExtremeColdLED.start (ekstremkold)
ColdLED.start (coldled)
ExtremeHotLED.start (extremehotled)
HotLED.start (hotled)
elif50 <temp <70:
hotled = getmiddlerightledintensity (temp)
extremehotled = 0
coldled = 100-hotled
ekstremkoldt = 0
print ("Ekstrem kold LED:"+str (ekstremkold)
print ("Cold led:"+str (coldled))
print ("Extreme hot led"+str (extremehotled))
print ("Hot led:"+str (hotled))
ExtremeColdLED.start (ekstremkold)
ColdLED.start (coldled)
ExtremeHotLED.start (extremehotled)
HotLED.start (hotled)
eliftemp == 50:
ekstremkoldt = 0
forkølet = 50
hotled = 50
extremehotled = 0
print ("Ekstrem kold LED:"+str (ekstremkold)
print ("Cold led:"+str (coldled))
print ("Extreme hot led"+str (extremehotled))
print ("Hot led:"+str (hotled))
ExtremeColdLED.start (ekstremkold)
ColdLED.start (coldled)
ExtremeHotLED.start (extremehotled)
HotLED.start (hotled)
defGetRainLED (idCode):
ifCheckRain (idCode):
GPIO.output (Rain_LED_PIN, GPIO. HIGH)
andet:
GPIO.output (Rain_LED_PIN, GPIO. LOW)
#Api -oplysninger: Genopret API -nøgle med din oepnweather api -nøgle
openweather_api_key = "460a23f27ff324ef9ae743c7e9c32d7e"
base_call = "https://api.openweathermap.org/data/2.5/weather?q="
print ("Indtast en by!")
bynavn = input ()
full_call = base_call+city_name+"& appid ="+openweather_api_key
#Få vejrdata
Response = requests.get (full_call)
WeatherData = Response.json ()
WeatherID = WeatherData ["vejr"] [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 (sandt):
GetLEDBrightness (City_TemperatureF)
GetRainLED (WeatherID)
tid. sover (10)
undtagen tastaturInterrupt:
Afslut()

se rawRaspberryPIWeatherStation.py hostet af ❤ af GitHub

Trin 7: Opbygning og tilslutning

Puha! Efter al den kodning kommer vi til bygningen, hvilket er betydeligt lettere. På grund af ordrerne til at blive hjemme, kunne vi ikke få mange af de værktøjer, vi forventede at have på skolen. Så denne del er lidt enklere end hvad vi havde til hensigt. Specifikationerne i sig selv er også fleksible. Først tegnede vi et rektangel på en planke af træ. Den specifikke størrelse betyder egentlig ikke så meget, da den simpelthen fungerer som en platform til at sætte lysdioder og elektronik på.

Derefter borede vi fem 1/8 i huller i vores stykke træ.

Vi skar derefter rektanglet ud af planken til at bruge som vores platform for vores elektronik.

(Det var da vi startede; vi fandt en større sav!)

Vi skubber derefter anode- og katodestifterne af ledet ind i hullerne; lysdioderne skal ligge ovenpå, deres løg stikker ud; holde styr på, hvilket ben der er længere og kortere. Vi blev derefter sat til at begynde at lodde sammen ledninger. Først lodder vi modstandene til LED -anodens ben (det længere ben).

Derefter lodder vi katodebenene på LED'erne til en enkelt kobbertråd, som vi vil bruge som jord. Det skal se sådan ud.

Efter at vi har gjort det, lodder vi han-enderne af hun-han-jumperkabler til enderne af hver modstand og kobberjordledningen. Når vi har gjort det, kan vi begynde at tilslutte ledningerne til hindbær PI GPIO benene. Her er et diagram! Bemærk dog, at stifterne er dem i den tidligere berørte kode.

Når du først har det hele tilsluttet, er alt hvad du skal gøre nu at hente Python -filen til hindbær Pi og åbne terminalen. kør "python3 RaspberryPIWeatherStation.py" og gør derefter som det viser.

Trin 8: Demonstration og konklusion

Tak fordi du læste hele vejen igennem! Jeg vedhæfter python -scriptet herunder! Hvis der var ting, vi kunne tilføje, ville det nok være …

1. Understøttelse af forskellige inputtyper (byer, geografiske punkter osv.)

2. Support til mere vejrinformation

3. Tilføj en lille skærm for at vise oplysninger

Fortæl os dine tanker! Dette var et sjovt projekt at bygge. Vi lærte meget om anmodninger og at få internetdokumenter ved hjælp af python, og vi lærte også meget om at bruge lodning.

Anbefalede: