مانیتورینگ دما و رطوبت مبتنی بر اینترنت توسط آردوینو در فضای ThingSpeak

الکترونیک و رباتیک -> ماژول ها و سنسور ها 3820 9 کاربر آکادمی پارتینه

رطوبت و دما پارامترهای بسیار متداولی برای اندازه‌گیری و تعیین وضعیت جوی محسوب می‌شوند. در این پروژه  مبتنی بر اینترنت اشیا(IOT)، مقادیر رطوبت و دما از طریق اینترنت و با استفاده از فضای ابری ThingSpeakمانیتور می‌شوند. این کار از طریق انتقال دیتا بین آردوینو ، ماژول دما و رطوبت DHT11 ، ماژول ESP8266 WIFI و یک نمایشگر انجام می‌شود. میزان دما بر حسب درجه سانتی‌گراد و میزان رطوبت براساس درصد از طریق نمایشگر نشان داده می‌شود. همچنین داده‌ها برای مانیتورینگ، به صورت بلادرنگ از هر نقطه جهان به سرور ThingSpeak ارسال می‌شوند.

مواد اولیه :
# عنوان تعداد لینک
0 برد آردوینو 1 لینک خرید
1 نمایشگر LCD کاراکتری ۱۶۰۲ 1 لینک خرید
2 ماژول وای فای ESP8266-01 1 لینک خرید
3 سنسور دما و رطوبت DHT-11 1 لینک خرید
4   برد بورد  1 لینک خرید
5 سیم جامپر 1 لینک خرید

مرحله 1 : بررسی عملکرد و راه اندازی فضای ابری ThingSpeak

Thingspeak چیست؟

ThingSpeak یک پلتفرم IOT است که با استفاده از آن می‌توان داده‌ها را توسط کانال‌ها، صفحات وب و از طریق اینترنت در هر نقطه از جهان کنترل کرد. در ThingSpeak نیز امکان مشاهده و تحلیل نموداری داده‌ به صورت بلادرنگ وجود دارد.

ساختار پروژه

این پروژه دارای چهار بخش است . در بخش اول ماژول DHT11 میزان رطوبت و دما را اندازه‌گیری می‌کند.

در مرحله دوم آردوینو داده‌های دریافتی از این حسگر را به صورت عددی مناسب، بر حسب درصد و در مقیاس سانتی‌گراد تبدیل کرده و به ماژول Wi-Fi ارسال می‌کند.

در مرحله سوم ماژول Wi-Fi ESP8266 داده را به سرور ThingSpeak ارسال می‌کند.  

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

مرحله 2 : ارسال داده‌ها به ThingSpeak توسط ماژول ESP8266 WIFI (گام اول)

ابتدا با ثبت نام در سایت ThingSpeak.com یک حساب کاربری ایجاد کنید. سپس وارد حساب کاربری خود شده و بر روی Get Started کلیک کنید.

مرحله 3 : ارسال داده‌ها به ThingSpeak توسط ماژول ESP8266 WIFI (گام دوم)

در این مرحله وارد منوی "Channels" شده و روی گزینه New Channel در همان صفحه کلیک کنید.

مرحله 4 : ارسال داده‌ها به ThingSpeak توسط ماژول ESP8266 WIFI (گام سوم)

در پنجره باز شده فرم ایجاد کانال را مشاهده خواهید کرد. برای پنل خود در صورت نیاز توضیحی بنویسید. سپس نام «Humidity» و «Temperature» را درفیلدهای 1و 2 وارد کنید. همچنین گزینه "Make Public" را در زیر فرم فعال کرده و کانال را ذخیره کنید.

مرحله 5 : ارسال داده‌ها به ThingSpeak توسط ماژول ESP8266 WIFI (گام چهارم)

حال بر روی تب«API keys» کلیک کرده، مقادیر Read API Key و Write API Key را یادداشت کنید. در اینجا فقط به Write API Key نیاز خواهیم داشت.

مرحله 6 : ارسال داده‌ها به ThingSpeak توسط ماژول ESP8266 WIFI (گام پنجم)

سپس روی "Data Import/Export"  کلیک کرده و آدرس موجود در قسمت Update Channel Feed-Get را کپی کنید.

مرحله 7 : ارسال داده‌ها به ThingSpeak توسط ماژول ESP8266 WIFI (گام ششم)

 کاربر باید "api.thingspeak.com" را توسط تابع httpGet با استفاده از postUrl به عنوان "update?api_key=SIWOYBX26OXQ1WMS&field1=0" باز کرده، سپس داده‌ها را ارسال کند. قبل از ارسال داده‌ها ، کاربر باید Query یا postUrl را با داده‌های دما و رطوبت ویرایش کند. مانند آنچه در زیر نشان داده شده است. در اینجا هر دو پارامتر دما و رطوبت را در قالب دو رشته توسط httpGet به سرور ارسال می‌کنیم.

​sprintf(postUrl, "update?api_key=%s&field1=%s&field2=%s",api_key,humidStr,tempStr);
httpGet("api.thingspeak.com", postUrl, 80);​

برای درک بیشتر این فرآیند، ویدیو قرار داده شده در انتهای آموزش را مشاهده کنید.

عملکرد این پروژه بر اساس ارتباط سریال و واکشی داده‌ها از ماژول DHT11 است. ابتدا آردوینو سیگنال شروع را برای این ماژول ارسال کرده، سپس DHT11 یک سیگنالی حاوی مقادیر دما و روطوبت را ارسال می‌کند.

آردوینو داده‌ها را پس از جمع‌آوری و استخراج به سرور ThingSpeak و نمایشگر ارسال می‌کنند. ThingSpeak داده‌ها را به صورت نموداری نمایش می‌دهد.

 

مرحله 8 : اتصالات و دیاگرام مداری

در اینجا از نمایشگر کاراکتری 1602 برای نمایش دما و رطوبت استفاده شده که به صورت چهارسیمه به آردوینو متصل می‌شود. پین‌های نمایشگر یعنی RS، EN، D4، D5، D6 و D7 به پین‌های دیجیتال شماره 14 ، 15 ، 16 ، 17 ، 18 و 19 به آردوینو متصل شده‌اند. وجود این نمایشگر اختیاری است.

ماژولDHT11 به پین دیجیتال شماره 12 آردوینو متصل شده است. پین‌های Vcc و GND ماژول Wi-Fi ESP8266 مستقیماً به 3.3V وصل می‌شوند. پین‌های Tx و Rx ماژول ESP8266 مستقیماً به پین‌های 2 و 3 آردوینو که به عنوان پین‌های سریال نرم‌افزاری تعریف شده‌اند، متصل می‌شوند. 

مرحله 9 : کدنویسی و تنظیمات نرم‌افزاری

در گام اول تمامی کتابخانه‌های مورد نیاز را فراخوانی کرده و متغیرهای مورد نیاز را تعریف می‌کنیم.

#include"dht.h"      // Including library for dht
#include<LiquidCrystal.h>
LiquidCrystal lcd(14,15,16,17,18,19);
#include<Timer.h>
Timer t;
#include <SoftwareSerial.h>
SoftwareSerial Serial1(2, 3);

سپس API key را وارد کنید.

char *api_key="SIWOYBX26OXQ1WMS";     // Enter your Write API key from ThingSpeak
static char postUrl[150];
int humi,tem;
void httpGet(String ip, String path, int port=80);

در حلقه اصلی مقادیر درجه حرارت و رطوبت را دریافت کرده و سپس بر روی نمایشگر نشان داده می‌شود. تابع void send2server () برای ارسال داده به سرور استفاده می‌شود.

تابع Send2server یک روال سرویس قطع زمان سنج است که در هر 20 ثانیه تماس می گیرد. وقتی تابع بروزرسانی را فراخوانی می کنیم ، روال سرویس قطع زمان سنج نامیده می شود.

void send2server()
{
  char tempStr[8];
  char humidStr[8];
  dtostrf(tem, 5, 3, tempStr);
  dtostrf(humi, 5, 3, humidStr);
  sprintf(postUrl, "update?api_key=%s&field1=%s&field2=%s",api_key,humidStr,tempStr);
  httpGet("api.thingspeak.com", postUrl, 80);
}

کد کامل:

#include"dht.h"                      // Including library for dht
#include<LiquidCrystal.h>
LiquidCrystal lcd(14,15,16,17,18,19);
#include<Timer.h>
Timer t;
#include <SoftwareSerial.h>
SoftwareSerial Serial1(2, 3);

#define dht_dpin 12 
#define heart 13
dht DHT;

char *api_key="SIWOYBX26OXQ1WMS";     // Enter your Write API key from ThingSpeak
static char postUrl[150];
int humi,tem;
void httpGet(String ip, String path, int port=80);

void setup()
{
 lcd.begin(16, 2);
 lcd.clear();
 lcd.print("   Humidity   ");
 lcd.setCursor(0,1);
 lcd.print("  Measurement ");
 delay(2000);
 lcd.clear();
 lcd.print("Circuit Digest ");
 lcd.setCursor(0,1);
 lcd.print("Welcomes You");
 delay(2000);
 Serial1.begin(9600);
 Serial.begin(9600);
 lcd.clear();
 lcd.print("WIFI Connecting");
 lcd.setCursor(0,1);
 lcd.print("Please wait....");
 Serial.println("Connecting Wifi....");
 connect_wifi("AT",1000);
 connect_wifi("AT+CWMODE=1",1000);
 connect_wifi("AT+CWQAP",1000);  
 connect_wifi("AT+RST",5000);
 connect_wifi("AT+CWJAP=\"1st floor\",\"muda1884\"",10000);
 Serial.println("Wifi Connected"); 
 lcd.clear();
 lcd.print("WIFI Connected.");
 pinMode(heart, OUTPUT);
 delay(2000);
 t.oscillate(heart, 1000, LOW);
 t.every(20000, send2server);
}

void loop()
{

  DHT.read11(dht_dpin);
  lcd.setCursor(0,0);
  lcd.print("Humidity: ");
  humi=DHT.humidity;
  lcd.print(humi);   // printing Humidity on LCD
  lcd.print(" %    ");
  lcd.setCursor(0,1);
  lcd.print("Temperature:");
  tem=DHT.temperature;
  lcd.print(tem);   // Printing temperature on LCD
  lcd.write(1);
  lcd.print("C   ");
  delay(1000);
  t.update();
}

void send2server()
{
  char tempStr[8];
  char humidStr[8];
  dtostrf(tem, 5, 3, tempStr);
  dtostrf(humi, 5, 3, humidStr);
  sprintf(postUrl, "update?api_key=%s&field1=%s&field2=%s",api_key,humidStr,tempStr);
  httpGet("api.thingspeak.com", postUrl, 80);
}

//GET https://api.thingspeak.com/update?api_key=SIWOYBX26OXQ1WMS&field1=0

void httpGet(String ip, String path, int port)
{
  int resp;
  String atHttpGetCmd = "GET /"+path+" HTTP/1.0\r\n\r\n";
  //AT+CIPSTART="TCP","192.168.20.200",80
  String atTcpPortConnectCmd = "AT+CIPSTART=\"TCP\",\""+ip+"\","+port+"";
  connect_wifi(atTcpPortConnectCmd,1000);
  int len = atHttpGetCmd.length();
  String atSendCmd = "AT+CIPSEND=";
  atSendCmd+=len;
  connect_wifi(atSendCmd,1000);
  connect_wifi(atHttpGetCmd,1000);
}

void connect_wifi(String cmd, int t)
{
  int temp=0,i=0;
  while(1)
  {
    lcd.clear();
    lcd.print(cmd);
    Serial.println(cmd);
    Serial1.println(cmd); 
    while(Serial1.available())
    {
      if(Serial1.find("OK"))

      i=8;
    }
    delay(t);
    if(i>5)
    break;
    i++;
  }
  if(i==8)
  {
   Serial.println("OK");
        lcd.setCursor(0,1);
      lcd.print("OK");
  }
  else
  {
   Serial.println("Error");
         lcd.setCursor(0,1);
      lcd.print("Error");
  }
}

نظرات سایر کاربران درباره این پست

mojtaba

سلام ویدیو در انتهای آموزش قرار نداره...