Obsah:

Meteorologická stanice Raspberry PI LED: 8 kroků
Meteorologická stanice Raspberry PI LED: 8 kroků

Video: Meteorologická stanice Raspberry PI LED: 8 kroků

Video: Meteorologická stanice Raspberry PI LED: 8 kroků
Video: Raspberry Pi - Půjde z něho postavit multimediální centrum? 2024, Červenec
Anonim
Meteorologická stanice LED Raspberry PI
Meteorologická stanice LED Raspberry PI

Vytvořili jsme meteorologickou LED stanici Raspberry PI. Svítí a stmívá LED diody a říká uživateli, jak je město horké a studené. Má také LED diodu, která jim říká, zda ve městě, do kterého napsali, prší nebo ne.

Vytvořili Michael Andrews a Tio Marello.

Zásoby

Nástroje

  1. Páječka
  2. Dremel
  3. Viděl

Materiály

  1. Raspberry Pi 3 B+ ~ 40 dolarů ~ 30 dolarů
  2. Propojovací vodiče mezi ženami a muži ~ 7 dolarů
  3. 3 modré a 2 červené LED diody ~ 11 dolarů
  4. Rezistory 100 ohmů ~ 13 dolarů
  5. 4 x 4 x 1/4 dřevěné prkno ~ 5 dolarů
  6. Pájka ~ 10 dolarů
  7. Měděný drát ~ 5 dolarů

Krok 1: Kódování jako řešení problému

Kódování je řešení problémů

Jaký je tedy v našem projektu náš problém? Naším problémem je získat data o počasí a poté je pomocí těchto dat informovat naše LED diody, zda jsou vypnuté nebo zapnuté. Tím se náš problém rozdělí na tři oblasti.

1. Získání údajů o počasí

2. Použití těchto dat

3. Pomocí LED

Jazyk, který jsme použili pro tento projekt, Python, a hardware, na kterém běží, Python, nám však poskytují snadný způsob, jak těchto cílů dosáhnout.

Začněme tedy prvním problémem, získáváním údajů o počasí.

Krok 2: Kódování: Získání údajů o počasí

Python sám o sobě nemůže získat data o počasí. K získání údajů o počasí musíme importovat dva nástroje a také externí službu. K tomu používáme tři nástroje.

1. Žádosti, modul pythonu, který umožňuje vytváření webů

2. Json, modul pythonu, který nám umožňuje používat formát souboru JSON

3. OpenWeather, webová stránka, která nám může poskytnout údaje o počasí

Přinášíme tedy dva moduly napsáním tohoto kódu v horní části skriptu pythonu.

importovat žádosti

importovat json

Než však použijeme tyto nástroje, musíme použít Openweather. K tomu musíme na jejich webu vytvořit účet a získat klíč API. Postupujte podle pokynů na jejich webových stránkách a získáte řetězec písmen a číslic, který nám umožní používat jejich službu. Jak?

openweather_api_key = "260a23f27f5324ef2ae763c779c32d7e" #Náš klíč API (není skutečný)

base_call = "https://api.openweathermap.org/data/2.5/weather?q=" #OpenWeather Call #Zde získáme město uživatele ve formě textového tisku ("Zadejte město!") city_name = vstup () #Zde jsme sestavili adresu, kterou připojíme do požadavků. Get pro příjem údajů o počasí full_call = base_call+city_name+"& appid ="+openweather_api_key #Nakonec s naší adresou zavoláme request.get a poté ji převedeme do souboru json Response = requests.get (full_call) WeatherData = Response.json () #JSON soubory obsahují různé proměnné, ke kterým máme přístup pomocí této syntaxe #Zde získáme ID počasí a teplotu v Kelvinech města, kterou uživatel zadal do WeatherID = WeatherData ["počasí"] [0] ["id"] City_TemperatureK = WeatherData ["main"] ["temp"]

Zde máme kód, který nám získává data o počasí. Requests, ve formě requests.get, převezme adresu webové stránky a vrátí nám soubor z této webové stránky zpět. OpenWeather nám dává adresu, na kterou můžeme zavolat, abychom nám poskytli údaje o počasí ve formě JSON. Sestavíme adresu, kterou vložíme do požadavků a získáme zpět soubor json. Poté vytvoříme dvě proměnné a přiřadíme je teplotě a počasí ve městě uživatele.

Takže teď s tímto kódem máme dvě proměnné. Máme ID počasí a teplotu v Kelvinech

Krok 3: Kódování: Použití těchto dat

Nyní, když máme tyto dvě proměnné, musíme je připravit pro použití pro naše LED diody. Z tohoto hlediska pro to nemusíme importovat žádné moduly.

Nejprve převedeme kelvin na Fahrenheita.

To provedeme vytvořením proměnné s touto syntaxí

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

který převádí z Kelvinů na Fahrenheita (což je ve skutečnosti převod z K -> C -> F)

Další je naše ID počasí. ID počasí je ID, které Openweather poskytuje a které nám říká o povětrnostních podmínkách města.

openweathermap.org/weather-conditions Zde je jejich seznam.

Všimli jsme si, že vše pod číslem 700 je nějaký druh srážek, takže jsme jen zkontrolovali, zda je kód pod 700, abychom zjistili, zda prší.

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

S tím máme naše dvě proměnné připravené pro použití s našimi Raspberry PI piny a LED diodami.

Krok 4: Kódování: Použití RPi. GPIO a LED diod

Kódování: Použití RPi. GPIO a LED diod
Kódování: Použití RPi. GPIO a LED diod

RaspberryPi je dodáván se sadou samčích kolíků, které můžeme použít ke komunikaci s řadou elektrických komponent, což jsou v tomto případě LED diody; je to podobné Arduinu a jeho systému. Raspberry PI je však počítač pro obecné účely, na rozdíl od mikrokontroléru, jako je Arduino. Musíme tedy udělat trochu více práce, abychom je mohli používat. To spočívá v nastavení pinů na Raspberry Pi. Děláme to pomocí tohoto kódu.

import RPi. GPIO jako GPIO #Modul importujeme, abychom jej mohli používat

#Nastavte pinsGPIO.setmode (GPIO. BCM) GPIO.setwarnings (False)

#Kolíky, do kterých jsou zapojeny diody LED. Ty se mohou lišit, pokud je vytvoříte, takže je v případě potřeby porovnejte a změňte

Extreme_Hot_LED_PIN = 26 Hot_LED_PIN = 16

Extreme_Cold_LED_PIN = 5

Cold_LED_PIN = 6

Rain_LED_PIN = 23

#Procházíme každý pin pomocí příkazu.setup, zadáme jeho číslo a nastavíme jej jako výstupní 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

Tento kód by nám však umožnil použít pouze dva stavy s LED, tj. Zapnuto a vypnuto. Potřebujeme to však, abychom mohli ztlumit světla. K tomu používáme Pulse Width Modulation.

Použití modulace šířky pulsu

Modulace šířky pulsu nám umožňuje výstup analogového signálu pomocí digitálního pinu. V zásadě zapíná a vypíná zdroj signálu vysokou rychlostí, která se průměruje na určité napětí. RPi. GPIO nám to umožňuje použít, i když s nějakým kódem navíc.

#Vytvoříme čtyři pinové objekty pomocí příkazu GPIO. PWM, který převezme číslo kanálu

#Druhé číslo je počet aktualizací za sekundu

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)

Pro další krok budete muset vědět, jak tyto piny aktualizujeme.

Piny aktualizujeme pomocí příkazu

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

ExtremeHotLED.start (x)

HotLED.start (x)

x by v tomto případě byl pracovní cyklus, který určuje, jak moc pulzuje. Pohybuje se od 0 do 100, takže z této skutečnosti musíme vycházet při dalším kódu.

Krok 5: Kódování: Získání jasu LED

Kódování: Získání jasu LED
Kódování: Získání jasu LED

Protože máme čtyři různé LED diody, chceme je rozsvítit podle toho, jak. ve městě uživatele je zima nebo horko. Rozhodli jsme se mít čtyři fáze pro LED.

#Funkce

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):

#Levá rovnice: y = - (50/20) x + 175 #Pravá rovnice: y = (50/20) x - 75 návratová (50/20)*Teplota vF - 75

def getextremeleftledintensity (TemperatureinF):

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

návrat -(100/30)*Teplota veF + 200

def getextremerightledintensity (TemperatureinF):

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

návrat (100/30)*Teplota vF - (400/3)

#Nastavení světel LED

def GetLEDBrightness (temp):

pokud je teplota <= 0: extrémně chladná = 100 za studena = 100 za tepla = 0 extrémně žhavená = 0

tisk ("Extrémně studená LED:" + str (extrémně studená))

tisk ("Studená LED:" + str (za studena)) tisk ("Extrémně horká LED" + str (extrémně horká)) tisk ("Horká LED:" + str (za tepla))

ExtremeColdLED.start (extrémně chladný)

ColdLED.start (za studena)

ExtremeHotLED.start (extremehotled)

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

tisk ("Extrémně studená LED:" + str (extrémně studená))

tisk ("Studená LED:" + str (za studena)) tisk ("Extrémně horká LED" + str (extrémně horká)) tisk ("Hot led:" + str (za tepla))

ExtremeColdLED.start (extrémně chladný)

ColdLED.start (za studena)

ExtremeHotLED.start (extremehotled)

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

tisk („Extrémně studená LED:“+ str (extrémně studená))

tisk ("Studená LED:" + str (za studena)) tisk ("Extrémně horká LED" + str (extrémně horká)) tisk ("Horká LED:" + str (za tepla))

ExtremeColdLED.start (extrémně chladný)

ColdLED.start (za studena)

ExtremeHotLED.start (extremehotled)

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

tisk ("Extrémně studená LED:" + str (extrémně studená))

tisk ("Studená LED:" + str (za studena)) tisk ("Extrémně horká LED" + str (extrémně horká)) tisk ("Hot led:" + str (za tepla))

ExtremeColdLED.start (extrémně chladný)

ColdLED.start (za studena)

ExtremeHotLED.start (extremehotled)

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

tisk ("Extrémně studená LED:" + str (extrémně studená))

tisk ("Studená LED:" + str (za studena)) tisk ("Extrémně horká LED" + str (extrémně horká)) tisk ("Hot led:" + str (za tepla))

ExtremeColdLED.start (extrémně chladný)

ColdLED.start (za studena)

ExtremeHotLED.start (extremehotled)

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

za studena = 100 - za tepla

extrémně chladný = 0

tisk ("Extrémně studená LED:" + str (extrémně studená))

tisk ("Studená LED:" + str (za studena)) tisk ("Extrémně horká LED" + str (extrémně horká)) tisk ("Hot led:" + str (za tepla))

ExtremeColdLED.start (extrémně chladný)

ColdLED.start (za studena)

ExtremeHotLED.start (extremehotled)

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

tisk ("Extrémně studená LED:" + str (extrémně studená))

tisk ("Studená LED:" + str (za studena)) tisk ("Extrémně horká LED" + str (extrémně horká)) tisk ("Hot led:" + str (za tepla))

ExtremeColdLED.start (extrémně chladný)

ColdLED.start (za studena)

ExtremeHotLED.start (extremehotled)

HotLED.start (hotled)

Dobře, tato část kódu je opravdu dlouhá. Je také docela těžké to vysvětlit. V zásadě výše uvedený kód sleduje teplotu ve Fahrenheitech a určuje, zda je v sadě rozsahů. V závislosti na rozsahu udává číslo pro každou LED a její jas a poté nastavuje jas voláním příkazu start (). To je rychlé vysvětlení. Pokud to stačí, doporučuji přejít k dalšímu kroku, ale pokud chcete vidět dlouhé a únavné vysvětlování, pokračujte ve čtení.

Když jsme programovali, rozhodli jsme se, že nejjednodušší způsob, jak získat hodnotu z teploty, je ve formě matematické funkce. Vytvořili jsme tedy v GeoGebře graf, který reprezentuje vztah mezi naší teplotou a naším jasem LED; důvod, proč jde nad 100, je, že figurant by šel do druhé LED. Narazili jsme však na problém získání jediné funkce pro mapování všech těchto bodů na jedinou funkci. Mysleli jsme si, že můžeme použít parabolu, ale rozhodli jsme se spokojit s použitím řady příkazů if. V podstatě je celý tento kód kusovou funkcí.

Funkce nahoře jsou příslušná rovnice čar. Jakmile v grafu určíme, kde je teplota, provedeme ji touto funkcí, získáme jas a přeneseme ji na LED diody.

Krok 6: Kódování: Poslední kroky

Nakonec toto prohlášení přidáme na konec.

Snaž se:

while (True): GetLEDBrightness (City_TemperatureF) GetRainLED (WeatherID) time.sleep (10) kromě KeyboardInterrupt: quit ()

Příkazy try a except nám umožňují ukončit kód pomocí klávesové zkratky; v každém případě bychom museli Raspberry Pi vypnout, aby se kód restartoval. Pak máme chvíli smyčku, která běží navždy. Aktualizujeme diody LED a také aktualizujeme dešťovou LED. Pozastavíme se na deset sekund; OpenWeather umožňuje pouze 60 volání dat za minutu a 10 sekund je spousta aktualizací.

A tím je náš kód hotový. Níže je hotový kód.

RaspberryPIWeatherStation.py

dovozní žádosti
importRPi. GPIOasGPIO
importjson
čas importu
#Openweather idCodes méně než 700 jsou všechny srážky
defCheckRain (IdCode):
ifIdCode <700:
returnTrue
jiný:
returnFalse
defgetmiddleleftledintensity (Teplota vF):
#Levá rovnice: y =-(50/20) x + 175
#Pravá rovnice: y = (50/20) x - 75
návrat-(50/20)*Teplota veF+175
defgetmiddlerightledintensity (Teplota vF):
#Levá rovnice: y =-(50/20) x + 175
#Pravá rovnice: y = (50/20) x - 75
návrat (50/20)*Teplota vF-75
defgetextremeleftledintensity (TemperatureinF):
#LeftEquation: y = -(100/30) x + 200
#RightEquation: y = (100/30) x - (400/3)
návrat-(100/30)*Teplota veF+200
defgetextremerightledintensity (Teplota vF):
# LeftEquation: y = -(100/30) x + 200
# RightEquation: y = (100/30) x - (400/3)
návrat (100/30)*Teplota vF- (400/3)
#GPIO Setup
GPIO.setmode (GPIO. BCM)
GPIO.setwarnings (False)
#Piny
Extreme_Hot_LED_PIN = 26
Hot_LED_PIN = 16
Extreme_Cold_LED_PIN = 5
Cold_LED_PIN = 6
Rain_LED_PIN = 23
#Nastavení kolíku
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:
extrémně chladný = 100
za studena = 100
hotled = 0
extrémní: 0
tisk („Extrémně studená LED:“+str (extrémně studená))
tisk ("Studená LED:"+str (za studena))
tisk („Extrémně horké LED“+str (extrémně ostré))
tisk ("Hot led:"+str (hotled))
ExtremeColdLED.start (extrémně chladný)
ColdLED.start (za studena)
ExtremeHotLED.start (extremehotled)
HotLED.start (hotled)
eliftemp> = 100:
extrémně chladný = 0
za studena = 0
hotled = 100
extrémní střela = 100
tisk („Extrémně studená LED:“+str (extrémně studená))
tisk ("Studená LED:"+str (za studena))
tisk („Extrémně horké LED“+str (extrémně ostré))
tisk ("Hot led:"+str (hotled))
ExtremeColdLED.start (extrémně chladný)
ColdLED.start (za studena)
ExtremeHotLED.start (extremehotled)
HotLED.start (hotled)
elif0 <teplota <= 30:
extremecoldled = getextremeleftledintensity (temp) -100
za studena = 100
hotled = 0
extrémní: 0
tisk ("Extrémně studená LED:"+str (extrémně studená))
tisk ("Studená LED:"+str (za studena))
tisk („Extrémně horké LED“+str (extrémně ostré))
tisk ("Hot led:"+str (hotled))
ExtremeColdLED.start (extrémně chladný)
ColdLED.start (za studena)
ExtremeHotLED.start (extremehotled)
HotLED.start (hotled)
elif100> teplota> = 70:
extrémně chladný = 0
za studena = 0
hotled = 100
extremehotled = getextremerightledintensity (temp) -100
tisk („Extrémně studená LED:“+str (extrémně studená))
tisk ("Studená LED:"+str (za studena))
tisk („Extrémně horké LED“+str (extrémně ostré))
tisk ("Hot led:"+str (hotled))
ExtremeColdLED.start (extrémně chladný)
ColdLED.start (za studena)
ExtremeHotLED.start (extremehotled)
HotLED.start (hotled)
elif30 <teplota <50:
extrémně chladný = 0
coldled = getmiddleleftledintensity (temp)
hotled = 100-studený
extrémní: 0
tisk („Extrémně studená LED:“+str (extrémně studená))
tisk ("Studená LED:"+str (za studena))
tisk („Extrémně horké LED“+str (extrémně ostré))
tisk ("Hot led:"+str (hotled))
ExtremeColdLED.start (extrémně chladný)
ColdLED.start (za studena)
ExtremeHotLED.start (extremehotled)
HotLED.start (hotled)
elif50 <teplota <70:
hotled = getmiddlerightledintensity (temp)
extrémní: 0
coldled = 100-hotled
extrémně chladný = 0
tisk ("Extrémně studená LED:"+str (extrémně studená))
tisk ("Studená LED:"+str (za studena))
tisk („Extrémně horké LED“+str (extrémně ostré))
tisk ("Hot led:"+str (hotled))
ExtremeColdLED.start (extrémně chladný)
ColdLED.start (za studena)
ExtremeHotLED.start (extremehotled)
HotLED.start (hotled)
eliftemp == 50:
extrémně chladný = 0
za studena = 50
hotled = 50
extrémní: 0
tisk ("Extrémně studená LED:"+str (extrémně studená))
tisk ("Studená LED:"+str (za studena))
tisk („Extrémně horké LED“+str (extrémně ostré))
tisk ("Hot led:"+str (hotled))
ExtremeColdLED.start (extrémně chladný)
ColdLED.start (za studena)
ExtremeHotLED.start (extremehotled)
HotLED.start (hotled)
defGetRainLED (idCode):
ifCheckRain (idCode):
GPIO.output (Rain_LED_PIN, GPIO. HIGH)
jiný:
GPIO.output (Rain_LED_PIN, GPIO. LOW)
#Api information: Repalce API key with your oepnweather api key
openweather_api_key = "460a23f27ff324ef9ae743c7e9c32d7e"
base_call = "https://api.openweathermap.org/data/2.5/weather?q="
tisk („Zadejte město!“)
city_name = vstup ()
full_call = base_call+city_name+"& appid ="+openweather_api_key
#Získávání údajů o počasí
Response = requests.get (full_call)
WeatherData = Response.json ()
WeatherID = WeatherData ["počasí"] [0] ["id"]
City_TemperatureK = WeatherData ["main"] ["temp"]
City_TemperatureF = (City_TemperatureK-273)*1,8+32#Převést na Fahrenheit
#LED/GPIO věci
tisk ("K:"+str (City_TemperatureK))
tisk ("F:"+str (City_TemperatureF))
tisk (WeatherID)
Snaž se:
while (True):
GetLEDBrightness (City_TemperatureF)
GetRainLED (WeatherID)
time.sleep (10)
kroměKeyboardInterrupt:
přestat()

zobrazit rawRaspberryPIWeatherStation.py hostované s ❤ od GitHub

Krok 7: Budování a zapojení

Fíha! Po tom všem kódování se dostáváme k budově, která je výrazně jednodušší. Kvůli objednávkám pobytu koruny doma jsme se nemohli dostat k mnoha nástrojům, které jsme ve škole očekávali. Tato část je tedy o něco jednodušší, než jsme zamýšleli. Flexibilní jsou i samotná specifika. Nejprve jsme na prkno nakreslili obdélník. Na konkrétní velikosti příliš nezáleží, protože jednoduše slouží jako platforma pro nasazení LED a elektroniky.

Potom jsme vyvrtali pět 1/8 do otvorů v našem kusu dřeva.

Potom jsme z prkna vystřihli obdélník, který měl sloužit jako platforma pro naši elektroniku.

(To bylo, když jsme začínali; našli jsme větší pilu!)

Poté zasuneme anodové a katodové kolíky LED do otvorů; LED diody by měly být položeny nahoře a jejich žárovky trčí; sledujte, která noha je delší a kratší. Poté jsme se pustili do pájení drátů. Nejprve připájíme odpory k anodové noze LED (delší noha).

Poté připájíme katodové nohy LED k jednomu měděnému drátu, který použijeme jako uzemnění. Mělo by to vypadat takto.

Poté, co to uděláme, připájíme zástrčkové konce propojovacích kabelů samice a samice ke koncovým koncům každého odporu a měděného uzemňovacího vodiče. Jakmile to uděláme, můžeme začít zapojovat vodiče do malinových PI GPIO pinů. Tady je diagram! Všimněte si však, že kolíky jsou ty v dříve dotknutém kódu.

Jakmile budete mít vše zapojené, nyní stačí jen dostat soubor Pythonu na malinový Pi a otevřít terminál. spusťte „python3 RaspberryPIWeatherStation.py“a poté proveďte, jak ukazuje.

Krok 8: Demonstrace a závěr

Děkujeme za úplné přečtení! Níže připojím skript pythonu! Pokud bychom mohli přidat něco, bylo by to pravděpodobně…

1. Podpora různých typů vstupů (města, geografické body atd.)

2. Podpora pro více informací o počasí

3. Přidejte malou obrazovku pro zobrazení informací

Dejte nám vědět své myšlenky! Byl to zábavný projekt na stavbu. Naučili jsme se hodně o požadavcích a získávání internetových dokumentů pomocí pythonu a také jsme se naučili hodně o používání pájení.

Doporučuje: