ساخت دستگاه حضور و غیاب IoT با سنسور اثر انگشت و آردوینو

فهرست مطالب

مقدمه

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

آنچه در این آموزش یاد می گیرید

Thingspeak چیست؟

Iot (Internet of things) پلتفورمی است که در آن تعدادی قطعات (things) به اینترنت متصل هستند که با افراد و قطعات دیگر تعامل دارند و معمولا داده هایی را برای تحلیل در فضای ابری قرار می دهند. Thingspeak یک پلتفورم IoT می باشد که به شما اجازه می دهد داده های زنده را در فضای ابری نمایش داده و نیز جمع آوری و تحلیل کنید.

برقراری ارتباط با Thingspeak و آپلود داده

برای شروع برقراری ارتباط با Thingspeak مراحل زیر را دنبال کنید:

گام اول) وارد سایت thingspeak.com شوید و یک اکانت بسازید.

گام دوم) پس از فعالسازی اکانت خود وارد آن شوید و در قسمت My Channel روی New Channel کلیک کنید.
گام سوم) در پنجره جدید باز شده برای پنل خود نام و درصورت نیاز توضیح بنویسید، سپس تعداد فیلدهایی که به آن نیاز دارید را با اختصاص نام تعیین کنید. باقی قسمت ها دلخواه می باشد. پس از تکمیل اطلاعات پنل را ذخیره کنید.
گام چهارم) حال که وارد پنل شدید به بخش API Keys بروید.
گام پنجم) برای ارسال داده به Channel ID و  Write API Key نیاز دارید، آنها را یادداشت کنید.

گام ششم) برای راحتی کار با پلتفروم Thingspeak برای آن کتابخانه موجود است آنرا دانلود کرده و به Arduino IDE اضافه کنید.

لینک دانلود کتابخانه Thingspeak

گام هفتم) Arduino IDE را باز کنید. از قسمت مثال ها WriteMultipleFields را باز کرده و  SSID، Password، Channel ID و Write API Key را وراد کنید.

فایل secrets.h

 /*
  WriteMultipleFields
  
  Description: Writes values to fields 1,2,3,4 and status in a single ThingSpeak update every 20 seconds.
  
  Hardware: ESP8266 based boards
  
  !!! IMPORTANT - Modify the secrets.h file for this project with your network connection and ThingSpeak channel details. !!!
  
  Note:
  - Requires ESP8266WiFi library and ESP8622 board add-on. See https://github.com/esp8266/Arduino for details.
  - Select the target hardware from the Tools->Board menu
  - This example is written for a network using WPA encryption. For WEP or WPA, change the WiFi.begin() call accordingly.
  
  ThingSpeak ( https://www.thingspeak.com ) is an analytic IoT platform service that allows you to aggregate, visualize, and 
  analyze live data streams in the cloud. Visit https://www.thingspeak.com to sign up for a free account and create a channel.  
  
  Documentation for the ThingSpeak Communication Library for Arduino is in the README.md folder where the library was installed.
  See https://www.mathworks.com/help/thingspeak/index.html for the full ThingSpeak documentation.
  
  For licensing information, see the accompanying license file.
  
  Copyright 2018, The MathWorks, Inc.
*/

#include "ThingSpeak.h"
#include "secrets.h"
#include <ESP8266WiFi.h>

char ssid[] = SECRET_SSID;   // your network SSID (name) 
char pass[] = SECRET_PASS;   // your network password
int keyIndex = 0;            // your network key Index number (needed only for WEP)
WiFiClient  client;

unsigned long myChannelNumber = SECRET_CH_ID;
const char * myWriteAPIKey = SECRET_WRITE_APIKEY;

// Initialize our values
int number1 = 0;
int number2 = random(0,100);
int number3 = random(0,100);
int number4 = random(0,100);
String myStatus = "";

void setup() {
  Serial.begin(115200);  // Initialize serial

  WiFi.mode(WIFI_STA); 
  ThingSpeak.begin(client);  // Initialize ThingSpeak
}

void loop() {

  // Connect or reconnect to WiFi
  if(WiFi.status() != WL_CONNECTED){
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(SECRET_SSID);
    while(WiFi.status() != WL_CONNECTED){
      WiFi.begin(ssid, pass);  // Connect to WPA/WPA2 network. Change this line if using open or WEP network
      Serial.print(".");
      delay(5000);     
    } 
    Serial.println("\nConnected.");
  }

  // set the fields with the values
  ThingSpeak.setField(1, number1);
  ThingSpeak.setField(2, number2);
  ThingSpeak.setField(3, number3);
  ThingSpeak.setField(4, number4);

  // figure out the status message
  if(number1 > number2){
    myStatus = String("field1 is greater than field2"); 
  }
  else if(number1 < number2){
    myStatus = String("field1 is less than field2");
  }
  else{
    myStatus = String("field1 equals field2");
  }
  
  // set the status
  ThingSpeak.setStatus(myStatus);
  
  // write to the ThingSpeak channel
  int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
  if(x == 200){
    Serial.println("Channel update successful.");
  }
  else{
    Serial.println("Problem updating channel. HTTP error code " + String(x));
  }
  
  // change the values
  number1++;
  if(number1 > 99){
    number1 = 0;
  }
  number2 = random(0,100);
  number3 = random(0,100);
  number4 = random(0,100);
  
  delay(20000); // Wait 20 seconds to update the channel again
}
پس از آپلود کردن کد، مشاهده می کنید که مقادیر عددی تصادفی در فیلدهای 1 تا 4 پنل شما آپلود شده است. از ساختار همین کد در ساخت دستگاه حضور و غیاب برای آپلود کردن داده ها استفاده شده است.
توجه

بین هر بار آپلود کردن داده روی پنل Thingspeak حداقل 15 ثانیه زمان لازم است.

ساخت دستگاه حضور و غیاب IoT با سنسور اثر انگشت و آردوینو

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

لوازمی که به آن احتیاج دارید

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

آردوینو مگا 2560 - R3 × 1
سنسور اثر انگشت R301T × 1
ماژول مموری ریدر میکرو SD - Micro SD/TF × 1
ماژول DS3231 I2C RTC × 1
شیلد نمایشگر 3.5 اینچی × 1
برد NodeMCU ESP8266 ESP-12E × 1
بازر الکترومغناطیسی × 1
سیم جامپر نری به مادگی × 1

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

Arduino IDE

سیم بندی

پس از اتصال تمامی ماژول ها شیلد LCD را روی آردوینو قرار دهید.
توجه

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

کد

برای ساخت این دستگاه به کتابخانه های زیر نیاز دارید:

Adafruit-Fingerprint-Sensor-Library

Adafruit-GFX-Library

MCUFRIEND_kbv

RTClib

حال کد زیر را دانلود کرده و روی آردوینو خود آپلود کنید. در این کد بصورت پیشفرض برای 11 نفر اسم انتخاب شده که می توانید آنها را تغییر داده یا از حالت پیشفرض خارج کنید. برای ثبت نام نفر جدید کافی است دستگاه را به کامپیوتر خود متصل کرده و کلید را فشار دهید تا سیستم به حالت ثبت نام برود سپس Serial Monitor را باز کرده و فرآیند ثبت نام را طبق دستورالعمل نشان داده شده در Serial monitor انجام دهید.

می توانید برای کسب اطلاعات بیشتر راجع به کار با SD کارت آموزش نوشتن و خواندن SD کارت با آردوینو، برای کار با ماژول ساعت آموزش چگونه از ماژول RTC DS1307 با آردوینو استفاده کنیم و یک یادآور هوشمند بسازیم و برای کار با LCD راهنمای کامل مبتدیان برای استفاده از نمایشگرهای TFT LCD با آردوینو را مطالعه کنید.

وظیفه آپلود کردن اطلاعات با Nodemcu می باشد، Nodemcu از طریق درگاه سریال اطلاعات را برای آپلود از آردوینو می گیرد و وضعیت آپلود شدن را به آردوینو بر می گرداند. کد زیر را  روی Nodemcu خود آپلود کنید.

#include "ThingSpeak.h"
#include <ESP8266WiFi.h>


char ssid[] = "YOUR SSID";
char pass[] = "SSID PASSWORD";
WiFiClient  client;

unsigned long myChannelNumber = YOUR CHANNEL ID;
const char * myWriteAPIKey = "YOUR CHANNEL WRITE API KEY";

String Final = "";

String Date = "";
String Enter = "";
String Exit = "";
String Name = "";
String WT = "";

void String_Analyze(String input) {
  int index1, index2, index3, index4;
  index1 =  input.indexOf('*', 0);
  index2 =  input.indexOf('*', index1 + 1);
  index3 =  input.indexOf('*', index2 + 1);
  index4 =  input.lastIndexOf('*');

  Name = input;
  Date = input;
  Enter = input;
  Exit = input;
  WT = input;

  Name.remove(index1);

  Date.remove(index2);
  Date.remove(0, index1 + 1);

  Enter.remove(index3);
  Enter.remove(0, index2 + 1);

  Exit.remove(index4);
  Exit.remove(0, index3 + 1);

  WT.remove(0, index4 + 1);
}

void Get_String()
{
  while (Serial.available()) {

    Final = Serial.readString(); // read the incoming data as string
    //Serial.println(Final);
  }
}
void setup() {

  Serial.begin(9600);
  WiFi.mode(WIFI_STA);
  ThingSpeak.begin(client);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);
}



void loop() {

  if (WiFi.status() != WL_CONNECTED) {
    //Serial.print("Attempting to connect to SSID: ");
    // Serial.println(ssid);
    while (WiFi.status() != WL_CONNECTED) {
      WiFi.begin(ssid, pass);  // Connect to WPA/WPA2 network. Change this line if using open or WEP network
      Serial.print("0");
      delay(5000);
    }
  }
  digitalWrite(LED_BUILTIN, LOW);
  //Serial.println("\nConnected.");

  Get_String();
  String_Analyze(Final);
  if (!Final.equals(""))
  {
    ThingSpeak.setField(1, Date);
    ThingSpeak.setField(2, Name);
    ThingSpeak.setField(3, Enter);
    ThingSpeak.setField(4, Exit);
    ThingSpeak.setField(5, WT);

    int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
    if (x == 200) {
      delay(100);
      Serial.print("1");
    }
    else {
      delay(100);
      Serial.print("0");
    }

    delay(17000);
    Final = "";
  }
}
ابتدا Channel ID و Write API Key را با توجه به پنل Thingspeak خود تغییر دهید. در این کد ابتدا با تابع String_Analuze (); رشته ورودی به Nodemcu را به تاریخ، نام، ساعت ورود، ساعت خروج و جمع کاری تفکیک کرده و این اطلاعات را به Thingspeak ارسال می کند، سپس در صورت موفقیت آمیز بودن فرایند آپلود کاراکتر “1” و در صورت عدم آپلود کاراکتر “0” را به آردوینو ارسال می کند.

ساخت بدنه و سر هم بندی دستگاه حضور و غیاب

برای ساخت بدنه دستگاه حضور و غیاب می توانید از نقشه های زیر و پلکسی گلس با رنگ های مختلف یا هر جنس دیگری استفاده کنید

Download the device body laser cut map from here:

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

یک گام جلوتر

  • سعی کنید از آیکون های بیشتری روی LCD استفاده کنید.
  • سعی کنید سیستم را به RFID نیز مجهز کنید.
  • سعی کنید بجای استفاده از Thingspeak داده ها را در google spreadsheets آپلود کنید.

از این مطلب خوشتان آمد؟

آخرین مطالت و آموزش ها را در ایمیلتان دریافت کنید:

مطالب بیشتر

Comments (31)

  • البرز Reply

    سلام
    ممنون برای آموزش فوق العادتون
    یه سوال، امکانش هست به جای NodeMCU و ماژول SD، از یه شیلد شبکه که میکرو SD می خوره استفاده کنیم؟
    راستی ای کاش می گفتین که تنها دلیل برای استفاده از Arduino Mega اینه که دو تا سریال داره و میشه همزمان از FingerPrint و RFID استفاده کرد، چون ممکنه خیلی ها نیازی به RFID نداشته باشن.
    متاسفانه تمام لینک های دانلود خراب هستن.. اگه ممکنه درستش کنین.
    بازم ممنون واسه زحماتتون

    اکتبر 15, 2019 at 1:28 ق.ظ
    • سعید حسینی Reply

      با سلام.
      بله می تونید.
      چشم لینکارو چک می کنیم و اصلاح می کنیم

      دسامبر 18, 2019 at 4:58 ب.ظ
  • مهرداد Reply

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

    نوامبر 1, 2019 at 10:15 ب.ظ
  • مسیح Reply

    سلام وخسته نباشد از موضوع که آموزش دادید تشکر ولی چظور میشه اطلاعات داخل را فراخوانی ونمایش داد البته ماگفته نماند که تا اینجا هم فوق العاده هست

    ژانویه 17, 2020 at 9:14 ق.ظ
    • سعید حسینی Reply

      سلام
      منظورتون از اطلاعات داخل چی هست؟

      فوریه 29, 2020 at 9:15 ق.ظ
  • سید امیرحسین Reply

    سلام ممنون از مطالب جالبتون ، آیا اجازه‌ی استفاده از آموزش هاتون در پروژه های تجاری رو داریم؟

    مارس 2, 2020 at 7:07 ب.ظ
    • mohammad Reply

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

      مارس 3, 2020 at 9:10 ق.ظ
  • امیر Reply

    برنامه نویسیش چطور و با چیه اگه فیلدی بخوام بهش اضافه کنم؟

    آگوست 10, 2020 at 1:49 ب.ظ
    • مهران ملکی Reply

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

      دسامبر 1, 2020 at 4:22 ب.ظ
  • حسین Reply

    سلام ممنون از آموزشتون. چطور میشه کاری کرد که از اسامی افراد و ساعت ورود و خروجشون پرینت گرفت؟

    جولای 2, 2021 at 9:17 ب.ظ
    • مهران ملکی Reply

      سلام،
      اطلاعات مربوط به اسامی افراد و ساعات ورود و خروجشون همگی ابتدا در SD card با فرمت csv ذخیره میشه و سپس در فضای thingspeak هم آپلود میشه. برای پرینت کردن این اطلاعات کافیه که اونارو از روی SD card بخونید. برای این کار هم میتونید از خود آردوینو و آموزش با لینک “http://thecaferobot.com/learn/sd-micro-sd-read-write-arduino/” استفاده کنید و هم اینکه مستقیما SD کارت رو به کامپیوتر متصل کنید و فایل درونش رو مشاهده کنید و ازشون پرینت بگیرید.

      جولای 3, 2021 at 9:44 ق.ظ
      • حسین Reply

        میشه Nodemcu رو قرار نداد و بدون استفاده از thingspeak و فقط با ماژول میکرو و DS3231 این کار رو انجام داد؟

        جولای 17, 2021 at 12:24 ب.ظ
        • مهران ملکی Reply

          سلام.
          بله میشه. nodemcu به طور خاص برای ارتباط با thingspeak و آپلود اطلاعات روی آن انتخاب شده. اگر فقط قصد داشته باشید که یک دستگاه حضور و غیاب بسازید که با ثبت اثر انگشت، ساعت ثبت شدن اون اثرانشگت رو ذخیره کنه، میتونید با یک میکروکنترلر مثل آردوینو یا هر میکروی دیگه به علاوه سنسور اثر انگشت، ماژول DS3231 و ماژول SD Card این کار رو انجام بدید. برای اطلاعات در مورد نحوه راه‌اندازی هر کدوم از این ماژول‌ها با آردوینو میتونید از آموزش‌های زیر استفاده کنید:
          “https://thecaferobot.com/learn/sd-micro-sd-read-write-arduino/”
          “https://thecaferobot.com/learn/interfacing-fpm10a-as608-optical-fingerprint-reader-sensor-module-with-arduino/”

          جولای 20, 2021 at 12:56 ب.ظ
  • علی Reply

    سلام متشکر از آموزشتون. به جای برد مگا میشه از uno استفاده کرد؟

    آگوست 3, 2021 at 9:39 ب.ظ
    • مهران ملکی Reply

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

      آگوست 4, 2021 at 12:03 ب.ظ
  • محمدحسسن Reply

    سلام متشکر از اموزشتون. ببخشید فابل های پرینت سه بعدی این دستگاه موجود هست؟

    دسامبر 29, 2021 at 10:13 ق.ظ
    • مهران ملکی Reply

      سلام… ممنون از لطف شما.
      نه متأسفانه فایل‌های پرینت سه بعدی این دستگاه موجود نیست.

      دسامبر 29, 2021 at 3:58 ب.ظ
  • مهدی Reply

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

    ژانویه 28, 2022 at 10:50 ق.ظ
    • مهران ملکی Reply

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

      ژانویه 29, 2022 at 11:22 ق.ظ
  • Rahii Reply

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

    جولای 2, 2022 at 7:48 ق.ظ
  • امیرحسین Reply

    با سلام خدمت شما و خسته نباشید بابت این پروژه جذابتون اینگه بنده قطعاتو از سایت شما خریداری کردم و قصد دارم برای پروژه دانشگاه ارائه بدم به ی سری مشکل برخورد کردم اینکه چطور میتونم از کمک شما استفاده کنم ممنون میشم راهنمایی کنید

    جولای 7, 2022 at 1:54 ق.ظ
    • مهران ملکی Reply

      سلام.
      میتونید سوالاتتون رو همیجا یا از طریق انجمن کافه ربات بپرسید. آدرس انجمن:
      https://thecaferobot.com/forum/
      در انجمن امکان قرار دادن عکس، کد و … هم موجود هست.

      جولای 10, 2022 at 3:29 ب.ظ
    • مرتضی Reply

      سلام اگر پروژتونو انجام دادید امکانش هست باهاتون صحبتی داشته باشم

      آوریل 11, 2023 at 12:13 ق.ظ
      • محمد دمیرچی Reply

        با سلام
        سؤال های خودتون رو میتوانید همین جا یا در بخش انجمن سؤال کنید.

        آوریل 15, 2023 at 11:40 ق.ظ
  • محمد Reply

    سلام … ببخشید میشه خواهش کنم لینک map رو درست کنید ؟؟ چون میخام این رو انجامش بدم ..

    ژانویه 24, 2023 at 5:02 ب.ظ
    • علی عبدالملکی Reply

      سلام
      لینک مشکلی نداره و قابل دانلود هست

      فوریه 21, 2023 at 4:48 ب.ظ
  • امین Reply

    با سلام
    آیا میشه به جای ماژول اثرانگشت R301 از ماژول اثر انگشت AS608 استفاده کرد؟

    آگوست 2, 2023 at 8:10 ب.ظ
    • محمد دمیرچی Reply

      با سلام
      بله از انواع ماژول های اثرانگشت می توانید جای سایر مورد ها استفاده کنید.
      فقط توجه داشته باشید که در کد خود در صورت نیاز بادریت را بر اساس مدل مورد استفاده درست انتخاب کنید (البته در این مورد یکسان می باشد)

      آگوست 5, 2023 at 12:08 ب.ظ
  • حمید Reply

    سلام حتما باید از برد آردوینو مگا استفاده کرد؟
    با اردوینو uno نمیشه ؟

    مارس 6, 2024 at 12:25 ب.ظ
    • محمد دمیرچی Reply

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

      مارس 9, 2024 at 10:47 ق.ظ

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

نشانی ایمیل شما منتشر نخواهد شد.