Classroom attendance app

Hi there, my name is ANC. I am student working on my project attendance system. Basically, what I want to do (according to the image attached) is:
create an app with four (4) button tabs.
A bluetooth connect button to connect my app to bluetooth generic module like HC-05 of a microcontroller,
Next, here we have three tabs: Enroll, Take attendence and Export file
In enroll, once u click on that tab, it will ask the MCU to read a fingerprint and the person will input his/her info and save it
In take attendance, it will produce the list of those who have enrolled and keep running a loop of scanning fingerprints placed on it and each one gotten it will, make it as present
In export tab, it will ask the user to select the date on the calendar they want to export and export the file either as a pdf or CSV file.

please, any assistance would be greatly appreciated.
Thank you.

2 Likes

Nice work :slight_smile:

Really interesting and helpful.

Is there anything else than the screen design and hopes for functionality here, that the other posts have praised?

I am missing some important parts, like:

  • Do you have MCU software and hardware to read fingerprints and encode them?
  • Does the MCU have persistent (across power down) storage to save fingerprint codes and their associated names?
  • Have you settled on message formats between the MCU and Android device?
1 Like

@ABG, the pictures are just wireframes of what the design may look like. I don't really know how to begin the app. To answer your questions straight.

  • The MCU software is the Arduino IDE, the hardware the Arduino Uno or Mega. The fingerprint module is AS608 optical fingerprint module. It would send the ID of the fingerprint scanned in form of string and I would want save them somewhere in the phone (app) database.
    The MCU can save on its EEPROM but i would like to use the phone memory for that instead, the fingerprint sensor can only save the bio prints as IDs.
    Lastly, I haven't settle on the message format yet but would love any head up on that.
    Any links or suggestion would be greatly appreciated. Thank you.

I suggest starting with this tutorial on the fingerprint sensor, so you can witness its basic functions and the messages it accepts and emits.

Then search this board for 'HC05' samples. There are lots of them.
Just take one that pairs, accepts text, and displays it in a Label.

Your device can store 128 fingerprints, by ID.

P.S. More questions need to be answered before starting to design your data storage.

  • How many fingerprint readers per classroom?
  • How many students per class?
  • How many different classrooms with fingerprint readers could each student attend?
  • How many phones might pair with each fingerprint reader?
  • Would a central database need to be updated with attendance data?

P.P.S. There exist BlueTooth terminal apps in the Play Store that you could use to test your fingerprint hardware, independent of AI2. That makes debugging easier.

1 Like

@ABG, thank you. But I don't have a problem with the hardware side, i could find my way around it. I have built biometric ignition system and a few other model projects with it. My focus is on the app side. I would however screenshot my progress so far on the app and post here.
It is just for a demo project and only one fingerprint reader is required.
Maximum of of 20 students and only one classroom..
It is one phone to be paired at a time.
I dont understand what you mean by a "central Database."

I checked some of the play store Bluetooth apps but they are not giving me what I want. And I would be require to defend the app development hence the need to design and code it myself.

For enrollment, I suggest separate TinyDB NameSpaces, because the data will be persistent and reusable day to day. For ease of use, I suggest using JOIN(Surname, ',', First Name) as a hopefully unique tag for each TinyDB NameSpace, with separate NameSpaces supplying values for:

  • Fingerprint ID
  • Matriculation Number

Having Names as tags allows you to ask for a TinyDB TagList, which would come back already alphabetized for use as the Elements list of a List Picker in your Attendance Taking Arrangement.

For Attendance taking, I suggest a separate TinyDB NameSpace 'Attendance', with one tag per yyyyMMdd day (assuming you will be taking only one attendance per day) and each day's value would be a table (list of lists) with each row containing:

  • yyyyMMdd date, (yes, I know this is redundant, but it would be helpful if you collect rows later)
  • SurName,
  • First Name,
  • Matriculation Number,
  • Fingerprint ID or 0 if not present

This table is easily converted to csv format for export using the native AI2 table to csv (csv from table?) block from the Lists pallette.

The fingerprint taking process would need a List Picker loaded with student surname,FirstName Elements. When Selected, that List Picker event should load displays of the student's other data (Matriculation Number, Fingerprint ID) from the appropriate NameSpaces, and request a scan from the fingerprint sensor. When a scan result arrives, it should be added as a row to today's Attendance table.

For setting today's date, just use a Label.Text and the Clock from the Sensors drawer.

Here are two ways to handle present/not present in List Pickers, to avoid the alignment problem in your checkbox scheme:

Finally, here is how to set up New Line message delimiters in AI2, standard advice:

Please see the Delimiter article in FAQ

Be sure to use println() at the end of each message to send from the sending device, to signal end of message. Do not rely on timing for this, which is unreliable.

In the AI2 Designer, set the Delimiter attribute of the BlueTooth Client component to 10 to recognize the End of Line character.
BlueToothClient1_Properties
Also, return data is not immediately available after sending a request,
you have to start a Clock Timer repeating and watch for its arrival in the Clock Timer event. The repeat rate of the Clock Timer should be faster than the transmission rate in the sending device, to not flood the AI2 buffers.

In your Clock Timer, you should check

  Is the BlueTooth Client still Connected?
  Is Bytes Available > 0?
     IF Bytes Available > 0 THEN
       set message var  to BT.ReceiveText(-1) 

This takes advantage of a special case in the ReceiveText block:

ReceiveText(numberOfBytes)
Receive text from the connected Bluetooth device. If numberOfBytes is less than 0, read until a delimiter byte value is received.

If you are sending multiple data values per message separated by | or comma, have your message split into a local or global variable for inspection before trying to select list items from it. Test if (length of list(split list result) >= expected list length) before doing any select list item operations, to avoid taking a long walk on a short pier. This bulletproofing is necessary in case your sending device sneaks in some commentary messages with the data values.

hi @ABG, I have been implementing these steps you mentioned above but it is even tougher than other research I came across. I will be posting the pictures and screenshots or even my code here shorting.
I have been able to create a table, save inputs to it but i cant go into it and take the information I need.

1 Like