কিশোরবয়সী সন্তানদের নিয়ে মা-বাবাদের চিন্তার শেষ নেই। বয়সটা ঠিক সবসময় চোখে চোখে রাখার অনুকূলেও না, আবার চোখের আড়াল করলেও টেনশন। বড় পরিবারগুলোতে সব সন্তানকে স্কুলে আনা-নেওয়া করাও বাবা-মাদের পক্ষে সম্ভব হয় না। তাই অনেকে একটু বড় হলে একাই স্কুলে যায়। কিন্তু অভিভাবকরা কি নিশ্চিন্ত থাকতে পারেন? “পথে কোনো বিপদ হয়নি তো”? “স্কুল ফাঁকি দিয়ে অন্যকোথাও ঘুরে বেড়াচ্ছে না তো”? আরও কত চিন্তা! একটি স্মার্ট অ্যাটেনডেন্স সিস্টেমের মাধ্যমে যদি সন্তানের স্কুলে পৌছানোর এবং স্কুল ত্যাগ করার খবরটা মা-বাবার কাছে পৌছে যেত, তাহলে কিন্তু একটু হলেও তারা নিশ্চিন্ত থাকতে পারতেন।তবে ফাঁকিবাজ ছাত্রছাত্রীদের জন্য হত দুঃসংবাদ।স্কুল পালিয়ে বেড়াতে যাওয়া আর হত না, দুইটায় স্কুল থেকে বেরিয়ে অন্যকোথাও আড্ডা মেরে ছয়টায় বাসায় গিয়ে ‘প্র্যাকটিক্যাল ছিল’ বলেও আর পার পাওয়া যেত না। এই এক্সপেরিমেন্টে আমরা যে অ্যাটেনডেন্স সিস্টেমটি তৈরী করব তা একসাথে বেশকিছু কাজ করবে।
১)প্রথমে রোল নাম্বার অনুযায়ী ছাত্র-ছাত্রীদের আঙ্গুলের ছাপ ফিঙ্গারপ্রিন্ট সেন্সরে লিপিবদ্ধ করা হবে। ২)ফিঙ্গারপ্রিন্ট সেন্সরে পূর্বে লিপিবদ্ধ আঙ্গুল স্পর্শ করালে সেন্সরটি আঙ্গুল সনাক্ত করবে। আঙ্গুলটি কত রোল নম্বরের স্টুডেন্টের সেটাও একটি এলসিডিতে দেখাবে। ৩)ক্লাসে ঢোকার সময়, অর্থ্যাৎ প্রথমবার ফিঙ্গারপ্রিন্ট দেবার সাথে সাথে স্টুডেন্টের অভিভাবকের নাম্বারে একটি এসএমএসে তার পৌছানোর সংবাদ যাবে। ৪)ক্লাস থেকে বের হবার সময়, অর্থ্যাৎ দ্বিতীয়বার ফিঙ্গারপ্রিন্ট দেবার সাথে সাথে ঐ একই নাম্বারে স্টুডেন্টের ক্লাস ত্যাগ করার মেসেজ পৌছে যাবে। ৫)স্টুডেন্ট কখন ক্লাসে ঢুকেছে এবং কখন ক্লাস থেকে বের হয়েছে, সেই তথ্য একটি এসডি কার্ডে লিপিবদ্ধ হবে। কাজেই ক্লাসে আর নাম ডাকার প্রয়োজন নেই।
প্রয়োজনীয় যন্ত্রপাতিঃপ্রয়োজনীয় যন্ত্রপাতি | পরিমান | প্রোডাক্ট লিংক |
Sanguino TSB | 1 | এখানে ক্লিক করুন |
Fingerprint Recognition Module (ZFM60) | 1 | এখানে ক্লিক করুন |
SIM900A kit | 1 | এখানে ক্লিক করুন |
Power distribution board | 1 | এখানে ক্লিক করুন |
3-wire LCD | 1 | এখানে ক্লিক করুন |
MicroSD card storage board | 1 | এখানে ক্লিক করুন |
Team Micro SD HC Card 32GB Class 10 | 1 | |
PCF 8563 RTC Board | 1 | এখানে ক্লিক করুন |
Breadboard | 1 | এখানে ক্লিক করুন |
12V 700mA Power Adapter | 1 | এখানে ক্লিক করুন |
Male to male jumper | 4 | এখানে ক্লিক করুন |
Male to female jumper | 20 | এখানে ক্লিক করুন |
Soldering iron | 1 | এখানে ক্লিক করুন |
Solder lead mini | 1 | এখানে ক্লিক করুন |
Sim card | 1 |
Sanguino TSB কী ও কেন?
Sanguine TSB হচ্ছে Arduino UNO-R3 এর সমতূল্য একটি Arduino বোর্ড। Arduino UNO-R3 দিয়ে যা কিছু করা যায় তার সবই Sanguine TSB দিয়ে করা সম্ভব। বরং, Sanguine TSB এর বেশকিছু বাড়তি কিছু সুবিধা আছে।যেমনঃ Sanguine TSB’র ইউজার্ট পিন দুই জোড়া। TX0,RX0, TX1, RX1. Arduino UNO R3 এর আউটপুট পিনগুলো ফিমেল। কিন্ত, Sanguine TSB ‘র প্রতিটি আউটপুট পিনের জন্যই একটি করে মেল এবং একটি করে ফিমেল হেডার দেওয়া আছে।তাই এতে যেকোনো ধরনের জাম্পার ওয়্যার কানেক্ট করা খুবই সহজ। বোর্ডটিতে পিনগুলোর নাম্বার তো বটেই, নামও (যেমন SCK, MISO,MOSI,TX0,RX0 ইত্যাদি) উল্লেখ করে দেওয়া আছে। কাজেই পিনআউটের ছবি দেখে দেখে সার্কিট কানেকশন দেবার ঝামেলা নেই।
আরডুইনো উনোর চেয়ে Sanguino TSB তে দুটি অ্যানালগ পিন এবং একটি ইন্টারাপ্ট পিন বেশি আছে। শুধু এতটুকুই নয়। Sanguino TSB’র SRAM, EEPROM, Flash memory সবই আরডুইনো উনোর দ্বিগুন। এই এক্সপেরিমেন্টে ব্যবহৃত ফিঙ্গারপ্রিন্ট স্ক্যানার এবং জিএসএম মডিউল উভয়েই ইউজার্ট কমিউনিকেশন সাপোর্ট করে। কাজেই আরডুইনো উনো ব্যবহার করলে হার্ডওয়্যার সিরিয়ালের মাধ্যমে এই দুটি ডিভাইস একসাথে ব্যবহার করা সম্ভব হত না। একটিকে হার্ডওয়্যার সিরিয়াল অর্থ্যাৎ, TX, Rx পিনে কানেক্ট করে অপরটিকে সফটওয়্যার সিরিয়ালের মাধ্যমে কানেক্ট করা যেত। কিন্তু সফটওয়্যার সিরিয়ালের কিছু সীমাবদ্ধতা আছে। এক, সফটওয়্যার সিরিয়াল কমিউনিকেশনের baud rate সর্বোচ্চ 115200 পর্যন্ত তোলা যাবে। তাছাড়া সফটওয়্যার সিরিয়ালে বিট মিস হবার সম্ভাবনাও আছে যেটা হার্ডওয়্যার সিরিয়ালে নেই। সবকিছু বিবেচনা করে আমাদের এই এক্সপেরিমেন্টের জন্য Sanguino TSB-ই ব্যবহারই ছিল সবচেয়ে সুবিধাজনক। সার্কিট কানেকশনঃ ফিঙ্গারপ্রিন্ট স্ক্যানারের পিনআউট নিম্নরুপ। চারটি তারের সাথে চারটি মেল-মেল জাম্পার সল্ডার করতে হবে। Sanguino TSB এবং ফিঙ্গারপ্রিন্ট স্ক্যানারের মধ্যে নিচের কানেকশনটি সম্পন্ন করুন।Sanguino TSB | Fingerprint Recognition Module (ZFM60) |
VCC | VCC |
GND | GND |
TX | RX1 |
RX | TX1 |
SIM900A | Power distribution board | Sanguino TSB |
VCC | 5V | |
GND | GND | GND |
Sanguino TSB | 3-wire LCD |
VCC | VCC |
GND | GND |
12 | DATA |
13 | Clock |
3 | Latch |
Sanguino TSB | PCF 8563 RTC Board |
VCC | VCC |
GND | GND |
SCL | SCL |
SDA | SDA |
Sanguino TSB | MicroSD card storage board |
VCC | VCC |
GND | GND |
MISO | MISO |
MOSI | MOSI |
SCK | SCLK |
SS | CS |
#include <Adafruit_Fingerprint.h> uint8_t id; unsigned char studentname[50]; int i=0; Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Serial1); void setup() { Serial.begin(9600); Serial.println("fingertest"); // set the data rate for the sensor serial port finger.begin(57600); if (finger.verifyPassword()) { Serial.println("Found fingerprint sensor!"); } else { Serial.println("Did not find fingerprint sensor :("); while (1); } } uint8_t readnumber(void) { uint8_t num = 0; while (num == 0) { while (! Serial.available()); num = Serial.parseInt(); } return num; } void loop() // run over and over again { Serial.println("Type in the ID # you want to save this finger as..."); // int id = 0; // while (true) { // while (! Serial.available()); // char c = Serial.read(); // if (! isdigit(c)) break; // id *= 10; // id += c - '0'; // // if (id == 0) {// ID #0 not allowed, try again! // return; // } // } id = readnumber(); if (id == 0) {// ID #0 not allowed, try again! return; } Serial.print("Enrolling ID #"); Serial.println(id); while (! getFingerprintEnroll(id) ); } uint8_t getFingerprintEnroll(int id) { int p = -1; Serial.println("Waiting for valid finger to enroll"); while (p != FINGERPRINT_OK) { p = finger.getImage(); switch (p) { case FINGERPRINT_OK: Serial.println("Image taken"); break; case FINGERPRINT_NOFINGER: Serial.println("."); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); break; case FINGERPRINT_IMAGEFAIL: Serial.println("Imaging error"); break; default: Serial.println("Unknown error"); break; } } // OK success! p = finger.image2Tz(1); switch (p) { case FINGERPRINT_OK: Serial.println("Image converted"); break; case FINGERPRINT_IMAGEMESS: Serial.println("Image too messy"); return p; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); return p; case FINGERPRINT_FEATUREFAIL: Serial.println("Could not find fingerprint features"); return p; case FINGERPRINT_INVALIDIMAGE: Serial.println("Could not find fingerprint features"); return p; default: Serial.println("Unknown error"); return p; } Serial.println("Remove finger"); delay(2000); p = 0; while (p != FINGERPRINT_NOFINGER) { p = finger.getImage(); } p = -1; Serial.println("Place same finger again"); while (p != FINGERPRINT_OK) { p = finger.getImage(); switch (p) { case FINGERPRINT_OK: Serial.println("Image taken"); break; case FINGERPRINT_NOFINGER: Serial.print("."); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); break; case FINGERPRINT_IMAGEFAIL: Serial.println("Imaging error"); break; default: Serial.println("Unknown error"); break; } } // OK success! p = finger.image2Tz(2); switch (p) { case FINGERPRINT_OK: Serial.println("Image converted"); break; case FINGERPRINT_IMAGEMESS: Serial.println("Image too messy"); return p; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); return p; case FINGERPRINT_FEATUREFAIL: Serial.println("Could not find fingerprint features"); return p; case FINGERPRINT_INVALIDIMAGE: Serial.println("Could not find fingerprint features"); return p; default: Serial.println("Unknown error"); return p; } // OK converted! p = finger.createModel(); if (p == FINGERPRINT_OK) { Serial.println("Prints matched!"); } else if (p == FINGERPRINT_PACKETRECIEVEERR) { Serial.println("Communication error"); return p; } else if (p == FINGERPRINT_ENROLLMISMATCH) { Serial.println("Fingerprints did not match"); return p; } else { Serial.println("Unknown error"); return p; } Serial.print("ID "); Serial.println(id); p = finger.storeModel(id); if (p == FINGERPRINT_OK) { Serial.println("Stored!"); } else if (p == FINGERPRINT_PACKETRECIEVEERR) { Serial.println("Communication error"); return p; } else if (p == FINGERPRINT_BADLOCATION) { Serial.println("Could not store in that location"); return p; } else if (p == FINGERPRINT_FLASHERR) { Serial.println("Error writing to flash"); return p; } else { Serial.println("Unknown error"); return p; } }ঘ)আরটিসি সেটিংঃ PCF 8563 RTC board ব্যবহার করার শুরুতে প্রথমে এর টাইম সেট করে নিতে হবে। নিচের কোডের প্যারামিটারগুলো আপনার এক্সপেরিমেন্টের তারিখ অনুযায়ী পরিবর্তন করে sanguine TSB তে আপলোড করুন।
#include <PCF8563.h> PCF8563 pcf; void setup() { Serial.begin(9600); pcf.init();//initialize the clock pcf.stopClock();//stop the clock //set time to to 31/3/2018 17:33:0 pcf.setYear(18);//set year pcf.setMonth(10);//set month pcf.setDay(28);//set dat pcf.setHour(13);//set hour pcf.setMinut(13);//set minut pcf.setSecond(0);//set second pcf.startClock();//start the clock } void loop() { }ঙ)মূল কোডঃ নিম্নলিখিত কোডটি sanguine TSB তে আপলোড করুন। আপনার প্রজেক্ট তৈরী।
/*************************************************** This is an example sketch for our optical Fingerprint sensor Designed specifically to work with the Adafruit BMP085 Breakout ----> http://www.adafruit.com/products/751 ****************************************************/ #include <SPI.h> #include <SD.h> #include <PCF8563.h> #include <LiquidCrystal_SR.h> #include <Adafruit_Fingerprint.h> LiquidCrystal_SR lcd(12, 13, 3); // DATA CLOCK LATCH //SH_CP->CLOCK->13 //ST_CP->LATCH->3 //DS->DATA->12 Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Serial1); const int pinCS = 4; int count1=0,count2=0,count3=0; File myFile; PCF8563 pcf; void setup() { lcd.begin(16, 2); lcd.clear(); // clear the screen Serial.begin(9600); pcf.init();//initialize the clock pinMode(pinCS, OUTPUT); if (SD.begin(4)) { Serial.println("fingerprint sensor."); Serial.println("SD card is ready to use."); } else { Serial.println("SD card initialization failed"); return; } while (!Serial); // For Yun/Leo/Micro/Zero/... delay(100); Serial.println("\n\nAdafruit finger detect test"); // set the data rate for the sensor serial port finger.begin(57600); if (finger.verifyPassword()) { Serial.println("Found fingerprint sensor!"); } else { Serial.println("Did not find fingerprint sensor :("); while (1) { delay(1); } } finger.getTemplateCount(); Serial.print("Sensor contains "); Serial.print(finger.templateCount); Serial.println(" templates"); Serial.println("Waiting for valid finger..."); lcd.setCursor(0, 0); // put cursor at colon 0 and row 0 lcd.print("Press finger"); } void loop() // run over and over again { getFingerprintIDez(); delay(50); //don't ned to run this at full speed. } uint8_t getFingerprintID() { uint8_t p = finger.getImage(); switch (p) { case FINGERPRINT_OK: Serial.println("Image taken"); break; case FINGERPRINT_NOFINGER: Serial.println("No finger detected"); return p; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); return p; case FINGERPRINT_IMAGEFAIL: Serial.println("Imaging error"); return p; default: Serial.println("Unknown error"); return p; } // OK success! p = finger.image2Tz(); switch (p) { case FINGERPRINT_OK: Serial.println("Image converted"); break; case FINGERPRINT_IMAGEMESS: Serial.println("Image too messy"); return p; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); return p; case FINGERPRINT_FEATUREFAIL: Serial.println("Could not find fingerprint features"); return p; case FINGERPRINT_INVALIDIMAGE: Serial.println("Could not find fingerprint features"); return p; default: Serial.println("Unknown error"); return p; } // OK converted! p = finger.fingerFastSearch(); if (p == FINGERPRINT_OK) { Serial.println("Found a print match!"); } else if (p == FINGERPRINT_PACKETRECIEVEERR) { Serial.println("Communication error"); return p; } else if (p == FINGERPRINT_NOTFOUND) { Serial.println("Did not find a match"); return p; } else { Serial.println("Unknown error"); return p; } // found a match! Serial.print("Found ID #"); Serial.print(finger.fingerID); Serial.print(" with confidence of"); Serial.println(finger.confidence); return finger.fingerID; } // returns -1 if failed, otherwise returns ID # int getFingerprintIDez() { uint8_t p = finger.getImage(); if (p != FINGERPRINT_OK) return -1; p = finger.image2Tz(); if (p != FINGERPRINT_OK) return -1; p = finger.fingerFastSearch(); if (p != FINGERPRINT_OK) return -1; // found a match! Serial.print("\r"); delay(500); Serial.print("AT+CMGF=1\r"); delay(500); if(finger.fingerID==1) { count1++; Serial.print("AT+CMGS=\"+8801---------\"\r"); //Number to which you want to send the sms delay(250); if(count1%2==0) { Serial.print("Roll#1 has left class\r"); //The text of the message to be sent lcd.clear(); lcd.setCursor(0,0); lcd.print("Goodbye Roll #"); lcd.print(finger.fingerID); delay(2000); lcd.clear(); // clear the screen lcd.print("Press finger"); } else { Serial.print("Roll#1 has reached class \r"); lcd.clear(); lcd.setCursor(0,0); lcd.print("Welcome roll #"); lcd.print(finger.fingerID); delay(2000); lcd.clear(); // clear the screen lcd.print("Press finger"); } delay(250); Serial.write(0x1A); myFile = SD.open("finger.txt", FILE_WRITE); if(count1%2==0) { myFile.print("Roll#1 left class at\r"); } else { myFile.print("Roll#1 entered at\r"); } myFile.print(" "); Time nowTime = pcf.getTime();//get current time myFile.print(nowTime.day); myFile.print("/"); myFile.print(nowTime.month); myFile.print("/"); myFile.print(nowTime.year); myFile.print(" "); myFile.print(nowTime.hour); myFile.print(":"); myFile.print(nowTime.minute); myFile.print(":"); myFile.println(nowTime.second); myFile.println(); myFile.close(); //myFile.println(); } else if(finger.fingerID==2) { //similar to if(finger.fingerID==1), just change the mobile number and use the cariable count2 } else if(finger.fingerID==3) { //similar to if(finger.fingerID==1), just change the mobile number and use the cariable count3. Similar loops can be written for total 152 fingerprints. } Serial.print("Found ID #"); Serial.print(finger.fingerID); Serial.print(" with confidence of "); Serial.println(finger.confidence); return finger.fingerID; }
লক্ষ্য করুনঃ কোড আপলোড করার সময় SIM900A কে সার্কিট থেকে বিচ্ছিন্ন করে নিতে হবে।
ক্লাসে ঢোকার সময় প্রদত্ত ফিঙ্গারপ্রিন্টের সাথে লিপিবদ্ধকৃত ফিঙ্গারপ্রিন্ট ম্যাচ করলে এলসিডিতে স্টুডেন্টের রোল নাম্বার উল্লেখপূর্বক একটি ওয়েলকাম মেসেজ দেখাবে এবং কোডে সেই রোল নম্বরের জন্য লিখিত মোবাইল নাম্বারে একটি এসএমএস যাবে। একইভাবে, ছুটির পর স্টুডেন্ট বের হবার সময় এলসিডিতে স্টুডেন্টের রোল নাম্বার উল্লেখপূর্বক একটি গুডবাই মেসেজ দেখাবে এবং একই মোবাইল নাম্বারেই স্টুডেন্টের ক্লাস ত্যাগ করার একটি মেসেজ যাবে।
প্রজেক্টে সংযুক্ত এসডি কার্ডে finger.txt নামক একটি ফাইল খুলবে। যাতে স্টুডেন্টদের ঢোকার এবং বের হবার সময় লিপিবদ্ধ থাকবে। এখান থেকেই স্কুল কর্তৃপক্ষ প্রতিটি ছাত্র-ছাত্রীর উপস্থিতির রেকর্ড দেখতে পারবেন।
]]>
আমার স্কুল মেনেজমেন্ট সফ্টও্য়্যারের জন্য একটি ফিঙ্গার প্রিন্ট ডিভাইস দরকার যেটি ইউএসবি পোর্টে লাগানো যাবে এবং একটি নাম্বার জেনারেট করবে। এবং উপরে উল্লেখিত ডিভাইসের মত এসএমএস করতে পারবে। যদি ডিভাইসটি তৈরি করা যায় তবে এর প্রাইজ কত পরবে জানাবেন প্লিজ।
দুঃখিত স্যার, আমাদের এখানে কোন প্রকার কাস্টম ডিভাইস অথবা ফিনিশড প্রডাক্ট তৈরি করা হয় না। তবে আপনি আমাদের পাইল্যাবস কন্সারন এর সাথে যোগাযোগ করতে পারেন। যোগাযোগের ঠিকানা https://www.pilabsbd.com/
এই প্রজেক্টের জন্য কোন কেসিং পাওয়া যাবে?
আমাদের কাছে কোনো কেসিং তৈরী করা নেই।
এই প্রজেক্ট কি এখন পর্যন্ত তৈরি করা হয়েছে ?
প্রজেক্ট তৈরী করার পরেই তো সেটা আপলোড করা হয়েছে আপনাদের জন্য। বাই দ্য ওয়ে, আমরা প্রজেক্ট বিক্রী করি না। টিউটোরিয়ালের জন্য যত প্রজেক্ট করা হয় সবই শুধুমাত্র সবাইকে বাসায় বসে শেখার সুযোগ দেবার জন্য।
আমি দেখলাম এ প্রজেক্ট এর সকল ডিভাইস গুলো আপনাদের ওয়েব সাইটে অ্যাভেলেবল আছে একটা বাদে। ( Power Distribution বোর্ড) এটা কি পাওয়া যাবে ?
এটা আগামীকাল পাওয়া যাবে। ইনশা আল্লাহ
ভাইয়া,
আপনারা কি আমাকে একটা এই প্রজেক্টের (এসএমএস ফিডব্যাকসহ ফিঙ্গারপ্রিন্ট ভিত্তিক অ্যাটেন্ডেন্স সিস্টেম) তৈরি করে দিতে পারবেন .
আর এটি তৈরি করতে কত সময় বা দিন লাগতে পারে আপনাদের .
আমরা কাউকে কোনো প্রজেক্ট তৈরী করে দিই না। বিষয়টি আমাদের ওয়েবসাইটে উল্লেখ করা আছে। https://www.techshopbd.com/about-us/technical-asistance
link guli kaj kore na
আমরা চেক করে দেখলাম সবগুলো লিঙ্ক কাজ করছে শুধু 3-wire LCD arduino Library ছাড়া, এখানে ক্লিক করুন ডাউনলোড করতে।
–
আরও অন্য কোন লিঙ্ক কাজ না করলে আমাদের জানাবেন প্লিজ।