สร้างเครื่องนับจำนวนด้วยบอร์ด ESPino

บทความสร้างเครื่องนับจำนวนด้วยบอร์ด ESPino เป็นบทความสร้างเครื่องมือสำหรับนับจำนวนด้วยอุปกรณ์อิเล็กทรอนิกส์ โดยบทความนี้ใช้งานบอร์ด ESPino (ESP8266) ที่เป็นบอร์ดไมโครคอนโทรเลอร์ที่มี WiFi ในการประมวลผล สามารถประยุกต์ใช้นับจำนวนสินค้าผ่านสายพานลำเลียง นับจำนวนคนเดินผ่าน นับจำนวนรถเข้าออก หรืออื่นๆตามต้องการและจากนั้นก็จะทำการอัพเดทข้อมูลไปเเสดงผลยังเเอพพลิเคชัน Blynk เพื่อดูข้อมูลแบบเรียลไทม์ใน Smart Device  ดังรูป เครื่องนับจำนวนด้วยบอร์ด ESPino 

หลักการทำงาน Photoelectric sensor
Photoelectric Sensor คือเซ็นเซอร์สำหรับวัดประเภทอินฟราเรดอย่างหนึ่ง ทำงานโดยอาศัยหลักการสะท้อนหรือการหักเหของแสงจากตัวส่ง (Emitter) ไปยังตัวรับ (Receiver) ให้เอาต์พุตเป็นลอจิก LOW เมื่อเกิดการสะท้อนของสัญญาณอินฟราเรดกลับมา หรือให้เอาต์พุตเป็นลอจิก HIGH เมื่อไม่มีการสะท้อนของสัญญาณอินฟราเรด ดังรูป เอาต์พุตของ Photoelectric Sensor

เอาต์พุตของ Photoelectric Sensor

หลังจากรู้หลักการทำงานของเซ็นเซอร์ Photoelectric Sensor แล้ว เราจะนำหลักการนี้มาประยุกต์ใช้งานร่วมกับบอร์ด ESPino เพื่อให้เกิดโครงงานชิ้นนี้ขึ้นมา

อุปกรณ์ที่ใช้

  1. ESPino Wifi Development Board (ETEE052) จำนวน 1 pcs บอร์ดไมโครคอนโทรลเลอร์พร้อมโมดูลสื่อสารเครือข่ายคอมพิวเตอร์ไร้สาย ใช้โมดูล WROOM-02 ชิพ ESP8266 เป็นไมโครคอนโทรลเลอร์ 32-bit ความเร็ว 80 MHz พร้อมหน่วยความจำแฟลชเมมโมรี่ขนาด 4 MB รองรับการเชื่อมต่อเครือข่ายมาตรฐาน IEEE 802.11 b/g/n สามารถพัฒนาบนแพลตฟอร์ม Arduino ได้
  1. Photoelectric Sensor (EFDV285) จำนวน 1 pcs เซ็นเซอร์ประเภทอินฟราเรดที่มีระยะการทำงานที่ 3 – 50 ซม. สัญญาณรบกวนมีผลน้อยเนื่องจากเป็นแสงอินฟราเรด ง่ายต่อการนำไปประกอบชิ้นงาน นอกจากนี้ยังสามารถนำไปต่อยอดใช้งานกับงานหุ่นยนต์หลบสิ่งกีดขวาง และงาน automation อื่นๆ อีกด้วย
  1. (TM1637) 7-Segment 4-Digit Display Module (EFDV669) จำนวน 1 pcs โมดูลสำหรับแสดงผลตัวเลข 4 หลัก หน้าจอขนาด 0.36 นิ้ว โดยมี IC เบอร์ TM1637 เป็นตัวควบคุมการทำงาน เหมาะสำหรับงานที่มีการแสดงผลด้วยตัวเลขหรือนาฬิกา ใช้งานง่าย สามารถควบคุมแต่ละหลักได้อิสระต่อกัน
  1. JY-MCU IIC Level Converter Module (EFDV311) จำนวน 1 pcs โมดูลสำหรับแปลงระดับเเรงดันไฟ 3.3V โวลต์เป็น 5V หรือแปลงระดับเเรงดันไฟ 5V โวลต์เป็น 3.3V
  1. 20 cm Male to Male Cable Jumper Wire 40 Pins (ผู้-ผู้) (ELNK050) จำนวน 1 pcs สาย Jumper Wire แบบสายแพ สามารถฉีกออกเป็นเล็กได้ 40 เส้น ความยาวสาย 20 cm ปลายหนึ่งเป็นหัว header ตัวผู้และอีกด้านหนึ่งเป็นหัว headerตัวเมีย
  1. 20 cm Male to Female Cable Jumper Wire 40 Pins (ผู้-เมีย) (ELNK054) จำนวน 1 pcs สาย Jumper Wire แบบสายแพ สามารถฉีกออกเป็นเล็กได้ 40 เส้น ความยาวสาย 20 cm ปลายสายเป็น header ตัวผู้ทั้งสองด้าน
  1. 400 point White BreadBoard (ProtoBoard) (EACC025) จำนวน 1 pcs BreadBoard หรือ ProtoBoard สำหรับวงจรทดลอง
  1. IP66 Waterproof Case (EFDV658) จำนวน 1 pcs กล่องอเนกประสงค์สำหรับใส่วงจร Sonoff หรือ แผ่นวงจรอื่นๆ เพื่อป้องกันแผ่นวงจรจากละอองน้ำ (IP66) พร้อม PF7 Connector ขั้วต่อกันน้ำ เหมาะแก่การนำไปใส่อุปกรณ์หรือแผงวงจรเพื่อติดตั้งภายนอกอาคาร

วงจรที่ใช้งาน

วงจรที่ใช้

สำหรับผู้ที่ยังไม่เคยใช้งานบอร์ด ESPino สามารถศึกษาการติดตั้งบอร์ดเเพ็กเกจและวิธีการใช้งานเบื้องต้นได้ที่

ไลบรารี่ที่จำเป็นต้องติดตั้งเพิ่มเติม

ตัวอย่างที่ 1 บอร์ด ESPino ตรวจจับการเคลื่อนผ่านและแสดงจำนวนผ่านจอแสดงผล

ตัวอย่างนี้จะเป็นการใช้บอร์ด ESPino ตรวจจับการเคลื่อนผ่านและแสดงจำนวนผ่านจอแสดงผลแบบ Stan Alone ก่อน โดยมีขั้นตอนการทำงานคือ เมื่อมีวัตถุเคลื่อนที่ผ่าน Photoelectric Sensor บอร์ด ESPino จะเพิ่มจำนวนนับและแสดงค่าจำนวนนับดังกล่าวผลจอ 7-Segment 

โปรเเกรมที่ 1

/* เรียกใช้งานไลบรารี่ที่เกี่ยวข้อง */
#include <EEPROM.h>
#include <Arduino.h>
#include <TM1637Display.h>
#define CLK 4
#define DIO 5
TM1637Display display(CLK, DIO);


const int ir_pin = 12;
const int button = 0;
volatile short counter;

/* ฟังก์ชันที่ถูกเรียกใช้งานเมื่อเกิด Interrupt Sensor*/
ICACHE_RAM_ATTR void detects() {
  Serial.print("SENSOR DETECTED!!! ");
  counter++;
  Serial.println(counter);
  display.clear();
  display.showNumberDec(counter);
  writeEEPROM(counter);
}

/* ฟังก์ชันที่ถูกเรียกใช้งานเมื่อเกิด Interrupt จากการกดปุ่ม*/
ICACHE_RAM_ATTR void resetEEPROM() {
  Serial.println("Reset EEPROM!!!");
  writeEEPROM(0);
  counter = readEEPROM();
  display.showNumberDec(counter);
}

/* ฟังก์ชันสำหรับบันทึกค่าลง EEPROM */
void writeEEPROM(unsigned short number)
{
  EEPROM.write(0, number >> 8);
  EEPROM.write(1, number & 0xFF);
  EEPROM.commit();
}

/* ฟังก์ชันสำหรับอ่านค่าจาก EEPROM */
unsigned short readEEPROM()
{
  byte dataHigh = EEPROM.read(0);
  byte dataLow = EEPROM.read(1);
  return (dataHigh << 8) + dataLow;
}

void setup(void) {
  Serial.begin(115200);
  pinMode( ir_pin , INPUT_PULLUP);
  pinMode( button , INPUT_PULLUP);

  EEPROM.begin(2);
  counter = readEEPROM();
  Serial.print("Old counter= ");
  Serial.println(counter);

  display.setBrightness(0x0f);
  display.clear();
  display.showNumberDec(counter);

  attachInterrupt(digitalPinToInterrupt(ir_pin), detects, FALLING);
  attachInterrupt(digitalPinToInterrupt(button), resetEEPROM, FALLING);
}

void loop(void) {
}

หลังจากอัพโหลดโปรเเกรมที่ 1 ลงไปในบอร์ด ESPino แนะนำให้ผู้ใช้งานลองทดสอบการทำงานของโปรเเกรม โดยฟีเจอร์หลักๆของโปรเเกรมคือ

  1. โปรเเกรมนี้จะอ่านค่าจำนวนนับก่อนหน้านี้จากหน่วยความจำ EEPROM ของบอร์ด ESPino มาเเสดงผล ดังนั้นเมื่อไฟดับ หรือมีการปิด/เปิดตัวบอร์ดใหม่ บอร์ดจะทำงานต่อจากเดิมได้ทันที
  2. เมื่อมีวัตถุเคลื่อนที่ผ่านบริเวณหน้า Photoelectric Sensor เอาต์พุตของเซ็นเซอร์จะกระตุ้นให้เกิดการทำงานแบบขัดจังหวะ (Interrupt) ที่ตัวบอร์ด ESPino จากนั้นตัวบอร์ดจะบันทึกค่าจำนวนนับลงใน EEPROM เเละแสดงผลออกทางจอ 7-Segment
  3. เมื่อมีการกดปุ่ม PRG บนตัวบอร์ด ESPino จะเกิดการทำงานแบบขัดจังหวะ (Interrupt) ไปเรียกใช้งานฟังก์ชัน resetEEPROM() เพื่อรีเซ็ทค่าจำนวนนับเป็น 0 และแสดงผลออกทางจอ 7-Segment

ตัวอย่างที่ 2 บอร์ด ESPino ตรวจจับการเคลื่อนผ่าน แสดงจำนวนผ่านจอแสดงผล และส่งค่าไปยัง Blynk Server

การทำงานของตัวอย่างนี้จะเหมือนโปรเเกรมที่ 1 เเต่จะเพิ่มในส่วนของการอัพโหลดจำนวนนับไปยัง Blynk Server เพื่อติดตามจำนวนนับดังกล่าวผ่านสมาร์ทโฟนผ่านทางแอพพลิเคชันฟรีอย่าง Blynk ได้

เนื้อหาเริ่มต้นสำหรับคนไม่รู้จัก Blynk >> เริ่มต้น IoT App ด้วย Blynk <<

ขั้นตอนเริ่มต้นก่อนจะอัพโหลดโปรเเกรมลงบนบอร์ด ESPino จะต้องทำการสร้าง Widget บนเเอพพลิเคชัน Blynk เสียก่อน เพื่อใช้สำหรับการแสดงผลจำนวนนับ สามารถดูตัวอย่างการสร้างได้จากรูป สร้าง Value Display Widget

การตั้งค่าในรูป

  • Widget: Value Display Widget
  • TiTle: Count
  • INPUT: Virtual V0 

สร้าง Value Display Widget

ก่อนที่จะอัพโหลดโปรเเกรมลงบนบอร์ด อย่าลืมเเก้ไข 3 ส่วนคือ

  • AUTH_TOKEN คือ รหัส Token ที่ได้จาก Blynk (หาได้จาก  เริ่มต้น IoT App ด้วย Blynk)
  • YOUR_SSID_NAME คือ Username WiFi ที่ต้องการใช้งาน
  • YOUR_SSID_PASSWORD คือ PASSWORD WiFi ที่ต้องการใช้งาน

โปรเเกรมที่ 2

#include <EEPROM.h>

#include <Arduino.h>
#include <TM1637Display.h>
#define CLK 4
#define DIO 5
TM1637Display display(CLK, DIO);

const int ir_pin = 12;
const int button = 0;
volatile short counter;

#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
char auth[] = "AUTH_TOKEN";
char ssid[] = "YOUR_SSID_NAME";
char pass[] = "YOUR_SSID_PASSWORD";

ICACHE_RAM_ATTR void detects() {
  Serial.print("SENSOR DETECTED!!! ");
  counter++;
  Serial.println(counter);
  display.clear();
  display.showNumberDec(counter);
  writeEEPROM(counter);
  Blynk.virtualWrite(V0,counter);
}

ICACHE_RAM_ATTR void resetEEPROM() {
  Serial.println("Reset EEPROM!!!");
  writeEEPROM(0);
  counter = readEEPROM();
  display.showNumberDec(counter);
  Blynk.virtualWrite(V0,counter);
}

void writeEEPROM(unsigned short number)
{
  EEPROM.write(0, number >> 8);
  EEPROM.write(1, number & 0xFF);
  EEPROM.commit();
}

unsigned short readEEPROM()
{
  byte dataHigh = EEPROM.read(0);
  byte dataLow = EEPROM.read(1);
  return (dataHigh << 8) + dataLow;
}

void setup(void) {
  Serial.begin(115200);
  pinMode( ir_pin , INPUT_PULLUP);
  pinMode( button , INPUT_PULLUP);

  EEPROM.begin(2);
  counter = readEEPROM();
  Serial.print("Old counter= ");
  Serial.println(counter);

  display.setBrightness(0x0f);
  display.clear();
  display.showNumberDec(counter);

  attachInterrupt(digitalPinToInterrupt(ir_pin), detects, FALLING);
  attachInterrupt(digitalPinToInterrupt(button), resetEEPROM, FALLING);

  Blynk.begin(auth, ssid, pass);
  Blynk.virtualWrite(V0,counter);
}

void loop(void) {
  Blynk.run();
}

หลังจากอัพโหลดโปรเเกรมที่ 2 ลงไปในบอร์ด ESPino แนะนำให้ผู้ใช้งานลองทดสอบการทำงานของโปรเเกรม โดยฟีเจอร์หลักๆของโปรเเกรมที่เพิ่มเข้ามาจากโปรเเกรมแรก จะเป็นการอัพเดทจำนวนนับขึ้นไปเเสดงผลบนเเอพพลิเคชัน Blynk ด้วย ดังรูป เครื่องนับจำนวนด้วยบอร์ด ESPino

เครื่องนับจำนวนด้วยบอร์ด ESPino

ในบทความ สร้างเครื่องนับจำนวนด้วยบอร์ด ESPino ขอจบการนำเสนอเนื้อหาเพียงเท่านี้ หากมีข้อสงสัยเพิ่มเติมสามารถสอบถามทีมงานได้ทาง อีเมล Support@thaieasyelec.com เบอร์โทร 089-514-8111 หรือ หากสนใจเลือกซื้ออุปกรณ์สามารถขอใบเสนอราคาได้ที่อีเมล Sales@thaieasyelec.com หรือสั่งซื้อทางหน้าเว็บไซต์ที่ https://www.thaieasyelec.com/