اینترنت اشیا

کنترل دمای خانه با ساخت ترموستات رزبری پای

خانه‌های هوشمند آینده‌ی زندگی مدرن هستند. اما اگر در خانه‌ی خود از دستگاه‌های قدیمی مانند کولر یا بخاری سنتی استفاده می‌کنید، چه باید کرد؟ تعویض این دستگاه‌ها همیشه امکان‌پذیر یا مقرون‌به‌صرفه نیست، اما می‌توان آن‌ها را با کمک رزبری پای (Raspberry Pi) به‌صورت خودکار کنترل کرد.

بسیاری از سیستم‌های تهویه مطبوع در منازل، امکانات مدرن مانند اتوماسیون مرکزی، ترموستات قابل‌برنامه‌ریزی، حسگرهای چندگانه یا کنترل از طریق وای‌فای را ندارند. با این حال، فناوری‌های قدیمی تهویه همچنان قابل اعتماد هستند و معمولاً به‌زودی جایگزین نمی‌شوند. اما نبود سیستم خودکار به این معناست که کاربران باید مرتباً کار یا خواب خود را قطع کنند تا کولر یا بخاری را روشن یا خاموش کنند. این مشکل به‌ویژه در خانه‌هایی با چیدمان فشرده یا پلان غیرمتعارف (مانند خانه‌ی من) بیشتر دیده می‌شود.

خانه‌ی من

در خانه‌ی من، به دلیل ساختار خاص اتاق‌ها، خنک کردن کل فضا تنها با یک کولر پنجره‌ای کار دشواری است. از اتاق خواب دید مستقیمی به کولر وجود ندارد و مسیر جریان هوای سرد به تمام اتاق‌ها محدود است. در آمریکا معمولاً خانه‌ها به سیستم تهویه مرکزی مجهز هستند، اما در بسیاری از نقاط جهان اینطور نیست. نبود سیستم مرکزی باعث می‌شود امکان خودکارسازی (automation) کمتر شده و حفظ دمای یکنواخت در کل خانه دشوار گردد. در نتیجه، نوسانات دمایی ایجاد می‌شود که نیاز به مداخله‌ی دستی دارند.

به عنوان یک مهندس و علاقه‌مند به اینترنت اشیا (IoT)، در این وضعیت فرصتی دیدم تا چند هدف مفید را همزمان دنبال کنم:

  • صرفه‌جویی در انرژی با افزایش بهره‌وری کولر تکی
  • افزایش راحتی زندگی با خودکارسازی و اتصال به Google Home
  • ایجاد یک راهکار کاملاً شخصی‌سازی‌شده به‌جای تکیه بر محصولات تجاری آماده
  • تقویت مهارت‌های فنی خود با استفاده از سخت‌افزارهای امتحان‌شده

کولر من دستگاهی ساده با ریموت کنترل مادون قرمز (IR) است. می‌دانستم ابزارهایی مانند Sensibo یا Tado وجود دارند که کولرها را به سیستم‌های خانه هوشمند متصل می‌کنند، اما تصمیم گرفتم مسیر DIY (خودت انجام بده) را انتخاب کنم و با ساخت یک ترموستات رزبری پای، کنترل پیشرفته‌تری بر اساس داده‌های حسگرها در اتاق‌های مختلف ایجاد کنم.

من از قبل چند دستگاه Raspberry Pi Zero W به همراه ماژول‌های سنسور DHT22 داشتم که از آن‌ها برای پایش دما و رطوبت در اتاق‌های مختلف استفاده می‌کردم. به دلیل تقسیم‌بندی پیچیده‌ی نقشه‌ی خانه، حسگرها را در نقاط مختلف نصب کردم تا دمای هر بخش را جداگانه اندازه بگیرم.

علاوه بر این، یک سیستم نظارت خانگی (Home Surveillance) بر پایه‌ی ویندوز ۱۰ و WSL 2 داشتم که البته برای این پروژه الزامی نبود. ایده‌ام این بود که خوانش دما و رطوبت از حسگرها را به ویدیوهای نظارتی اضافه کنم تا به‌صورت متن (Text Overlay) روی تصویر دیده شود.

اتصال این حسگر بسیار ساده است و تنها سه سیم نیاز دارد. در تصویر شماتیکی نحوه‌ی اتصال پایه‌های DHT22 به Raspberry Pi نمایش داده شده است.

ترموستات قابل‌برنامه‌ریزی

برای این پروژه از سیستم‌عامل Raspberry Pi OS Lite استفاده کردم و روی آن Python 3 به همراه مدیر بسته‌ی PiP و کتابخانه‌ی Adafruit_DHT را نصب نمودم تا بتوانم داده‌های حسگر را بخوانم. هرچند این کتابخانه از نظر رسمی منسوخ (Deprecated) محسوب می‌شود، اما نصب و استفاده از آن بسیار ساده‌تر است و به منابع کمتری نیاز دارد؛ بنابراین برای پروژه‌ی ما کاملاً مناسب است.

پروژه‌ی ساخت ترموستات شما می‌تواند حرفه‌ای‌تر اجرا شود.
در لَنسریفای، متخصصان الکترونیک و نرم‌افزار آماده‌اند تا ایده‌ی شما را به محصولی کاربردی تبدیل کنند.
🚀 شروع همکاری

برای ذخیره‌ی داده‌ها تصمیم گرفتم از یک سرور شخص ثالث به نام ThingSpeak استفاده کنم تا داده‌ها را از طریق API در دسترس قرار دهد. از آنجا که نیازی به خوانش لحظه‌ای نداشتم، تنظیم کردم تا داده‌ها هر ۵ دقیقه یک بار ارسال شوند.

نمونه‌ی کد پایتون پروژه:

import requests
import time
import Adafruit_DHT

KEY = 'api key'

def pushData(temp: float, hum: float):
    '''ارسال دما و رطوبت به سرور ThingSpeak'''
    url = 'https://api.thingspeak.com/update'
    params = {'api_key': KEY, 'field5': temp, 'field6': hum}
    res = requests.get(url, params=params)

def getData(sensor: int, pin: int):
    '''خواندن داده از حسگر DHT'''
    try:
        humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
        return humidity, temperature
    except:
        Exception("خطا در خواندن داده‌های حسگر")
        return False

if __name__ == "__main__":
    sensor = 22  # در صورت استفاده از DHT11 مقدار را به 11 تغییر دهید
    pin = 4      # پین شماره ۴ GPIO
    while True:
        h, t = getData(sensor, pin)
        pushData(t, h)
        time.sleep(300)

روی کامپیوتر نظارتی که WSL 2 داشت، یک اسکریپت PHP ایجاد کردم که داده‌ها را از ThingSpeak واکشی کرده، قالب‌بندی می‌کرد و در یک فایل متنی ساده (.txt) ذخیره می‌کرد. این فایل متنی بعداً توسط نرم‌افزار دوربین خوانده می‌شد تا مقادیر دما و رطوبت به‌صورت زیرنویس روی تصویر زنده نمایش داده شوند.

از آن‌جایی که از قبل تعدادی لامپ هوشمند و روال‌های خودکار در Google Home داشتم، منطقی بود که داده‌های سنسورها را در قالب ترموستات هوشمند متصل به Google Home نیز استفاده کنم. هدفم این بود که روتینی در Google Home بسازم تا کولر بر اساس دمای اتاق به‌طور خودکار روشن و خاموش شود، بدون اینکه نیاز به دخالت کاربر باشد.

در بازار، دستگاه‌های آماده مانند Sensibo یا Tado وجود دارند که راه‌اندازی ساده‌تری دارند، اما قیمت بالاتری هم دارند. من از دستگاه PNI SafeHome PT11IR Wi-Fi Smart Remote Control استفاده کردم که با هزینه‌ای بسیار کمتر، به من امکان می‌داد از طریق موبایل، هر دستگاه مادون قرمز در محدوده‌ی خود را کنترل کنم. اپلیکیشن Tuya که همراه این کنترلر ارائه می‌شود، با Google Home نیز ادغام می‌گردد.

پس از فعال‌سازی کنترل هوشمند کولر و آماده‌سازی داده‌های حسگر، تلاش کردم رزبری پای را به‌عنوان یک ترموستات در Google Home شناسایی کنم ، اما موفق نشدم. هرچند توانستم داده‌ها را به سرویس Google IoT Cloud و بخش Pub/Sub ارسال کنم، اما هیچ راه مستقیمی برای انتقال آن داده‌ها به Google Home جهت ساخت روتین وجود نداشت.

چند روزی روی این موضوع فکر کردم تا به ایده‌ی جدیدی رسیدم: اگر نیازی به ارسال داده‌ها به Google Home نباشد چه؟ اگر بتوانم به‌صورت محلی (locally) داده‌ها را بررسی کنم و سپس فرمان روشن یا خاموش شدن کولر را مستقیماً به Google Home بفرستم؟

آزمایش کردم و متوجه شدم اجرای دستورات صوتی از طریق Google Assistant موفقیت‌آمیز است، بنابراین مسیر جدیدی برایم باز شد. در جست‌وجویی کوتاه، به ابزاری به نام Assistant Relay رسیدم، یک سیستم مبتنی بر Node.js که اجازه می‌دهد فرمان‌ها را از طریق درخواست‌های POST به Google Assistant ارسال کنیم. به این ترتیب، می‌توان هر فرمانی را به Google Assistant ارسال کرد تا آن را اجرا کند، مشروط بر اینکه فرمان شناخته‌شده باشد.

می‌خواستم فرآیند روشن و خاموش شدن خودکار کولر تنها در زمان شب انجام شود؛ بنابراین بازه‌ی زمانی بین ۱۰ شب تا ۷ صبح را به‌عنوان محدوده‌ی فعال تنظیم کردم و دمای دلخواه را مشخص نمودم. برای رسیدن به محدوده‌ی دمایی مطلوب و جلوگیری از روشن و خاموش شدن مکرر دستگاه (که ممکن است عمر آن را کاهش دهد) چندین بار دما را آزمایش و اصلاح کردم تا به بهترین مقدار رسیدم.

اسکریپت PHP که قبلاً برای افزودن داده‌های دما به ویدیو استفاده می‌شد، طوری تنظیم شده بود که هر ۵ دقیقه یک‌بار از طریق cron job اجرا شود. بنابراین تنها لازم بود شرایط دمایی و درخواست POST به Google Assistant را به آن اضافه کنم.

اما مشکلی ایجاد شد: اگر شرط برقرار می‌بود، اسکریپت هر ۵ دقیقه دوباره فرمان «روشن کردن» را می‌فرستاد، حتی زمانی که کولر از قبل روشن بود. این باعث می‌شد هر بار دستگاه با صدای بوق پاسخ دهد ، چه برای روشن کردن و چه برای خاموش کردن. برای حل این مشکل، نیاز به روشی داشتم تا بتوانم وضعیت فعلی کولر را بخوانم.

از آنجا که هدفم سادگی بود، یک فایل JSON ساختم که در آن آرایه‌ای از وضعیت‌های قبلی ذخیره می‌شد. هرگاه فرمان «روشن» یا «خاموش» با موفقیت انجام می‌گرفت، اسکریپت وضعیت جدید را در آن فایل ثبت می‌کرد. به این ترتیب، از ارسال فرمان‌های تکراری جلوگیری شد. البته در روزهای بسیار گرم یا هنگام گرمایش زمستانی، ممکن بود دوباره شرایط فعال شود؛ در این موارد، یک کلید دستی برای کنترل دستی (Manual Override) کافی بود.

نمونه‌ی کد PHP پروژه:

<?php
switch(true)
{
    case $temperature > 27:
        turnAc('on');
        break;
    case $temperature < 24:
        turnAc('off');
        break;
}

function turnAc($status)
{
    $command = 'turn on hallway ac'; // نام دستگاه در Google Home
    if ($status == 'off') {
        $command = 'turn off hallway ac';
    }

    if ($status == 'on' && checkAc() == 'on') {
        return;
    }

    if ($status == 'off' && checkAc() == 'off') {
        return;
    }

    $curl = curl_init();
    curl_setopt_array($curl, array(
      CURLOPT_URL => 'local assistant server ip',
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_ENCODING => '',
      CURLOPT_MAXREDIRS => 10,
      CURLOPT_TIMEOUT => 0,
      CURLOPT_FOLLOWLOCATION => true,
      CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
      CURLOPT_CUSTOMREQUEST => 'POST',
      CURLOPT_POSTFIELDS =>'{
        "command": '.$command.',
        "converse": false,
        "user": "designated user"
        }',
      CURLOPT_HTTPHEADER => array('Content-Type: application/json'),
    ));

    $response = curl_exec($curl);
    curl_close($curl);
    $obj = null;

    try {
        $obj = json_decode($response);
    } catch (Exception $e) {}

    if (!$obj || $obj->success != true) {
        markAc($status == 'on' ? 'off' : 'on');
        return;
    }

    markAc($status);
}

function markAc($status)
{
    $file = __DIR__ . "/markAc.json";
    $json = json_decode(file_get_contents($file), true);
    $json[] = array(date('F j, Y H:i:s'), $status);
    file_put_contents($file, json_encode($json));
}

function checkAc()
{
    $file = __DIR__ . "/markAc.json";
    $json = json_decode(file_get_contents($file), true);
    $end = array_pop($json);
    return $end[1];
}
?>

اجرای این سیستم در ابتدا بدون اشکال نبود. نیاز بود بخش‌هایی از کد را تغییر دهم و چند بار تست کنم تا به عملکرد پایدار برسم. اما با آزمون و خطا، سیستم به‌خوبی کار کرد. امیدوارم با استفاده از تجربه‌ی من، شما بتوانید از ابتدا پروژه‌ی خود را بدون دردسر پیاده‌سازی کنید.

انگیزه‌ی اصلی من برای خودکارسازی سیستم تهویه، طراحی نامعمول خانه‌ام بود که باعث تفاوت زیاد دما در اتاق‌های مختلف می‌شد. اما مزایای اتوماسیون دما بسیار فراتر از این است و برای همه مفید است:

  • افزایش بهره‌وری انرژی و کاهش هزینه‌ها، به‌ویژه در مناطقی که تعرفه‌ی برق متغیر است.
  • افزایش راحتی و کنترل دقیق دما بدون نیاز به تنظیم دستی مکرر.
  • قابل استفاده برای دستگاه‌های قدیمی مانند کولر، بخاری برقی و آبگرمکن‌ها بدون نیاز به تعویض آن‌ها.
  • افزایش طول عمر تجهیزات با جلوگیری از روشن‌خاموش شدن‌های پی‌در‌پی.
  • گسترش امکانات خانه‌ی هوشمند با هزینه‌ی بسیار کم نسبت به محصولات تجاری آماده.

✅ مزایای ترموستات هوشمند چیست؟
ترموستات‌های هوشمند نسبت به مدل‌های معمولی انعطاف‌پذیرتر هستند. آن‌ها عوامل مختلفی مانند زمان، فصل و داده‌های حسگر (به‌ویژه رطوبت) را در نظر می‌گیرند و با موبایل، Google Home یا Amazon Alexa یکپارچه می‌شوند.

✅ رزبری پای چه کاربردهایی دارد؟
از Raspberry Pi می‌توان به‌عنوان یک کامپیوتر کوچک، کنسول بازی (RetroPi)، سیستم مانیتورینگ محیط، یا کنترل‌کننده‌ی خانه هوشمند استفاده کرد. تنها محدودیت واقعی شما تخیل و منبع تغذیه‌ی آن است.

✅ معایب Raspberry Pi چیست؟
مدل‌هایی که دارای Wi-Fi هستند، در فاصله‌های زیاد دچار افت سیگنال می‌شوند. در حالت قابل‌حمل نیز باتری سریع‌تر تخلیه می‌شود، اما می‌توان از پاوربانک‌های پرظرفیت استفاده کرد.

✅ Raspberry Pi 3 B+ چه ویژگی‌هایی دارد؟
این مدل دارای پردازنده‌ی ۱.۴ گیگاهرتزی، رم ۱ گیگ، اترنت گیگابیتی، وای‌فای، چهار پورت USB 2.0، خروجی HDMI با کیفیت Full HD، و پین‌های توسعه (GPIO) و درگاه دوربین است.

✅ تفاوت بین Raspberry Pi 3B و 3B+ چیست؟
مدل 3B+ نسخه‌ی به‌روزشده‌ای از 3B است با سرعت پردازنده‌ی بالاتر (۱.۴ در برابر ۱.۲ گیگاهرتز)، بلوتوث جدیدتر، پشتیبانی از اترنت گیگابیتی، و قابلیت تغذیه از طریق PoE (Power over Ethernet) با ماژول جداگانه.

پروژه‌ی ساخت ترموستات هوشمند با Raspberry Pi راهی عالی برای ترکیب مهارت‌های برنامه‌نویسی، الکترونیک و خانه هوشمند است. با صرف هزینه‌ای اندک می‌توانید سیستم تهویه‌ی قدیمی خود را هوشمند کنید، در مصرف انرژی صرفه‌جویی نمایید، و آسایش بیشتری در زندگی روزمره تجربه کنید.

اگر قصد دارید پروژه‌های مبتنی بر Raspberry Pi را توسعه دهید،
لَنسریفای بهترین بستر برای همکاری با متخصصان حوزه‌ی سخت‌افزار و اینترنت اشیاء است.
💡 ایجاد پروژه جدید

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا