在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

電子發燒友App

硬聲App

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示
電子發燒友網>電子資料下載>電子資料>帶Wep接口的智能加熱器

帶Wep接口的智能加熱器

2022-11-14 | zip | 0.15 MB | 次下載 | 免費

資料介紹

描述

問題

我必須不斷調整我的加熱器以保持合適的溫度。此外,有時我離開家時忘記關掉暖氣。

解決方案

設置溫度和運動傳感器以捕獲環境數據。創建一個網絡應用程序,允許用戶設置他們想要的溫度,這將控制加熱器的關閉或打開方式。

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

poYBAGNxHemAPeqUAABiItfoTJA612.png
?

第 1 步 - 使用 Raspberry Pi 設置傳感器

獲得 DHT11 溫度和 PIR 運動傳感器后,是時候將其連接到 Raspberry Pi。

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

pYYBAGNxHeuAdRd3AAD6cnzRsRc390.png
?

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

poYBAGNxHe2AQCtpAACv3PEy-gI420.jpg
?
pYYBAGNxHfCACs5qAAEEbHAZB2w142.jpg
?

兩者連接時的最終結果:

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

第 2 步 - 編寫代碼來測試傳感器

下面是測試運動傳感器的 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()

下面是測試溫度傳感器的 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

這是兩者結合的代碼:

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 步 - 開發 Flask API 以公開傳感器數據

在我們可以讓傳感器工作之后,它的服務時間是通過一個 API,在本例中是一個 Flask API。下面是重要的代碼,但請參考我的 GitHub 存儲庫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 上添加代碼后,以下是如何運行代碼以及訪問在 Raspberry Pi 上設置的端點時應該得到的結果(嘗試從同一網絡上的不同設備訪問端點以測試是否CORS 策略正常工作):

pYYBAGNxHg-AfnvhAAgb1unWMLY281.png
?

第 4 步 - 使用 IFTTT 設置智能插頭

此步驟將根據您碰巧選擇的支持 WI-FI 的智能插頭品牌而有所不同。對我來說,我選擇了Powertech Wi-Fi Smart Plug ,這需要我使用Smart Life應用程序進行設置。無論您使用哪種品牌,請按照說明連接插頭。然后,轉到IFTTT ,創建一個帳戶,然后搜索 IFTTT 與您的智能插頭應用程序的集成。

設置兩個小程序。第一個觸發器是是否觸發了關閉加熱器的 GET 請求(事件名稱 temperature_high)。第二個觸發器是是否觸發了打開加熱器的 GET 請求(事件名稱 temperature_low)。

poYBAGNxHheAZfBpAAX5xdl_r3E485.png
?

第 4 步 - 開發 React 前端來控制一切

最后,我們將開發這個漂亮的前端:

pYYBAGNxHiaAL_v8AAuWPFc6-Gw856.png
?

我使用 ReactJs 和 TailWindCss 來創建 Web 應用程序,因此它可以幫助您擁有這些技術的先前經驗。是幫助您入門的完美資源。您還可以使用您喜歡的任何其他框架(Angular、Laravel)或語言(HTML + CSS + JSS)來構建網站。

共有三張卡: 1. 溫度傳感器,顯示當前溫度,可以設置目標溫度 2. 運動傳感器,我們可以看到是否檢測到任何運動,如果太長時間沒有檢測到運動,我們可以自動關閉加熱器 3. 加熱器狀態為關閉或開啟,也可手動控制智能加熱器系統關閉。

這是我們從前端進行 API 調用的示例:

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);
    }
}

這是我如何使用這些異步函數的示例。它還顯示加熱器將根據它是否低于或高于目標溫度來打開和關閉。

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()));

以下是運動邏輯的設置方式:

const handleMotion = async () => {
    const newMotion = await getMotion();
    if (newMotion === false) {
        setNoMotion(noMotion + 1)
    } else {
        setNoMotion(0)
        setMotion(true);
    }

    if (noMotion > 50) {
        setMotion(false);
    }
}

最后的想法

我在這里只展示重要的代碼,你可以在附件中找到整個前端和后端代碼庫,以及完成這個項目所需的電子設備和傳感器。祝你好運!


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

評論

查看更多

下載排行

本周

  1. 1使用單片機實現七人表決器的程序和仿真資料免費下載
  2. 2.96 MB   |  44次下載  |  免費
  3. 2聯想E46L DAOLL6筆記本電腦圖紙
  4. 1.10 MB   |  2次下載  |  5 積分
  5. 3MATLAB繪圖合集
  6. 27.12 MB   |  2次下載  |  5 積分
  7. 4PR735,使用UCC28060的600W交錯式PFC轉換器
  8. 540.03KB   |  1次下載  |  免費
  9. 5UCC38C42 30W同步降壓轉換器參考設計
  10. 428.07KB   |  1次下載  |  免費
  11. 6DV2004S1/ES1/HS1快速充電開發系統
  12. 2.08MB   |  1次下載  |  免費
  13. 7模態分解合集matlab代碼
  14. 3.03 MB   |  1次下載  |  2 積分
  15. 8美的電磁爐維修手冊大全
  16. 1.56 MB   |  1次下載  |  5 積分

本月

  1. 1使用單片機實現七人表決器的程序和仿真資料免費下載
  2. 2.96 MB   |  44次下載  |  免費
  3. 2UC3842/3/4/5電源管理芯片中文手冊
  4. 1.75 MB   |  15次下載  |  免費
  5. 3DMT0660數字萬用表產品說明書
  6. 0.70 MB   |  13次下載  |  免費
  7. 4TPS54202H降壓轉換器評估模塊用戶指南
  8. 1.02MB   |  8次下載  |  免費
  9. 5STM32F101x8/STM32F101xB手冊
  10. 1.69 MB   |  8次下載  |  1 積分
  11. 6HY12P65/HY12P66數字萬用表芯片規格書
  12. 0.69 MB   |  6次下載  |  免費
  13. 7華瑞昇CR216芯片數字萬用表規格書附原理圖及校正流程方法
  14. 0.74 MB   |  6次下載  |  3 積分
  15. 8華瑞昇CR215芯片數字萬用表原理圖
  16. 0.21 MB   |  5次下載  |  3 積分

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935119次下載  |  10 積分
  3. 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉換器 PCB layout 設計
  4. 1.48MB  |  420061次下載  |  10 積分
  5. 3Altium DXP2002下載入口
  6. 未知  |  233084次下載  |  10 積分
  7. 4電路仿真軟件multisim 10.0免費下載
  8. 340992  |  191367次下載  |  10 積分
  9. 5十天學會AVR單片機與C語言視頻教程 下載
  10. 158M  |  183335次下載  |  10 積分
  11. 6labview8.5下載
  12. 未知  |  81581次下載  |  10 積分
  13. 7Keil工具MDK-Arm免費下載
  14. 0.02 MB  |  73807次下載  |  10 積分
  15. 8LabVIEW 8.6下載
  16. 未知  |  65987次下載  |  10 積分
主站蜘蛛池模板: 欧美老汉色| 黑人性xx| 久久精品国产99精品最新| 四虎影永久在线观看精品| 亚洲日本一区二区| 四虎永久精品免费网址大全| 国产激情视频一区二区三区| 日日日干干干| 国产一区国产二区国产三区| 免费 的黄色| 日韩欧美在线第一页| 乱肉情欲杂乱小说| 六月婷婷综合| 久久dvd| 直接在线观看的三级网址| 久久国产成人精品国产成人亚洲| 美女被草视频| 伊人久久狼人| 国产主播精品在线| 91精品福利久久久| 五月天婷婷在线视频| www.色多多| 中文字幕一区二区三区不卡| 日本黄a| 国产精品伦理久久久久| 午夜在线亚洲男人午在线| 四虎在线精品免费高清在线| 一级片在线视频| 一级毛片日韩a欧美| 美女一区二区三区| 狠狠干天天干| 天天噜噜色| 天天天天色| 在线观看你懂的网站| 成 黄 色 激 情视频网站| 亚洲综合免费| 久久新地址| 日处女穴| 欧美透逼视频| 国产性夜夜性夜夜爽91| 深爱激情五月网|