Оглавление:

Светодиодная метеостанция Raspberry PI: 8 шагов
Светодиодная метеостанция Raspberry PI: 8 шагов

Видео: Светодиодная метеостанция Raspberry PI: 8 шагов

Видео: Светодиодная метеостанция Raspberry PI: 8 шагов
Видео: Raspberry Pi - Что нужно знать? Что нужно иметь? Достаточно купить только плату? 2024, Июль
Anonim
Светодиодная метеостанция Raspberry PI
Светодиодная метеостанция Raspberry PI

Мы создали светодиодную метеостанцию Raspberry PI. Он сообщает пользователю, насколько жарко и холодно в городе, за счет включения и выключения светодиодов. У него также есть светодиод, чтобы сказать им, идет ли дождь в городе, который они набрали.

Создано Майклом Эндрюсом и Тио Марелло.

Запасы

Инструменты

  1. Паяльник
  2. Дремель
  3. Пила

Материалы

  1. Raspberry Pi 3 B + ~ 40 долларов ~ 30 долларов
  2. Перемычки между мужчинами и женщинами ~ 7 долларов
  3. 3 синих и 2 красных светодиода ~ 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 # Здесь мы получаем город пользователя в виде текста print ("Введите город!") city_name = input () # Здесь мы собрали адрес, который мы вставим в request.get для получения данных о погоде full_call = base_call + city_name + "& appid =" + openweather_api_key # Наконец, мы вызываем request.get с нашим адресом, а затем конвертируем его в файл json Response = requests.get (full_call) WeatherData = Response.json () # Файлы JSON содержат различные переменные, к которым мы можем получить доступ с помощью этого синтаксиса # Здесь мы получаем идентификатор погоды и температуру в Кельвинах города, введенного пользователем в WeatherID = WeatherData ["погода"] [0] ["id"] City_TemperatureK = WeatherData ["main"] ["temp"]

Здесь у нас есть код, который получает данные о погоде. Запросы в форме request.get принимают адрес веб-сайта и возвращают нам файл с этого веб-сайта. OpenWeather дает нам адрес, по которому можно позвонить, чтобы предоставить данные о погоде в форме json. Мы собираем адрес, который вставляем в запросы и получаем обратно json-файл. Затем мы создаем две переменные и назначаем их температуре и погодным условиям города пользователя.

Итак, теперь с этим кодом у нас есть две переменные. У нас есть weatherID и температура в градусах Кельвина

Шаг 3. Кодирование: использование этих данных

Теперь, когда у нас есть эти две переменные, мы должны подготовить их для использования в наших светодиодах. Для этого аспекта нам не нужно импортировать для этого какие-либо модули.

Сначала мы переводим кельвин в градусы Фаренгейта.

Мы делаем это, создавая переменную с таким синтаксисом

Город_ТемператураF = (Город_ТемператураK - 273) * 1,8 + 32

который преобразует из Кельвина в Фаренгейт (что на самом деле преобразуется из K -> C -> F)

Далее идет наш weatherID. WeatherID - это идентификатор, предоставляемый Openweather, который сообщает нам о погодных условиях в городе.

openweathermap.org/weather-conditions Вот их список.

Мы заметили, что все, что ниже числа 700, было чем-то вроде осадков, поэтому мы просто проверили, был ли код ниже 700, чтобы узнать, идет ли дождь.

def CheckRain (IdCode): если IdCode <700: вернуть True, иначе: вернуть False

При этом у нас есть две переменные, подготовленные для использования с нашими выводами Raspberry PI и светодиодными диодами.

Шаг 4: Кодирование: Использование RPi. GPIO и светодиодных диодов

Кодирование: использование RPi. GPIO и светодиодных диодов
Кодирование: использование RPi. GPIO и светодиодных диодов

RaspberryPi поставляется с набором штыревых контактов, которые мы можем использовать для связи с множеством электрических компонентов, которыми в данном случае являются светодиоды; это похоже на Arduino и его систему. Однако Raspberry PI - это компьютер общего назначения, в отличие от микроконтроллера, такого как Arduino. Итак, нам нужно немного поработать, чтобы их использовать. Это состоит из установки контактов на Raspberry Pi. Мы делаем это с помощью этого кода.

import RPi. GPIO as GPIO # Мы импортируем модуль, чтобы мы могли его использовать

# Настроить пины GPIO.setmode (GPIO. BCM) GPIO.setwarnings (Ложь)

# Контакты, в которые вставлены светодиоды. Они могут отличаться, если вы его построите, поэтому обязательно сравнивайте и меняйте при необходимости.

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.setup (Extreme_Hot_LED_PIN), GPIO.setup (Extreme_Hot_LED_PIN), GPIO.setup (Extreme_Hot_LED_PIN)

Однако этот код позволит нам использовать только два состояния светодиода, то есть включено и выключено. Однако он нужен нам, чтобы можно было приглушать свет. Для этого мы используем широтно-импульсную модуляцию.

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

Широтно-импульсная модуляция позволяет нам выводить аналоговый сигнал с помощью цифрового вывода. По сути, он включает и выключает источник сигнала с высокой скоростью, которая в среднем достигает определенного напряжения. 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 четыре этапа.

# Функции

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

# Левое уравнение: y = - (50/20) x + 175 # Правое уравнение: y = (50/20) x - 75 return (50/20) * TemperatureinF - 75

def getextremeleftledintensity (TemperatureinF):

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

возврат - (100/30) * Температура, inF + 200

def getextremerightledintensity (TemperatureinF):

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

возврат (100/30) * Температура inF - (400/3)

# Настройка светодиодного освещения

def GetLEDBrightness (темп):

если темп <= 0: экстремально холодный = 100 холодный = 100 горячий = 0 экстремально горячий = 0

print ("Очень холодный светодиод:" + str (extremecoldled))

print ("Холодный светодиод:" + str (холодный)) print ("Очень горячий светодиод" + str (extremehotled)) print ("Горячий светодиод:" + str (hotled))

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

ColdLED.start (холодный)

ExtremeHotLED.start (extremehotled)

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

print ("Очень холодный светодиод:" + str (extremecoldled))

print ("Холодный светодиод:" + str (холодный)) print ("Очень горячий светодиод" + str (extremehotled)) print ("Горячий светодиод:" + str (hotled))

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

ColdLED.start (холодный)

ExtremeHotLED.start (extremehotled)

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

print ("Очень холодный светодиод:" + str (extremecoldled))

print ("Холодный светодиод:" + str (холодный)) print ("Очень горячий светодиод" + str (extremehotled)) print ("Горячий светодиод:" + str (hotled))

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

ColdLED.start (холодный)

ExtremeHotLED.start (extremehotled)

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

print ("Очень холодный светодиод:" + str (extremecoldled))

print ("Холодный светодиод:" + str (холодный)) print ("Очень горячий светодиод" + str (extremehotled)) print ("Горячий светодиод:" + str (hotled))

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

ColdLED.start (холодный)

ExtremeHotLED.start (extremehotled)

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

print ("Очень холодный светодиод:" + str (extremecoldled))

print ("Холодный светодиод:" + str (холодный)) print ("Очень горячий светодиод" + str (extremehotled)) print ("Горячий светодиод:" + str (hotled))

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

ColdLED.start (холодный)

ExtremeHotLED.start (extremehotled)

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

coldled = 100 - горячий

Extremecoldled = 0

print ("Очень холодный светодиод:" + str (extremecoldled))

print ("Холодный светодиод:" + str (холодный)) print ("Очень горячий светодиод" + str (extremehotled)) print ("Горячий светодиод:" + str (hotled))

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

ColdLED.start (холодный)

ExtremeHotLED.start (extremehotled)

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

print ("Очень холодный светодиод:" + str (extremecoldled))

print ("Холодный светодиод:" + str (холодный)) print ("Очень горячий светодиод" + str (extremehotled)) print ("Горячий светодиод:" + str (hotled))

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

ColdLED.start (холодный)

ExtremeHotLED.start (extremehotled)

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

importrequests
importRPi. GPIOasGPIO
importjson
время импорта
#Openweather idCodes меньше 700 - все осадки.
defCheckRain (IdCode):
ifIdCode <700:
returnTrue
еще:
returnFalse
defgetmiddleleftledintensity (TemperatureinF):
# Левое уравнение: y = - (50/20) x + 175
# Правое уравнение: y = (50/20) x - 75
возврат- (50/20) * Температура inF + 175
defgetmiddlerightledintensity (TemperatureinF):
# Левое уравнение: y = - (50/20) x + 175
# Правое уравнение: y = (50/20) x - 75
возврат (50/20) * Температура inF-75
defgetextremeleftledintensity (TemperatureinF):
#LeftEquation: y = - (100/30) x + 200
#RightEquation: y = (100/30) x - (400/3)
возврат- (100/30) * Температура, inF + 200
defgetextremerightledintensity (TemperatureinF):
# LeftEquation: y = - (100/30) x + 200
# RightEquation: y = (100/30) x - (400/3)
возврат (100/30) * Температура inF- (400/3)
#GPIO Настройка
GPIO.setmode (GPIO. BCM)
GPIO.setwarnings (Ложь)
# Булавки
Extreme_Hot_LED_PIN = 26
Hot_LED_PIN = 16
Extreme_Cold_LED_PIN = 5
Холодный_LED_PIN = 6
Rain_LED_PIN = 23
# Настройка булавки
GPIO.setup (Rain_LED_PIN, GPIO. OUT)
GPIO.setup (Extreme_Cold_LED_PIN, GPIO. OUT)
GPIO.setup (Холодный_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 (темп):
iftemp <= 0:
Extremecoldled = 100
холодный = 100
hotled = 0
extremehotled = 0
print ("Очень холодный светодиод:" + str (extremecoldled))
print ("Холодный светодиод:" + str (холодный))
print ("Extreme hot led" + str (extremehotled))
print ("Горячий светодиод:" + str (hotled))
ExtremeColdLED.start (экстремально холодный)
ColdLED.start (холодный)
ExtremeHotLED.start (extremehotled)
HotLED.start (горячий)
eliftemp> = 100:
Extremecoldled = 0
холодный = 0
hotled = 100
extremehotled = 100
print ("Очень холодный светодиод:" + str (extremecoldled))
print ("Холодный светодиод:" + str (холодный))
print ("Extreme hot led" + str (extremehotled))
print ("Горячий светодиод:" + str (hotled))
ExtremeColdLED.start (экстремально холодный)
ColdLED.start (холодный)
ExtremeHotLED.start (extremehotled)
HotLED.start (горячий)
elif0 <темп <= 30:
extremecoldled = getextremeleftledintensity (темп) -100
холодный = 100
hotled = 0
extremehotled = 0
print ("Очень холодный светодиод:" + str (extremecoldled))
print ("Холодный светодиод:" + str (холодный))
print ("Extreme hot led" + str (extremehotled))
print ("Горячий светодиод:" + str (hotled))
ExtremeColdLED.start (экстремально холодный)
ColdLED.start (холодный)
ExtremeHotLED.start (extremehotled)
HotLED.start (горячий)
elif100> температура> = 70:
Extremecoldled = 0
холодный = 0
hotled = 100
extremehotled = getextremerightledintensity (темп) -100
print ("Очень холодный светодиод:" + str (extremecoldled))
print ("Холодный светодиод:" + str (холодный))
print ("Extreme hot led" + str (extremehotled))
print ("Горячий светодиод:" + str (hotled))
ExtremeColdLED.start (экстремально холодный)
ColdLED.start (холодный)
ExtremeHotLED.start (extremehotled)
HotLED.start (горячий)
elif30 <темп <50:
Extremecoldled = 0
coldled = getmiddleleftledintensity (темп)
hotled = 100-холодный
extremehotled = 0
print ("Очень холодный светодиод:" + str (extremecoldled))
print ("Холодный светодиод:" + str (холодный))
print ("Extreme hot led" + str (extremehotled))
print ("Горячий светодиод:" + str (hotled))
ExtremeColdLED.start (экстремально холодный)
ColdLED.start (холодный)
ExtremeHotLED.start (extremehotled)
HotLED.start (горячий)
elif50 <темп <70:
hotled = getmiddlerightledintensity (темп)
extremehotled = 0
coldled = 100 разогретый
Extremecoldled = 0
print ("Очень холодный светодиод:" + str (extremecoldled))
print ("Холодный светодиод:" + str (холодный))
print ("Extreme hot led" + str (extremehotled))
print ("Горячий светодиод:" + str (hotled))
ExtremeColdLED.start (экстремально холодный)
ColdLED.start (холодный)
ExtremeHotLED.start (extremehotled)
HotLED.start (горячий)
eliftemp == 50:
Extremecoldled = 0
холодный = 50
hotled = 50
extremehotled = 0
print ("Очень холодный светодиод:" + str (extremecoldled))
print ("Холодный светодиод:" + str (холодный))
print ("Extreme hot led" + str (extremehotled))
print ("Горячий светодиод:" + str (hotled))
ExtremeColdLED.start (экстремально холодный)
ColdLED.start (холодный)
ExtremeHotLED.start (extremehotled)
HotLED.start (горячий)
defGetRainLED (idCode):
ifCheckRain (idCode):
GPIO.output (Rain_LED_PIN, GPIO. HIGH)
еще:
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="
print («Типа в городе!»)
city_name = input ()
full_call = base_call + city_name + "& appid =" + openweather_api_key
# Получение данных о погоде
Ответ = requests.get (full_call)
WeatherData = Response.json ()
WeatherID = WeatherData ["погода"] [0] ["идентификатор"]
City_TemperatureK = WeatherData ["main"] ["temp"]
Город_ТемператураF = (Город_ТемператураK-273) * 1,8 + 32 # Конвертировать в градусы Фаренгейта
# LED / GPIO вещи
print ("K:" + str (Город_ТемператураK))
print ("F:" + str (City_TemperatureF))
печать (WeatherID)
пытаться:
в то время как (Истина):
GetLEDBrightness (Город_ТемператураF)
GetRainLED (WeatherID)
время сна (10)
exceptKeyboardInterrupt:
покидать()

просмотреть rawRaspberryPIWeatherStation.py, размещенный на ❤ от GitHub

Шаг 7: Сборка и подключение

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

Затем мы просверлили в дереве пять отверстий на 1/8 дюйма.

Затем мы вырезаем прямоугольник из доски, чтобы использовать его в качестве платформы для нашей электроники.

(Это было тогда, когда мы начали; мы нашли пилу побольше!)

Затем мы вставляем анодный и катодный штырьки светодиода в отверстия; светодиоды должны лежать сверху, их лампочки торчат наружу; отслеживайте, какая нога длиннее, а какая короче. Затем мы приступили к пайке проводов. Сначала припаиваем резисторы к анодной ножке светодиода (более длинной ножке).

Затем мы припаиваем катодные ножки светодиодов к одному медному проводу, который мы будем использовать в качестве заземления. Должно получиться вот так.

После этого мы припаиваем концы папа-вилка перемычек к концевым концам каждого резистора и медному заземляющему проводу. Как только мы это сделаем, мы можем начать подключать провода к контактам Raspberry PI GPIO. Вот диаграмма! Однако обратите внимание, что контакты - это те, которые указаны в ранее затронутом коде.

После того, как вы все это подключили, теперь все, что вам нужно сделать, это загрузить файл Python на Raspberry Pi и открыть терминал. запустите "python3 RaspberryPIWeatherStation.py", а затем сделайте, как показано.

Шаг 8: демонстрация и заключение

Спасибо, что дочитали до конца! Прикреплю скрипт на python ниже! Если бы мы могли что-то добавить, это, вероятно, было бы…

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

2. Поддержка получения дополнительной информации о погоде.

3. Добавьте небольшой экран для отображения информации.

Сообщите нам свои мысли! Создавать этот проект было весело. Мы много узнали о запросах и получении интернет-документов с помощью Python, а также узнали много нового об использовании пайки.

Рекомендуемые: