ساخت ثبت کننده داده (دیتالاگر) توسط آردوینو و ثبت‌ داده‌ های سنسور دما و رطوبت

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

دیتالاگر (Data logger) چیست؟

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

هدف از انجام این پروژه:

به طور کلی ضبط داده‌های یک سنسور توسط دیتالاگر و تجزیه و تحلیل آنها، روشی متداول برای ارزیابی عملکرد و بهبود کیفیت یک سیستم محسوب می‌شود. در این آموزش برای خواندن برخی از داده‌ها شامل دما ، رطوبت ، تاریخ ، زمان و ذخیره‌ی آنها بر روی کارت حافظه SD و رایانه به طور همزمان از یک آردوینو استفاده خواهد شد.

مواد اولیه :
# عنوان تعداد لینک
0 بورد آردوینو 1 لینک خرید
1 سنسور دما و رطوبت DHT-11 1 لینک خرید
2 ماژول ساعت دقیق DS3231 1 لینک خرید
3   برد بورد  1 لینک خرید
4 سیم جامپر 1 لینک خرید
5 ماژول کارت حافظه SD CARD 1 لینک خرید
6 کارت حافظه میکرو SD 1 لینک خرید

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

پروتکل ارتباطی ماژول ساعت I2C بوده و از دو پین SCL و SDA برای برقراری ارتباط با آردوینو استفاده می‌کند. پروتکل ارتباطی ماژول کارت حافظه SPI بوده و از طریق 4 پین MISO MOSI ، SCK ، CS با آردوینو نیز ارتباط برقرار می‌کند. پین‌های 4 و 7 به عنوان پین CS و پین خروجی در برنامه  تعریف شده‌اند.

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

در این برنامه ابتدا داده‌های سنسور دما و رطوبت DTH11 (یا هر داده دیگری که مورد نظر شماست) خوانده می‌شود. باس های I2C و SPI برای خواندن داده‌ها از ماژول RTC و ماژول کارت حافظه راه‌اندازی اولیه می شوند. در نهایت تاریخ ، زمان ، دما و رطوبت در کارت حافظه و هم چنین در یک فایل اکسل در رایانه ذخیره می‌شوند. مراحل فوق ممکن است در ظاهر پیچیده به نظر برسند، اما به دلیل وجود کتابخانه‌های مورد نیاز به راحتی قابل انجام هستند. بنابراین دو کتابخانه زیر را دانلود و در کامپیالر آردوینو IDE نصب کنید.

Sketch->Include Library -> Add .ZIP Library

 DHT11 Sensor Library from GitHub

 DS3231 RTC module library  from Rinky-Dink Electronics

برای ذخیره اطلاعات دریافتی از آردوینو در یک فایل اکسل به صورت بلادرنگ نیاز به نصب نرم‌افزاری به نام PLX-DAQ تهیه شده توسط Parallax Inc بر روی رایانه است که می‌توانید آن از این لینک دانلود کنید. پس از اضافه کردن هر دو کتابخانه و نصب نرم افزار می‌توانید از سورس کدی که در انتهای برنامه قرار گرفته است استفاده کنید. در ادامه بخش‌های مختلف برنامه مورد بررسی قرار می‌گیرد.

1. خواندن داده‌ها از ماژول ساعت DS1307 RTC
ماژول DS3231 برای حفظ تاریخ و زمان بوده که در اکثر پروژه‌های الکترونیکی استفاده می شود. باتری پشتیبان قرار گرفته بر روی این ماژول زمانیکه برق در دسترس نیست، باعث جلوگیری از عقب افتادن زمان خواهد شد. استفاده از این ماژول به دلیل وجود کتابخانه آن بسیار آسان است.

// Init the DS3231 using the hardware interface

DS3231  rtc(SDA, SCL);

void Initialize_RTC()

{

   // Initialize the rtc object

  rtc.begin();


//#### the following lines can be uncommented to set the date and time for the first time### 

/*

rtc.setDOW(FRIDAY);     // Set Day-of-Week to SUNDAY

rtc.setTime(18, 46, 45);     // Set the time to 12:00:00 (24hr format)

rtc.setDate(6, 30, 2017);   // Set the date to January 1st, 2014

*/

}

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

2. خواندن داده ها از ماژول دما و رطوبت
 DHT11 به عنوان یک ماژول دما و رطوبت، دیتا 8 بیتی را به صورت سریال ارسال  می‌کند. در کتابخانه این ماژول از طریق  پورت سریال مجازی دیتا سنسور خوانده می‌شود.

#define DHT11_PIN 7 //Sensor output pin is connected to pin 7

dht DHT; //Sensor object named as DHT

void Read_DHT11()

{

int chk = DHT.read11(DHT11_PIN);

}

در این جا پین 7 به عنوان پورت سریال مجازی نیز تعریف شده است. توسط دستور (DHT.read(pin number مقادیر دما و رطوبت به ترتیب در متغیرهای DHT.temperature و DHT.Humidity ذخیره می‌شوند.

3. راه اندازی اولیه ماژول کارت حافظه SD

void Initialize_SDcard()

{

  // see if the card is present and can be initialized:

  if (!SD.begin(chipSelect)) {

    Serial.println("Card failed, or not present");

    // don't do anything more:

    return;

  }




   // open the file. note that only one file can be open at a time,

  // so you have to close this one before opening another.

  File dataFile = SD.open("LoggerCD.txt", FILE_WRITE);

  // if the file is available, write to it:

  if (dataFile) {

    dataFile.println("Date,Time,Temperature,Humidity"); //Write the first row of the excel file

    dataFile.close();

  }

}

استفاده از کارت حافظه در کنار آردوینو به دلیل اینکه کتابخانه آن به صورت پیش فرض در کامپایلر آردوینو IDE موجود است بسیار آسان است. برای راه‌اندازی اولیه‌ی این ماژول یک فایل متنی به نام "LoggerSD.txt" ایجاد می‌کنیم. برای جداسازی مقادیر از "," استفاده می‌شود.

4. ذخیره داده ها در کارت حافظه SD

void Write_SDcard()
{
    // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  File dataFile = SD.open("LoggerCD.txt", FILE_WRITE);
 
  // if the file is available, write to it:
  if (dataFile) {
    dataFile.print(rtc.getDateStr()); //Store date on SD card
    dataFile.print(","); //Move to next column using a ","
 
    dataFile.print(rtc.getTimeStr()); //Store date on SD card
    dataFile.print(","); //Move to next column using a ","
 
    dataFile.print(DHT.temperature); //Store date on SD card
    dataFile.print(","); //Move to next column using a ","
 
    dataFile.print(DHT.humidity); //Store date on SD card
    dataFile.print(","); //Move to next column using a ","
 
    dataFile.println(); //End of Row move to next row
    dataFile.close(); //Close the file
  }
  else
  Serial.println("OOPS!! SD card writing failed");
}

با کمک کتابخانه های DS3231 و DHT11 آردوینو قادر خواهد بود 4 پارامتر زیر را بخواند.

 

تاریخ ;() rtc.getDateStr
زمان ;() rtc.getTimeStr
دما ;() DHT.temperature
رطوبت ;DHT.humidity

 

 

 

با قرار دادن هر کدام از پارامترها در دستور زیر می توان آنها را در کارت حافظه ذخیره کرد.

dataFile.print(parameter);

برای رفتن به سطر بعدی نیز از دستور زیر استفاده می‌شود.

dataFile.print(parameter);

5. ارسال داده‌ها به PLX-DAQ

PLX-DAQ افزونه مایکروسافت اکسل است که به ما کمک می‌کند تا مقادیر دریافت شده از آردوینو را مستقیما در یک فایل اکسل در رایانه ذخیره کنیم. در این پروژه به دو دلیل از این نرم‌افزار استفاده شده است:

1. امکان خواندن و ذخیره داده‌ها به صورت همزمان وجود داشته و به دنبال آن امکان رسم نمودار از داده‌های دریافتی برای تحلیل آنها وجود دارد.

2. برای نظارت بر تاریخ و زمان نیازی به ماژول RTC مانند DS3231 نداشته و از تاریخ و زمان رایانه خود استفاده کرده و داده‌ها مستقیماً در اکسل ذخیره می‌شوند.

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

void Initialize_PlxDaq()
{
Serial.println("CLEARDATA"); //clears up any data left from previous projects
Serial.println("LABEL,Date,Time,Temperature,Humidity"); //always write LABEL, to indicate it as first line
}
void Write_PlxDaq()
  {
    Serial.print("DATA"); //always write "DATA" to Inidicate the following as Data
    Serial.print(","); //Move to next column using a ","
 
    Serial.print("DATE"); //Store date on Excel
    Serial.print(","); //Move to next column using a ","
 
    Serial.print("TIME"); //Store date on Excel
    Serial.print(","); //Move to next column using a ","
 
    Serial.print(DHT.temperature); //Store date on Excel
    Serial.print(","); //Move to next column using a ","
 
    Serial.print(DHT.humidity); //Store date on Excel
    Serial.print(","); //Move to next column using a ","
 
    Serial.println(); //End of Row move to next row
 
  }

این نرم افزار قادر است کلمات کلیدی مانند LABEL ، DATA ، TIME ، DATE و ... را تشخیص دهد.  همانطور که در تابع Initialize نشان داده شده، کلمه کلیدی "LABEL" برای نوشتن اولین ردیف صفحه‌ی اکسل استفاده می‌شود. سپس در تابع write از کلمه کلیدی  "DATA” استفاده شده تا نشان دهد که اطلاعات زیر باید به عنوان DATA در نظر گرفته شوند. برای رفتن به ردیف بعدی از کاما ("،") استفاده می‌شود. برای نشان دادن پایان ردیف نیز از دستور ()Serial.println  نیز استفاده می‌شود. همانطور که پیشتر اشاره شد می توانیم تاریخ و زمان سیستم را با ارسال کلمات کلیدی "DATE" و "TIME" به ترتیب مطابق با شکل بالا بنویسیم.

توجه: هنگام استفاده ازنرم افزار PLX_DAQ از سریال مانیتور کامپایلر آردوینو استفاده نکنید.

توضیح روند کار برنامه:

برای فعال کردن PLX-DAQ برای ارسال اطلاعات به اکسل لازم است مراحل زیر انجام شوند.

گام اول: "Plx-Daq Spreadsheet"را که هنگام نصب برنامه روی دسکتاپ ایجاد شده، باز کنید.

گام دوم: در صورت وجود قفل امنیتی مسیر Options->Enable the content -> Finish -> OK   را طی کرده و قفل را دریافت کنید. 

گام سوم: حال مقدار baud را ۹۶۰۰ انتخاب کنید، و شماره‌ی پورتی که آردوینو خود را به آن وصل کرده‌اید را در قسمت  port نوشته و روی connect کلیک کنید. همانطور که در تصویر مربوط به این مرحله نشان داده شده ، بعد از انجام این کار مقادیر شما باید به سیستم وارد شوند.

برای اطمینان از درستی ذخیره اطلاعات می‌توانید SD card را از مدار جدا کنید و آن را به سیستم خود متصل کنید. پس از بازکردن کارت حافظه باید یک فایل متنی به نام “LoggerCD.txt” در آن پیدا کنید.

برای باز کردن این فایل در اکسل باید :

اکسل را باز کنید، روی File->Open کلیک کنید. فرمت فایل های نشان داده شده را روی “All file” گذاشته و “LoggerCD” را از sd card باز کنید. روی next کلیک کرده و کاما را به عنوان یک delimiter انتخاب کنید. مجددا روی next کلیک و در نهایت روی finish کلیک کنید. حال مقادیر در اکسل به صورتی که در تصویر می‌بینید نمایش داده می‌شوند.

کد کامل برنامه:

/*
 * Program to demonstrate Data Logging/Visualisation using Arduino
 * 
 * ###Connection with SD card module###
 * Vcc->5V
 * Gnd->Gnd
 * MISO->pin 12
 * MOSI->pin 11
 * SCK-> pin 13
 * CS-> pin 4
 * 
 * ###Connection with DS3231###
 * Vcc->5V
 * Gns->Gnd
 * SCL->pin A5
 * SDA-> pin A4
 * 
 * ###Connection with DT11###
 * Vcc->5V
 * Gnd->Gnd
 * Out-> pin 7
 * 
 * 
 */

#include <DS3231.h> //Library for RTC module (Download from Link in article)
#include <SPI.h> //Library for SPI communication (Pre-Loaded into Arduino)
#include <SD.h> //Library for SD card (Pre-Loaded into Arduino)
#include <dht.h> //Library for dht11 Temperature and Humidity sensor (Download from Link in article)

#define DHT11_PIN 7 //Sensor output pin is connected to pin 7
dht DHT; //Sensor object named as DHT

const int chipSelect = 4; //SD card CS pin connected to pin 4 of Arduino

// Init the DS3231 using the hardware interface
DS3231  rtc(SDA, SCL);

void setup()
{
  // Setup Serial connection
  Serial.begin(9600);
  Initialize_SDcard();
  Initialize_RTC();
  Initialize_PlxDaq();
}

void loop()
{
  Read_DHT11();
  Write_SDcard();
  Write_PlxDaq();
  delay(5000); //Wait for 5 seconds before writing the next data 
}

void Write_PlxDaq()
  {
    Serial.print("DATA"); //always write "DATA" to Indicate the following as Data
    Serial.print(","); //Move to next column using a ","

    Serial.print("DATE"); //Store date on Excel
    Serial.print(","); //Move to next column using a ","

    Serial.print("TIME"); //Store date on Excel
    Serial.print(","); //Move to next column using a ","

    Serial.print(DHT.temperature); //Store date on Excel
    Serial.print(","); //Move to next column using a ","

    Serial.print(DHT.humidity); //Store date on Excel
    Serial.print(","); //Move to next column using a ","

    Serial.println(); //End of Row move to next row
  }

void Initialize_PlxDaq()
{
Serial.println("CLEARDATA"); //clears up any data left from previous projects
Serial.println("LABEL,Date,Time,Temperature,Humidity"); //always write LABEL, to indicate it as first line
}

void Write_SDcard()
{
    // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  File dataFile = SD.open("LoggerCD.txt", FILE_WRITE);

  // if the file is available, write to it:
  if (dataFile) {
    dataFile.print(rtc.getDateStr()); //Store date on SD card
    dataFile.print(","); //Move to next column using a ","

    dataFile.print(rtc.getTimeStr()); //Store date on SD card
    dataFile.print(","); //Move to next column using a ","

    dataFile.print(DHT.temperature); //Store date on SD card
    dataFile.print(","); //Move to next column using a ","

    dataFile.print(DHT.humidity); //Store date on SD card
    dataFile.print(","); //Move to next column using a ","

    dataFile.println(); //End of Row move to next row
    dataFile.close(); //Close the file
  }
  else
  Serial.println("OOPS!! SD card writing failed");
}

void Initialize_SDcard()
{
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
   // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  File dataFile = SD.open("LoggerCD.txt", FILE_WRITE);
  // if the file is available, write to it:
  if (dataFile) {
    dataFile.println("Date,Time,Temperature,Humidity"); //Write the first row of the excel file
    dataFile.close();
  }
}

void Initialize_RTC()
{
   // Initialize the rtc object
  rtc.begin();

//#### The following lines can be uncommented to set the date and time for the first time###  
/*
rtc.setDOW(FRIDAY);     // Set Day-of-Week to SUNDAY
rtc.setTime(18, 46, 45);     // Set the time to 12:00:00 (24hr format)
rtc.setDate(6, 30, 2017);   // Set the date to January 1st, 2014 
*/
}

void Read_DHT11()
{
int chk = DHT.read11(DHT11_PIN);
}

/*void Read_DateTime()
{  
  // Send date
  Serial.print(rtc.getDateStr());
  Serial.print(" -- ");

  // Send time
  Serial.println(rtc.getTimeStr());
}*/

/*void Read_TempHum()
{
  Serial.print("Temperature = ");
  Serial.println(DHT.temperature);
  Serial.print("Humidity = ");
  Serial.println(DHT.humidity);
 // delay(1000);
}*/