Съдържание:

Raspberry PI LED метеорологична станция: 8 стъпки
Raspberry PI LED метеорологична станция: 8 стъпки

Видео: Raspberry PI LED метеорологична станция: 8 стъпки

Видео: Raspberry PI LED метеорологична станция: 8 стъпки
Видео: Raspberry Pi 4B в корпусе Argon ONE M.2 c SSD диском 128 ГБ, собираем сервер для Home Assistant 2024, Юли
Anonim
Малинова PI LED метеорологична станция
Малинова PI LED метеорологична станция

Създадохме Raspberry PI Weather LED станция. Той казва на потребителя колко горещ и студен е градът, като осветява и затъмнява светодиодите. Той също така има индикатор, който да им каже дали вали или не вали в града, в който са въвели.

Създадено от Майкъл Андрюс и Тио Марело.

Консумативи

Инструменти

  1. Поялник
  2. Дремел
  3. Трион

Материали

  1. Raspberry Pi 3 B+ ~ 40 долара ~ 30 долара
  2. Женски към мъжки джъмпер проводници ~ 7 долара
  3. 3 сини и 2 червени LED диода ~ 11 долара
  4. 100 ома резистори ~ 13 долара
  5. 4 x 4 x 1/4 дървена дъска ~ 5 долара
  6. Припой ~ 10 долара
  7. Медна тел ~ 5 долара

Стъпка 1: Кодирането като решаване на проблеми

Кодирането е решаване на проблеми

И така, в нашия проект какъв е нашият проблем? Нашият проблем е да получим метеорологични данни и след това да използваме тези данни, за да кажем на нашите светодиоди дали са изключени или включени. Така че това разделя нашия проблем на три области.

1. Получаване на метеорологични данни

2. Използване на тези данни

3. Използване на светодиоди

Езикът, който използвахме за този проект, Python, и хардуерът, на който работи, Python, ни дават лесен начин да постигнем тези цели.

Така че, нека започнем с първия проблем, получаване на метеорологични данни.

Стъпка 2: Кодиране: Получаване на метеорологични данни

Python сам по себе си не може да получи метеорологични данни. Трябва да импортираме два инструмента, както и външна услуга, за да получим метеорологични данни. За целта използваме три инструмента.

1. Заявки, модул на python, който позволява уебскапиране

2. Json, модул на python, който ни позволява да използваме JSON файлов формат

3. OpenWeather, уебсайт, който може да ни предостави метеорологични данни

И така, ние въвеждаме двата модула, като напишем този код в горната част на нашия скрипт на python.

заявки за импортиране

импортиране на json

Преди да използваме тези инструменти обаче, трябва да използваме Openweather. За това трябва да създадем акаунт на техния сайт и да получим API ключ. Следвайте инструкциите на уебсайта им и ще получите низ от букви и цифри, които ще ни позволят да използваме тяхната услуга. Как?

openweather_api_key = "260a23f27f5324ef2ae763c779c32d7e" #Нашият API ключ (не е реален)

base_call = "https://api.openweathermap.org/data/2.5/weather?q=" #OpenWeather Call #Тук получаваме града на потребителя под формата на текстов печат ("Въведете град!") city_name = input () #Тук събрахме адреса, който ще включим в requests.get, за да получим метеорологични данни full_call = base_call+city_name+"& appid ="+openweather_api_key #Накрая наричаме requests.get с нашия адрес, след което го преобразуваме в json файл Отговор = requests.get (full_call) WeatherData = Response.json () #JSON файловете съдържат различни променливи, до които можем да получим достъп с помощта на този синтаксис #Тук получаваме идентификатора на времето и температурата в Келвин на града, който потребителят е въвел в WeatherID = WeatherData ["weather"] [0] ["id"] City_TemperatureK = WeatherData ["main"] ["temp"]

Тук имаме кода, който ни дава нашите метеорологични данни. Заявките, под формата на requests.get, приемат адрес на уебсайт и ни връщат файл от този уебсайт. OpenWeather ни дава адрес, на който да се обадим, за да ни даде метеорологични данни под формата на json. Събираме адрес, който включваме в заявки и получаваме json файл обратно. След това създаваме две променливи и ги присвояваме на температурата и метеорологичните условия в града на потребителя.

Така че сега, с този код, имаме две променливи. Имаме weatherID и температура в Келвин

Стъпка 3: Кодиране: Използване на тези данни

Сега, когато имаме тези две променливи, трябва да ги подготвим за използване за нашите светодиоди. За този аспект не е нужно да импортираме никакви модули за това.

Първо, превръщаме келвина във Фаренхайт.

Правим това, като създаваме променлива с този синтаксис

City_TemperatureF = (City_TemperatureK - 273)*1.8 + 32

който се преобразува от Келвин в Фаренхайт (което наистина се преобразува от K -> C -> F)

Следва нашият weatherID. WeatherID е идентификационен номер, който Openweather предоставя, който ни разказва за метеорологичните условия на града.

openweathermap.org/weather-conditions Ето списък с тях.

Забелязахме, че всичко под номер 700 е някакъв вид валежи, затова просто проверихме дали кодът е под 700, за да видим дали вали.

def CheckRain (IdCode): ако IdCode <700: връщане True Иначе: return False

С това имаме нашите две променливи, подготвени за използване с нашите Raspberry PI щифтове и LED диоди.

Стъпка 4: Кодиране: Използване на RPi. GPIO и LED диоди

Кодиране: Използване на RPi. GPIO и LED диоди
Кодиране: Използване на RPi. GPIO и LED диоди

RaspberryPi идва с набор от мъжки щифтове, които можем да използваме за комуникация с множество електрически компоненти, които в този случай са LED диоди; това е подобно на Arduino и неговата система. Raspberry PI обаче е компютър с общо предназначение, за разлика от микроконтролер като Arduino. Така че, трябва да свършим малко повече работа, за да ги използваме. Това се състои в настройване на щифтовете на Raspberry Pi. Правим това, като използваме този код.

импортирайте RPi. GPIO като GPIO #Импортираме модула, за да можем да го използваме

#Настройте pinsGPIO.setmode (GPIO. BCM) GPIO.setwarnings (False)

#Пиновете, към които са включени светодиодите. Те могат да бъдат различни, ако го изградите, така че не забравяйте да сравнявате и променяте, когато е необходимо

Extreme_Hot_LED_PIN = 26 Hot_LED_PIN = 16

Extreme_Cold_LED_PIN = 5

Студено_LED_PIN = 6

Rain_LED_PIN = 23

#Преминаваме през всеки пин, като използваме командата.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.

Този код обаче би ни позволил да използваме само две състояния с LED, тоест включване и изключване. Нуждаем се обаче от него, за да можем да приглушим светлините. За да направим това, използваме Pulse Width Modulation.

Използване на модулация на ширината на импулса

Модулацията на ширината на импулса ни позволява да извеждаме аналогов сигнал с помощта на цифров щифт. По същество той включва и изключва източника на сигнал с висока скорост, която е средно до определено напрежение. RPi. GPIO ни позволява да използваме това, макар и с някакъв допълнителен код.

#Създаваме четири пинови обекта с помощта на командата GPIO. PWM, която приема номера на канал

#Второто число е броят на актуализациите в секунда

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)

За следващата стъпка ще трябва да знаете начина, по който актуализираме тези щифтове.

Актуализираме щифтовете с помощта на командата

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

ExtremeHotLED.start (x)

HotLED.start (x)

x в този случай би бил работният цикъл, който определя колко той пулсира. Той варира от 0-100, така че следващият код трябва да се основава на този факт.

Стъпка 5: Кодиране: Получаване на яркост на LED

Кодиране: Получаване на яркост на LED
Кодиране: Получаване на яркост на LED

Тъй като имаме четири различни светодиода, искаме да ги запалим в зависимост от това как. студено или горещо е в града на потребителя. Решихме да имаме четири етапа за водещите.

#Функции

def getmiddleleftled интензитет (Температура вF): #Ляво уравнение: y = -(50/20) x + 175 #Право уравнение: y = (50/20) x -75 връщане -(50/20)*ТемператураinF + 175

def getmiddlerightledintensity (TemperatureinF):

#Ляво уравнение: y = - (50/20) x + 175 #дясно уравнение: y = (50/20) x - 75 връщане (50/20)*температура inF - 75

def getextremeleftled интензитет (TemperatureinF):

#Ляво уравнение: y = - (100/30) x + 200 #дясно уравнение: y = (100/30) x - (400/3)

връщане -(100/30)*Температура inF + 200

def getextremerightled интензитет (TemperatureinF):

# Ляво уравнение: y = - (100/30) x + 200 # дясно уравнение: y = (100/30) x - (400/3)

връщане (100/30)*Температура inF - (400/3)

#Задаване на LED светлините

def GetLEDBrightness (temp):

ако temp <= 0: екстремно охладено = 100 охладено = 100 горещо = 0 крайно охладено = 0

печат ("Изключително студен светодиод:" + str (крайно охладено))

print ("Cold led:" + str (студено)) print ("Extreme hot LED" + str (extremehogether)) print ("Hot led:" + str (hotled))

ExtremeColdLED.start (екстремно охладено)

ColdLED.start (охладено)

ExtremeHotLED.start (екстремно заселен)

HotLED.start (горещо) elif temp> = 100: екстремно охладено = 0 охладено = 0 горещо = 100 крайно охладено = 100

печат ("Изключително студен светодиод:" + str (крайно охладено))

print ("Cold led:" + str (студено)) print ("Extreme hot LED" + str (extremehogether)) print ("Hot led:" + str (hotled))

ExtremeColdLED.start (екстремно охладено)

ColdLED.start (охладено)

ExtremeHotLED.start (екстремно заселен)

HotLED.start (hotled) elif 0 <temp <= 30: extremecoldled = getextremeleftledintensity (temp) - 100 охладено = 100 hotled = 0 extremehought = 0

печат ("Изключително студен светодиод:" + str (крайно охладено))

print ("Cold led:" + str (студено)) print ("Extreme hot LED" + str (extremehogether)) print ("Hot led:" + str (hotled))

ExtremeColdLED.start (екстремно охладено)

ColdLED.start (охладено)

ExtremeHotLED.start (екстремно заселен)

HotLED.start (горещо) elif 100> темп.

печат ("Изключително студен светодиод:" + str (крайно охладено))

print ("Cold led:" + str (студено)) print ("Extreme hot LED" + str (extremehogether)) print ("Hot led:" + str (hotled))

ExtremeColdLED.start (екстремно охладено)

ColdLED.start (охладено)

ExtremeHotLED.start (екстремно заселен)

HotLED.start (hotled) elif 30 <temp <50: extremecoldled = 0 coldled = getmiddleleftledintensity (temp) hotled = 100 - охладено extremehought = 0

печат ("Изключително студен светодиод:" + str (крайно охладено))

print ("Cold led:" + str (студено)) print ("Extreme hot LED" + str (extremehogether)) print ("Hot led:" + str (hotled))

ExtremeColdLED.start (екстремно охладено)

ColdLED.start (охладено)

ExtremeHotLED.start (екстремно заселен)

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

охладено = 100 - изгорено

екстремно охладено = 0

печат ("Изключително студен светодиод:" + str (крайно охладено))

print ("Cold led:" + str (студено)) print ("Extreme hot LED" + str (extremehogether)) print ("Hot led:" + str (hotled))

ExtremeColdLED.start (екстремно охладено)

ColdLED.start (охладено)

ExtremeHotLED.start (екстремно заселен)

HotLED.start (горещо) elif temp == 50: екстремно охладено = 0 охладено = 50 горещо = 50 крайно охладено = 0

печат ("Изключително студен светодиод:" + str (крайно охладено))

print ("Cold led:" + str (студено)) print ("Extreme hot LED" + str (extremehogether)) print ("Hot led:" + str (hotled))

ExtremeColdLED.start (екстремно охладено)

ColdLED.start (охладено)

ExtremeHotLED.start (екстремно заселен)

HotLED.start (горещо)

Добре, тази част от кода е наистина дълга. Също така е доста трудно да се обясни. По същество горният код разглежда температурата във Фаренхайт и определя дали тя е в набор от диапазони. В зависимост от диапазоните, той дава номер за всеки светодиод и неговата яркост и след това задава яркостта чрез извикване на командата start (). Това е бързото обяснение. Ако е достатъчно, препоръчвам ви да преминете към следващата стъпка, но ако искате да видите дългото и досадно обяснение, продължете да четете.

Когато програмирахме, решихме, че най -лесният начин да получим стойност от температура е под формата на математическа функция. И така, ние създадохме графика в GeoGebra, за да представим каква е връзката между нашата температура и нашата яркост на светодиода; причината да надхвърля 100 е, че допълнителното ще отиде във втория водещ. Ние обаче се сблъскахме с въпроса за получаване на една функция, която да картографира всички тези точки в една функция. Мислехме, че можем да използваме парабола, но решихме просто да се задоволим с използването на поредица от инструкции if. По същество целият този код е частична функция.

Функциите в горната част са съответното уравнение на линии. След като определим къде е температурата на графиката, я пропускаме през тази функция, получаваме яркостта и я предаваме на светодиодите.

Стъпка 6: Кодиране: Последни стъпки

Накрая добавяме това твърдение в края.

опитвам:

while (True): GetLEDBrightness (City_TemperatureF) GetRainLED (WeatherID) time.sleep (10) с изключение на KeyboardInterrupt: quit ()

Изявленията try и except ни позволяват да излезем от кода с помощта на клавишна комбинация; така или иначе, ще трябва да изключим Raspberry Pi, за да рестартираме кода. След това имаме цикъл while, който работи завинаги. Актуализираме светодиодите, както и актуализираме светодиода за дъжд. Ние правим пауза за десет секунди; OpenWeather позволява само 60 обаждания за данни в минута, а 10 секунди са много актуализации.

И с това нашият код е завършен. По -долу е завършеният код.

RaspberryPIWeatherStation.py

импортни запитвания
importRPi. GPIOasGPIO
importjson
importtime
#Openweather idCodes под 700 са всички валежи
defCheckRain (IdCode):
ifIdCode <700:
returnTrue
иначе:
returnFalse
defgetmiddleleftled интензитет (TemperatureinF):
#Ляво уравнение: y =-(50/20) x + 175
#Право уравнение: y = (50/20) x - 75
връщане- (50/20)*Температура inF+175
defgetmiddlerightled интензивност (TemperatureinF):
#Ляво уравнение: y =-(50/20) x + 175
#Право уравнение: y = (50/20) x - 75
връщане (50/20)*Температура вF-75
defgetex крайно ляв интензитет (TemperatureinF):
#Ляво уравнение: y = -(100/30) x + 200
#RightEquation: y = (100/30) x - (400/3)
връщане- (100/30)*Температура inF+200
defgetex изключително висок интензитет (TemperatureinF):
# Ляво уравнение: y = -(100/30) x + 200
# Дясно уравнение: y = (100/30) x - (400/3)
връщане (100/30)*Температура inF- (400/3)
#GPIO Настройка
GPIO.setmode (GPIO. BCM)
GPIO.setwarnings (False)
#Щифтове
Extreme_Hot_LED_PIN = 26
Hot_LED_PIN = 16
Extreme_Cold_LED_PIN = 5
Студено_LED_PIN = 6
Rain_LED_PIN = 23
#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_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:
екстремно охладено = 100
охладено = 100
горещо = 0
екстремно затворен = 0
печат ("Изключително студен светодиод:"+str (крайно охладено))
print ("Cold led:"+str (студено))
печат ("Изключително горещ светодиод"+str (екстремно забит))
print ("Hot LED:"+str (hotled))
ExtremeColdLED.start (екстремно охладено)
ColdLED.start (охладено)
ExtremeHotLED.start (екстремно заселен)
HotLED.start (горещо)
eliftemp> = 100:
екстремно охладено = 0
охладено = 0
горещо = 100
екстремно забити = 100
печат ("Изключително студен светодиод:"+str (крайно охладено))
print ("Cold led:"+str (студено))
печат ("Изключително горещ светодиод"+str (екстремно забит))
print ("Hot led:"+str (hotled))
ExtremeColdLED.start (екстремно охладено)
ColdLED.start (охладено)
ExtremeHotLED.start (екстремно заселен)
HotLED.start (горещо)
elif0 <temp <= 30:
екстремно охладено = getextremeleftledintensity (temp) -100
охладено = 100
горещо = 0
екстремно затворен = 0
печат ("Изключително студен светодиод:"+str (крайно охладено))
print ("Cold led:"+str (студено))
печат ("Изключително горещ светодиод"+str (екстремно забит))
print ("Hot led:"+str (hotled))
ExtremeColdLED.start (екстремно охладено)
ColdLED.start (охладено)
ExtremeHotLED.start (екстремно заселен)
HotLED.start (горещо)
elif100> temp> = 70:
екстремно охладено = 0
охладено = 0
горещо = 100
екстремно сгъстен = getextremerightledintensity (temp) -100
печат ("Изключително студен светодиод:"+str (крайно охладено))
print ("Cold led:"+str (студено))
печат ("Екстремно горещ светодиод"+str (екстремно забит))
print ("Hot led:"+str (hotled))
ExtremeColdLED.start (екстремно охладено)
ColdLED.start (охладено)
ExtremeHotLED.start (екстремно заселен)
HotLED.start (горещо)
elif30 <temp <50:
екстремно охладено = 0
студено = getmiddleleftled интензивност (температура)
горещ = 100-охладен
екстремно затворен = 0
печат ("Изключително студен светодиод:"+str (крайно охладено))
print ("Cold led:"+str (студено))
печат ("Изключително горещ светодиод"+str (екстремно забит))
print ("Hot led:"+str (hotled))
ExtremeColdLED.start (екстремно охладено)
ColdLED.start (охладено)
ExtremeHotLED.start (екстремно заселен)
HotLED.start (горещо)
elif50 <temp <70:
hotled = getmiddlerightledintensity (temp)
екстремно затворен = 0
охладен = 100-горещ
екстремно охладено = 0
печат ("Изключително студен светодиод:"+str (крайно охладено))
print ("Cold led:"+str (студено))
печат ("Екстремно горещ светодиод"+str (екстремно забит))
print ("Hot LED:"+str (hotled))
ExtremeColdLED.start (екстремно охладено)
ColdLED.start (охладено)
ExtremeHotLED.start (екстремно заселен)
HotLED.start (горещо)
eliftemp == 50:
екстремно охладено = 0
охладено = 50
горещ = 50
екстремно затворен = 0
печат ("Изключително студен светодиод:"+str (крайно охладено))
print ("Cold led:"+str (студено))
печат ("Изключително горещ светодиод"+str (екстремно забит))
print ("Hot led:"+str (hotled))
ExtremeColdLED.start (екстремно охладено)
ColdLED.start (охладено)
ExtremeHotLED.start (екстремно заселен)
HotLED.start (горещо)
defGetRainLED (idCode):
ifCheckRain (idCode):
GPIO.изход (Rain_LED_PIN, GPIO. HIGH)
иначе:
GPIO.изход (Rain_LED_PIN, GPIO. LOW)
#Api информация: Repalce API ключ с вашия api ключ oepnweather
openweather_api_key = "460a23f27ff324ef9ae743c7e9c32d7e"
base_call = "https://api.openweathermap.org/data/2.5/weather?q="
print ("Въведете град!")
city_name = вход ()
full_call = base_call+city_name+"& appid ="+openweather_api_key
#Получаване на метеорологични данни
Отговор = 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#Конвертиране в Фаренхайт
#LED/GPIO неща
print ("K:"+str (City_TemperatureK))
print ("F:"+str (City_TemperatureF))
печат (WeatherID)
опитвам:
while (Вярно):
GetLEDBrightness (City_TemperatureF)
GetRainLED (WeatherID)
time.sleep (10)
с изключение на KeyboardInterrupt:
напусни ()

вижте rawRaspberryPIWeatherStation.py, хоствано с ❤ от GitHub

Стъпка 7: Изграждане и окабеляване

Уау! След цялото това кодиране стигаме до сградата, което е значително по -лесно. Поради заповедите за короната да останем у дома, не успяхме да стигнем до много от инструментите, които очаквахме да имаме в училище. Така че, тази част е малко по -проста от това, което планирахме. Самите специфики също са гъвкави. Първо нарисувахме правоъгълник върху дървена дъска. Конкретният размер всъщност няма особено значение, тъй като той просто служи като платформа за поставяне на светодиоди и електроника.

След това пробихме пет 1/8 в дупки в нашето парче дърво.

След това изрязахме правоъгълника от дъската, който да използваме като наша платформа за нашата електроника.

(Това беше, когато започнахме; намерихме по -голям трион!)

След това натискаме анодните и катодните щифтове на проводника в отворите; светодиодите трябва да са поставени на върха, а техните крушки да стърчат; следете кой крак е по -дълъг и по -къс. След това бяхме настроени да започнем да запояваме заедно жици. Първо запояваме резисторите към анодния крак на светодиода (по -дългия крак).

След това запояваме катодните крака на светодиодите към един меден проводник, който ще използваме като земя. Трябва да изглежда така.

След като направим това, запояваме мъжките краища на джъмперните кабели женски-мъжки към крайните краища на всеки резистор и медния заземен проводник. След като направим това, можем да започнем да включваме проводниците в малиновите PI GPIO щифтове. Ето диаграма! Имайте предвид обаче, че пиновете са тези в кода, засегнат по -рано.

След като всичко това е свързано, всичко, което трябва да направите, е да поставите Python файла на малиновия Pi и да отворите терминала. стартирайте "python3 RaspberryPIWeatherStation.py" и след това направете както показва.

Стъпка 8: Демонстрация и заключение

Благодаря, че прочетохте докрай! Ще прикача скрипта на python по -долу! Ако имаше неща, които бихме могли да добавим, вероятно би било …

1. Поддръжка за различни видове въвеждане (градове, географски точки и т.н.)

2. Поддръжка за повече информация за времето

3. Добавете малък екран, за да покажете информация

Кажете ни вашите мисли! Това беше забавен проект за изграждане. Научихме много за заявки и получаване на интернет документи с помощта на python, а също така научихме много за използването на запояване.

Препоръчано: