電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>帶Wep接口的智能加熱器

帶Wep接口的智能加熱器

2022-11-14 | zip | 0.15 MB | 次下載 | 免費(fèi)

資料介紹

描述

問(wèn)題

我必須不斷調(diào)整我的加熱器以保持合適的溫度。此外,有時(shí)我離開(kāi)家時(shí)忘記關(guān)掉暖氣。

解決方案

設(shè)置溫度和運(yùn)動(dòng)傳感器以捕獲環(huán)境數(shù)據(jù)。創(chuàng)建一個(gè)網(wǎng)絡(luò)應(yīng)用程序,允許用戶設(shè)置他們想要的溫度,這將控制加熱器的關(guān)閉或打開(kāi)方式。

這是一個(gè)圖表,顯示了一切將如何交互。

poYBAGNxHemAPeqUAABiItfoTJA612.png
?

第 1 步 - 使用 Raspberry Pi 設(shè)置傳感器

獲得 DHT11 溫度和 PIR 運(yùn)動(dòng)傳感器后,是時(shí)候?qū)⑵溥B接到 Raspberry Pi。

以下是如何連接 DHT11 溫度傳感器。我放棄了面包板并使用引腳 1(3V3)而不是引腳 2(5V)供電,從而偏離了圖表。

pYYBAGNxHeuAdRd3AAD6cnzRsRc390.png
?

以下是如何連接 PIR 運(yùn)動(dòng)傳感器。LED 連接是可選的。我通過(guò)將 Gnd 連接到引腳 20(接地)而不是引腳 6(接地),輸出到引腳 36(GPIO 16)而不是引腳 8(GPIO 14)和 LED 連接到引腳 40(GPIO 21)而不是引腳 10(GPIO 15)。

poYBAGNxHe2AQCtpAACv3PEy-gI420.jpg
?
pYYBAGNxHfCACs5qAAEEbHAZB2w142.jpg
?

兩者連接時(shí)的最終結(jié)果:

這里我的 PIR 傳感器連接到 GPIO 16,DHT11 連接到 GPIO4。溫度傳感器應(yīng)放置在您想要獲得正確溫度的位置,而運(yùn)動(dòng)傳感器應(yīng)朝向您通常所在的位置。

第 2 步 - 編寫(xiě)代碼來(lái)測(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 步 - 開(kāi)發(fā) Flask API 以公開(kāi)傳感器數(shù)據(jù)

在我們可以讓傳感器工作之后,它的服務(wù)時(shí)間是通過(guò)一個(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)行代碼以及訪問(wèn)在 Raspberry Pi 上設(shè)置的端點(diǎn)時(shí)應(yīng)該得到的結(jié)果(嘗試從同一網(wǎng)絡(luò)上的不同設(shè)備訪問(wèn)端點(diǎn)以測(cè)試是否CORS 策略正常工作):

pYYBAGNxHg-AfnvhAAgb1unWMLY281.png
?

第 4 步 - 使用 IFTTT 設(shè)置智能插頭

此步驟將根據(jù)您碰巧選擇的支持 WI-FI 的智能插頭品牌而有所不同。對(duì)我來(lái)說(shuō),我選擇了Powertech Wi-Fi Smart Plug ,這需要我使用Smart Life應(yīng)用程序進(jìn)行設(shè)置。無(wú)論您使用哪種品牌,請(qǐng)按照說(shuō)明連接插頭。然后,轉(zhuǎn)到IFTTT ,創(chuàng)建一個(gè)帳戶,然后搜索 IFTTT 與您的智能插頭應(yīng)用程序的集成。

設(shè)置兩個(gè)小程序。第一個(gè)觸發(fā)器是是否觸發(fā)了關(guān)閉加熱器的 GET 請(qǐng)求(事件名稱 temperature_high)。第二個(gè)觸發(fā)器是是否觸發(fā)了打開(kāi)加熱器的 GET 請(qǐng)求(事件名稱 temperature_low)。

poYBAGNxHheAZfBpAAX5xdl_r3E485.png
?

第 4 步 - 開(kāi)發(fā) React 前端來(lái)控制一切

最后,我們將開(kāi)發(fā)這個(gè)漂亮的前端:

pYYBAGNxHiaAL_v8AAuWPFc6-Gw856.png
?

我使用 ReactJs 和 TailWindCss 來(lái)創(chuàng)建 Web 應(yīng)用程序,因此它可以幫助您擁有這些技術(shù)的先前經(jīng)驗(yàn)。是幫助您入門的完美資源。您還可以使用您喜歡的任何其他框架(Angular、Laravel)或語(yǔ)言(HTML + CSS + JSS)來(lái)構(gòu)建網(wǎng)站。

共有三張卡: 1. 溫度傳感器,顯示當(dāng)前溫度,可以設(shè)置目標(biāo)溫度 2. 運(yùn)動(dòng)傳感器,我們可以看到是否檢測(cè)到任何運(yùn)動(dòng),如果太長(zhǎng)時(shí)間沒(méi)有檢測(cè)到運(yùn)動(dòng),我們可以自動(dòng)關(guān)閉加熱器 3. 加熱器狀態(tài)為關(guān)閉或開(kāi)啟,也可手動(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)溫度來(lái)打開(kāi)和關(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)!


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
  2. 1.06 MB  |  532次下載  |  免費(fèi)
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費(fèi)
  5. 3TC358743XBG評(píng)估板參考手冊(cè)
  6. 1.36 MB  |  330次下載  |  免費(fèi)
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費(fèi)
  9. 5元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費(fèi)
  11. 6迪文DGUS開(kāi)發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費(fèi)
  13. 7元宇宙底層硬件系列報(bào)告
  14. 13.42 MB  |  182次下載  |  免費(fèi)
  15. 8FP5207XR-G1中文應(yīng)用手冊(cè)
  16. 1.09 MB  |  178次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書(shū))
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
  16. 0.00 MB  |  6656次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191187次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
  14. 158M  |  183279次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)