資料介紹
描述
問題
我必須不斷調(diào)整我的加熱器以保持合適的溫度。此外,有時(shí)我離開家時(shí)忘記關(guān)掉暖氣。
解決方案
設(shè)置溫度和運(yùn)動(dòng)傳感器以捕獲環(huán)境數(shù)據(jù)。創(chuàng)建一個(gè)網(wǎng)絡(luò)應(yīng)用程序,允許用戶設(shè)置他們想要的溫度,這將控制加熱器的關(guān)閉或打開方式。
這是一個(gè)圖表,顯示了一切將如何交互。
第 1 步 - 使用 Raspberry Pi 設(shè)置傳感器
獲得 DHT11 溫度和 PIR 運(yùn)動(dòng)傳感器后,是時(shí)候?qū)⑵溥B接到 Raspberry Pi。
以下是如何連接 DHT11 溫度傳感器。我放棄了面包板并使用引腳 1(3V3)而不是引腳 2(5V)供電,從而偏離了圖表。
以下是如何連接 PIR 運(yùn)動(dòng)傳感器。LED 連接是可選的。我通過將 Gnd 連接到引腳 20(接地)而不是引腳 6(接地),輸出到引腳 36(GPIO 16)而不是引腳 8(GPIO 14)和 LED 連接到引腳 40(GPIO 21)而不是引腳 10(GPIO 15)。
兩者連接時(shí)的最終結(jié)果:
這里我的 PIR 傳感器連接到 GPIO 16,DHT11 連接到 GPIO4。溫度傳感器應(yīng)放置在您想要獲得正確溫度的位置,而運(yùn)動(dòng)傳感器應(yīng)朝向您通常所在的位置。
第 2 步 - 編寫代碼來測(cè)試傳感器
下面是測(cè)試運(yùn)動(dòng)傳感器的 Python 代碼(不要忘記在此處安裝 RPi.GPIO https://pypi.org/project/RPi.GPIO/ ):
import RPi.GPIO as GPIO
from time import sleep
GPIO.setmode(GPIO.BCM)
motion_pin = 16
led_pin = 21
GPIO.setup(motion_pin, GPIO.IN)
GPIO.setup(led_pin, GPIO.OUT)
print("Sensor initializing . . .")
sleep(2)
try:
no_motion_count = 0
while True:
if GPIO.input(motion_pin) == True:
print("Motion Detected!")
GPIO.output(led_pin, True)
sleep(4)
GPIO.output(led_pin, False)
no_motion_count = 0
else:
no_motion_count += 1
print(f"No Motion Count: {no_motion_count}")
sleep(1)
except KeyboardInterrupt:
pass
finally:
GPIO.output(led_pin, False)
GPIO.cleanup()
下面是測(cè)試溫度傳感器的 Python 代碼(不要忘記在此處安裝 Adafruit_DHT https://pypi.org/project/Adafruit_Python_DHT/ ):
import Adafruit_DHT
from time import sleep
temperature_humidity_sensor = Adafruit_DHT.DHT11
gpio_pin = 4
try:
while True:
humidity, temperature = Adafruit_DHT.read_retry(
temperature_humidity_sensor, gpio_pin)
if humidity is not None and temperature is not None:
print(
'Temp={0:0.1f}*C Humidity={1:0.1f}%'.format(temperature, humidity))
else:
print('Failed to get reading. Try again!')
sleep(0.5)
except KeyboardInterrupt:
pass
這是兩者結(jié)合的代碼:
import RPi.GPIO as GPIO
import Adafruit_DHT
from time import sleep
GPIO.setmode(GPIO.BCM)
# Motion
motion_pin = 16
led_pin = 21
no_motion_count = 0
GPIO.setup(motion_pin, GPIO.IN)
GPIO.setup(led_pin, GPIO.OUT)
def handle_motion(no_motion_count):
if GPIO.input(motion_pin) == True:
print("Motion Detected!")
GPIO.output(led_pin, True)
sleep(4)
GPIO.output(led_pin, False)
no_motion_count = 0
return 0
else:
return no_motion_count + 1
# Temperature + Humidity
temperature_humidity_sensor = Adafruit_DHT.DHT11
gpio_pin = 4
def handle_temperature():
humidity, temperature = Adafruit_DHT.read_retry(
temperature_humidity_sensor, gpio_pin)
if humidity is not None and temperature is not None:
print(
'Temperature = {0:0.1f}*C Humidity = {1:0.1f}%'.format(temperature, humidity))
return temperature
else:
print('Failed to read Temperature/Humidity')
# Run Program
print("Sensor initializing . . .")
sleep(5)
try:
no_motion_count = 0
desired_temperature = 28
desired_temperature_margin = 2
while True:
temperature = handle_temperature()
no_motion_count = handle_motion(no_motion_count)
if no_motion_count >= 20:
print(f"No Human Detected.")
elif temperature > desired_temperature + desired_temperature_margin:
print(f"Temperature Too High")
elif temperature < desired_temperature - desired_temperature_margin:
print(f"Temperature Too Low")
else:
print(f"Temperature Just Right")
print(f"No Motion Count: {no_motion_count}")
sleep(0.25)
except KeyboardInterrupt:
pass
finally:
GPIO.output(led_pin, False)
GPIO.cleanup()
第 3 步 - 開發(fā) Flask API 以公開傳感器數(shù)據(jù)
在我們可以讓傳感器工作之后,它的服務(wù)時(shí)間是通過一個(gè) API,在本例中是一個(gè) Flask API。下面是重要的代碼,但請(qǐng)參考我的 GitHub 存儲(chǔ)庫(kù)https://github.com/sometheasiekswx/smart-heater-api-flask以查看所有代碼(不要忘記在此處安裝 Flask https://flask .palletsprojects.com/en/2.0.x/quickstart/和 Flask-CORS 在這里https://flask-cors.readthedocs.io/en/latest/ ):
from operator import itemgetter
from signal import signal, SIGINT
from sys import exit
from time import sleep
import RPi.GPIO as GPIO
from Adafruit_DHT import DHT11, read_retry
from flask import Flask
from flask_cors import CORS
GPIO.setmode(GPIO.BCM)
# Motion
motion_pin = 16
led_pin = 21
no_motion_count = 0
GPIO.setup(motion_pin, GPIO.IN)
GPIO.setup(led_pin, GPIO.OUT)
# Temperature + Humidity
temperature_humidity_sensor = DHT11
gpio_pin = 4
# Run Program
print("Sensor initializing . . .")
sleep(5)
app = Flask(__name__)
cors = CORS(app, resources={r"/api/*": {"origins": "*"}})
no_motion_count = 0
desired_temperature = 28
desired_temperature_margin = 2
@app.route("/api/v1/temperature")
def get_temperature():
humidity, temperature = read_retry(
temperature_humidity_sensor, gpio_pin)
if humidity is not None and temperature is not None:
return str(temperature)
return 'Unknown'
@app.route("/api/v1/motion")
def get_motion():
if GPIO.input(motion_pin):
GPIO.output(led_pin, True)
return "true"
GPIO.output(led_pin, False)
return "false"
def has_no_empty_params(rule):
defaults = rule.defaults if rule.defaults is not None else ()
arguments = rule.arguments if rule.arguments is not None else ()
return len(defaults) >= len(arguments)
@app.cli.command()
def routes():
'Display registered routes'
rules = []
for rule in app.url_map.iter_rules():
methods = ','.join(sorted(rule.methods))
rules.append((rule.endpoint, methods, str(rule)))
sort_by_rule = itemgetter(2)
for endpoint, methods, rule in sorted(rules, key=sort_by_rule):
route = '{:50s} {:25s} {}'.format(endpoint, methods, rule)
print(route)
@app.route("/")
def main():
return """
Smart Heater API
Endpoint
Method
Rule
get_motion
GET
/api/v1/motion
get_temperature
GET
/api/v1/temperature
"""
def cleanup(signal, frame):
print('Closing API...')
GPIO.output(led_pin, False)
GPIO.cleanup()
exit(0)
signal(SIGINT, cleanup)
在 Raspberry Pi 上添加代碼后,以下是如何運(yùn)行代碼以及訪問在 Raspberry Pi 上設(shè)置的端點(diǎn)時(shí)應(yīng)該得到的結(jié)果(嘗試從同一網(wǎng)絡(luò)上的不同設(shè)備訪問端點(diǎn)以測(cè)試是否CORS 策略正常工作):
第 4 步 - 使用 IFTTT 設(shè)置智能插頭
此步驟將根據(jù)您碰巧選擇的支持 WI-FI 的智能插頭品牌而有所不同。對(duì)我來說,我選擇了Powertech Wi-Fi Smart Plug ,這需要我使用Smart Life應(yīng)用程序進(jìn)行設(shè)置。無論您使用哪種品牌,請(qǐng)按照說明連接插頭。然后,轉(zhuǎn)到IFTTT ,創(chuàng)建一個(gè)帳戶,然后搜索 IFTTT 與您的智能插頭應(yīng)用程序的集成。
設(shè)置兩個(gè)小程序。第一個(gè)觸發(fā)器是是否觸發(fā)了關(guān)閉加熱器的 GET 請(qǐng)求(事件名稱 temperature_high)。第二個(gè)觸發(fā)器是是否觸發(fā)了打開加熱器的 GET 請(qǐng)求(事件名稱 temperature_low)。
第 4 步 - 開發(fā) React 前端來控制一切
最后,我們將開發(fā)這個(gè)漂亮的前端:
我使用 ReactJs 和 TailWindCss 來創(chuàng)建 Web 應(yīng)用程序,因此它可以幫助您擁有這些技術(shù)的先前經(jīng)驗(yàn)。是幫助您入門的完美資源。您還可以使用您喜歡的任何其他框架(Angular、Laravel)或語(yǔ)言(HTML + CSS + JSS)來構(gòu)建網(wǎng)站。
共有三張卡: 1. 溫度傳感器,顯示當(dāng)前溫度,可以設(shè)置目標(biāo)溫度 2. 運(yùn)動(dòng)傳感器,我們可以看到是否檢測(cè)到任何運(yùn)動(dòng),如果太長(zhǎng)時(shí)間沒有檢測(cè)到運(yùn)動(dòng),我們可以自動(dòng)關(guān)閉加熱器 3. 加熱器狀態(tài)為關(guān)閉或開啟,也可手動(dòng)控制智能加熱器系統(tǒng)關(guān)閉。
這是我們從前端進(jìn)行 API 調(diào)用的示例:
import axios from 'axios';
const sensorsApi = axios.create({
baseURL: `http://${process.env.REACT_APP_API_HOST}:${process.env.REACT_APP_API_PORT}/api/v1/`,
});
const heaterApi = axios.create({
baseURL: `https://maker.ifttt.com/trigger/`,
});
export const turnOffHeater = async () => {
try {
await heaterApi.get(`temperature_high/with/key/${process.env.REACT_APP_IFTTT_WEBHOOK_KEY}`);
} catch (error) {
console.log(error.message);
}
}
export const turnOnHeater = async () => {
try {
await heaterApi.get(`temperature_low/with/key/${process.env.REACT_APP_IFTTT_WEBHOOK_KEY}`);
} catch (error) {
console.log(error.message);
}
}
export const getTemperature = async () => {
try {
const data = (await sensorsApi.get('temperature')).data;
return parseFloat(data);
} catch (error) {
console.log(sensorsApi)
console.log(error.message);
}
}
export const getMotion = async () => {
try {
const data = (await sensorsApi.get('motion')).data;
return data === 'true';
} catch (error) {
console.log(error.message);
}
}
這是我如何使用這些異步函數(shù)的示例。它還顯示加熱器將根據(jù)它是否低于或高于目標(biāo)溫度來打開和關(guān)閉。
import {useEffect, useState} from "react";
import {getMotion, getTemperature, turnOffHeater, turnOnHeater} from "../utils/api";
import {CronJob} from "cron";
function Devices() {
const [currentTemperature, setCurrentTemperature] = useState(0);
const [targetTemperature, setTargetTemperature] = useState(25);
const [targetTemperatureMargin] = useState(2);
const [heaterOn, setHeaterOn] = useState(false);
const handleTemperature = async () => {
const temperature = await getTemperature();
setCurrentTemperature(temperature);
console.log(currentTemperature, targetTemperature);
if (currentTemperature >= targetTemperature + targetTemperatureMargin && heaterOn) {
await turnOffHeater();
setHeaterOn(false);
} else if (currentTemperature <= targetTemperature - targetTemperatureMargin && !heaterOn) {
await turnOnHeater();
setHeaterOn(true);
}
}
const [jobTemperature] = useState(new CronJob("* * * * * *", handleTemperature()));
以下是運(yùn)動(dòng)邏輯的設(shè)置方式:
const handleMotion = async () => {
const newMotion = await getMotion();
if (newMotion === false) {
setNoMotion(noMotion + 1)
} else {
setNoMotion(0)
setMotion(true);
}
if (noMotion > 50) {
setMotion(false);
}
}
最后的想法
我在這里只展示重要的代碼,你可以在附件中找到整個(gè)前端和后端代碼庫(kù),以及完成這個(gè)項(xiàng)目所需的電子設(shè)備和傳感器。祝你好運(yùn)!
- PTC加熱器 REV1
- 康普茶加熱器開源分享
- 帶PID溫度控制的加熱器開源分享
- 脈沖感應(yīng)加熱器開源分享
- 煒固專業(yè)級(jí)單相加熱器斷線報(bào)警器US17資料 10次下載
- 加熱器短線報(bào)警器原理、分類和選型 5次下載
- 開源硬件-TIDA-01184-適用于座椅加熱器的智能電源開關(guān) PCB layout 設(shè)計(jì)
- 透明加熱器的應(yīng)用
- 浸沒式汽水混合加熱器
- 國(guó)產(chǎn)300MW高壓加熱器泄漏原因分析及預(yù)防措施
- 超臨界高壓加熱器研制
- 大客車液體加熱器安裝要點(diǎn)
- 風(fēng)暖加熱器油煙味產(chǎn)生的原因及其改進(jìn)方法
- 國(guó)內(nèi)外汽車燃油加熱器技術(shù)比較及發(fā)展
- 實(shí)用高精度智能恒溫加熱器系統(tǒng)設(shè)計(jì)
- 功率放大器在微型加熱器中的應(yīng)用 941次閱讀
- 【電磁兼容技術(shù)案例分享】某車載PTC加熱器輻射發(fā)射低頻整改案例 1322次閱讀
- 使用MOSFET作為恒溫加熱器 1154次閱讀
- 電烙鐵的加熱器的結(jié)構(gòu)組成與溫度控制方法分析 9294次閱讀
- 低壓加熱器工作原理_低壓加熱器的作用 1.8w次閱讀
- 恒溫加熱器的工作原理_恒溫加熱器保養(yǎng) 1.8w次閱讀
- 汽車駐車加熱器的工作原理詳解 3.5w次閱讀
- 如何正確使用防爆電加熱器 4000次閱讀
- 電加熱器的分類及對(duì)比 9637次閱讀
- 一文了解電加熱器是什么 5969次閱讀
- 電加熱器功率計(jì)算方法 6w次閱讀
- 簡(jiǎn)易加熱器制作 1.7w次閱讀
- PTC加熱器原理及功能 23.6w次閱讀
- 用于植物的土壤加熱器 3770次閱讀
- 加熱器控制電路圖 2.6w次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊(cè)
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論
查看更多