آموزش آردوینوپروژه های آردوینو

کنترل خانه با گفتار با برد آردوینو (هوشمند سازی صوتی)

اتوماسیون خانه با کنترل صوتی با استفاده از آردوینو یک پروژه هیجان انگیز است که هدف آن خودکارسازی لوازم خانگی با دستورات صوتی است. در این پروژه دستورات صوتی تشخیص داده می شود و تبدیل متن به گفتار با استفاده از اپلیکیشن اندروید انجام می شود. سپس از ماژول HC-05 برای انتقال داده های متنی از طریق بلوتوث به میکروکنترلر آردوینو استفاده می شود. این سیستم بسیار کاربردی و کاربرپسند است زیرا کاربران را قادر می سازد تا با استفاده از دستورات صوتی اولیه به سادگی وسایل خانه را کنترل و مدیریت کنند. این ایده سطح جدیدی از اتوماسیون را در مدیریت لوازم خانگی ارائه می دهد.

هوشمند سازی خانه صوتی چگونه کار میکند؟

همانطور که در مقدمه ذکر شد، ما از یک برنامه اندروید برای تشخیص فرمان صوتی استفاده خواهیم کرد. پس از شناسایی دستورات صوتی، دستور با استفاده از همان برنامه به متن تبدیل می‌شود، سپس این داده‌های متنی با استفاده از بلوتوث به آردوینو نانو ارسال می‌شود. برای این کار از ماژول بلوتوث معروف HC-05 استفاده کرده ایم. ماژول HC-05 با استفاده از بلوتوث SPP (نمایه پورت سریال) با موبایل ارتباط برقرار می کند. هنگامی که یک داده دریافت شد، ماژول داده ها را از طریق خط UART به آردوینو نانو منتقل می کند. در اینجا ما از خطوط سریال پیش‌فرض استفاده کرده‌ایم، اما می‌توانید با استفاده از سریال نرم‌افزاری از پین های دیگر نیز استفاده کنید. پس از دریافت داده ها، آردوینو نانو آن را رمزگشایی می کند و عملیاتی را بر اساس آن انجام می دهد.

قطعات مورد نیاز

تمام قطعاتی که برای ساخت پروژه اتوماسیون خانگی با کنترل صوتی نیاز دارید در زیر لیست شده است.

  • آردوینو نانو
  • ماژول بلوتوث HC-05
  • ماژول منبع تغذیه 5 ولت 3 وات Hi-link
  • سنسور IR VS1838
  • ال ای دی IR
  • 5* ترانزیستور S8050 NPN
  • 4* رله 5 ولت
  • 4* دیود 1N4007
  • 4* ال ای دی
  • 5* مقاومت 1 KOhms
  • 4* مقاومت 470 اهم
قطعات مورد نیاز را از فروشگاه قطعات آیرنکس تهیه کنید.

مدار خانه هوشمند صوتی با آردوینو

شماتیک مدار کامل برای اتوماسیون خانگی با کنترل صوتی با استفاده از آردوینو در زیر نشان داده شده است.

مدار خانه هوشمند صوتی با آردوینو

مدار پروژه بسیار ساده است. یک ماژول Hi-Link 5 ولت AC-DC به عنوان منبع تغذیه استفاده می شود. ورودی AC مستقیماً به ماژول منبع تغذیه متصل است. خروجی 5 ولت از آن برای تغذیه کل مدار کنترل استفاده خواهد شد. شما همچنین می توانید از 4 رله جداگانه استفاده کنید. مدار درایور رله حول ترانزیستور S8050 NPN ساخته شده است. یک ترمینال سیم پیچ رله به خط تغذیه 5 ولت متصل است. هنگامی که یک پالس HIGH به پایه ترانزیستور درایور اعمال می شود، ترمینال سیم پیچ دیگر را با خط GND پایین می کشد. یک دیود 1N4007 به عنوان دیود آزاد برای محافظت از مدار در برابر هر گونه ولتاژ برگشتی استفاده می شود. یک LED با مقاومت محدود کننده جریان برای نشان دادن وضعیت هر رله استفاده می شود.

مدار خانه هوشمند صوتی با آردوینو

ماژول بلوتوث با استفاده از خط UART به آردوینو متصل می شود. ماژول بلوتوث نیازی به پیکربندی ندارد، این ماژول با آردوینو در نرخ باود پیش فرض خود ارتباط برقرار می کند. همچنین می توانید از سایر ماژول های بلوتوث مشابه با پشتیبانی از SPP استفاده کنید. اما مطمئن شوید که نرخ باود آن را روی 9600 تنظیم کنید. سنسور مادون قرمز VS1838 به پین D2 وصل شده است. از آنجایی که کتابخانه رمزگشای IR به وقفه سخت افزاری بستگی دارد، باید حتما از همان پین استفاده کنید. LED فرستنده IR با استفاده از ترانزیستور S8050 NPN هدایت می شود و با پایه D3 هدایت می شود. مشابه پین حسگر، این پین نیز به دلیل وابستگی به کتابخانه قابل تغییر نیست. ما از خروجی PWM از این پین برای ارسال سیگنال های IR استفاده می کنیم. در نهایت، LED های نئوپیکسل RGB از طریق پین D3 به هم متصل می شوند. شما میتوانید تعداد LED های موجود در کد را مطابق با موارد استفاده خود تغییر دهید. همچنین اگر تعداد LED ها زیاد است LED RGB را به صورت خارجی تغذیه کنید.

مدار اتوماسیون خانگی با کنترل صوتی

کد آردوینو برای اتوماسیون خانگی با کنترل صوتی

به عنوان اولین گام مطمئن شوید که تمام کتابخانه های لازم را نصب کرده اید. کتابخانه های لازم IRMP برای سنجش و انتقال IR و کتابخانه FastLED برای کنترل LED های RGB هستند. می توانید آنها را مستقیماً از library manager آردوینو نصب کنید یا می توانید با دانلود از مخزن GitHub به صورت دستی آنها را نصب کنید.

کد کامل در فایل دانلودی انتهای صفحه قرار داده شده است. در اینجا بخش های مختلف کد را بررسی میکنیم.

#include <Arduino.h>
#include <FastLED.h>
#include <EEPROM.h>
#define DATA_PIN 12        //Define led data pin in
#define LED_TYPE NEOPIXEL  //define type of led
#define NUM_LEDS 16        //num of leds in strip
#define IRMP_INPUT_PIN 2   // To be compatible with interrupt example, pin 2 is chosen here.
#define IRSND_OUTPUT_PIN 3
#define TONE_PIN 4
#define IRSND_IR_FREQUENCY 38000
#define IRMP_PROTOCOL_NAMES 1         // Enable protocol number mapping to protocol strings - needs some program memory ~ 420 bytes here
#define IRMP_USE_COMPLETE_CALLBACK 1  // Enable callback functionality
// Decode protocol list!disable unwanted     Enable  Remarks      F_INTERRUPTS            program memory
#define IRMP_SUPPORT_SIRCS_PROTOCOL 1         // Sony SIRCS           >= 10000                 ~150 bytes
#define IRMP_SUPPORT_NEC_PROTOCOL 1           // NEC + APPLE + ONKYO  >= 10000                 ~300 bytes
#define IRMP_SUPPORT_SAMSUNG_PROTOCOL 1       // Samsung + Samsg32    >= 10000                 ~300 bytes
#define IRMP_SUPPORT_KASEIKYO_PROTOCOL 1      // Kaseikyo             >= 10000                 ~250 bytes
#define IRMP_SUPPORT_JVC_PROTOCOL 1           // JVC                  >= 10000                 ~150 bytes
#define IRMP_SUPPORT_NEC16_PROTOCOL 1         // NEC16                >= 10000                 ~100 bytes
#define IRMP_SUPPORT_NEC42_PROTOCOL 1         // NEC42                >= 10000                 ~300 bytes
#define IRMP_SUPPORT_MATSUSHITA_PROTOCOL 1    // Matsushita           >= 10000                  ~50 bytes
#define IRMP_SUPPORT_DENON_PROTOCOL 1         // DENON, Sharp         >= 10000                 ~250 bytes
#define IRMP_SUPPORT_RC5_PROTOCOL 1           // RC5                  >= 10000                 ~250 bytes
#define IRMP_SUPPORT_RC6_PROTOCOL 1           // RC6 & RC6A           >= 10000                 ~250 bytes
#define IRMP_SUPPORT_IR60_PROTOCOL 1          // IR60 (SDA2008)       >= 10000                 ~300 bytes
#define IRMP_SUPPORT_GRUNDIG_PROTOCOL 1       // Grundig              >= 10000                 ~300 bytes
#define IRMP_SUPPORT_SIEMENS_PROTOCOL 1       // Siemens Gigaset      >= 15000                 ~550 bytes
#define IRMP_SUPPORT_NOKIA_PROTOCOL 1         // Nokia                >= 10000                 ~300 bytes
#define IRMP_SUPPORT_BOSE_PROTOCOL 1          // BOSE                 >= 10000                 ~150 bytes
#define IRMP_SUPPORT_KATHREIN_PROTOCOL 1      // Kathrein             >= 10000                 ~200 bytes
#define IRMP_SUPPORT_NUBERT_PROTOCOL 1        // NUBERT               >= 10000                  ~50 bytes
#define IRMP_SUPPORT_FAN_PROTOCOL 0           // FAN (ventilator)     >= 10000                  ~50 bytes     conflicts with NUBERT
#define IRMP_SUPPORT_SPEAKER_PROTOCOL 1       // SPEAKER (~NUBERT)    >= 10000                  ~50 bytes
#define IRMP_SUPPORT_BANG_OLUFSEN_PROTOCOL 1  // Bang & Olufsen       >= 10000                 ~200 bytes
#define IRMP_SUPPORT_RECS80_PROTOCOL 1        // RECS80 (SAA3004)     >= 15000                  ~50 bytes
#define IRMP_SUPPORT_RECS80EXT_PROTOCOL 1     // RECS80EXT (SAA3008)  >= 15000                  ~50 bytes
#define IRMP_SUPPORT_THOMSON_PROTOCOL 1       // Thomson              >= 10000                 ~250 bytes
#define IRMP_SUPPORT_NIKON_PROTOCOL 1         // NIKON camera         >= 10000                 ~250 bytes
#define IRMP_SUPPORT_NETBOX_PROTOCOL 1        // Netbox keyboard      >= 10000                 ~400 bytes (PROTOTYPE!)
#define IRMP_SUPPORT_ORTEK_PROTOCOL 0         // ORTEK (Hama)         >= 10000                 ~150 bytes     conflicts with FDC and NETBOX
#define IRMP_SUPPORT_TELEFUNKEN_PROTOCOL 1    // Telefunken 1560      >= 10000                 ~150 bytes
#define IRMP_SUPPORT_FDC_PROTOCOL 1           // FDC3402 keyboard     >= 10000 (better 15000)  ~150 bytes (~400 in combination with RC5)
#define IRMP_SUPPORT_RCCAR_PROTOCOL 1         // RC Car               >= 10000 (better 15000)  ~150 bytes (~500 in combination with RC5)
#define IRMP_SUPPORT_ROOMBA_PROTOCOL 0        // iRobot Roomba        >= 10000                 ~150 bytes     conflicts with RC6
#define IRMP_SUPPORT_RUWIDO_PROTOCOL 0        // RUWIDO, T-Home       >= 15000                 ~550 bytes     conflicts with DENON
#define IRMP_SUPPORT_A1TVBOX_PROTOCOL 1       // A1 TV BOX            >= 15000 (better 20000)  ~300 bytes
#define IRMP_SUPPORT_LEGO_PROTOCOL 1          // LEGO Power RC        >= 20000                 ~150 bytes
#define IRMP_SUPPORT_RCMM_PROTOCOL 1          // RCMM 12,24, or 32    >= 20000                 ~150 bytes
#define IRMP_SUPPORT_LGAIR_PROTOCOL 1         // LG Air Condition     >= 10000                 ~300 bytes
#define IRMP_SUPPORT_SAMSUNG48_PROTOCOL 1     // Samsung48            >= 10000                 ~100 bytes (SAMSUNG must be enabled!)
#define IRMP_SUPPORT_MERLIN_PROTOCOL 1        // Merlin               >= 15000 (better 20000)  ~300 bytes (requires IRMP_32_BIT=1)
#define IRMP_SUPPORT_PENTAX_PROTOCOL 1        // Pentax               >= 10000 <=17000         ~150 bytes (<= 17000 due to 8 bit timing overflow issue)
#define IRMP_SUPPORT_S100_PROTOCOL 0          // S100                 >= 10000                 ~250 bytes     conflicts with RC5
#define IRMP_SUPPORT_ACP24_PROTOCOL 0         // ACP24                >= 10000                 ~250 bytes     conflicts with DENON
#define IRMP_SUPPORT_TECHNICS_PROTOCOL 1      // TECHNICS             >= 10000                 ~250 bytes
#define IRMP_SUPPORT_PANASONIC_PROTOCOL 0     // PANASONIC Beamer     >= 10000                 ~250 bytes     conflicts with KASEIKYO
#define IRMP_SUPPORT_MITSU_HEAVY_PROTOCOL 0   // Mitsubishi Aircond   >= 10000                 ~250 bytes     conflicts with KASEIKYO
#define IRMP_SUPPORT_VINCENT_PROTOCOL 1       // VINCENT              >= 10000                 ~250 bytes
#define IRMP_SUPPORT_SAMSUNGAH_PROTOCOL 1     // SAMSUNG AH           >= 10000                 ~250 bytes
#define IRMP_SUPPORT_IRMP16_PROTOCOL 0        // IRMP specific        >= 15000                 ~250 bytes
#define IRMP_SUPPORT_GREE_PROTOCOL 1          // GREE CLIMATE         >= 10000 <=17000         ~250 bytes
#define IRMP_SUPPORT_RCII_PROTOCOL 0          // RCII T+A             >= 15000                 ~250 bytes     conflicts with GRUNDIG and NOKIA
#define IRMP_SUPPORT_METZ_PROTOCOL 1
#define IRMP_SUPPORT_MELINERA_PROTOCOL 1  // MELINERA (Lidl)      >= 10000
// Encode protocol list!disable unwanted    Enable  Remarks        F_INTERRUPTS            program memory
#define IRSND_SUPPORT_SIRCS_PROTOCOL 1         // Sony SIRCS           >= 10000                 ~200 bytes
#define IRSND_SUPPORT_NEC_PROTOCOL 1           // NEC + APPLE          >= 10000                 ~100 bytes
#define IRSND_SUPPORT_SAMSUNG_PROTOCOL 1       // Samsung + Samsung32  >= 10000                 ~300 bytes
#define IRSND_SUPPORT_KASEIKYO_PROTOCOL 1      // Kaseikyo             >= 10000                 ~300 bytes
#define IRSND_SUPPORT_JVC_PROTOCOL 1           // JVC                  >= 10000                 ~150 bytes
#define IRSND_SUPPORT_NEC16_PROTOCOL 1         // NEC16                >= 10000                 ~150 bytes
#define IRSND_SUPPORT_NEC42_PROTOCOL 1         // NEC42                >= 10000                 ~150 bytes
#define IRSND_SUPPORT_MATSUSHITA_PROTOCOL 1    // Matsushita           >= 10000                 ~200 bytes
#define IRSND_SUPPORT_DENON_PROTOCOL 1         // DENON, Sharp         >= 10000                 ~200 bytes
#define IRSND_SUPPORT_RC5_PROTOCOL 1           // RC5                  >= 10000                 ~150 bytes
#define IRSND_SUPPORT_RC6_PROTOCOL 1           // RC6                  >= 10000                 ~250 bytes
#define IRSND_SUPPORT_RC6A_PROTOCOL 1          // RC6A                 >= 10000                 ~250 bytes
#define IRSND_SUPPORT_GRUNDIG_PROTOCOL 1       // Grundig              >= 10000                 ~300 bytes
#define IRSND_SUPPORT_SIEMENS_PROTOCOL 1       // Siemens, Gigaset     >= 15000                 ~150 bytes
#define IRSND_SUPPORT_NOKIA_PROTOCOL 1         // Nokia                >= 10000                 ~400 bytes
#define IRSND_SUPPORT_IR60_PROTOCOL 0          // IR60 (SDA2008)       >= 10000                 ~250 bytes // IR frequency 30 kHz
#define IRSND_SUPPORT_BOSE_PROTOCOL 1          // BOSE                 >= 10000                 ~100 bytes
#define IRSND_SUPPORT_KATHREIN_PROTOCOL 0      // Kathrein             >= 10000                 DON'T CHANGE, NOT SUPPORTED YET!
#define IRSND_SUPPORT_NUBERT_PROTOCOL 1        // NUBERT               >= 10000                 ~100 bytes
#define IRSND_SUPPORT_FAN_PROTOCOL 1           // FAN (ventilator)     >= 10000                 ~100 bytes
#define IRSND_SUPPORT_SPEAKER_PROTOCOL 1       // SPEAKER              >= 10000                 ~100 bytes
#define IRSND_SUPPORT_BANG_OLUFSEN_PROTOCOL 0  // Bang&Olufsen         >= 10000                 ~250 bytes // IR frequency 455 kHz
#define IRSND_SUPPORT_RECS80_PROTOCOL 1        // RECS80               >= 15000                 ~100 bytes
#define IRSND_SUPPORT_RECS80EXT_PROTOCOL 1     // RECS80EXT            >= 15000                 ~100 bytes
#define IRSND_SUPPORT_THOMSON_PROTOCOL 1       // Thomson              >= 10000                 ~250 bytes
#define IRSND_SUPPORT_NIKON_PROTOCOL 1         // NIKON                >= 10000                 ~150 bytes
#define IRSND_SUPPORT_NETBOX_PROTOCOL 0        // Netbox keyboard      >= 10000                 DON'T CHANGE, NOT SUPPORTED YET!
#define IRSND_SUPPORT_ORTEK_PROTOCOL 0         // ORTEK (Hama)         >= 10000                 DON'T CHANGE, NOT SUPPORTED YET!
#define IRSND_SUPPORT_TELEFUNKEN_PROTOCOL 1    // Telefunken 1560      >= 10000                 ~150 bytes
#define IRSND_SUPPORT_FDC_PROTOCOL 1           // FDC IR keyboard      >= 10000 (better 15000)  ~150 bytes
#define IRSND_SUPPORT_RCCAR_PROTOCOL 1         // RC CAR               >= 10000 (better 15000)  ~150 bytes
#define IRSND_SUPPORT_ROOMBA_PROTOCOL 1        // iRobot Roomba        >= 10000                 ~150 bytes
#define IRSND_SUPPORT_RUWIDO_PROTOCOL 1        // RUWIDO, T-Home       >= 15000                 ~250 bytes
#define IRSND_SUPPORT_A1TVBOX_PROTOCOL 1       // A1 TV BOX            >= 15000 (better 20000)  ~200 bytes
#define IRSND_SUPPORT_LEGO_PROTOCOL 1          // LEGO Power RC        >= 20000                 ~150 bytes
#define IRSND_SUPPORT_RCMM_PROTOCOL 0          // RCMM 12,24, or 32    >= 20000                 DON'T CHANGE, NOT SUPPORTED YET!
#define IRSND_SUPPORT_LGAIR_PROTOCOL 1         // LG Air Condition     >= 10000                 ~150 bytes.
#define IRSND_SUPPORT_SAMSUNG48_PROTOCOL 1     // Samsung48            >= 10000                 ~100 bytes
#define IRSND_SUPPORT_PENTAX_PROTOCOL 1        // Pentax               >= 10000                 ~150 bytes
#define IRSND_SUPPORT_S100_PROTOCOL 1          // S100                 >= 10000                 ~150 bytes
#define IRSND_SUPPORT_ACP24_PROTOCOL 1         // ACP24                >= 10000                 ~150 bytes
#define IRSND_SUPPORT_TECHNICS_PROTOCOL 1      // TECHNICS             >= 10000                 ~200 bytes
#define IRSND_SUPPORT_PANASONIC_PROTOCOL 1     // PANASONIC Beamer     >= 10000                 ~150 bytes
#define IRSND_SUPPORT_MITSU_HEAVY_PROTOCOL 1   // Mitsubishi-Heavy Aircondition, similar Timing to Panasonic beamer
#define IRSND_SUPPORT_IRMP16_PROTOCOL 0        // IRMP specific        >= 15000                 ~250 bytes
#define USE_ONE_TIMER_FOR_IRMP_AND_IRSND
#include <irmp.hpp>
#include <irsnd.hpp>
IRMP_DATA irmp_data;
IRMP_DATA irsnd_data;
int Prortocol_Index[58] = { IRMP_UNKNOWN_PROTOCOL, IRMP_SIRCS_PROTOCOL, IRMP_NEC_PROTOCOL, IRMP_SAMSUNG_PROTOCOL, IRMP_MATSUSHITA_PROTOCOL, IRMP_KASEIKYO_PROTOCOL, IRMP_RECS80_PROTOCOL, IRMP_RC5_PROTOCOL, IRMP_DENON_PROTOCOL, IRMP_RC6_PROTOCOL, IRMP_SAMSUNG32_PROTOCOL, IRMP_APPLE_PROTOCOL, IRMP_RECS80EXT_PROTOCOL, IRMP_NUBERT_PROTOCOL, IRMP_BANG_OLUFSEN_PROTOCOL, IRMP_GRUNDIG_PROTOCOL, IRMP_NOKIA_PROTOCOL, IRMP_SIEMENS_PROTOCOL, IRMP_FDC_PROTOCOL, IRMP_RCCAR_PROTOCOL, IRMP_JVC_PROTOCOL, IRMP_RC6A_PROTOCOL, IRMP_NIKON_PROTOCOL, IRMP_RUWIDO_PROTOCOL, IRMP_IR60_PROTOCOL, IRMP_KATHREIN_PROTOCOL, IRMP_NETBOX_PROTOCOL, IRMP_NEC16_PROTOCOL, IRMP_NEC42_PROTOCOL, IRMP_LEGO_PROTOCOL, IRMP_THOMSON_PROTOCOL, IRMP_BOSE_PROTOCOL, IRMP_A1TVBOX_PROTOCOL, IRMP_ORTEK_PROTOCOL, IRMP_TELEFUNKEN_PROTOCOL, IRMP_ROOMBA_PROTOCOL, IRMP_RCMM32_PROTOCOL, IRMP_RCMM24_PROTOCOL, IRMP_RCMM12_PROTOCOL, IRMP_SPEAKER_PROTOCOL, IRMP_LGAIR_PROTOCOL, IRMP_SAMSUNG48_PROTOCOL, IRMP_MERLIN_PROTOCOL, IRMP_PENTAX_PROTOCOL, IRMP_FAN_PROTOCOL, IRMP_S100_PROTOCOL, IRMP_ACP24_PROTOCOL, IRMP_TECHNICS_PROTOCOL, IRMP_PANASONIC_PROTOCOL, IRMP_MITSU_HEAVY_PROTOCOL, IRMP_VINCENT_PROTOCOL, IRMP_SAMSUNGAH_PROTOCOL, IRMP_IRMP16_PROTOCOL, IRMP_GREE_PROTOCOL, IRMP_RCII_PROTOCOL, IRMP_METZ_PROTOCOL, IRMP_ONKYO_PROTOCOL };
struct CRGB leds[NUM_LEDS];  // Initialize LED array
const int Relay1 = 5;        // Relay pin 1 (IN1)
const int Relay2 = 4;        // Relay pin 2 (IN2)
const int Relay3 = 6;        // Relay pin 3 (IN3)
const int Relay4 = 7;        // Relay pin 4 (IN4)
int irrec = 0;
String data;  //Variable for storing received data
int proto;
uint16_t addr, cmd, temp;
int eeadr;
void handleReceivedIRData();
void IRDecoder();
void SerialDecoder();
bool volatile sIRMPDataAvailable = false;

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

void setup() {
  Serial.begin(9600);  //Sets the baud for serial data transmission
  FastLED.addLeds<LED_TYPE, DATA_PIN>(leds, NUM_LEDS);
  // Set Relay pins as OUTPUT
  pinMode(Relay1, OUTPUT);
  pinMode(Relay2, OUTPUT);
  pinMode(Relay3, OUTPUT);
  pinMode(Relay4, OUTPUT);
  // Init all relays to off
  digitalWrite(Relay1, LOW);
  digitalWrite(Relay2, LOW);
  digitalWrite(Relay3, LOW);
  digitalWrite(Relay4, LOW);
  irmp_init();
  irmp_irsnd_LEDFeedback(true);  // Enable receive signal feedback at LED_BUILTIN
  irmp_register_complete_callback_function(&handleReceivedIRData);
  irsnd_init();
}

در تابع setup، پورت سریال را با نرخ باود 9600 مقداردهی کردیم. این نرخ باود پیش فرض ماژول HC-05 است. اگر نرخ باود ماژول HC-05 را تغییر دادید، مطمئن شوید که آن را در تابع setup نیز تغییر دهید. سپس کتابخانه FastLED را به همراه پایه های کنترل رله به عنوان خروجی مقداردهی اولیه کرده و در هنگام راه اندازی روی LOW تنظیم کرده ایم. بعداً نمونه های کتابخانه IRMP و کنترل کننده وقفه را مقداردهی اولیه کردیم.

void loop() {
  // Read data from Bluetooth Module
  char ch = 0;
  data = "";
  while (1) { // When there is no command received the MCU will be in this loop.
    while (Serial.available() <= 0) {
      if (irrec > 0) {
        IRDecoder();// Call IR decoder function when a valid command is detected
      }
      digitalWrite(13, irrec);
    };
    ch = Serial.read();
    if (ch == '#')
      break; // break the loop when a command is received
    data += ch;
  }
  SerialDecoder();// call serial Decoder function
}

در تابع حلقه دو حلقه دیگر ایجاد کرده ایم. آردوینو بررسی می کند که آیا داده ای در بافر UART وجود دارد یا خیر. هنگامی که داده ای در دسترس باشد، در یک متغیر بارگذاری می شود و به محض اینکه کاراکتر پایانی شناسایی شد، حلقه را می شکند. پس از خارج شدن از حلقه، تابع SerialDecoder را برای رمزگشایی درخواست فراخوانی می کند. پس از آن به حلقه قبلی برمی گردد. در حلقه اگر دستوری برای ضبط یک سیگنال IR خاص باشد، با فراخوانی تابع IRDecoder به سیگنال IR جدید گوش می دهد.

void SerialDecoder() {
  // Print Bluetooth Module data on serial monitor
  Serial.print(data);
  Serial.print("\n");
  // Control the devices using voice command
  if (data.startsWith("*turn on light"))  // turn on Device1 {
    digitalWrite(Relay1, HIGH);
    Serial.println("  :   light on");
    delay(200);
  } else if (data.startsWith("*turn off light"))  // turn off Device1
  {
    digitalWrite(Relay1, LOW);
    Serial.println("  :   light off");
    delay(2000);
  } else if (data.startsWith("*turn on TV"))  // turn on Device2
  {
    digitalWrite(Relay2, HIGH);
    Serial.println("  :   TV on");
    delay(200);
  }
  else if (data.startsWith("*turn off TV"))  // turn off Device2
  {
    digitalWrite(Relay2, LOW);
    Serial.println("  :   TV off");
    delay(200);
  } else if (data.startsWith("*turn on fan"))  // turn on Device3
  {
    digitalWrite(Relay3, HIGH);
    Serial.println("  :   fan on");
    delay(200);
  } else if (data.startsWith("*turn off fan"))  // turn off Device3
  {
    digitalWrite(Relay3, LOW);
    Serial.println("  :   fan off");
    delay(200);
  } else if (data.startsWith("*turn on music"))  // turn on Device4
  {
    digitalWrite(Relay4, HIGH);
    Serial.println("  :   music on");
    delay(200);
  } else if (data.startsWith("*turn off music"))  // turn off Device4
  {
    digitalWrite(Relay4, LOW);
    Serial.println("  :   music off");
    delay(200);
  } else if (data.startsWith("*turn on all"))  // turn on all Device
  {
    digitalWrite(Relay1, HIGH);
    digitalWrite(Relay2, HIGH);
    digitalWrite(Relay3, HIGH);
    digitalWrite(Relay4, HIGH);
    Serial.println("  :   All Relays on");
    delay(200);
  } else if (data.startsWith("*turn off all"))  // turn off all Device
  {
    digitalWrite(Relay1, LOW);
    digitalWrite(Relay2, LOW);
    digitalWrite(Relay3, LOW);
    digitalWrite(Relay4, LOW);
    Serial.println("  :   All Relays off");
    delay(200);
  } else if (data.startsWith("*RGB red"))  // set the RGB leds to red
  {
    for (int i = 0; i < NUM_LEDS; i++) {
      leds[i] = CRGB::Red;  //set the RGB leds to red
    }
    FastLED.show();
    delay(200);
  } else if (data.startsWith("*RGB green"))  //set the RGB leds to green
  {
    for (int i = 0; i < NUM_LEDS; i++) {
      leds[i] = CRGB::Green;  //set the RGB leds to green
    }
    FastLED.show();
    delay(200);
  } else if (data.startsWith("*RGB blue"))  // set the RGB leds to blue
  {
    for (int i = 0; i < NUM_LEDS; i++) {
      leds[i] = CRGB::Blue;  //set the RGB leds to blue
    }
    FastLED.show();
    delay(200);
  } else if (data.startsWith("*RGB yellow"))  // set the RGB leds to yellow
  {
    for (int i = 0; i < NUM_LEDS; i++) {
      leds[i] = CRGB::Yellow;  //set the RGB leds to yellow
    }
    FastLED.show();
    delay(200);
  } else if (data.startsWith("*RGB white"))  // // set the RGB leds to  white
  {
    for (int i = 0; i < NUM_LEDS; i++) {
      leds[i] = CRGB::White;  //set the RGB leds to white
    }
    FastLED.show();
    delay(200);
  } else if (data.startsWith("*turn off RGB"))  // turn off all RGB LEDS
  {
    for (int i = 0; i < NUM_LEDS; i++) {
      leds[i] = CRGB::Black;  //turn off all RGB LEDS
    }
    FastLED.show();
    delay(200);
  } else if (data.startsWith("*record power"))  // record and save remote power button
  {
    irrec = 12;
    IRDecoder();
    irrec = 1;
    delay(200);
  } else if (data.startsWith("*record volume up"))  // record and save remote volume up button
  {
    irrec = 12;
    IRDecoder();
    irrec = 2;
    delay(200);
  } else if (data.startsWith("*record volume down"))  // record and save remote volume down button
  {
    irrec = 12;
    IRDecoder();
    irrec = 3;
    delay(200);
  } else if (data.startsWith("*record next"))  // record and save remote next button
  {
    irrec = 12;
    IRDecoder();
    irrec = 4;
    Serial.print("irrec :");
    Serial.println(irrec);
    delay(200);
  } else if (data.startsWith("*record previous"))  /// record and save remote previous button
  {
    irrec = 12;
    IRDecoder();
    irrec = 5;
    delay(200);
  }
  else if (data.startsWith("*remote power"))  // Recall and send remote power button signal
  {
    eeadr = 10;
    irsnd_data.protocol = EEPROM.read(eeadr);
    temp = (EEPROM.read(eeadr + 2) << 8);
    temp |= EEPROM.read(eeadr + 1);
    irsnd_data.address = temp;
    temp = (EEPROM.read(eeadr + 4) << 8);
    temp |= EEPROM.read(eeadr + 3);
    irsnd_data.command = temp;
    irsnd_data.flags = 0;  // repeat frame 1 time
    Serial.print(F("Sending data  "));
    Serial.println(proto);
    if (!irsnd_send_data(&irsnd_data, true)) {
      Serial.println(F("Protocol not found"));  
    }
    irsnd_data_print(&Serial, &irsnd_data);
  } else if (data.startsWith("*remote volume up"))  // Recall and send remote volume up button signal
  {
    eeadr = 20;
    irsnd_data.protocol = EEPROM.read(eeadr);
    temp = (EEPROM.read(eeadr + 2) << 8);
    temp |= EEPROM.read(eeadr + 1);
    irsnd_data.address = temp;
    temp = (EEPROM.read(eeadr + 4) << 8);
    temp |= EEPROM.read(eeadr + 3);
    irsnd_data.command = temp;
    irsnd_data.flags = 0;  // repeat frame 1 time
    Serial.print(F("Sending data  "));
    Serial.println(proto);
    if (!irsnd_send_data(&irsnd_data, true)) {
      Serial.println(F("Protocol not found"));
    }
    irsnd_data_print(&Serial, &irsnd_data);
  } else if (data.startsWith("*remote volume down")) // Recall and send remote volume down button signal
  {
    eeadr = 30;
    irsnd_data.protocol = EEPROM.read(eeadr);
    temp = (EEPROM.read(eeadr + 2) << 8);
    temp |= EEPROM.read(eeadr + 1);
    irsnd_data.address = temp;
    temp = (EEPROM.read(eeadr + 4) << 8);
    temp |= EEPROM.read(eeadr + 3);
    irsnd_data.command = temp;
    irsnd_data.flags = 0;  // repeat frame 1 time
    Serial.print(F("Sending data  "));
    Serial.println(proto);
    if (!irsnd_send_data(&irsnd_data, true)) {
      Serial.println(F("Protocol not found"));  
    }
    irsnd_data_print(&Serial, &irsnd_data);
  } else if (data.startsWith("*remote next"))  // Recall and send remote next button signal
  {
    eeadr = 40;
    irsnd_data.protocol = EEPROM.read(eeadr);
    temp = (EEPROM.read(eeadr + 2) << 8);
    temp |= EEPROM.read(eeadr + 1);
    irsnd_data.address = temp;
    temp = (EEPROM.read(eeadr + 4) << 8);
    temp |= EEPROM.read(eeadr + 3);
    irsnd_data.command = temp;
    irsnd_data.flags = 0;  // repeat frame 1 time
    Serial.print(F("Sending data  "));
    Serial.println(proto);
    if (!irsnd_send_data(&irsnd_data, true)) {
      Serial.println(F("Protocol not found"));  
    }
    irsnd_data_print(&Serial, &irsnd_data);
  } else if (data.startsWith("*remote previous"))  // Recall and send remote previous button signal
  {
    eeadr = 50;
    irsnd_data.protocol = EEPROM.read(eeadr);
    temp = (EEPROM.read(eeadr + 2) << 8);
    temp |= EEPROM.read(eeadr + 1);
    irsnd_data.address = temp;
    temp = (EEPROM.read(eeadr + 4) << 8);
    temp |= EEPROM.read(eeadr + 3);
    irsnd_data.command = temp;
    irsnd_data.flags = 0;  // repeat frame 1 time
    Serial.print(F("Sending data  "));
    Serial.println(proto);
    if (!irsnd_send_data(&irsnd_data, true)) {
      Serial.println(F("Protocol not found"));  
    }
    irsnd_data_print(&Serial, &irsnd_data);
  }
}

تابع SerialDecoder وظیفه رمزگشایی تمام پیام های صوتی و همچنین اجرای آنها را بر عهده دارد. این تابع با استفاده از if else دستور دریافتی را با موارد از پیش تعریف شده مقایسه می کند و هنگامی که مطابقت را تشخیص داد، تابع مربوطه را اجرا می کند. اگر می‌خواهید درخواست‌های صوتی را سفارشی کنید یا می‌خواهید پیام‌های صوتی اضافی اضافه کنید، باید این تابع را تغییر دهید.

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید
void Rotary() {
  delay(75);
  if (digitalRead(PinCLK))
    rotationdirection = digitalRead(PinDT);
  else
    rotationdirection = !digitalRead(PinDT);
  TurnDetected = true;
  delay(75);
}

تابع Rotary به محض ایجاد وقفه در پایه D3 که به پایه CLK رمزگذار چرخشی متصل است، اجرا می شود. هنگامی که این تابع اجرا می شود، جهت چرخش را تشخیص می دهد و rotationdirection را بر اساس آن تنظیم می کند. همچنین داده دیگری به نام TurnDetected را تنظیم می کند تا به تابع حلقه بفهماند که یک چرخش شناسایی شده است.

void IRDecoder() {
  if (sIRMPDataAvailable) {
    int eepaddr = irrec;
    irrec = 0;
    int rpt;
    sIRMPDataAvailable = false;
    irmp_result_print(&irmp_data);
    proto = irmp_data.protocol;
    addr = irmp_data.address;
    cmd = irmp_data.command;
    // save signal data to EEPROM
    if (eepaddr < 10) {
      if (proto == 0) {
        EEPROM.write(eepaddr * 10, 0x0);
      } else {
        EEPROM.write(eepaddr * 10, proto);
      }
      if (addr == 0) {
        EEPROM.write((eepaddr * 10) + 1, 0);
        EEPROM.write((eepaddr * 10) + 2, 0);
      } else {
        EEPROM.write((eepaddr * 10) + 1, addr);
        EEPROM.write((eepaddr * 10) + 2, addr >> 8);
      }
      if (cmd == 0) {
        EEPROM.write((eepaddr * 10) + 3, 0x0);
        EEPROM.write((eepaddr * 10) + 4, 0x0);
      } else {
        EEPROM.write((eepaddr * 10) + 3, cmd);
        EEPROM.write((eepaddr * 10) + 4, cmd >> 8);
      }
    }
  }
}

تابع IRdecoder به سیگنال های IR جدید گوش می دهد و هنگامی که سیگنال معتبری را تشخیص می دهد سیگنال را به پروتکل، آدرس و فرمان رمزگشایی می کند. پس از رمزگشایی، این مقادیر را در آدرس های مربوطه در EEPROM ذخیره می کند. می توانید با درخواست صوتی آن ها را به دلخواه ذخیره یا برنامه ریزی مجدد کنید.

void handleReceivedIRData() {
  irmp_get_data(&irmp_data);
  sIRMPDataAvailable = true;
}

تابع handleReceivedIRData تابع کنترل کننده وقفه است که مسئول تشخیص سیگنال های IR است. این تابع در پس زمینه کار می کند و سیگنال دریافتی را برای پردازش در بافر ذخیره می کند.

چگونه از اتوماسیون خانگی با کنترل صوتی استفاده کنیم؟

برای استفاده از پروژه ابتدا باید اپلیکیشنی به نام BT Voice Control برای آردوینو (AMR_voice) نصب کنید. می‌توانید این برنامه را از این لینک دانلود و نصب کنید. پس از دانلود و نصب، بلوتوث را روشن کنید، ماژول HC-05 را جفت کنید و برنامه را باز کنید. در برنامه، گزینه Connect Robot را از منو انتخاب کنید. این دستور تمام دستگاه های بلوتوث جفت شده را لیست می کند. ماژول HC-05 را از لیست انتخاب کنید و برنامه با ماژول ارتباط برقرار می کند.

برنامه اتوماسیون خانگی

پس از اتصال تنها کاری که باید انجام دهید این است که دکمه میکروفون را فشار دهید تا گزینه صدای فرمان ظاهر شود. فرمان صحیح را بگویید و از کنترل خانه خود با پیام های صوتی لذت ببرید. در تصویر زیر اعلان های صوتی پیش فرض در برنامه داده شده است.

دستورات صوتی کنترل خانه با آردوینو

موارد موجود در فایل : سورس کامل

5 (3 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید قرار بدهم. سوالات مربوط به این مطلب را در قسمت نظرات همین مطلب اعلام کنید. سعی میکنم در اسرع وقت به نظرات شما پاسخ بدهم.

6 نظر

  1. سلام مجدد مهندس ببخشید بجای برد لورا ۰۲ میخام( از برد E32ttl 1w استفاده کنم) اصلاح کنید خودتون

  2. سلام مهندس
    میخوام یه بیسیم درست کنم برای یه پروژه
    با آردوینو میشه توضیح بدین مراحل کارو
    من در اون مراحل ساخت بیسیم خود مجموعتون هم مطالعه کردم ولی یکم مطالب گنگ بود . میخوام بیسیم م چند کیلومتر رو پوشش بده از ماژول های بیسیم از ماژول لورا۰۲
    هم تحقیق کردم میشه این کارو کرد میشه راهنماییم کنید که با استفاده از آردوینو وعورا بسازم .ممنون
    +من خودم دوره آردوینو شما رو دارم

  3. سلام من در حال انجام یک پروژه ای هستم می خواستم بدونم همچین اپلیکیشنی برای esp هم هست.

  4. سلام خدمت تان برسد
    پروژه ای که با آردنیو بسازیم ویدیو شنارا از کجا دریافت کرد

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

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