1 of 97

ไมโครคอนโทลรเลอร์ขั้นพื้นฐาน �และอินเตอร์เน็ตของสรรพพสิ่ง (IoT)

มหาวิทยาลัยเทคโนโลยีพระจอมเกล้าพระนครเหนือ

2 of 97

ประวัติวิทยาการ

  • ผศ.ดร. ชานินทร์ จูฉิม – อาจารย์สาขาวิชาวิศวกรรมแมคคาทรอนิกส์ มหาวิทยาลัยเทคโนโลยีพระจอมเกล้าพระนครเหนือ
    • B. eng (Electrical engineering)
    • M. eng (Electrical engineering)
    • Dr.- Ing (Mechatronic engineering) University of Siegen, Germany
    • Skill: Automation system, microcontroller, IoT, PLC
    • Email: chanin.j@cit.kmutnb.ac.th

    • ผศ.ดร. สุพจน์ แก้วกรณ์ - อาจารย์สาขาวิชาวิศวกรรมแมคคาทรอนิกส์ มหาวิทยาลัยเทคโนโลยีพระจอมเกล้าพระนครเหนือ
    • B. eng (Electrical engineering)
    • M. eng (Electrical engineering)
    • PhD (Mechatronic engineering) AIT, Thailand
    • Skill: Automation system, microcontroller, IoT, Networking, embedded system
    • Email: supod.k@cit.kmutnb.ac.th

3 of 97

การพัฒนาสู่อุตสาหกรรม 4.0 สามารถแบ่งการพัฒนาเป็น 5 ระดับ ในการปรับเปลี่ยนกระบวนการผลิตทางอุตสาหกรรมให้เป็นกระบวนการอัตโนมัติ สำหรับการบูรณาการระบบควบคุมอุตสาหกรรมซึ่งสามารถนำมาใช้ได้กับการพัฒนาไปสู่ระบบอุตสาหกรรม 4.0 โดยแบ่งระดับการพัฒนาเป็น 5 ระดับ ดังแสดงในรูป

4 of 97

1. ไมโครคอนโทรลเลอร์คืออะไร

  • ไมโครคอนโทรลเลอร์ (อังกฤษ: microcontroller มักย่อว่า µC, uC หรือ MCU) คือ อุปกรณ์ควบคุมขนาดเล็ก ซึ่งบรรจุความสามารถที่คล้ายคลึงกับระบบคอมพิวเตอร์ โดยในไมโครคอนโทรลเลอร์ได้รวมเอาซีพียู, หน่วยความจำ และพอร์ต ซึ่งเป็นส่วนประกอบหลักสำคัญของระบบคอมพิวเตอร์เข้าไว้ด้วยกัน โดยทำการบรรจุเข้าไว้ในตัวถังเดียวกัน

5 of 97

ไมโคร คอนโทรลเลอร์ มีกี่ประเภทอะไรบ้าง?

ไมโคร คอนโทรลเลอร์ มีด้วยกันหลายประเภทแบ่งตามสถาปัตยกรรม

  • 1. ไมโคร คอนโทรลเลอร์ตระกูล PIC (บริษัทผู้ผลิต Microchip ไมโครชิป)
  • 2. ไมโคร คอนโทรลเลอร์ตระกูล MCS51 (บริษัทผู้ผลิต Atmel,Phillips)
  • 3. ไมโคร คอนโทรลเลอร์ตระกูล AVR (บริษัทผู้ผลิต Atmel)
  • 4. ไมโคร คอนโทรลเลอร์ตระกูล ARM7,ARM9 (บริษัทผู้ผลิต Atmel,Phillips,Analog Device,Sumsung,STMicroelectronics)
  • 5. ไมโคร คอนโทรลเลอร์ตระกูล Basic Stamp (บริษัทผู้ผลิต Parallax)
  • 6. ไมโคร คอนโทรลเลอร์ตระกูล PSOC (บริษัทผู้ผลิต CYPRESS)
  • 7. ไมโคร คอนโทรลเลอร์ตระกูล MSP (บริษัทผู้ผลิต Texas Intruments)
  • 8. ไมโคร คอนโทรลเลอร์ตระกูล 68HC (บริษัทผู้ผลิต MOTOROLA)
  • 9. ไมโคร คอนโทรลเลอร์ตระกูล H8 (บริษัทผู้ผลิต Renesas)
  • 10. ไมโคร คอนโทรลเลอร์ตระกูล RABBIT (บริษัทผู้ผลิต RABBIT SEMICONDUCTOR)
  • 11. ไมโคร คอนโทรลเลอร์ตระกูล Z80 (บริษัทผู้ผลิต Zilog)

6 of 97

2. Arduino คืออะไร

  •  Arduino อ่านว่า (อา-ดู-อิ-โน่ หรือ อาดุยโน่) เป็นบอร์ดไมโครคอนโทรเลอร์ตระกูลที่มีการพัฒนาแบบ Open Source คือมีการเปิดเผยข้อมูลทั้งด้าน Hardware และ Software ตัว บอร์ด Arduino ถูกออกแบบมาให้ใช้งานได้ง่าย ดังนั้นจึงเหมาะสำหรับผู้เริ่มต้นศึกษา ทั้งนี้ผู้ใช้งานยังสามารถดัดแปลง เพิ่มเติม พัฒนาต่อยอดทั้งตัวบอร์ด หรือโปรแกรมต่อได้อีกด้วย ความง่ายของบอร์ด Arduino ในการต่ออุปกรณ์เสริมต่างๆ คือผู้ใช้งานสามารถต่อวงจรอิเล็กทรอนิคส์จากภายนอกแล้วเชื่อมต่อเข้ามาที่ขา I/O ของบอร์ด
  • ผลิต freeware compiler ใช้กับ microcontroller AVR เป็นหลัก (PIC,MCS, STM etc)
  • https://www.arduino.cc

7 of 97

8 of 97

9 of 97

โครงสร้างขาของ Node MCU 8266

http://arduino.esp8266.com/stable/package_esp8266com_index.json

1 ติด 2 ดับ

Delay 1 sec

1 ดับ 2 ติด

Delay 1 sec

10 of 97

11 of 97

1. โครงสร้างของบอร์ด Arduino UnoR3

12 of 97

13 of 97

14 of 97

คำสั่งพื้นฐานของภาษาซี

15 of 97

1.การเริ่มต้นโปรแกรม

โครงสร้างพื้นฐานของการเขียนโปรแกรมภาษา Arduino ค่อนข้างง่ายและทำงานในเวลาอย่างน้อยสองส่วน คือส่วนเริ่มต้นและส่วนที่วนไม่รู้จบ

void setup()

{

//เริ่มต้นการตั้งค่า

}

void loop()

{

//วนลูปไม่รู้จบ

}

16 of 97

2. ชนิดของตัวแปร

17 of 97

การเปรียบเทียบ Comparison Operators

ยกตัวอย่าง if (a==b) ไม่ใช่ if (a=b)

== (equal to)

!= (not equal to)

< (less than)

> (greater than)

<= (less than or equal to)

>= (greater than or equal to)

18 of 97

Boolean Operator

&& (and)

|| (or)

! (not)

  • ยกตัวอย่าง ต้องกดสวิตช์พร้อมกันทั้ง 2 ตัวไฟถึงจะติด

If (switch1 && swithc2) {on led};

  • ยกตัวอย่าง กดสวิตช์ตัวใดตัวหนึ่งไฟก็ติด

If (switch1 || swithc2) {on led};

19 of 97

Compound Operators

  • ++ (increment)
  • -- (decrement)
  • += (compound addition)
  • -= (compound subtraction)
  • *= (compound multiplication)
  • /= (compound division)

20 of 97

Compound Operators

ยกตัวอย่าง

x = 2;

x += 4; // x now contains 6

x -= 3; // x now contains 3

x *= 10; // x now contains 30

x /= 2; // x now contains 15

x %= 5; // x now contains 0

21 of 97

3. คำสั่งพื้นฐานของภาษาซี if else

If…else…

if (เงื่อนไข A)

{

// ถ้าเงื่อนไข A เป็นจริงทำงานในลูปนี้

// เช่น 1==1

}

else

{

// action B

}

22 of 97

คำสั่ง for

int data;

int i;

Data = 0;

for(int i=0; i < 4; i++)

{

data++;

}

// สุดท้าย data = 4

23 of 97

คำสั่ง switch

switch (var) {

case 1:� //do something when var equals 1� break;� case 2:� //do something when var equals 2� break;� default: � // if nothing else matches, do the default � // default is optional� break;� }

24 of 97

คำสั่ง while 

while(expression)

{

// statement(s)

}

var = 0;�while(var < 200)

{�  // do something repetitive 200 times�  var++;�}

25 of 97

คำสั่ง break

  • for (x = 0; x < 255; x ++)�{�    if (button == 0)

{�        x = 0;�        break;�     }  �    x++;�}

26 of 97

การส่งค่าเอาท์พุต(Digital Output)

27 of 97

28 of 97

29 of 97

ลง Library

ESP8266 Scheduler

30 of 97

ตัวอย่าง ทดลองเปิด-ปิดหลอดไฟบนบอร์ดที่ขา 2 หรือ D4 เพื่อเปิด-ปิดหลอดไฟ

 

void setup()

{

pinMode(2,OUTPUT); // ตั้งค่าขา 2 ให้เป็น Output

Serial.begin(9600); // กำหนดการสื่อสารให้เป็น 9600 b/s

}

void loop() {

digitalWrite(2,1); // สั่งให้ขา 2 มีไฟออก 3.3 v

delay(1000); // หน่วงเวลา 1 วินาที

digitalWrite(2,0); // สั่งให้ขา 2 ส่งกราวด์

delay(1000); // หน่วงเวลา 1 วินาที

}

31 of 97

ควบคุมการเปิด ปิดหลอดไฟ

กด sw(0) – LED 2 (ติด)

ปล่อย sw(1) – LED 2 (ดับ)

32 of 97

ควบคุมการเปิด ปิดหลอดไฟ

void setup()

{

pinMode(13, OUTPUT);

}

void loop()

{

digitalWrite(13, HIGH); // ส่งสัญญาณ 5 โวล์ต ออกมาจากขา 13

delay(1000); // รอ 1 วินาที

digitalWrite(13, LOW); // ส่งสัญญาณ 0 ออกมาจากขา 13

delay(1000); // รอ 1 วินาที

}

33 of 97

แบบฝึกหัด

  • ออกแบบวงจรให้มีการเปิด – ปิด ไฟ LED สลับกันไปมา 2 ดวง
    • 1- ติด 2 ดับ หน่วงเวลา 2 วินาที
    • 1- ดับ 2 ติด หน่วงเวลา 1 วินาที
    • วนกลับไปเริ่มต้นใหม่

34 of 97

Sw1 –gpio 0

Sw2-gpio 14

Led1 -5

Led2-2

0 (กด)

0

0 (ดับ)

0

0

1

0

1

1 (ไม่กด)

0

1(ติด)

0

1(ไม่กด)

1(ไม่กด)

1(ติด)

1(ติด)

35 of 97

การรับค่าอินพุต (Digital Input)

36 of 97

การต่ออินพุตให้ไมโครคอนโทรลเลอร์

  • การต่อแบบ pull-up
  • การต่อแบบ pull-down
  • ไม่สามารถให้ไมโครคอนโทรลเลอร์ลอยอยู่ในอากาศโดยที่ไม่มีสภาวะไฟ เพราะจะทำให้ไม่สามารถอ่านสภาวะของขานั้นได้

37 of 97

การรับสวิตช์

const int buttonPin = 2; // the number of the pushbutton pin

const int ledPin = 13; // the number of the LED pin

int button = 0;

void setup() {

pinMode(13, OUTPUT); // เริ่มต้นกำหนดให้ ขา 13 เป็นเอาท์พุท

pinMode(12, INPUT); // เริ่มต้นกำหนดให้ ขา 12 เป็นอินพุท}

void loop() {

button = digitalRead(12);

// อ่านค่าสวิตช์จาก ขา 12 มาเก็บไว้ในตัวแปร button

if (button == HIGH) // ถ้ากดปุ่มมีแรงดัน 5 โวลต์เข้าไมโครคอนโทรเลอร์

{

digitalWrite(13, HIGH);

// ส่งสัญญาณ 5 โวล์ต ออกมาจากขา 13

}

else {

// ถ้าไม่มีการกดปุ่มมีแรงดัน 0 โวลต์เข้าไมโครคอนโทรเลอร์

digitalWrite(13, LOW);

}

}

38 of 97

int button;

void setup()

{

Serial.begin(9600);

pinMode(2,OUTPUT);

pinMode(5,OUTPUT);

pinMode(0,INPUT_PULLUP);

}

void loop()

{

button = digitalRead(0);

Serial.print("button = "); Serial.println(button);

if(button==1) // ไม่ได้กด sw

{

Serial.println("if loop");

digitalWrite(2,1); // หลอดไฟดับ

}

else //กดsw

{

Serial.println("else loop");

digitalWrite(2,0); // หลอดไฟติด

}

39 of 97

แบบฝึกหัด

  • ต่อสวิตช์ 2 ตัวเพื่อควบคุมการเปิด – ปิดของ หลอดไฟ 2 ดวง
    • หลอดไฟที่ขา 13 และขา 10
    • สวิตช์ 1 ขา 12
      • กด 12 แต่ไม่กด 11 ไฟดวงที่ 1 และ 2 ติด
      • ไม่กด 11 และ 12 ไฟดวงที่ 1 และ 2 ดับ
    • สวิตช์ 2 ขา 11
      • ไม่กด 12 แต่กด 11 ไฟกระพริบสลับระหว่าง 1 และ 2
      • ไม่กด 11 และ 12 ไฟดวงที่ 1 และ 2 ดับ

40 of 97

การรับค่าสัญญาแอนะล็อก

(Analog Signal)

41 of 97

42 of 97

รายการเซนเซอร์ที่มีในชุด 37-in-1 ชุดรวม Sensor สำหรับ Arduino Sensor Kit for Arduino

1 x Joystick

1 x Relay

1 x Big sound

1 x Small sound

1 x Tracking

1 x Avoidance

1 x Flame

1 x Linear hall

1 x Mental touch

1 x Digital temperature

1 x Active buzzer

1 x Passive buzzer

1 x RGB LED

1 x SMD RGB

1 x Two-color

1 x Mini two-color

1 x Magnetic spring

1 x Mini reed switch

1 x Heartbeat

1 x 7 color flash

1 x 7 color flash

1 x Button

1 x Shock

1 x Rotary encoders

1 x Light cup

1 x Hydrargyrum-switch

1 x Tilt-switch

1 x Photo-resistor

1 x Temp and humidity

1 x Analog hall

1 x Hall magnetic

1 x 18B20 temp

1 x Analog temp

1 x IR mission

1 x IR receiver

1 x Tap module

1 x Light blocking

43 of 97

การรับค่าแอนะล็อก (Analog input)

  • แอนะล็อกคือ การรับสัญญญาณที่มีระดับของแรงดันเข้ามาแทนที่จะเป็นสัญญาณดิจิตอลที่มีแค่ค่า 0-5 โวลต์ ระดับแรงดันที่เข้ามาจะถูกเปลี่ยนเป็นสัญญาณขนาด 10 bit

 

44 of 97

สัญญาณอะแนล็อกและค่าดิจิทัล

ค่าดิจิตอล

อะแนล๊อก

 

512

0

5V

2.5V

 

45 of 97

46 of 97

47 of 97

48 of 97

analogRead(ขาที่ต่อ)

  • คือคำสั่งในการอ่านค่าจากพินอะแนล็อก
  • Uno มี 6 ช่อง (ช่อง 8 ช่องบน Mini และ Nano 16 ช่องบน Mega)
  • ช่วงการป้อนข้อมูลและความละเอียดสามารถเปลี่ยนแปลงได้โดยใช้ analogReference() ใช้เวลาในการอ่านข้อมูลแอนะล็อกประมาณ 100 microseconds (0.0001 วินาที) ดังนั้นอัตราการอ่านข้อมูลสูงสุดคือประมาณ 10,000 ครั้งต่อวินาที

49 of 97

ขา analog ที่รับได้จะมีทั้งหมด 6 ขาคือ A0-A5

int sensorValue;

float x;

void setup()

{

Serial.begin(9600);

}

void loop()

{

sensorValue = analogRead(A0);

// กำหนดอ่านค่าแรงดันทางขา A0

x = sensorvalue;

Serial.print(x); // ส่งค่าที่แปลงได้เข้าสู่คอมพิวเตอร์

Delay(1000);

}

50 of 97

  • โปรแกรมรดน้ำต้นไม้อัตโนมัติ

  • อุณหภูมิ น้อยกว่า 20
    • ปิดปั๊มทั้งหมด
  • อุณหภูมิ 20-25
    • เปิดปั๊ม 1 ตัว (LED2)
  • อุณหภูมิ มากว่า 25-100
    • เปิดปั๊ม 2 ตัว
    • (LED2 + LED0)

51 of 97

LM35 temperature analog sensor

  • ข้อมูล Module LM35 เซนเซอร์วัดอุณหภูมิ
  • Calibrated Directly in Celsius (Centigrade)
  • Linear + 10-mV/°C Scale Factor
  • 0.5°C Ensured Accuracy (at 25°C)
  • Rated for Full −55°C to 150°C Range
  • Suitable for Remote Applications
  • Low-Cost Due to Wafer-Level Trimming
  • Operates from 4 V to 30 V
  • Less than 60-μA Current Drain
  • Low Self-Heating, 0.08°C in Still Air
  • Non-Linearity Only ±¼°C Typical
  • Low-Impedance Output, 0.1 Ω for 1-mA Load

float tempC;

int reading;

int tempPin = A0;

void setup()

{

analogReference(INTERNAL);

Serial.begin(9600);

}

void loop()

{

reading = analogRead(tempPin);

tempC = reading / 9.31;

Serial.println(tempC);

delay(1000);

}

52 of 97

การใช้คำสั่ง map

  • คำสั่ง map เป็นคำสั่งในการเปรียบเทียบอัตราส่วนแบบเป็นเชิงเส้น เพื่อเปลี่ยนจากค่าหนึ่งไปสู่ค่าหนึ่ง map(value, fromLow, fromHigh, toLow, toHigh)
  • ยกตัวอย่างถ้ามีการเขียนโปรแกรมดังต่อไปนี้

Newvalue =map(sensorValue,0,10,100,200);

โปรแกรมจะเป็นการเปลี่ยนค่าอัตราส่วนจากค่าเดิมที่อยู่ระหว่าง 0-10 เป็นค่าใหม่ที่อยู่ระหว่าง 100-200 โดยมีอัตราส่วนที่คงที่ต่อกัน ถ้าคำสั่งรับค่า sensorValue เป็น 5 คำสั่ง map จะทำงานและส่งค่าอัตราส่วนที่เปลี่ยนใหม่คือ 500 ไปสู่ตัวแปร Newvalue

53 of 97

Analog input

54 of 97

Analog input

int sensorValue;

void setup()

{

Serial.begin(9600);

}

void loop()

{

sensorValue = analogRead(A0); // กำหนดอ่านค่าแรงดันทางขา A0

Serial.print(sensorValue); // ส่งค่าที่แปลงได้เข้าสู่คอมพิวเตอร์             

Delay(1000);

}

55 of 97

LCD Display

56 of 97

57 of 97

58 of 97

  • https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library

59 of 97

60 of 97

61 of 97

Pulse Width Modulation (PWM)

  • คือการปรับความกว้างของสัญญาณที่ส่งออกมาในรูปของความกว้างของพลัซ์ความถี่ PWM ใช้คำสั่ง analogWrite() ค่าที่ใส่อยู่ในช่วง 0-255 เช่น analogWrite (255) จะให้แรงดันออกมาที่ 100% ของ 5 V และ analogWrite (127) จะให้แรงดันออกมาที่ 50% คือ 2.5 V

62 of 97

ตัวอย่าง ปรับความสว่างของหลอดไฟที่ต่อกับขา 9

int ledPin = 9; // LED connected to digital pin 9

int analogPin = 3; // potentiometer connected to analog pin 3

int val = 0; // variable to store the read value

void setup()

{

pinMode(ledPin, OUTPUT); // sets the pin as output

}

void loop()

{

analogWrite(ledPin, 127);

}

63 of 97

  • Distance Sensor�Distance = ………. cm

64 of 97

เซ็นเซอร์อัลตาร์โซนิคส์

Ultrasonic Sensor

65 of 97

เซ็นเซอร์อัลตาร์โซนิคส์ HC-SR04

  • สามารถวัดระยะทางได้ในระยะ 2 ซม- 400 ซม ในชุดโมดูลประกอบด้วยตัวส่ง ตัวรับ และชุดควบคุม แนะนำให้ต่อ GND ก่อนที่จะต่อ VCC เข้าโมดูล เพราะว่าอาจจะมีผลต่อการคำนวนในช่วงเริ่มต้น และพื้นที่ในการคำนวณไม่ควรน้อยกว่า 0.5 ตารางเมตร และพื้นผิวควรจะเรียบที่สุดเท่าที่จะเป็นไปได้ ไม่เช่นนั้นจะมีผลต่อการคำนวณระยะทาง

66 of 97

หลักการทำงานเป็นดังนี้

  • ส่งสัญญาณ high ไปที่ขา trig เป็นเวลา 10 us
  • โมดูลจะส่งสัญญาณ 40 kHz 8 ครั้ง อัตโนมัติ และรอเมื่อไรจะมีสัญญาส่งกลับมา
  • ถ้าสัญญาณส่งกลับมาเป็น high เวลาสำหรับเอาท์พุตคือเวลาที่ใช้ในการเดินทางไปและกลับ
  • ระยะทาง = (เวลาสัญญาณ high * ความเร็วเสียง (340 M/s) /2)
  • สามารถคำนวณระยะทางใน หน่วย ซม และ นิ้ว ได้ดังสมการ
  • uS/58 = centimeters
  • uS/148 =inch

67 of 97

เซ็นเซอร์

ขา Arduino

Trig

D0 / 16

Echo

D3 / 0

Vcc

5V

Gnd

Gnd

#define echoPin 2 // กำหนดขา Echo

#define trigPin 0 // กำหนดขาTrigger

#define LEDPin 13 // กำหนดขา LED บนบอร์ด

int maximumRange = 200; // กำหนดย่านวัดไกลที่สุด

int minimumRange = 0; // กำหนดย่านวัดใกล้ที่สุด

long duration, distance; // ระยะเวลาที่ใช้ในการคำนวณระยะทาง

 void setup() {

Serial.begin (9600);

pinMode(trigPin, OUTPUT);

pinMode(echoPin, INPUT);

pinMode(LEDPin, OUTPUT);

void loop() {

digitalWrite(trigPin, LOW); // สั่งงานให้ขา trig เป็น LOW

delayMicroseconds(2);

digitalWrite(trigPin, HIGH); // สั่งงานให้ขา trig เป็น HIGH และรอเป็นเวลา 10us โมดูลจะเริ่มทำงาน

delayMicroseconds(10);

digitalWrite(trigPin, LOW); // สั่งงานให้ขา trig เป็น LOW

duration = pulseIn(echoPin, HIGH); // รอจนกระทั่งขา echo มีสัญญาณ high กลับมา

// คำนวณเวลาในหน่วย ซม

 

68 of 97

เซ็นเซอร์

ขา Arduino

Trig

8

Echo

9

Vcc

5V

Gnd

Gnd

void loop() {

digitalWrite(trigPin, LOW); // สั่งงานให้ขา trig เป็น LOW

delayMicroseconds(2);

digitalWrite(trigPin, HIGH); // สั่งงานให้ขา trig เป็น HIGH และรอเป็นเวลา 10us โมดูลจะเริ่มทำงาน

delayMicroseconds(10);

digitalWrite(trigPin, LOW); // สั่งงานให้ขา trig เป็น LOW

duration = pulseIn(echoPin, HIGH); // รอจนกระทั่งขา echo มีสัญญาณ high กลับมา

// คำนวณเวลาในหน่วย ซม

distance = duration/58;

// ถ้าระยะทางเกินกว่าค่าสูงสุด หรือต่ำสุดที่กำหนดไว้ให้ ส่งค่า -1 และไฟ 13 ติด

if (distance >= maximumRange || distance <= minimumRange){

Serial.println("-1"); digitalWrite(LEDPin, HIGH);

}

else { // ส่งค่าระยะทางออกทาง UART และไฟ 13 ดับ

Serial.println(distance); digitalWrite(LEDPin, LOW);

} //หน่วงเวลา 50ms ก่อนการอ่านครั้งต่อไป.

delay(50);

}

69 of 97

LCD Display

70 of 97

หลักการทำงาน

  • LCD ย่อมาจากคำว่า Liquid Crystal Display ซึ่งภายในมีผลึกคริสตอลเหลว เมื่อไอซีไดร์ฟปล่อยกระแสไฟฟ้าเข้าไปกระตุ้นที่ผลึก ก็จะทาให้ผลึกโปร่งแสงแสดงเป็นตัวอักษร พื้นฐานการติดต่อกับไอซีไดร์ฟ LCD เป็นอุปกรณ์ที่สามารถแสดงผลได้อย่างสวยงามไม่ว่าจะเป็นตัวอักษรหรือรูปวาดเพราะไอซีไดร์ฟที่ใช้ขับการแสดงผลสามารถประมวลผลและแสดงผลได้ตามเมตริกซ์ที่บรรจุอยู่ในตัว LCD

71 of 97

ขาที่

สัญลักษณ์

ความหมาย

1

VSS

GND

2

VDD

ไฟเลี้ยง 5V

3

VE

ใช้ในการปรับความเข้มของตัวอักษร จากรูปเช่นตัว h สามารถปรับความเข้ม ให้เข้มมากหรือจางจากกการปรับแรงดันที่เข้าทางขา VE ถ้าไม่ต้องการปรับความเข้มของตัวหนังสือสามารถต่อตัวต้านทานคงที่ระหว่างขา 3 กับขา 1 ได้ประมาณ 1kΩ

4

RS

โดยปกติการส่งข้อมูลให้ LCD จะมีข้อมูลสองประเภทในการส่งคือข้อมูลคำสั่ง (command) และตัวอักษร (data) โดยที่ช่องที่ส่งเข้ามาจะส่งมาที่ช่องเดียวกันคือ Data0-Data7 ขา RS จะเป็นขาที่กำหนดว่าข้อมูลที่เข้ามาจะเป็น command หรือ data ถ้า RS = 0 ข้อมูลที่เข้ามาเป็น command RS=1 ข้อมูลที่เข้ามาเป็น data

5

Read/write

นอกจากที่ LCD เป็นอุปกรณ์ในการแสดงผลแล้วยังสามารถที่จะอ่านข้อมูลจากตัวเองด้วยเช่นกัน คือ ถ้าให้ ขา 5 เป็น GND (write) จะสามารถใช้ไมโครคอนโทรลเลอร์ในการเขียนข้อมูลมาสูง LCD แต่ถ้าให้ขา 5 เป็น VDD LCD จะอยู่ในโหมด Read ไมโครคอนโทรลเลอร์จะสามารถอ่านข้อมูลจาก LCD ได้

6

Enable

ยอมให้ LCD ทำงานหรือไม่ ถ้า VDD จะยอมให้ LCD ทำงานได้ปกติ

7-14

D0-D7

ข้อมูล และ command ขนาด 8 บิต

15

+ve

Black Light เป็นไฟที่แสดงฉากหลังของ LCD ปัจจุบันมีหลายสีไม่ว่าจะเป็น เหลือง แดง เขียว ฟ้า ต้องต่อตัวต้านทานด้วยเสมอ ประมาณ 330 Ω

16

GND

GND

72 of 97

LCD

Arduino

GND

GND

Vcc

Vcc

RS

12

R/W

GND

Enable

11

D4

5

D5

4

D6

3

D7

2

R/W

GND

ทำการต่อวงจรดังต่อไปนี้ เพื่อเชิ่อมต่อระหว่าง LCD กับ arduino

นอกเหนือจากนั้นให้ทำการต่อความต้านทาน 200 โอห์ม ที่ขา 3 เพื่อปรับความสว่าง หน้าจอ LCD

73 of 97

#include <LiquidCrystal.h> //ทำการเพิ่มไลบารี่ LCD เข้ามาในโปรแกรม

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //กำหนดขาที่ใช้กับ Arduino ดังให้เรียงกันดังนี้RS,Enable,D4,D5,D6,D7

void setup() {�   // คำสั่ง begin กำหนดการใช้งาน LCD 16 ตัว 2 บรรทัด

lcd.begin(16, 2);� // สั่งงานให้ตัวหนังสือ hello, world ออกที่ LCD

  lcd.print("hello, world!");

}�void loop() {

lcd.setCursor(0, 1); // เลื่อนตำแหน่ง cursor ไปที่แถว 1 ตำแหน่ง 0

lcd.print("Thailand"); // ตัวอักษรคำว่า Thailand จะขึ้นที่ แถว 1 ตำแหน่ง 0

}�}

74 of 97

Data = 578�Voltage = 3.1 V

https://maxpromer.github.io/LCD-Character-Creator/

--------------------------

Data = ….

Data = 1024

Data = ….

Data = 1578

75 of 97

  • Blynk
  • https://examples.blynk.cc

https://blynk.io/

76 of 97

Servo Motor

ส้ม สัญญาณ

แดง +5

น้ำตาล GND

77 of 97

หลักการทำงาน

  • สามารถรองรับการเชื่อมต่อ RC Servo Motor ได้ถึง 12 ตัวกับบอร์ด Arduino UNO และรองรับสูงสุดถึง 48 ตัวหากใช้บอร์ด Arduino Mega
  • ฟังก์ชั่นภายใน Servo Library
    • attach()
    • write()
    • writeMicroseconds()
    • read()
    • attached()
    • detach()

78 of 97

การใช้ MILLIS การกำหนดระยะเวลา

  • ปัญหาของไมโครคอนโทรลเลอร์คือการหน่วงเวลาถ้าเราใช้การหน่วงเวลาด้วยฟังก์ชั่น Delay() ปัญหาหลักๆคือในขณะที่โปรแกรมวิ่งเข้าไปสู่การ Delay จะไม่สามารถทำงานอย่างอื่นได้เลย
  • ยกตัวอย่างถ้าต้องการรับปุ่มกด ขณะที่วนอยู่ในฟังก์ชั่น Delay ปุ่มจะไม่สามารถรับค่าได้
  • MILLIS (ย่อมาจากมิลลิวินาที) เปรียบเสมือนนาฬิกาที่วิ่งไปเรื่อยๆภายในไมโครคอนโทรลเลอร์ ฟังก์ชั่น MILLIS ส่งกลับจำนวนของมิลลิวินาทีตั้งแต่เริ่มจนถึงเวลาปัจจุบัน MILLIS จะวนกลับไปที่ หลังจากรันอย่างต่อเนื่องเป็นระยะเวลาประมาณ 50 วัน การเก็บเวลาเริ่มต้นเทียบกับเหตุการณ์ปัจจุบันทำให้สามารถคำนวณระยะเวลาของเหตุการณ์

79 of 97

void loop()

{// here is where you'd put code that needs to be running all the time...

บรรทัดถัดไปตรวจสอบเพื่อดูว่าช่วงเวลาที่ต้องการได้ผ่าน:

if (millis() - previousMillis > interval)

{// save the last time you blinked the LED

//หากช่วงเวลาได้ผ่านค่า MILLIS ปัจจุบันจะถูกบันทึกไว้ในตัวแปร

previousMillis:

previousMillis = millis();

 // if the LED is off turn it on and vice versa: if (ledState == LOW)

ledState = HIGH; else

ledState = LOW; // set the LED with the ledState of the variable:

digitalWrite(ledPin, ledState);

}}

80 of 97

#include <Servo.h>

Servo myservo; // สร้างตัแปรในการควบคุม servo motor

int pos = 0; // กำหนดค่าเริ่ม

void setup()

{

myservo.attach(9); // ต่อ servo

}

void loop()

{

myservo.write(90); // หมุนมอเตอร์มาที่ตำแหน่ง 90 องศา

delay(1000); // หน่วงเวลา 1 วินาที

myservo.write(0); // หมุนมอเตอร์มาที่ตำแหน่ง 0 องศา

delay(1000); // หน่วงเวลา 1 วินาที

}

}

81 of 97

การสร้างกระดิ่งเป็นจังหวะ

82 of 97

ตัวอย่าง ระบบเปิด-ปิดประตูอัตโนมัติ

  • ประตูอัตโนมัติจะเปิดเมื่อมีคนเดินเข้ามาใกล้กว่า 30 cm
  • และจะเปิดตัวเอง และปิดลงใน เวลา 3 วินาที
  • ประตูจะอนุญาติให้ คนเดินเข้าได้แค่ 5 คนเท่านั้น
  • เมื่อเดินเข้าครบ 5 คนแล้ว จะมีเสียง Buzzer ดังต่อเนื่องกัน 3 ครั้ง

  • ระบบจะเริ่มใหม่ได้เมื่อกดปุ่ม reset ระบบ

83 of 97

เซ็นเซอร์ตัวจับอุณหภูมิ�และความชื้น

84 of 97

วัดอุณหภูมิ และความชื้น (DHT11)

85 of 97

คุณสมบัติของเซ็นเซอร์

-DHT series digital temperature and humidity sensor�- Full scale calibration, single-wire digital output;�- Humidity measuring range: 20% ~ 90% RH (0- 50°C temperature compensation);�- Temperature measuring range: 0 ~ +50 °C;�- Humidity measurement accuracy: ± 5.0% RH�- Temperature measurement accuracy: ± 2.0 °C�- Response time: <5s;�- Low power consumption

86 of 97

void loop() {

delay(2000);

float h = dht.readHumidity();

// Read temperature as Celsius

float t = dht.readTemperature();

// Read temperature as Fahrenheit

float f = dht.readTemperature(true);

}

Serial.print("Humidity: ");

Serial.print(h);

Serial.print("Temperature: ");

Serial.print(t);

}

87 of 97

88 of 97

attachInterrupt

* ขา GPIO ทุกขาสามารถใช้คำสั่ง Interrupt ได้ ยกเว้นขา GPIO16

attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);

Delay(5000);

89 of 97

interrupt:

the number of the interrupt (int)

ISR:

คือฟังก์ชั่นย่อยที่โปรแกรมจะเรียกใช้งานเมื่อเกิดการขัดจังหวะ โดยจะไม่มีการคืนค่าใดๆกลับไปสู่โปรหลักใดๆ หรือสามารถเรียกได้ว่า interrupt service routine.

mode:

ความหมายของการเกิดอินเตอร์รัพdefines when the interrupt should be triggered. Four constants are predefined as valid values:

LOW เกิดการขัดจังหวะเมื่อสัญญาณเป็นศูนย์

CHANGE เกิดการขัดจังหวะเมื่อที่มีการเปลี่ยนแปลงสัญญาณ

RISING เกิดการขัดจังหวะเมื่อสัญญาณเกิดขอบขาขึ้น

FALLING เกิดการขัดจังหวะเมื่อสัญญาณเกิดขอบขาลง

HIGH เกิดการขัดจังหวะเมื่อสัญญาณเป็นไฮ

90 of 97

#define ledPin 2

#define interruptPin 5

volatile byte state = LOW;

int button;

void setup()

{

  pinMode(ledPin, OUTPUT);

  //pinMode(3, OUTPUT);

  pinMode(interruptPin, INPUT_PULLUP);

  attachInterrupt(digitalPinToInterrupt(interruptPin), blink, RISING);

}

void loop()

{

Serial.println("Main Loop");

delay(1000);

}

void blink() {

//button = digitalRead(5);

//if (button==HIGH)

//{

digitalWrite(2,0);

delay(1000);

//}

//else

//{

digitalWrite(2,1);

delay(1000);

}

��

91 of 97

92 of 97

การควบคุมมอเตอร์กระแสตรง

93 of 97

หลักการควบคุมมอเตอร์กระแสตรง

การทำงานของ H-Bridge เพื่อควบคุมความเร็วมอเตอร์

การปรับความกว้างของ พลัสซ์ (duty cycle)

มอเตอร์จะหยุดหมุนเมื่อ duty cycle = 0%

มอเตอร์หมุนช้าเมื่อมีแรงดันจ่ายมาที่ duty cycle = 25%

ความเร็วสูงสุดที่ duty cycle = 100%

94 of 97

ชุดขับเคลื่อนมอเตอร์ไอซี LM298

95 of 97

96 of 97

ตัวอย่าง การปรับทิศทางการหมุนมอเตอร์

int IN1=8;

int IN2=9;

int ENA=3;

void setup()

{

pinMode(IN1,OUTPUT);

pinMode(IN2,OUTPUT);

}

void loop()

{

analogWrite(ENA, 200);// motor speed

digitalWrite(IN1,LOW);// rotate forward

digitalWrite(IN2,HIGH);

delay(2000);

digitalWrite(IN1,HIGH);// rotate reverse

digitalWrite(IN2,LOW);

delay(2000);

}

97 of 97