پایش گاز در خانه هوشمند

فهرست

مقدمه

گاز گرفتگی در  اثر سوخت ناقص گاز طبیعی و دیگر سوخت ها در منازل باعث از دست رفتن جان ساکنان و بروز خسارات جانی جبران ناپذیر می شود. نشتی گاز نیز از دیگر خطراتی است که منازل مسکونی و دیگر امکان را تهدید می کند و می تواند باعت بروز خسارت مالی و جانی فراوانی شود. با پیشرفت فناوری امکان تشخیص وجود گاز های مختلف در فضا فراهم شده است و با استفاده اینترنت اشیاء در هر زمان و هر مکان می تواند از بروز وضعیت های هشدار دهنده آگاه شد.

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


هشدار ایمنی: این پروژه برای اهداف آموزشی طراحی شده است!! در صورتی که می خواهید از آن استفاده واقعی داشته باشید می بایست فرایندکالیبراسیون حسگر رابه دقت و به صورت علمی انجام دهید. هرگونه استفاده غیر آموزشی از این کیت به مسئولیت خود شماست و شرکت سازنده هیچ گونه مسئولیتی در این مورد ندارد.

اقلام مورد نیاز برای ساخت پایشگر گاز خانه هوشمند

برای ساخت سیستم پایش گاز خانه هوشمند نیاز به اقلام زیر داریم:

  1. ماژول آردوینو نانو(Arduino Nano) + کابل USB مناسب برای پروگرم کردن آن
  2. کیت ماژولار آردوینو نانو پرومیک(ProMake Arduino Nano Kit)
  3. ماژول ProMake WiFi ESP12(که از ESP8266 برای ارتباط با شبکه وای فای استفاده می کند)
  4. ماژول ProMake 2-ch Relay (برای کنترل پمپ آب، فن، هیتر، مه پاش یا هر مورد دیگر)
  5. ماژول ProMake Sensor Tag(برای اندازگیری دما، رطوبت نسبی و نور محیطی)
  6. ماژول ProMake Gas MQ (برای اندازه گیری میزان گازهای خطرناک)
  7. یک جعبه با سایز مناسب ()
برروی ماژول ProMake Gas MQ  به صورت پیش فرض حسگر MQ-2 نصب شده است. حسگر MQ-2 عضوی از خانواده حسگر های MQ هست که از فناوری MOS) Metal Oxide Semiconductor) برای تشخیص میزان حضور گاز استفاده می‌کنند. این حسگر ها به گروهی از گازها حساس هستند و برایند میزان حضور همه آنها در محیط بر میزان جریان عبوری از حسگر تاثیر گذار است.
حسگر MQ-2 به گازهای هیدروژن(H2)، گاز مایع(LPG)، گازشهری(CH4)، مونواکسید کربن(CO)، الکل، دود و پروپان حساسیت نشان می دهد و وجود هر یک از این گازها در محیط موجب تحریک این حسگر می‌شود.

برای آشنایی بیشتر با محصولات به کار رفته در این کیت برروی آنها کلیک کنید

wifi-001( janbi )

WiFi ESP12

معروف‌ترین ماژول برای ارتباط با شبکه‌های WiFi در اختیار شماست.

snstag-001 ( janbi )

Sensor TAG

ماژولی کوچک با سنسورهای متنوع

GASMQ(KENAR)

GAS MQ

ماژول شناسایی وجود انواع گاز در محیط

سرهم کردن کیت

ابتدا ماژول آردوینو نانو را برروی “ProMake Arduino Nano kit” قرار می دهیم. دقت کنید که ماژول را در جهت صحیح وارد کیت نمایید. سپس مطابق شکل رو به رو ماژول ها را در مکان های مشخص شده وارد نماید:

  1. ماژول ProMake WiFi ESP12 را در محل شماره 1
  2. ماژول ProMake Sensor Tag را در محل شماره 2
  3. ماژول ProMake Gas MQ را در محل شماره 3
توجه: در هنگام وارد کردن ماژول های پرومیک به جهت آنها که از بریدگی گوشه آنها قابل تشخیص است دقت کنید.
توجه: حتماً هر ماژول را در محل تعیین شده وارد نمایید تا اتصالات مورد نیاز برای ارتباط با ماژول فراهم باشد.

حال باید کیت شما مطابق شکل روبرو باشد.

برنامه نویسی و بارگزاری(Upload) روی برد

برای برنامه نویسی از محیط معروف و دوست داشتنی Arduino IDE استفاده می‌کنیم. پس اگر آن را برروی رایانه شخصیتون نصب ندارید، سریع نصبش کنید تا بریم سراغ مرحله بعد…

نصب کتابخانه WiFiEsp 

برای اینکه بتونیم با ماژول ESP8266 ارتباط برقرار کنیم باید کتابخانه WiFiEsp را در Arduino IDE نصب نمایید.

برای اینکار کافی است از منو Sketch وارد زیر منو Include Library شوید و آیتم Manage Libraries را انتخاب نمایید و در پنجره ظاهر شده مطابق تصویر رو به رو عبارت WiFiEsp را جستجو نمایید. بعد از ظاهر شدن نتایج برروی دکمه Install کلیک نمایید تا کتابخانه نصب شود.

آیتم Manage Libraries از منو Tools نیز قابل دسترس است و البته با استفاده از کلید ترکیبی Ctrl+Shift+I نیز  ظاهر می شود.

نصب کتابخانه DFRobot_SHT20

برای ارتباط با سنسور دما و رطوبت روی ماژول سنسور تگ، کتابخانه DFRobot_SHT20 را در Arduino IDE نصب نمایید.

برای اینکار کافی است از منو Sketch وارد زیر منو Include Library شوید و آیتم Manage Libraries را انتخاب نمایید و در پنجره ظاهر شده مطابق تصویر رو به رو عبارت FastLED  را جستجو نمایید. بعد از ظاهر شدن نتایج برروی دکمه Install کلیک نمایید تا کتابخانه نصب شود.

نصب کتابخانه FastLED  

برای کنترل RGB LED های روی شیلد، کتابخانه Fast LED را در Arduino IDE نصب نمایید.

برای اینکار کافی است از منو Sketch وارد زیر منو Include Library شوید و آیتم Manage Libraries را انتخاب نمایید و در پنجره ظاهر شده مطابق تصویر رو به رو عبارت FastLED  را جستجو نمایید. بعد از ظاهر شدن نتایج برروی دکمه Install کلیک نمایید تا کتابخانه نصب شود.

کتابخانه FastLED

ایجاد حساب کاربری Ubidots

برای اینکه بتوانید مسیرها و محل تردد خودرو خود را برروی نقشه مشاهده کنید می بایست برروی یک سرویس دهند اینترنتی پلتفورم IoT یک حساب کاربری داشته باشید. در این پروژه ما سرویس ubidots را به عنوان یک نمونه که به صورت رایگان در اختیار همه قرار دارد انتخاب کردیم.

پس به سایت https://ubidots.com مراجعه نمایید و برای خود یک حساب کاربری رایگان ایجاد نمایید.

سایت ubidots.com

آشنایی با کد

حال که کتابخانه های پیش نیاز را نصب کردید و حساب کاربری ubidots را ساخته اید، آماده هستید تا وارد نوشتن برنامه اصلی شوید.

عجله نکنید!! ابتدا نیاز است تغییراتی در کد زیر بدهید و بعد از آن استفاده کنید، لذا لطفا گام به گام با من همراه شوید تا هم کد را برایتان شرح دهم و هم تغییرات را باهم اعمال کنیم

  • در خطوط 1 تا 7 شیئ  RGB LED را ایجاد کردیم و پین مربوطه را از  روی مارکاژ برد استخراج و  تعریف  نمودیم.
  • در خطوط 8 تا 9 شیئ  حسگرهای دما و رطوبت  را ایجاد کردیم.
  • در خطوط 12 تا 26 پین های  مربوط به ارتباط UART و RESET ماژول WiFi را  با دقت از روی مارکاژهای کیت و ماژول  استخراج و  تعریف کردیم. سپس اشیاء مورد نیاز را ایجاد نمودیم.
    • برای ارتباط با مودم وای فای شناسه شبکه(SSID) و کلمه عبور را در خطوط 30 و 31 اصلاح نمایید.
  • در خطوط 29 تا 34 آدرس و پورت سرور HTTP سایت Ubidots را تنظیم نمودیم و فاصله زمانی بین ارسال های پیاپی به Ubidots را تعیین کردیم.
  • در خط 37 پین آنالوگ حسگر گاز  از روی ماژول ProMake Gas MQ را  با دقت از روی مارکاژهای کیت و ماژول استخراج و تعریف کردیم.
  • در خط 38 پین تحریک بازر  را  از روی مارکاژ  کیت استخراج و تعریف کردیم.
  • در تابع setup :
    • ارتباط سریال Debug را راه اندازی کردیم
    • چراغهای RGB LED را راه اندازی می کنیم
    • ماژول ESP8266 را ریست و با پارامترهای صحیح راه اندازی می کنیم
    • سپس تلاش می کنیم تا به شبکه WiFi وصل شویم
    • در نهایت سنسورها را راه اندازی می کنیم تا آماده ورود به تابع loop شویم.
  • در تابع loop:
    • ابتدا  مقادیر حسگرها را می خوانیم.
    • سپس با توجه به مقادیر خوانده شده بوق و چراغ های هشداردهند RGB LED را فعال و غیر فعال می کنیم.
      • برای اینکه عملکرد دلخواه خود را بدست آورید شرط های داخل if ها را به فراخور نیاز خود تغییر دهید.
    • سپس  در صورتی که بیش از  10 ثانیه از  ارسال داده قبلی گذشته باشد، داده های جدید را به صورت یک رشته با فرمت JSON برای سرور ارسال می کنیم.
  • در تابع http_post اقدام به ارسال داده ها در قالب یک رشته دریافت شده در آرگومان ورودی تابع می کنیم.
    • برای اینکه داده‌های حسگرها  برای حساب کاربری شما ارسال شود می‌بایست Default token حساب خود را در بخشی از کد که عبارت REPLACE_YOUR_TOKEN نوشته شده جایگزین کنید. در ادامه در باره این که چگونه این توکن را از سایت دریافت کنید توضیح خواهم داد.
				
					//RGB LEDs ==========================================
#include 
#define LED_PIN     16
#define NUM_LEDS    2
CRGB leds[NUM_LEDS];

//Sensors ==========================================
#include "DFRobot_SHT20.h"
DFRobot_SHT20 sht20;

// WiFi UART Connection =================================
#include 
#define ARD_RX_ESP_TX   4 // Arduino RX = ESP TX
#define ARD_TX_ESP_RX   7 // Arduino TX = ESP RX
SoftwareSerial EspSerial(ARD_RX_ESP_TX, ARD_TX_ESP_RX); 

#define ESP_AT_BAUD     9600  
#define ESP_RST_PIN     8

#include "WiFiEsp.h"

char ssid[] = "YOUR_SSID";            // your network SSID (name)
char pass[] = "YOUR_PASSWORD";        // your network password

// Initialize the Ethernet client object
WiFiEspClient client;

// IOT Platform ===================================
#define SERVER_NAME   "169.55.61.243" //"industrial.api.ubidots.com"
#define SERVER_PORT   (80)

unsigned long lastConnectionTime = 0;         // last time you connected to the server, in milliseconds
//const unsigned long postingInterval = 10000L; // delay between updates, in milliseconds
const unsigned long postingInterval = 300000L; // delay between updates, in milliseconds

//Pins =================================
#define GAS_PIN     A6
#define BUZZ_PIN    5

void setup(void)
{
  Serial.begin(9600);
  while (!Serial);

  FastLED.addLeds(leds, NUM_LEDS);

  pinMode(ESP_RST_PIN, OUTPUT);
  //ESP RESET
  digitalWrite(ESP_RST_PIN, LOW);
  delay(50);
  digitalWrite(ESP_RST_PIN, HIGH);
  delay(2000); // to boot

  // initialize serial for ESP module
  EspSerial.begin(ESP_AT_BAUD);
  // initialize ESP module
  WiFi.init(&EspSerial);

  // check for the presence of the shield
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi module not present");
    // don't continue
    while (true);
  }

  // attempt to connect to WiFi network
  int status = WL_IDLE_STATUS;     // the Wifi radio's status
  while ( status != WL_CONNECTED) {
    Serial.print(F("Connecting to WPA SSID: "));
    Serial.println(ssid);
    // Connect to WPA/WPA2 network
    status = WiFi.begin(ssid, pass);
  }

  pinMode(BUZZ_PIN, OUTPUT);
  pinMode(GAS_PIN,INPUT);
  
  sht20.initSHT20();                         // Init SHT20 Sensor
  delay(1000);
  sht20.checkSHT20();                        // Check SHT20 Sensor
}

bool toggle = true;
void loop(void)
{
  float humd = sht20.readHumidity();         // Read Humidity
  float temp = sht20.readTemperature();      // Read Temperature

  int gasValue = analogRead(GAS_PIN); 
  Serial.println(gasValue);
 
  if(gasValue>40){
    if(toggle){
      analogWrite(BUZZ_PIN, 32);
      leds[0] = CRGB(255, 0, 0);
      leds[1] = CRGB(0, 0, 255);
      FastLED.show();
      toggle = false;
    }else{
      analogWrite(BUZZ_PIN, 128);
      leds[0] = CRGB(0, 0, 255);
      leds[1] = CRGB(255, 0, 0);
      FastLED.show();
      toggle = true;
    }
  }else{
    analogWrite(BUZZ_PIN, 0);
    leds[0] = CRGB(0, 255, 0);
    leds[1] = CRGB(0, 255, 0);
    FastLED.show();
  }

  // if 10 seconds have passed since your last connection,
  // then connect again and send data
  if (millis() - lastConnectionTime > postingInterval) {
    http_post(String(F("{\"Temp\":"))+ String(temp,6)+
              String(F(",\"Humid\":")) + String(humd,6)+
              String(F(",\"Gas\":")) + String(gasValue)+
              String("}"));
  }
  delay(1000);
}

void http_post( String postdata) {
  // close any connection before send a new request
  // this will free the socket on the WiFi module
  client.stop();
  
  if (client.connect(SERVER_NAME, SERVER_PORT)) 
  {
    // Sending the HTTP request
    client.println(("POST /api/v1.6/devices/home/ HTTP/1.1"));
    client.println(F("Host: industrial.api.ubidots.com"));
    client.println(F("User-Agent: ESP8266/1.0"));
    client.println(F("X-Auth-Token: REPLACE_YOUR_TOKEN"));
    client.println(F("Content-Type: application/json"));
    client.print(F("Content-Length: "));
    client.println(String(postdata.length()));
    client.println(F("Connection: close"));
    client.println();
    client.println(postdata);

    // note the time that the connection was made
    lastConnectionTime = millis();
    
    // if there are incoming bytes available
    // from the server, read them and print them
    while (client.connected());
    while (client.available()) {
      char c = client.read();
      Serial.write(c);      // note the time that the connection was made
   }
    lastConnectionTime = millis();  
    Serial.println();
    Serial.println("Disconnecting from server...");
  } 
  else 
  {
   Serial.println(F("Connect failed"));
  }
}
				
			

دریافت Default token از Ubidots

برای ارسال هر درخواست به ubidots نیاز مند TOKEN است. ساده ترین راه برای دریافت توکن ، انتخاب گزینه API Credentials” از منو کاربر در گوشه راست بالای سایت است. برای این کار:

  1. وارد حساب کاربری خود در سایت Ubidots شوید.
  2. وارد منو کاربر در گوشه سمت راست بالا شوید و برروی گزینه API Credentials” کلیک کنید.
  3. حال در فرمی کنه نمایش داده می شود از بخش Tokens مقدار Default token را با استفاده از دکمه مقابل آن کپی کنید. مراقب باشید که توکن را با API Key اشتباه نگیرید!!

بارگذاری کد برروی برد

حال در محیط Arduino IDE :

  • یک Sketch جدید ایجاد نماید و برنامه فوق را  داخل آن کپی نماید.
  • عبارت YOUR_SSID را با  شناسه شبکه(SSID) و عبارت YOUR_PASSWORD را با کلمه عبور  مودم وای فای جایگزین نمایید.
  • عبارت REPLACE_YOUR_TOKEN را با Default token دریافتی از سایت جایگزین نمایید.
  • حال Sketch را با نامی دلخواه مثل home_gas ذخیره نمایید.
  • بررسی کنید که کلید S1 روی کیت در وضعیت PROG قرار داشته باشد.
  • حال می توانید برنامه را برروی برد آردوینو نانو بارگذاری(Upload) نمایید.

تست اولیه

برای اینکه قبل از انجام تست میدانی از عملکرد درست مدار اطمینان حاصل کنید، برای تغذیه برد از دو روش می توانید استفاده کنید:

  • با استفاده از پورت USB کامپیوتر  یا یک شارژر موبایل یا پاور بانک و یک کابل USB مناسب و اتصال آنها به کانکتور USB ماژول آردوینو نانو؛ تغذیه کیت، ماژول ها و آردوینو را تامین کنید.
  • با استفاده از پورت USB کامپیوتر  یا یک شارژر موبایل یا پاور بانک و یک کابل USB Type-C و اتصال آنها به کانکتور USB Type-C روی کیت؛ تغذیه کیت، ماژول ها و آردوینو را تامین کنید.

    با برقرار شدن تغذیه علایم زیر مشاهده می شود:

    • ماژول WiFi راه اندازی شده و در صورت موفقیت در ارتباط با مودم وای فای دو چراغ RGB LED سبز رنگ می‌شوند.
    • حال اگر فندکی را روشن کنید در حالی که شاسی آن را پایین نگهداشته ای شغله را فوت کنید تا گاز آن به بیرون جریان داشته باشد و نزدیک حسگر MQ-2 بنمایید آژیر و چراغ هشدار به کار می افتد
    • همانطور که پیش‌تر اشاره شد در بازه های زمانی که در کد تعریف کردیم، داده‌های جدید برای سایت Ubidots ارسال می‌شوند.
    • در سایت Ubidots یک دستگاه به نام home برای شما ثبت می شود که دارای سه متغییر به نام های gas، humid و temp است که اطلاعات حسگرها در آن قابل مشاهده است.

    مشاهده اطلاعات برروی داشبرد

    حالا برای مشاهده داده های دریافتی از حسگرها کافی هست مراحل زیر را طی کنید:

    • وارد حساب کاربری خود در سایت Ubidots بشوید.
    • از منوی Data آیتم Dashboards را انتخاب کنید.
    • یک داشبرد جدید با نام دلخواه ایجاد کنید.
    • به این داشبرد یک ویجت از نوع Thermometer مطابق شکل رو برو اضافه نمایید.
    • در بخش Settings این ویجت، فیلد Select Devices دستگاه home را انتخاب نمایید.
    • سپس متغییر Temp را انتخاب کنید و با زدن دکمه تایید دماسنج به داشبرد افزوده می شود
    حال می توانید برای تک تک متغییرهای دریافتی با استفاده از Widget های دلخواه خود نمایش تصویری در داشبرد ایجاد نمایید.

    بهبودهای نرم افزاری

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

    • جبران اثر دما و رطوبت بر حسگر گاز: احتمالا از خود پرسیده باشید علت وجود حسگر دما ورطوبت در این پروژه چیست؟؟ خوب است بدانید که حسگرهای گازی که از فناوری MOS) Metal Oxide Semiconductor) استفاده می کنند به تغییرات دما و رطوبت حساس هستند. واکنش این حسگرها به میزان گاز ثابت در محیط در شرایط دما و رطوبت متفاوت، متفاوت است!! لذا بهتر است برای دستیابی به اعداد بهتر و دقیق تر و کاهش صادر شدن هشدار های نادرست، اثر دما و رطوبت بر عملکرد حسگر را محاسبه و جبران نماییم.
    • نمایش وضعیت ارتباط با شبکه WiFi: همان طور که شاید تا کنون متوجه شده باشید وضعیت ارتباط با Access Point به کاربر نمایش داده نمی شود و در صورتی که دستگاه دچار مشکل ارتباطی شود علامتی به کاربر داده نمی شود. برای اینکه با یک نگاه بتوان از برقرار بودن ارتباط WiFi دستگاه مطمئن شد می بایست از یکی از RGB LED ها به این منظور استفاده نمود
    • بهبود ارتباط WiFi: شاید با کمی دقت متوجه شده باشید که اگر ارتباط وای فای به دلیلی مثل خاموش شدن مودم یا تضعیف سیگنال دچار قطعی شود، دیگر اقدامی برای ارتباط مجدد صورت نمی گیرد و تمام ارسال ها با شکست رو به رو می شود. برای حل این مشکل می بایست همواره وضعیت ارتباط با Access Point را بررسی نمود و در صورت بروز قطعی مجدد ارتباط را برقرار نمود.

    بهبودهای سخت افزاری

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

    1. افزایش عملگرها: احتمالا  فعال کردن تهویه مطبوع اثر جدی در کاهش غلظت گازهای موجود در محیط داشته باشد یا بستن شیر گاز توسط یک عملگر برقی می تواند جلو بروز یک فاجعه را بگیرد ، لذا در صورتی که بخواهید در واکنش به تشخیص شرایط عملگری را فعال کنید می‌توانید با اتصال ماژول ProMake Universal 8-CH Relay به کانکتور Grove روی کیت امکان کنترل 8 عملگر را داشته باشید. البته می توانید تا 8 عدد از این ماژول ها را به صورت آبشاری به هم متصل کنید و تا حداکثر 64 عملگر مختلف را کنترل نمایید.(البته برای گرفتن عملکرد صحیح نیاز است تغذیه مناسب را برای این ماژول ها فراهم کنید تا جریان کافی برای عملکرد رله ها فراهم باشد)
    2. افزایش سرعت و ظرفیت پردازش:  همان طور که شاید تا کنون مشاهده کرده باشید ماژول های Arduino Nano  استاندارد توان و ظرفیت پردازشی محدودی دارند و با بزرگ شدن برنامه شما به محدودیت های خود رسیده و امکان اجرای برنامه را ندارند و یا در اجرای برنامه با اشکالات غیر متعارف روبرو می شوند. برای حل این مشکل با استفاده از ماژول ProMake STM32 Nano می توانید از سرعت و ظرفیت بیشتر برای پردازش و تحلیل اطلاعات بهره ببرید.

      هشدار ایمنی: در صورتی که می خواهیدبرای کنترل عملگرها از رله استفاده کنید می بایست از تخصص و مهارت لازم برخوردار باشید. انجام این کار توسط افراد کم تجربه و ناوارد می تواند خطرات جانی و مالی جدی برای شما و دیگران به دنبال داشته باشد. خطر آتش سوزی در صورت عدم رعایت تناسب جریان نامی رله ها و عملگرها بسیار محتمل و گاهاً حتمی است.
      هشدار ایمنی: فعال شدن رله ها در حضور گازهای قابل اشتعال خطر بروز انفجار و آتش سوزی به همراه دارد.بسته بندی صحیح و نصب در محل مناسب به جهت جلوگیری از بروز حادثه بر عهده مصرف کننده است! شرکت سازنده هیچ مسئولیتی در قبال استفاده غیر آموزشی از این محصولات را بر عهده نمی گیرد.

      ماژول ProMake STM32 Nano

      STM32 NANO

      استفاده از قدرت STM32 در محیط Arduino IDE