กลับไปหน้ารวมไฟล์
automatic-attendance-and-classroom-environmental-monitoring-39ec1a.md

ในฐานะครู การเช็คชื่อแบบโบราณ (เรียกทีละคน) เป็นงานที่กินเวลาโคตรๆ ถ้าทำให้มันอัตโนมัติได้ ครูก็จะได้มีสมาธิไปสอนอย่างอื่นแทน ในโปรเจคนี้เราจะใช้โมดูล RFID reader กับบัตร RFID มาทำระบบเช็คชื่ออัตโนมัติกัน

การเรียนการสอนมักเกิดขึ้นในห้องสี่เหลี่ยมแคบๆ ถ้าอากาศในห้องมันร้อนเกินหรือหนาวเกิน น้องๆ ก็คงไม่มีสมาธิเรียนแน่ๆ เพื่อให้การเรียนรู้มีประสิทธิภาพ เราต้องรักษาสภาพแวดล้อมทางกายภาพในห้องเรียนให้เหมาะสม เซ็นเซอร์วัดความชื้นสัมพัทธ์และอุณหภูมิ (DHT11) จะถูกใช้ในโปรเจคนี้เพื่อตรวจสอบอุณหภูมิและความชื้น และแจ้งเตือนถ้าค่าพวกนี้มันเกินขอบเขตที่กำหนด

ไลบรารีและการประกาศตัวแปร

ก่อนเริ่มเขียนโค้ด เราต้อง include ไลบรารีต่างๆ เข้ามาในโปรแกรมก่อน เราจะกำหนดหมายเลขพินที่ต่อเข้ากับบอร์ด Arduino ไว้ตรงนี้ สร้างอินสแตนซ์ของตัวรับ RFID (mfrc522) และเซ็นเซอร์ DHT (dht) ที่จะใช้ในการเก็บข้อมูล สร้างตัวแปรชื่อ student ซึ่งเป็นอาร์เรย์สองมิติของสตริง ใช้เก็บชื่อนักเรียนและรหัสแท็ก RFID ที่เกี่ยวข้อง

#include <SPI.h>
#include <MFRC522.h>
#include "thingProperties.h"
#include "DHT.h"
#define DHTpin 2
#define DHTTYPE DHT11
#define SS_PIN 11
#define RST_PIN 12
MFRC522 mfrc522(SS_PIN, RST_PIN);
String student[6][2] = {
 {"90 17 34 37", "Ana" },
 {"D3 AA D0 45", "Paula" },
 {"52 98 81 39", "Renato" },
 {"71 E4 AE 20", "Luis" },
 {"E3 72 52 1A", "Angela" },
 {"91 39 45 20", "Maria" }
};
DHT dht(DHTpin, DHTTYPE);

Setup

ฟังก์ชัน setup() จะถูกเรียกทำงานเพียงครั้งเดียวตอนเปิดบอร์ดหรือกดปุ่มรีเซ็ต เริ่มต้นการเชื่อมต่อ Serial ด้วย baud rate 9600 การเริ่มต้นเซ็นเซอร์ DHT เรียกใช้ฟังก์ชัน begin() เพื่อเริ่มการอ่านค่า

มีการเรียกฟังก์ชันของ Arduino IoT Cloud เพื่อกำหนดค่า properties เริ่มต้น, เริ่มการเชื่อมต่อ, ตั้งค่าระดับข้อความ debug และพิมพ์ข้อมูล debug ออกมา

void setup() {
 // Initialize serial and wait for port to open:
 Serial.begin(9600);
 delay(1500);
 // Defined in thingProperties.h
 initProperties();
 // Connect to Arduino IoT Cloud
 ArduinoCloud.begin(ArduinoIoTPreferredConnection);
 setDebugMessageLevel(2);
 ArduinoCloud.printDebugInfo();
 delay(4);
 dht.begin();
}

ฟังก์ชันหลัก - Loop

ฟังก์ชัน loop() ใน Arduino ของเราจะรวมการเริ่มต้นการสื่อสาร SPI และการตั้งค่าเริ่มต้นของ mfrc522 ไว้ด้วย ตอนแรกเราทำสองอย่างนี้ในเฟส setup แต่มันต้องย้ายมาไว้ใน loop เพราะมีบั๊กตอนที่ Arduino Cloud อัปเดตค่า มันจะเปลี่ยนพิน 10 เป็นโหมด input ทำให้การสื่อสาร SPI พัง! ทางแก้คือให้เริ่มต้นการสื่อสาร SPI ในทุกๆ loop เพื่อรีเซ็ตพิน 10 กลับมาเป็นโหมด output

 void loop() {
 SPI.begin();
 mfrc522.PCD_Init();
 if ( mfrc522.PICC_IsNewCardPresent()) {
   if (mfrc522.PICC_ReadCardSerial()) {
     String content = "";
     byte letter;
     for (byte i = 0; i < mfrc522.uid.size; i++)
     {
       content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
       content.concat(String(mfrc522.uid.uidByte[i], HEX));
     }
     //Serial.println(content.substring(1));
     content.toUpperCase();
     for (int i = 0; i < 6; i++) {
       if (content.substring(1) == student[i][0])
       {
         msg_Attendance = "Attendance Recorded for Student: " + student[i][1] ;
       }
     }
     Serial.println(msg_Attendance);
   }
 }
 dht_sensor_getdata();
 delay(500);
 ArduinoCloud.update();
}

หลังจากตั้งค่า mfrc522 แล้ว ฟังก์ชัน PICC_IsNewCardPresent() จะถูกเรียก ถ้าตรวจพบบัตรใหม่ ฟังก์ชัน PICC_ReadCardSerial() จะอ่านข้อมูล ID จากบัตร RFID ID ที่ได้จะเป็นตัวแปรสตริงชื่อ content จากนั้นจะถูกแปลงเป็นตัวพิมพ์ใหญ่เพื่อนำไปเปรียบเทียบกับอาร์เรย์ student IDs ที่เก็บไว้ตอนประกาศตัวแปร เมื่อ ID ที่อ่านจากบัตรตรงกับนักเรียนในรายการ การเช็คชื่อจะถูกบันทึกและเก็บไว้ในตัวแปร msg_Attendance

เรียกใช้ฟังก์ชัน dht_sensor_getdata() ละ รายละเอียดจัดเต็มรออ่านในหัวข้อถัดไปได้เลยจ้า หลังจากนั้นก็รอสักครู่ (500 ms) ก่อนจะเรียก ArduinoCloud.update() เพื่ออัพข้อมูลทั้งสี่ตัวขึ้นคลาวด์ให้หมดเลย ไม่ว่าจะเป็น temperature, humidity, msg_Attendance และ msgTempHum ไปแบบจัดเต็ม

ฟังก์ชันเซ็นเซอร์ DHT

ฟังก์ชัน dht_sensor_getdata() นี้เราสร้างขึ้นมาเพื่ออ่านค่าความชื้นและอุณหภูมิจากเซ็นเซอร์ DHT11 โดยตรงเลยครับพี่น้อง เราเรียกใช้ความสามารถจากไลบรารี dht.h ที่มีฟังก์ชัน readHumidity() กับ readTemperature() ให้ใช้อยู่แล้ว

ส่วนเงื่อนไข if-else ด้านในนั้นคือการตรวจสอบขีดจำกัดอุณหภูมินะฮะ ถ้าต่ำกว่า 20°C หรือสูงกว่า 27°C ก็จะส่งข้อความแจ้งเตือนไปที่แดชบอร์ด ให้เห็นภาพง่ายๆ ถ้าทำของจริงก็อาจต่อกับอุปกรณ์อื่น เช่น เปิด-ปิดแอร์อัตโนมัติ หรือติดสัญญาณเตือนในห้องเรียนได้เลย

void dht_sensor_getdata()
{
 float hm = dht.readHumidity();
 Serial.print(F("Humidity "));
 Serial.println(hm);
 float temp = dht.readTemperature();
 Serial.print(F("Temperature "));
 Serial.println(temp);
 humidity = hm;
 temperature = temp;
 if (temp > 27) {
   msgTempHum = "Temperature = " + String (temperature) + "  Humidity = " + String(humidity) + " -> High ";
 }
 else if (temp < 20) {
   msgTempHum = "Temperature = " + String (temperature) + "  Humidity = " + String(humidity) + " -> Low ";
 }
 else {
   msgTempHum = "Temperature = " + String (temperature) + "  Humidity = " + String(humidity) + " -> All ok ";
 }
}

ลงลึกอีกนิด (Technical Details)

โปรเจกต์นี้เป็นการบูรณาการหลายระบบเข้าไว้ด้วยกัน จำลองระบบที่มหาวิทยาลัยสมัยใหม่ใช้จัดการทั้งความปลอดภัยของข้อมูลและการบันทึกข้อมูลสภาพแวดล้อมแบบเรียลไทม์เลยทีเดียว

ระบบเช็คชื่อดิจิทัล (RFID)

หัวใจของระบบเช็คชื่อคือ MFRC522 RFID Reader นะฮะ ส่วนใหญ่จะติดตั้งไว้ที่ประตูห้องเรียน พอนักเรียนแตะบัตรนักศึกษา (ซึ่งเป็นแท็ก NFC แบบ passive) ตัวอ่านจะส่งคลื่นวิทยุมาเพื่ออ่านค่า Unique Identifier (UID) ของบัตร ซึ่งเป็นชุดข้อมูลไบต์ที่เฉพาะตัวเลย (เช่น 90 17 34 37) ในโค้ดของเรา Arduino จะนำ UID นี้ไปเปรียบเทียบกับรายการรหัสนักศึกษาและชื่อที่เรากำหนดไว้ล่วงหน้าในโค้ด สำหรับระบบระดับองค์กรที่ใหญ่ขึ้น เราสามารถพัฒนาต่อให้ NodeMCU ส่งคำขอ HTTP POST ไปยังฐานข้อมูลบนคลาวด์หรือสคริปต์ Google Sheets เพื่อบันทึกสถานะ "Present" พร้อมเวลาที่แน่นอนได้เลย

การตรวจสอบสภาพห้องเรียน

ในเวลาเดียวกัน ระบบก็จะคอยตรวจสอบสภาพแวดล้อมภายในห้องเรียนไปด้วย โค้ดของเราใช้โครงสร้างแบบ non-blocking (อาศัย delay(500) ในลูปหลัก) เพื่ออ่านค่าเซ็นเซอร์ DHT11 อย่างต่อเนื่องโดยไม่ไปขัดขวางการทำงานของเครื่องอ่าน RFID เซ็นเซอร์ DHT11 จะติดตามอุณหภูมิและความชื้น และมีเงื่อนไขตรวจสอบเพื่อแจ้งเตือนทันทีหากค่าอยู่นอกช่วงที่กำหนด (20°C ถึง 27°C) แนวคิดนี้สามารถขยายได้ด้วยการเพิ่มเซ็นเซอร์อื่นๆ เช่น MQ-135 เพื่อตรวจสอบคุณภาพอากาศ (วัดระดับ CO2) จะได้เตือนได้ถ้าห้องเริ่มอับชื้น ข้อมูลเซ็นเซอร์ทั้งหมดจะถูกจัดรวมและส่งไปยังแดชบอร์ด Arduino Cloud เพื่อให้เราสามารถตรวจสอบจากระยะไกลได้สบายๆ

ระบบโครงสร้างและการขยายขนาด (System Architecture & Scalability)

โค้ดที่ให้มาใช้บอร์ด Arduino MKR GSM 1400 แต่ว่าโครงสร้างมันปรับใช้ได้กว้างนะจ๊ะ ESP8266 หรือ ESP32 NodeMCU นี่แหละตัวเด็ดที่รุ่นพี่ชอบใช้ในโปรเจคขั้นสูงกว่า เพราะมันมี Wi-Fi ในตัว ทำให้เรียกใช้ API ของฐานข้อมูลโดยตรงได้สะดวกมาก การสื่อสารผ่านบัส SPI กับโมดูล MFRC522 นี่คือหัวใจของงานฮาร์ดแวร์เลยนะตัวนี้ ส่วนเรื่องการตอบกลับผู้ใช้ แนะนำให้เพิ่ม จอ OLED ขนาด 0.96 นิ้ว เพื่อแสดงข้อความ "Welcome, [ชื่อนักเรียน]!" ตอนสแกนบัตรผ่าน จะช่วยยกระดับประสบการณ์ผู้ใช้ได้อย่างชัดเจน โปรเจคนี้จะปูพื้นฐานให้พวกนายในเรื่องการผสมผสานการสื่อสารฮาร์ดแวร์ผ่าน SPI, การอ่านค่าจากเซนเซอร์ และการจัดการข้อมูลบนคลาวด์ ซึ่งเป็นรากฐานสำคัญสำหรับการสร้างระบบสมาร์ทคลาสรูมระดับองค์กรเลยทีเดียว

ขั้นตอนที่ 0 - เตรียมคลาวด์ให้พร้อม

ก่อนจะเชื่อมต่อกับ Arduino IoT Cloud ต้องทำการสร้างบัญชีหรือล็อกอินกันก่อน

ถ้าอยากใช้ Web Editor แบบออนไลน์ ที่มี cores และไลบรารีต่างๆ ติดตั้งไว้ให้หมดแล้ว เราต้องติดตั้ง Create Agent Plugin ลงในเครื่องก่อนนะ ตัว Agent นี้จะช่วยจับคู่กับบอร์ดที่เราเสียบเข้ากับคอมผ่านพอร์ต USB

เมื่อเข้าไปในหน้า Web Editor แล้ว เราจะเห็นสถานะการเชื่อมต่อของบอร์ด แก้ไขโค้ด และอัปโหลดโปรแกรมได้เลย

แต่ก็ยังมีอีกสองทางเลือกนะ:

  • Arduino IDE 1.8.13 แบบคลาสสิก (ทำงานออฟไลน์) – ตัวนี้ใช้ดีสำหรับการดีบักเซนเซอร์ในเครื่อง
  • Arduino IDE 2.0 ตัวใหม่ – มีฟีเจอร์เด็ดๆ อย่างการดีบัก, การไฮไลต์โค้ด และการเติมโค้ดอัตโนมัติ (ตอนทำโปรเจคนี้ยังอยู่ช่วงเบต้าอยู่)

ถ้าจะเลือกเมนู IoT Cloud หรือ Web Editor ให้กดที่ปุ่มมุมขวาบนใกล้ๆ รูปโปรไฟล์เลย

IoT Cloud and Web Editor selection

เมื่อเราเลือกเมนู IoT Cloud แล้ว จะมีตัวเลือกหลายอย่าง แต่ในโปรเจคนี้ เราจะโฟกัสที่การสร้าง Thing, การเชื่อมโยงกับอุปกรณ์ และการเตรียมแดชบอร์ด

IoT Cloud - Things menu

หลังจากคลิกที่ "Create Thing" ตามภาพด้านบน เราก็ทำตามขั้นตอนในโปรเจคนี้เลย:

  • ขั้นตอนที่ 1 - Device - เชื่อมโยงอุปกรณ์กับ Thing ของเรา
  • ขั้นตอนที่ 2 - Add variables - เพิ่มตัวแปร
  • ขั้นตอนที่ 3 - Change the network settings - เปลี่ยนการตั้งค่าเครือข่าย
  • ขั้นตอนที่ 4 - Edit the sketch, connect to the serial monitor - แก้ไขสเก็ตช์และเชื่อมต่อ Serial Monitor
  • ขั้นตอนที่ 5 - Preparing a dashboard - เตรียมแดชบอร์ด
  • ขั้นตอนที่ 6 - Acquire data from board sent to the cloud and export - รับข้อมูลจากบอร์ดส่งขึ้นคลาวด์และส่งออก

ขั้นตอนที่ 1 - Device

Thing ใหม่ที่สร้างขึ้นมาจะยังไม่มีอุปกรณ์ (Device) กำหนดค่าไว้ ดังนั้นขั้นแรกให้คลิกไปที่ Device เลย

Configure a New device

เราสามารถเลือกเชื่อมโยงกับอุปกรณ์ที่เคยใช้ใน IoT Cloud มาก่อนแล้ว หรือจะตั้งค่าอุปกรณ์ใหม่ก็ได้

Associate or set up a new device

สำหรับโปรเจคนี้ รุ่นพี่เชื่อมโยงบอร์ด Arduino MKR GSM 1400 เข้ากับ Thing แต่น้องๆ จะใช้บอร์ดอื่นก็ได้นะ เช่น Arduino MKR WiFI 1010 หรือ NodeMCU ก็จัดไปได้เลย

ขั้นตอนที่ 2 - ตัวแปร (Variables)

ขั้นต่อมา มาจัดการกับตัวแปรกันหน่อย!

เพิ่มตัวแปรใหม่

พอคลิกเพิ่มตัวแปรแล้ว น้องต้องเลือกชื่อตัวแปร, ประเภท, สิทธิ์, นโยบายการอัปเดต และค่า threshold (ขีดเริ่มเปลี่ยน) ให้เรียบร้อย ในโปรเจคนี้เราสร้างตัวแปรไว้ 5 ตัว:

  • Humidity – เอาไว้เก็บและแสดงค่าความชื้นสัมพัทธ์บนแดชบอร์ด
  • Temperature – เอาไว้เก็บและแสดงอุณหภูมิห้องบนแดชบอร์ด
  • msg_Attendance – เอาไว้แสดงสถานะการเข้าเรียน, ชื่อนักเรียน และเวลา
  • msgTempHum – เอาไว้แสดงอุณหภูมิ, ความชื้น และข้อความแจ้งเตือนต่างๆ
  • led – ตัวนี้เอาไว้ใช้สำหรับการตรวจสอบเบื้องต้น เช็คการเชื่อมต่อระหว่างบอร์ดกับคลาวด์ (debug ง่ายๆ นั่นแหละ)

สิทธิ์ของตัวแปร (Variable Permission) มีแบบนี้:

  • Read & Write – ตัวแปรทำงานได้ทั้งรับและส่งข้อมูล คือส่งจากอุปกรณ์ไปคลาวด์ และจากคลาวด์มาอุปกรณ์ได้
  • Read only – ตัวแปรทำงานได้แค่ส่งข้อมูลออกอย่างเดียว คือส่งจากอุปกรณ์ไปคลาวด์ได้เท่านั้น

นโยบายการอัปเดตตัวแปร (Update Policy) มีแบบนี้:

  • On Change: ตัวแปรจะถูกอัปเดตไปยังคลาวด์เมื่อค่ามันเปลี่ยนแปลงมากกว่าหรือเท่ากับค่า threshold ที่ตั้งไว้
  • Periodically: ตัวแปรจะถูกอัปเดตไปยังคลาวด์เป็นระยะๆ ทุกๆ กี่วินาทีตามที่ตั้งค่า

ประเภทตัวแปรพื้นฐานที่ใช้ในโปรเจคนี้:

  • Boolean – ค่า true หรือ false (ใช้กับ LED)
  • Floating point number – ตัวเลขที่มีจุดทศนิยม (ใช้กับอุณหภูมิและความชื้น)
  • Character String - ข้อความหรือประโยค (ใช้กับ msg_Attendance และ msgTempHum)

ตั้งชื่อและเลือกประเภทตัวแปร

ขั้นตอนที่ 3 - เน็ตเวิร์ก

ตั้งค่าตัวแปรครบแล้ว ขั้นที่สามคือเพิ่มข้อมูลเครือข่ายในส่วน Configure Network กัน

การตั้งค่าเครือข่าย

ในโปรเจคนี้เราใช้ซิมการ์ดของ Arduino ซึ่งข้อมูลการตั้งค่าจะเป็นแบบนี้:

การตั้งค่าเครือข่าย GSM

แต่ถ้าน้องใช้อุปกรณ์ Wi-Fi การตั้งค่าก็จะต่างออกไปนะ ระวังด้วย ชื่อ Wi-Fi (SSID) ห้ามมีช่องว่างเด็ดขาด!

การตั้งค่าเครือข่าย WiFi

ขั้นตอนที่ 4 - สเก็ตช์ (Sketch)

โค้ดส่วนหนึ่งจะถูกอัปเดตให้อัตโนมัติโดย Arduino IoT Cloud ตามข้อมูลที่เรากรอกในสามขั้นตอนแรกนี่แหละ น้องสามารถเข้าไปแก้ไขสเก็ตช์ได้ โดยโค้ดเต็มๆ จะแสดงอยู่ด้านล่างของหน้านี้

แท็บแก้ไขสเก็ตช์

เคล็ดลับ: เวลาเจอปัญหา เช็คการเชื่อมต่อให้ดูที่แท็บ Serial Monitor นะตัวดี ถ้ามันยังไม่ยอมเชื่อมต่อกับคลาวด์ พี่แนะนำให้ลองใช้ Arduino IDE แบบ local ในคอมน้อง แล้วดูข้อความใน Serial Monitor ตรงนั้นแทน สู้งานนะน้อง!

Step 5 - Dashboard

เฮ้ย น้อง! มาถึงขั้นสุดท้ายของการตั้งค่า IoT Cloud แล้ววว นั่นก็คือการสร้าง Dashboard ไงล่ะ ไปที่แท็บ Dashboards แล้วคลิกสร้าง Dashboard โลด!

Dashboards Tab

พอสร้าง Dashboard ว่างๆ มาแล้ว เราก็ต้องเติมชีวิตชีวาให้มันด้วยการเพิ่ม Widget ต่างๆ เข้าไปจ้า

Adding widgets to dashboard

จากนั้นก็ตั้งค่า Widget โดยลิงก์ตัวแปร (Variable) ที่เราสร้างไว้ใน Cloud เข้าไป ในโปรเจคนี้พี่เพิ่มไปทั้งหมด 7 Widgets โลด! มีทั้งปุ่ม LED, เกจวัดความชื้นและอุณหภูมิ, กราฟความชื้นและอุณหภูมิ, ข้อความแสดงอุณหภูมิ/ความชื้น และข้อความแสดงการเช็คชื่อ

Widget Settings

หรืออีกวิธีที่ง่ายกว่านั้นคือ สร้างจาก Thing เลย! (ในโปรเจคนี้ Thing ชื่อ SIM)

Creating widgets from things

แล้วก็เลือกตัวแปรจาก Thing นั้นมาใช้ได้เลย ง่ายมั้ยล่ะ!

Selecting Variables

Dashboard ของเรามีให้ดูสองแบบนะ วัยรุ่น! แบบ Mobile View

Mobile View

และแบบ Desktop View

Desktop view

จัดไปวัยรุ่น! สวยปะล่ะ

Step 6 - Download Historic Data

เก็บข้อมูลใน Cloud ไว้เฉยๆ ก็ไม่สนุกสิ น้องสามารถดาวน์โหลดข้อมูลย้อนหลังมาเล่นได้! โดยไปที่ Dashboard แล้วคลิกที่ไอคอน (i) แล้วเลือก Download Historic Data

Download Historic Data

ในหน้านี้เราสามารถเลือกได้ว่าจะดาวน์โหลดข้อมูลจากตัวแปรไหน และในช่วงเวลาไหนบ้าง

Selecting Variables to download history

ตัวอย่างข้อมูลการเช็คชื่อที่ดาวน์โหลดมาเป็นไฟล์ CSV จะหน้าตาประมาณนี้เลย

CSV containing historical data received by email

ไฟล์ readme.txt ที่มากับข้อมูลก็จะบอกชื่อตัวแปร ช่วงเวลาที่ขอข้อมูลมา และมีข้อความอวยพรให้เราสนุกกับการเล่นข้อมูลด้วยล่ะ

![Read

ข้อมูล Frontmatter ดั้งเดิม

apps:
  - "1x Arduino IoT Cloud"
  - "1x Arduino IDE"
author: "anaferraz"
category: "Sensors & Environment"
components:
  - "1x Jumper wires (generic)"
  - "1x DHT11 Temperature & Humidity Sensor (4 pins)"
  - "1x RFID-RC522"
  - "1x Resistor 10k ohm"
  - "1x Arduino SIM Kit"
  - "1x Solderless Breadboard Full Size"
description: "โปรเจคนี้จะจำลอง Smart Classroom ตึงๆ โดยใช้ RFID Module จัดการเช็คชื่ออัตโนมัติแบบไม่ต้องง้อกระดาษ และใช้เซนเซอร์ DHT11 วัยรุ่นคอยตรวจสอบสภาพแวดล้อมในห้องเรียนให้อยู่สบายตลอดคาบ!"
difficulty: "Advanced"
documentationLinks: []
downloadableFiles: []
encryptedPayload: "U2FsdGVkX1+3CCDhLHvMTBb/PV5UgiGxgCOEik8A1ZxcCx1grpB9Bxi0wD8tdGieHEFPRgpDx6yd8EE65q889Mu4s0G8KXE1e3XMWXILYyI1Ql8nTBocYORc0xxZJdQh"
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/automatic-attendance-and-classroom-environmental-monitoring-39ec1a_cover.jpg"
lang: "en"
likes: 5
passwordHash: "c62c1e57d9928bd2fc4ef730d2d7e65e49911fe5358b961126b08a49ebd34e8b"
price: 2450
seoDescription: "Smart Classroom project featuring Automatic Attendance with RFID module and Classroom Environmental Monitoring using DHT11 sensor."
tags:
  - "Communication"
  - "Embedded"
  - "Tracking"
title: "ระบบเช็คชื่ออัตโนมัติและจับตาสภาพห้องเรียน (งานง่ายแต่หล่อ!)"
tools: []
videoLinks: []
views: 27708