Page 1

 IoTIoT Education Kit - Lite 1

IoT Education Kit Lite version

  IoT (Internet of Things)NodeMCU

ธีรวุฒิ จิตรพรมมา ชัยวัฒน ลิมพรจิ ้ ตรวิไล

www.inex.co.th


2   IoTIoT Education Kit - Lite

 บทนํา ...............................................................................................................................................3 บทที่ 1 แนะนําอุปกรณ IoT Education Kit - Lite ...................................................................................5 บทที่ 2 การพัฒนาโปรแกรมภาษา C/C++ สําหรับ NodeMCU ดวย Arduino IDE ........................13 บทที่ 3 ตัวอยางการทดลอง...............................................................................................................21 บทที่ 4 เชือมต ่ อ NodeMCU กับคลาวดเซิรฟเวอร...........................................................................49


 IoTIoT Education Kit - Lite 3

 Internet of Things (IoT) หรือ อินเทอรเน็ตสําหรับสิงของ ่ เปนเทคโนโลยีที่บงบอกชัดเจน วา เปนการนําอินเทอรเน็ตมาเปนสวนหนึงของสิ ่ งของต ่ างๆ ทําใหสิงของถู ่ กทําใหเกิดความเชือมโยง ่ เชื่อมตอ แลกเปลี่ยนขอมูล สั่งงาน ควบคุม หรือตรวจสอบได โดยคนหรือระบบที่ดูแลการติดตอนัน้ จะอยูที่ใดก็ได เพราะการสื่อสารกันจะกระทําผานเครือขายอินเทอรเน็ต ในอดีต การติดตอสือสารและควบคุ ่ มอุปกรณผานเครือขายพืนฐานหรื ้ อ LAN เปนเรืองไม ่ งาย และถายิ่งเปนการสื่อสารแบบไรสายผาน WiFi ยิ่งเปนเรื่องที่เมกเกอรหรือนักเลน นักทดลอง ตอง ใชความพยายามสูง บวกกับอุปสรรคใหญคือ ราคาของอุปกรณ ทําใหการพัฒนาอุปกรณ IoT กลาย เปนเรื่องถูกจํากัดไวในวงแคบๆ ของนักพัฒนาดานไฮเอ็นดเทานั้น จนกระทังมี ่ โมดูล WiFi ราคาถูกมากทีชื่ อว ่ า ESP8266 เกิดขึน้ ทําใหการพัฒนาอุปกรณ IoT เปลียนโฉมหน ่ าไปตลอดกาล กอใหเกิดการตืนตั ่ วในการพัฒนาอุปกรณเพือเชื ่ อมต ่ อระบบเครือขาย WiFi ราคาประหยัดอยางกวางขวางไปทังโลก ้ รวมไปถึงความพยายามในการสรางเครืองมื ่ อพัฒนาโปรแกรม ใหแก ESP8266 ใหงายและสะดวกขึน้ นันจึ ่ งทําใหเกิด Arduino IDE for ESP8266 ขึนด ้ วยความงาย ของโปรแกรมภาษา C/C++ .ในสไตล Arduino ทําใหใครๆ ก็สามารถเขาสูการพั  ฒนาอุปรณเพือเชื ่ อมต ่ อ เครือขาย WiFi ได และตอยอดไปสูการติ  ดตอหรือควบคุมระบบผานเครือขายอินเทอรเน็ตไดไมยาก ในชุด IoT Education Kit - Lite มีการจัดทําเนือหาของคู ้ มื อการใชงาน เพือให ่ เขาใจถึงแนวทาง การพัฒนาอุปกรณ IoT อยางงายดวย NodeMCU-12E หรือ V2 หรือ V1 Development kit กับซอฟตแวร Arduino IDE รุนพิ  เศษทีมี่ ไลบรารีรองรับการทํางานกับ NodeMCU และการเชือมต ่ อกับเครือขาย WiFi โดยจะเริมต ่ นจากการแนะนําใหรูจั กกับเอุปกรณทีใช ่ ในการเรียนรู เครืองมื ่ อทางซอฟตแวรทีใช ่ ในการ พัฒนาโปรแกรม การทดลองใชงาน NodeMCU เบืองต ้ น ตัวอยางการทดลองเพือเชื ่ อมต ่ อกับเครือขาย WiFi โปรโตคอลที่ใชในการสื่อสารเบื้องตน รูจักกับคลาวดเซิฟเวอร การติดตอเพื่อรับสงขอมูล จนนําไปสูการสร  างแอปพลิเคชั่นของอุปกรณ IoT อยางงายขึ้นมาได คณะผูจัดทําดําเนินการในแบบ “เลาเทาที่รู” และพยายามทําใหผูอานหรือผูที่นําไปใชในการ เริ่มตนเรียนรูเขาใจใหไดมากที่สุด วันนี้เราตองเริ่มตนนับหนึงกั ่ บการเรียนรูและพัฒนาอุปกรณ IoT แลว แมวาในปลายทางจะสามารถเปนผูผลิ  ตอุปกรณเพือจํ ่ าหนายไดหรือไมก็ตาม หากแตการทีรู่ และ  เขาใจจะชวยใหอยางนอยเราใชงานหรือดูแลอุปกรณเหลานี้ไดอยางมีประสิทธิภาพตามสมควร


4   IoTIoT Education Kit - Lite


IoTIoT Education Kit - Lite  5

 

IoT Education kit - Lite ประกอบดวยอุปกรณตางๆ ดังนี้ 1. NodeMCU-12E มิ นิ บอรดไมโครคอนโทรลเลอร 32 บิตที่มี WiFi ในตัว บางครั้งเรียก NodeMCU V2 หรือ Development Kit V1.0 ขึ้นกับผูผลิ  ตแตละราย โดยมีพื้นฐานมาจากโมดูล WiFi คอนโทรลเลอร ESP8266-12E 2. AX-NodeMCU บอรดอินพุตเอาตพุตสําหรับ NodeMCU-12E 3. ZX-LED บอรดขับ LED 8 มม. 4. ZX-DHT11 โมดูลตัวตรวจจับความชืนสั ้ มพัทธและอุณหภูมิ 5. สาย microB-USB สําหรับอัปโหลดโปรแกรมและเชือมต ่ อกับคอมพิวเตอรผานพอรต USB 6. สายเชือมต ่ อและทดลองวงจรรุน IDC1MF และ IDC1FF แบบละ 10 เสน (คละสี) 7. ไขควงปลายแฉกขนาดเล็ก 8. เอกสารประกอบการใชงาน (เลมนี้)

1.1 NodeMCU-12E โมดูลไมโครคอนโทรลเลอร 32 บิตพรอม WiFi เพื่อการพัฒนาอุปกรณ IoT โมดูล NodeMCU-12E หรือ V2 หรือ Development Kit V1.0 (ชือที ่ แตกต ่ างนีมาจากการเรี ้ ยกของ ผูผลิ  ต) นีเป ้ นการนําโมดูล ESP8266-12E มาตอรวมกับชิปแปลงสัญญาณ USB เปน UART เบอร CP2102 ของ Slilcon Lab (โปรดระวังของเลียนแบบจะใชชิปเบอร CH340) มีสวิตชเพือเข ่ าสูโหมดโปรแกรม  เฟรมแวรมาพรอม บรรจุรวมกันอยูบนแผงวงจรขนาดเล็  กทีออกแบบมาให ่ ติดตังลงบนเบรดบอร ้ ดหรือ แผงตอวงจรได โดยยังมีรูของเบรดบอรดเหลือใหตอสายเพือเชื ่ อมต ่ อกับอุปกรณภายนอกไดสะดวก ชวย ใหการพัฒนาตนแบบและการเรียนรูเกี  ยวกั ่ บ IoT ทําไดงายขึน้ คุณสมบัติทางเทคนิคที่สําคัญ มีดังนี้


6 IoTIoT Education Kit - Lite

รูปที่ 1-1 หนาตาของ NodeMCU-12E และการจัดขา ใชโมดูล ESP8266-12E ที่ภายในมีไมโครคอนโทรลเลอร 32 บิต หนวยความจําแบบ แฟลช ความจุ 4 เมกะไบตและวงจร WiFi ในตัว 

มีชิป CP2102 สําหรับแปลงสัญญาณพอรต USB เปน UART เพือเชื ่ อมต ่ อคอมพิวเตอรสํา หรับโปรแกรมเฟรมแวร (ของเลียนแบบจะใชชิปเบอร CH340) 

ใชไฟเลี้ยงภายนอก +5V มีวงจรควบคุมแรงดันไฟเลี้ยงสําหรับอุปกรณ 3.3V กระแส ไฟฟาสูงสุด 800mA 

มีขาพอรต SPI สําหรับติดตอกับ SD การด

มีสวิตช RESET และ FLASH สําหรับโปรแกรมเฟรมแวรใหม

มีอินพุตเอาตพุตดิจิตอล (ลอจิก 3.3V) รวม 16 ขา

มีอินพุตอะนาลอก 1 ชอง รับแรงดันไฟตรง 0 ถึง +3.3Vdc เขาสูวงจรแปลงสั  ญญาณ อะนาลอก เปนดิจิตอล ความละเอียด 10 บิต (ที่อินพุตมีวงจรแบงแรงดัน เนื่องจากอินพุตอะนาลอก ของ ESP8266-12E รับแรงดันไดเพียง 0 ถึง 1V จึงตองมีการตอตัวตานทานเพื่อชวยลดแรงดันลงจาก +3.3V ใหเหลือไมเกิน 1.0V) 

เสียบลงบนเบรดบอรดเพือทํ ่ าการทดลองไดทันที หรือนําไปติดตังบนแผงวงจรประยุ ้ กต ทีออกแบบขึ ่ นเองได ้ สะดวก 


IoTIoT Education Kit - Lite  7

1.2 AX-NodeMCU บอรดอินพุตเอาตพุตสําหรับทดลองและใชงาน โมดูล NodeMCU-12E เพือการพั ่ ฒนาอุปกรณ IoT ในการใชงานโมดูล NodeMCU-12E หรือ V2 หรือ Development Kit V1.0 งายทีสุ่ ดก็เพียงเสียบ โมดูลลงบนเบรดบอรด แลวตอสายเขากับพอรต USB ของคอมพิวเตอร ก็จะทําการพัฒนาและอัปโหลด โปรแกรมไดแลว ดานไฟเลียงก็ ้ ใชจากพอรต USB หากตองการใชงานแบบโดยลําพัง จะตองจัดหาแหลง จายไฟภายนอกเพิมเติ ่ ม ซึงที ่ หาได ่ งายและสะดวกคือ เพาเวอรแบงก (power bank) เนืองจากให ่ แรงดัน +5V แลวใชสาย Micro-USB เชือมต ่ อ อยางไรก็ตาม หากตองการใหโมดูล NodeMCU-12E ทํางานกับแผงวงจรตรวจจับและอุปกรณ อินพุตเอาตพุตของผูผลิ  ตที่มีอยูอยางหลากหลาย การจัดการขาพอรตใหมีจุดตอที่สะดวกตอการเชือม ่ ตอก็นาจะเปนทางเลือกที่ดี ในที่นี้แนะนําใหใช AX-NodeMCU บอรดทดลองและเรียนรูสําหรับ NodeMCU-12E

รูปที่ 1-2 บอรด AX-NodeMCU สําหรับติดตังและใช ้ งานโมดูล NodeMCU-12E


8 IoTIoT Education Kit - Lite

1.2.1 คุณสมบัติทางเทคนิคทีสํ่ าคัญ มีซ็อกเก็ตสําหรับติดตังโมดู ้ ล NodeMCU-12E หรือ V2 หรือ V1.0 Development kit  มีจุดตอพอรตอินพุตเอาตพุตทังหมดของโมดู ้ ล NodeMCU-12E ในรูปแบบของคอนเน็กเตอร JST 2.0 มม. ตัวผู และ IDC 2.54 มม. ทังตั ้ วผูและตั  วเมีย ทําใหใชงานกับบอรดอินพุตเอาตพุต และตัว ตรวจจับไดทุกรุน ทุกผูผลิ  ต รวมถึงการใชงานกับแผงตอวงจรหรือเบรดบอรด  พิมพชือ, ่ หมายเลข และฟงกชันการทํ ่ างานของขาพอรตตางไวอยางชัดเจน  มีตัวตานทานปรับคาไดติดตังบนบอร ้ ดสําหรับทดสอบการทํางานของอินพุตอะนาลอก ซึง่ ใชงานรวมกับจุดตออินพุตอะนาลอก A0 โดยมีจั๊มเปอรเลือกตอใชงาน  มีจุดตอไฟเลี้ยงจากภายนอกผานแจกอะแดปเตอร พรอมสวิตชเปดปด  มี LED แสดงสถานะไฟเลี้ยง ้ และปองกันแรงดันยอนกลับหากตอแหลงจายไฟภายนอก  มีไดโอดปองกันการจายไฟกลับขัว พรอมกับตอพอรต USB หากมีการตอพอรต USB โมดูล NodeMCU-12E จะรับไฟเลี้ยงจากพอรต USB 

1.2.2 วงจรและการทํางาน ในรูปที่ 2-3 แสดงวงจรของบอรด AX-NodeMCU เริมจากส ่ วนของไฟเลียง ้ มาไดจาก 2 ทางคือ ทาง J1 แจกอะแดปเตอร และจากพอรต USB ทีมี่ บนตัวโมดูล NodeMCU-12E ในกรณีทีจ่ ายไฟผานทาง J1 แรงดัน +5V (สูงสุดไมเกิน +5.6V) จะไดรับการตัดตอเพือเข ่ าสูวงจรด  วยสวิตช SW1 มีไดโอด D1 ตอไวเพือป ่ องกันการจายไฟกลับขัว้ และใชปองกันไมใหแรงดัน +5V จากพอรต USB ยอนกลับเขาไป ทีแหล ่ งจายไฟภายนอกดวย C1 และ C2 ชวยลดสัญญาณรบกวน สวนการแสดงสถานะไฟเลียงใช ้ LED1 ซ็อกเก็ตสําหรับรองรับตัวโมดูล NodeMCU-12E คือ K21 ขาพอรตทังหมดของโมดู ้ ล NodeMCU จะถูกตอเขากับ K19 และ K20 รวมถึง K2 ถึง K18 ซึงเป ่ นคอนเน็กเตอร JST 2.0 มม. 3 ขา โดยจัดสรร รวมกับขาไฟเลียง ้ +3.3V และกราวด (GND) และมีตัวตานทาน R2 ถึง R18 ตออนุกรมเพือจํ ่ ากัดกระแส ไฟฟาทีไหลผ ่ านขาพอรต ลดโอกาสทีขาพอร ่ ตจะเสียหายจากการตอไฟเกินหรือลัดวงจร สวนอินพุตอะนาลอก A0 นันจะต ้ อเขากับ JP1 เพือเลื ่ อกใชงานในแบบตอกับแรงดันอะนาลอก ภายนอก หรือตอกับแรงดันทีได ่ จากตัวตานทานปรับคาได VR1 ทีมี่ บนแผงวงจร

1.2.3 การนําไปใชงาน หากการใชงานไมมีอุปกรณทีต่ องการกระแสไฟฟาสูง การใชไฟเลียงจากพอร ้ ต USB นับเปนทาง เลือกทีสะดวก ่ โดยติดตังโมดู ้ ล NodeMCU-12E แลวตอสายจากพอรต USB ของคอมพิวเตอร หากติด ตังโปรแกรมและไดรเวอร ้ ไวแลว ก็จะใชงานทัง้ NodeMCU และบอรด AX-NodeMCU ไดทันที


J1 DC INPUT +5V...+5.6V

C2IoTIoT Education Kit - Lite  9

D1 SW1 1N5819

0.1/63V +Vin R1 ~5V 1k LED1 ON

C1 470/16V

A0 K1 A0 (0-3.3V)

K2 D12/SD3

VR1 +3.3V 10k

VR R2

+3.3V

K3 D11/SD2

+3.3V

K4 SPI_INT/SD1

+3.3V +3.3V

K6 MISO/SD0

+3.3V

K17 D1

R16

+3.3V

K16 D2

+3.3V

K15 D3

+3.3V

K14 D4

+3.3V

K13 D5

+3.3V

K12 D6

+3.3V

K11 D7/RxD2

+3.3V

K10 D8/TxD2

R9 +3.3V

K9 D9/RxD0

R8 +3.3V

K8 D10/TxD0

3

28

4

27

R15 R14

26 25

R5

7

24

9 10 11

MOD1 NodeMCU V2

R13

22

R12

21

R11

20

R10

19

13

18

15

RST

FLASH

+3.3V

23

12 14

+5V

+3.3V

29

6

+3.3V

R17 30

5

R7

K18 D0

2

R4

+3.3V

+3.3V

1

R3

R6

R18 K20 K19 K21

8

K5 MOSI/CMD

K7 SCLK/CLK

K19 K20 JP1 ADC

+3.3V

R2-R18 47 x 17

17 16

C3 0.1/63V +3.3V

รูปที่ 1-3 วงจรของ AX-NodeMCU บอรดอินพุตเอาตพุตสําหรับทดลองและใชงานโมดูล NodeMCU-12E

รูปที่1-5 แสดงการตอใชงานโมดูล NodeMCU-12E รูปที่ 1-4 แสดงบอรด AX-NodeMCU ทีได ่ ติดตังโมดู ้ ล และบอรด AX-NodeMCU กับคอมพิวเตอรผาน พอรต USB NodeMCU เรียบรอย พรอมใชงาน


10 IoTIoT Education Kit - Lite

LED1 R1 (Default = 510)

S

+

Q1 KRC102 (DTC114)

รูปที่ 1-6 รูปรางและวงจรของ ZX-LED บอรดขับ LED

1.3 ZX-LED บอรดขับ LED เปนบอรดอุปกรณเอาตพุต ใชขับ LED 8 มิลลิเมตร ตองการลอจิก “1” ในการขับ LED ใหสวาง มีวงจรแสดงในรูปที่ 1-6

1.4 ZX-SWITCH01 บอรดสวิตชอินพุต 1 ชอง

D

ZX-SWITCH01

มีวงจรแสดงในรูปที่ 1-7 ประกอบดวยสวิตชพรอมไฟแสดงผล ตองการไฟเลียงในย ้ าน +3 ถึง +5V ใชกระแสไฟฟา 10mA ในการทํางาน เมื่อมีการกดสวิตช ใหเอาตพุตคือ หากมีการกดสวิตช จะสงลอจิก “0” (ระดับแรงดัน 0V) และไฟสีแดงติด

   

LED1

Indicator

+V

R2 10k R1 510

R3 220

DATA

Signal output S1 GND Switch

รูปที่ 1-7 รูปรางและวงจรของบอรดสวิตชอินพุต 1 ชอง (ZX-SWITCH01)


IoTIoT Education Kit - Lite  11

1.5 ZX-DHT11 บอรดวัดความชืนสั ้ มพัทธและอุณหภูมิ ZX-DHT11 เปนแผงวงจรขนาดเล็กทีบรรจุ ่ โมดูลตรวจจับและวัดความชืนสั ้ มพัทธเบอร DHT11 ซึ่งนอกจากจะวัดความชื้นสัมพัทธไดแลว ยังใหคาของอุณหภูมิของพื้นที่ที่ตรวจวัดความชื้นดวย การติดตอเปนแบบหนึงสาย ่ นันคื ่ อใชขาพอรตของไมโครคอนโทรลเลอร เพียง 1 หนึงขาในการทํ ่ างาน ในรูปที่ 1-8 แสดงหนาตาของ ZX-DHT11 และการจัดขา ZX-DHT11 มีคุณสมบัติทางเทคนิคที่ควรทราบเพื่อเปนขอมูลประกอบในการใชงานดังนี้ ้ นวงจรพิมพ  ใชโมดูล DHT11 ติดตังบนแผ  มีตัวตานทานตอพูลอัปทีขา ่ DATA ทําใหเชือมต ่ อกับขาพอรตของไมโครคอนโทรลเลอร ไดโดยไมตองตอตัวตานทานเพิม่  ใชไฟเลี้ยง +3 ถึง +5.5V ตองการกระแสไฟฟา 2.5mA  วัดความชืนสั ้ มพัทธได 20 ถึง 80%RH มีความผิดพลาด 5%RH และมีความละเอียด ในการวัด 1 % ขนาดของขอมูล 8 บิต  วัดอุณหภูมิได 0 ถึง 50 องศาเซลเซียส มีความผิดพลาด 2 องศาเซลเซียส ความละเอียด ในการวัด 1 องศาเซลเซียส ขนาดของขอมูล 8 บิต  อัตราการสุมวัด 1 วินาที  ความเร็วในการตอบสนองตอการเปลี่ยนแปลงในการวัด 6 ถึง 30 วินาที  ขนาด 12 x 28 มิลลิเมตร

รูปที่ 1-8 หนาตาและการจัดขาของ ZX-DHT11 บอรดวัดความชืนสั ้ มพัทธและอุณหภูมิ หมายเหตุ : มีผูผลิ  ตแผงวงจรตรวจจับทีใช ่ โมดูล DHT11 หลายราย อาจมีการจัดขาทีต่ างไปจากนี้ ดังนัน้ จึงควรตรวจสอบตําแหนงขาใหถูกตองกอนเชือมต ่ อเพือใช ่ งาน


12 IoTIoT Education Kit - Lite

1.6 สาย JST3AA-8 : สายเชือมต ่ อระหวางบอรดแบบหัวตอ JST สาย JST3AA-8 ใชเชือมต ่ อระหวางบอรด AX-NodeMCU กับบอรดอุปกรณตรวจจับและบอรด แผงวงจรอุปกรณตางๆ เปนสายแพ 3 เสน ยาว 8 นิ้ว ปลายสายทั้งสองดานติดตังคอนเน็ ้ กเตอรแบบ JST 3 ขา ตัวเมีย ระยะหางระหวางขา 2 มิลลิเมตร มีการจัดขาดังนี้ ระยะหางระหวางขา 2 มม.

ระยะหางระหวางขา 2 มม.

GND S +5V

เปนสายสัญญาณที่ตอกับแผงวงจร ZX-LED และ ZX-SWITCH01

1.7 สาย IDC1MF สายเชือมต ่ อระหวางบอรดแบบหัวตอ IDC เปนสายสัญญาณสําหรับเชือมต ่ อระหวางจุดตอขาพอรตของ NodeMCU ทีใช ่ หัวตอแบบ IDC ทั้งตัวผูและตัวเมีย ยาว 25 ซม. มีระยะหางของแตละขาคือ 2.54 มิลลิเมตร

1.8 สาย microB-USB เปนสายสัญญาณสําหรับเชือมต ่ อระหวางพอรต USB ของคอมพิวเตอรกับโมดูล NodeMCU12E ยาว 1.5 เมตรโดยประมาณ


 IoTIoT Education Kit - Lite  13

 

  การพัฒนาโปรแกรมเพื่อใชงาน NodeMCU ทําไดดวยโปรแกรมภาษา Lua และ C/C++ สําหรับในที่นี้เลือกใชโปรแกรมภาษา C/C++ โดยใชเครื่องมือพัฒนาที่ไดรับความนิยมสูงนั่นคือ Arduino IDE โดยมีนักพัฒนาอิสระชื่อ Christian Klippel ไดเริ่มตนพัฒนาเครื่องมือทีชื่ ่อวา Esptool โดยใชขอมูลจาก Espressif SDK ที่ พั ฒนาโดย Espressif ผูผลิตโมดูล ESP8266 จากนั้น Ivan Grokhotkov ชาวรัสเซีย จากเซนตปเตอรสเบิรกไดเขามาสานตอและพัฒนาดวยการเพิมคอมไพเลอร ่ สําหรับ NodeMCU ลงใน Arduino IDE กอใหเกิดเปน Arduino IDE รุนพิ  เศษ มีขอมูลและโปรแกรม ใหดาวนโหลดที่ https://github.com/esp8266/arduinoโดยมีขันตอนตามปกติ ้ คือ ติดตัง้ Arduino IDE เวอรชัน 1.6.xx (แนะนําเวอรชัน 1.6.4.xxx) กอน จากนั้นจึงผนวกคอมไพเลอรสําหรับ ESP8266 ซึ่ง ก็คือ อุปกรณหลักของ NodeMCU ซึ่งในขั้นตอนนี้ตองทําการเชือมต ่ อกับเว็บไซตของผูพั ฒนาและ ดาวนโหลดโปรแกรมลงมาผนวกเขากับ Arduino IDE โดยปกติจะใชเวลานานพอสมควร นอกจาก นันในขั ้ นตอนการผนวกคอมไพเลอร ้ และไลบรารีจะตองมีการแกไขไฟลภายในเล็กนอย จึงจะใชงาน Arduino IDE ในการพัฒนาโปรแกรมใหแก NodeMCU หรือโมดูล ESP8266 ทุกรุนได

License and credits  Arduino IDE is developed and maintained by the Arduino team. The IDE

is licensed under GPL. ESP8266 core includes an xtensa gcc toolchain, which is also under GPL.

 Esptool written by Christian Klippel is licensed under GPLv2, currently maintained by Ivan Grokhotkov: https://github.com/igrr/esptool-ck.  Espressif SDK included in this build is under Espressif MIT License.  ESP8266 core files are licensed under LGPL.  SPI Flash File System (SPIFFS) written by Peter Andersson is used in

this project. It is distributed under MIT license

Ivan Grokhotkov ผูพั ฒนา Arduino IDE สําหรับโมดูล ESP8266 (ภาพจาก https://github.com/igrr)


14   IoTIoT Education Kit - Lite

2.1 Arduino IDE 1.6.5R2 for ESP8266/NodeMCU อยางไรก็ตาม เพือให ่ เกิดความสะดวกมากขึ้น วิศวกรของบริษัท อินโนเวตีฟ เอ็กเพอริเมนต จํากัด หรือ INEX ไดทําการสรางไฟลติดตั้งซอฟตแวร Arduino IDE for ESP8266/NodeMCU ขึ้นมา ใหม เปนไฟล Arduino1.6.5r5_Setup151116.exe (เลขเวอรชั่นอาจเปลียนแปลงได ่ ) โดยตัดขันตอนการผนวกไฟล ้ และแกไขไฟลองคประกอบหลังจากการติดตัง้ ทําใหการติดตัง้ โปรแกรมงาย เหมือนกับการติดตั้งโปรแกรมประยุกตทั่วไป นั่นคือ ดับเบิลคลิกไฟลติดตั้ง คลิกปุม เพื่อตอบรับการติดตั้งโปรแกรม รอจนกระทั่งการติดตั้งเสร็จสมบูรณ ก็จะใชงานไดทันที Arduino IDE for ESP8266/NodeMCU ที่ INEX จัดทําขึ้น ดาวนโหลดไดโดยไมมีคาใชจายที่ https://www.dropbox.com/home?preview=IoTeduKit_Tools.rar

2.2 ติดตังโปรแกรมและไดรเวอร ้ (2.2.1) ดาวนโหลดไฟล IoTeduKit_Tools.rar จากนั้นทําการแตกไฟลออกมา จะไดไฟลติด ตั้ ง Arduino1.6.5r5_Setup151116.exe (2.2.2) ดับเบิลคลิ ้ กเพือสั ่ งให ่ ไฟลติดตังทํ ้ างาน จะปรากฏขอความตอนรับการติดตังโปรแกรม ้ คลิกปุม Next และปุมตอบรับในทุดขั้นตอนจนกระทั่งติดตั้งโปรแกรมเสร็จสิ้น


 IoTIoT Education Kit - Lite  15

(2.2.2) จากนั้นติดตั้งไดรเวอรของอุปกรณพอรต USB คลิกปุม Next

(2.2.5) คลิกปุมตอบรับ จนกระทั่งการติดตั้งไดรเวอรเสร็จสิ้น คลิกปุม Finish (2.2.6) จากนั้นจะเขาสูการติดตั้ง Tool chain สําหรับ ESP8266/NodeMCU ใหกับ Arduino IDE 1.6.5 ใหคลิกปุม Install เพือทํ ่ าการติดตั้ง

(2.2.7) รอจนกระทั่งการติดตั้งเสร็จสมบูรณ จะได ArduinoIDE ที่พรอมสําหรับการพัฒนา โปรแกรมใหกับโมดูล ESP8266 และ NodeMCU


16   IoTIoT Education Kit - Lite

2.3 ทดสอบโปรแกรมเบืองต ้ น (2.3.1) เชื่อมตอโมดูล NodeMCU กับพอรต USB โดย (A) หากใชโมดูล NodeMCU-12E กับเบรดบอรด ใหเสียบโมดูล NodeMCU-12E ลง บนเบรดบอรด ดังรูปที่ 3-1 จากนั้นตอสาย microB-USB เขากับโมดูล NodeMCU-12E และพอรต USB ของคอมพิวเตอร รอสักครูเพื  อให ่ การเชือมต ่ อสมบูรณ (B) หากใชโมดูล NodeMCU-12E กับบอรด AX-NodeMCU ใหทําการติดตั้งโมดูล NodeMCU-12E บนซ็อกเก็ตของบอรด AX-NodeMCU ดังรูปที่ 3-2 จากนั้นตอสาย microB-USB เขา กับโมดูล NodeMCU-12E และพอรต USB โดยไมตองจายไฟเลียงเข ้ าทีแจ ่ กอะแดปเตอรบนบอรด AXNodeMCU

รูปที่ 3-1 ทดสอบการทํางานเบื้องตนของ NodeMCU-12E บนแผงตอวงจรหรือเบรด บอรด รูปที่ 3-2 การใชงาน NodeMCU-12E กับบอรด AX-NodeMCU เพือการทดลอง ่ เรียนรู และใชงานจริง


 IoTIoT Education Kit - Lite  17

(2.3.2) ตรวจสอบพอรตเชื่อมตอที่เกิดขึ้นจากไดรเวอรของ NodeMCU ไดที่ Control panel > System > Hardware > Device Manager > Port สังเกตหัวขอ Silicon Labs CP210x USB to UART Bridge (COMxx) ในที่นี้คือ COM3

(2.3.3) เปดซอฟตแวร ArduinoIDE 1.6.5R2 แลวเลือกฮารดแวรโดยไปทีเมน ่ ู Tools > Board > NodeMCU 1.0 (ESP-12E Module)


18   IoTIoT Education Kit - Lite

(2.3.4) เลือกพอรตเชื่อมตอ โดยไปทีเมนู ่ Tools > Port > COM 3

(2.3.5) จะไดขอมูลการเชื่อมตอในภาพรวม ดังนี้


 IoTIoT Education Kit - Lite  19

(2.3.6) เขียนโปรแกรมตอไปนี้ const int PIN_LED = D0; void setup() { pinMode(PIN_LED, OUTPUT); } void loop() { digitalWrite( PIN_LED, HIGH ); delay(1000); digitalWrite( PIN_LED, LOW ); delay(1000); }

(2.3.7) อัปโหลดโคด คลิกทีปุ่ ม Upload หรือเลือกเมนู Sketch > Upload หรือกดคีย Ctrl ตามดวย U


20   IoTIoT Education Kit - Lite

(2.3.8) ซอฟตแวรจะทําการคอมไพลโคด (compiling) เมือเสร็ ่ จแลวจะแสดงผลการคอมไพล ขนาดไฟล พืนที ้ เหลื ่ อของหนวยความจํา ตามดวยการอัปโหลดโคด แสดงสถานะการอัปโหลดดวยจุด ไขปลาสีแดง ..... ที่หนาตางสถานะ พรอมกันนัน้ LED แสดงสถานะการอัปโหลดบนบอรด NodeMCU12E (ซึงต ่ อกับขาพอรต D4 หรือ GPIO2) จะติดกะพริบตามจังหวะการถายทอดขอมูล การอัปโหลดโคด จะใชเวลาประมาณ 30 วินาที เมืออั ่ ปโหลดโคดไปยังบอรดไดสําเร็จ จะแจงดวยขอความ Done uploading ทีช่ องแสดงสถานะ LED สีนํ้าเงินตําแหนง D4 บนโมดูล NodeMCU กะพริบถีๆ่ ตามจังหวะ การสื่อสารขอมูล

(2.3.9) เมื่ออัปโหลดโคดเสร็จ NodeMCU จะเริ่มทํางานทันที

LED ที่ตําแหนง D0 บนโมดูล NodeMCU กะพริบทุกๆ วินาที


 IoTIoT Education Kit - Lite  21

 

 3.1 ขันตอนการพั ้ ฒนาโปรแกรมภาษา C/C++ เพือใช ่ งาน NodeMCU-12E ขันตอนการพั ้ ฒนาโปรแกรมสําหรับโมดูล WiFi คอนโทรลเลอร NodeMCU-12E หรือ V2 หรือ Development kit 1.0 แสดงเปนแผนภาพดังรูปที่ 3-1 ติดตั้งซอฟตแวร - Arduino1.6.5r2 ซอฟตแวรพัฒนาโปรแกรมภาษา C/C++ มีทั้งสวนของเท็กซเอดิเตอรสําหรับเขียนโปรแกรม, ไฟลไลบรารี ESP8266wifi.h, คอมไพเลอร และสวนของการอัปโหลดโคดไปยัง โมดูล NodeMCU-12E - ไดรเวอรอุปกรณ USB ของโมดูล NodeMCU-12E เปนไดรเวอร สําหรับชิป CP2102 เปนตัวแปลงสัญญาณพอรต USB เปนพอรต อนุกรมแบบ UART

สรางไฟลสเก็ตช เขียนโปรแกรมภาษา C บน Arduino IDE คอมไพล อัปโหลดโปรแกรม (ใชเวลา 30 วินาที) พอรต USB

อัปโหลดโปรแกรมผานพอรต USB 1. ตอสาย microB-USB เขากับพอรต USB และ โมดูล NodeMCU-12E 2. ตรวจสอบตําแหนง USB Serial port (COMx) ทีเ่ กิดขึ้น 3. เลือกฮารดแวรเปน NodeMCU1.0 (ESP826612E) 4. ทําการอัปโหลดโปรแกรม

รันโปรแกรม หลังจากอัปโหลดโปรแกรมเสร็จสมบูรณแลว จากนั้นระบบจะเริ่มทํางานทันที

รูปที่ 3-1แสดงผังงานของการพัฒนาโปรแกรมเพือควบคุ ่ มการทํางานของโมดูล NodeMCU-12E ดวยภาษา C/C++ โดยใช ArduinoIDE 1.6.5r2 เปนรุนที  ปรั ่ บปรุงใหใชงานกับโมดูล NodeMCU ไดสะดวกและงายขึน้


22   IoTIoT Education Kit - Lite

3.2 ขอควรทราบในการเขียนโปรแกรมภาษา C/C++ ดวย Arduino IDE สําหรับ NodeMCU-12E ในการเขียนโปรแกรมภาษา C/C++ สําหรับโมดูล NodeMCU-12E โดยใชภาษาของ Arduino (Arduino programming language) ผูพั ฒนาโปรแกรมควรมีความเขาใจในสวนประกอบของโปรแกรม เสียกอน ซึ่งแบงไดเปน 2 สวนหลักคือ 1. โครงสรางภาษา (structure) ตัวแปรและคาคงที่ 2. ฟงกชั่น (function) ภาษาของ Arduino จะอางอิงตามภาษา C/C++ จึงอาจกลาวไดวาการเขียนโปรแกรมสําหรับ Arduino ก็ คื อการเขี ยนโปรแกรมภาษา C โดยเรี ยกใช ฟ งก ชั่ นและไลบรารี ที่ ทาง Arduino ไดเตรียมไวใหแลว ซึ่งสะดวก และทําใหผูที่ไมมีความรูดานไมโครคอนโทรลเลอรอยางลึกซึ้ง สามารถเขียนโปรแกรมสั่งงานได โปรแกรมของ Arduino แบงไดเปนสองสวนคือ void setup()

และ

void loop()

โดยฟงกชั่น setup() เมื่อโปรแกรมทํางานจะทําคําสั่งของฟงกชั่นนี้เพียงครั้งเดียว จึงเหมาะ ที่จะใชในการกําหนดคาเริ่มตนของการทํางาน โดยปกติใชกําหนดโหมดการทํางานของขาตางๆ สวนฟงกชั่น loop() เปนสวนทํางาน โปรแกรมจะทําคําสั่งในฟงกชั่นนี้ตอเนื่องกันตลอด เวลา เชน อานคาอินพุต ประมวลผล สั่งงานเอาตพุต ฯลฯ สําหรับการกําหนดคาเริ่มตน เชน ตัวแปร จะตองเขียนทีส่ วนหัวของโปรแกรม กอนถึงตัวฟงกชัน่ นอกจากนัน้ ยังตองคํานึงถึงตัวพิมพเล็ก-ใหญ ของตัวแปรและชื่อฟงกชั่นใหถูกตองดวย


 IoTIoT Education Kit - Lite  23

3.2.1 สวนของฟงกชัน่ setup() ฟงกชั่นนี้จะเขียนที่สวนตนของโปรแกรม ทํางานเมื่อโปรแกรมเริมต ่ นเพียงครั้งเดียว ใชเพือ่ กําหนดคาของตัวแปร โหมดการทํางานของขาตางๆ เริ่มตนเรียกใชไลบรารี ฯลฯ ตัวอยางที่ 3-1 int LEDpin = D0; void setup() { pinMode(LEDpin, OUTPUT); } void loop() { digitalWrite(LEDpin,HIGH); delay(500); digitalWrite(LEDpin,LOW); delay(500); }

จากตัวอยางนี้ ฟงกชัน่ setup() ใชกําหนดโหมดการทํางานของขาพอรตทีอ่ างอิงดวย ชือ่ LEDpin ซึงก็ ่ คือ ขาพอรต D0 ของโมดูล NodeMCU-12E ใหเปนขาพอรตเอาตพุตดิจิตอล

3.2.2 สวนของฟงกชัน่ loop() หลังจากทีเขี ่ ยนฟงกชัน่ setup()ทีกํ่ าหนดคาเริมต ่ นของโปรแกรมแลว สวนถัดมาคือฟงกชัน่ ่ การทํางานตรงตามชือคื ่ อ จะทํางานตามฟงกชันนี ่ วนต ้ อเนืองตลอดเวลา ่ ภายในฟงกชัน่ loop() ซึงมี นี้จะมีโปรแกรมของผูใช เพือรั ่ บคาจากพอรต ประมวล แลวสังเอาต ่ พุตออกขาตางๆ เพือควบคุ ่ มการ ทํางานของบอรด ตัวอยางที่ 3-2 int LEDpin = D0; void setup() { pinMode(LEDpin, OUTPUT); } void loop() { digitalWrite(LEDpin,HIGH); delay(500); digitalWrite(LEDpin,LOW); delay(500); }

จากตัวอยางนี้ ฟงกชัน่ loop() เปนการสั่งใหขาพอรตที่อางอิงดวยชือ่ LEDpin ซึงก็ ่ คือ ขาพอรต D0 ของโมดูล NodeMCU-12E มีสถานะเปน “1” (HIGH) และ “0” (LOW) สลับกันทุกๆ 0.5 วินาที และวนทํางานเชนนี้ไปตลอด


24   IoTIoT Education Kit - Lite

3.3 การทดลองติดตอกับอุปกรณอินพุตเอาตพุต กอนทีจะเข ่ าสูขั นตอนการพั ้ ฒนาอุปกรณ IoT ดวย NodeMCU ขันตอนหนึ ้ งที ่ สํ่ าคัญและผูพั ฒนา ควรใหความสนใจคือ การพัฒนาโปรแกรมเพือใช ่ งานโมดูล NodeMCU-12E ในการติดตอกับอุปกรณ อินพุตเอาตพุตภายนอกพืนฐาน ้ เชน LED และติดตอจากตัวตรวจจับทังแบบอะนาลอกและแบบดิ ้ จิตอล ทีต่ องใชการสือสารข ่ อมูลอนุกรมผานระบบบัส ทั้งนี้เพื่อใหแนใจวา การทํางานของฮารดแวรทั้งในการรับคาจากตัวตรวจจับและอุปกรณ อินพุตตางๆ กับการสงสัญญาณหรือขอมูลไปยังอุปกรณเอาตพุตเปนไปอยางถูกตอง เมือเข ่ าสูกระบวน  การเชื่อมตอกับเครือขายอินเทอรเน็ตแลว การพัฒนาตอจากนั้นจะถูกโฟกัสไปยังกระบวนการทาง ซอฟตแวรเปนหลัก ไมวาจะเปนการนําขอมูลไปแสดงผลในรูปของกราฟกแบบตางๆ การประมวล ผลและจัดเก็บฐานขอมูล การดูแลรักษาดานความปลอดภัยของขอมูล หากการทํางานทางฮารดแวรไมมีความแนนอนหรือไมเสถียร ขอมูลทีได ่ รับหรือสงตอจากการ เชื่อมตอกับอุปกรณฮารดแวรจะไมเกิดประโยชน สงผลใหอุปกรณ IoT ตัวนั้นๆ ลมเหลวในการนํา ไปใชงานอยางสิ้นเชิง นั่นหมายความวา ในการพัฒนาอุปกรณ IoT จะตองมีความสมบูรณพรอมทัง้ ฮารดแวร ซอฟตแวร การจัดการดานเครือขาย และการบริหารพืนที ้ หน ่ วยความจํา จึงจะทําใหอุปกรณ IoT ตัวนันๆ ้ หรือระบบนั้นๆ ทํางานไดอยางมีประสิทธิภาพ

รูปที่ 3-2 อุปกรณทางฮารดแวรทั้งหมดที่ใชในบทนี้ อยางไรก็ตาม ผูพัฒนาสามารถเปลียนอุ ่ ปกรณ จากมินิบอรดสําเร็จรูปเปนอุปกรณอิเล็กทรอนิกสพื้นฐาน โดยดูจากวงจรที่ใชในการทดลอง แลว ทําการตอวงจรขึนใหม ้ บนแผงตอวงจรหรือเบรดบอรดก็ได (สําหรับผูจั ดซือชุ ้ ด IoT Education Kit - Lite จะมีอุปกรณทังหมดนี ้ ครบถ ้ วน)


 IoTIoT Education Kit - Lite  25

3.3.1 ตัวอยางการติดตออุปกรณอินพุตเอาตพุตพืนฐานของโมดู ้ ล NodeMCU-12E ขั้นตอนการพัฒนาโปรแกรมในแตละตัวอยางในหัวขอนีจะเหมื ้ อนกัน นั่นคือ เปดซอฟตแวร ArduinoIDE 1.6.5r2 ที่ปรับปรุงมาเปนพิเศษสําหรับพัฒนาโปรแกรมใหกับโมดูล NodeMCU-12E ทําการเขียนโปรแกรม คอมไพล และอัปโหลดลงบนโมดูล NodeMCU-12E จากนั้นตอวงจรเพื่อ ทดสอบการทํางาน การตอวงจรสําหรับเชื่อมตอกับอุปกรณอินพุตเอาตพุตใหแกโมดูล NodeMCU-12E ในหัวขอ นี้มีดวยกัน 2 ลักษณะคือ แนะนําวงจรที่ผูทดลองสามารถตอวงจรบนเบรดบอรดได แมไมไดจัดซื้อ ชุด IoT Education Kit - NodeMCU กับอีกลักษณะคือ การตอวงจรโดยใชอุปกรณที่จัดเตรียมมาพรอม ในชุด IoT Education Kit สิ่งสําคัญที่ตองเนนยํ้าคือ 1. การจายไฟใหแกโมดูล NodeMCU-12E ทําได 2 ทาง นั่นคือ จายไฟผานทางพอรต USB และจายไฟ +5V เขาที่ขา +Vcc ของโมดูล NodeMCU-12E แตตองไมทําพรอมกัน 2. ในการเขียนโปรแกรม ตองเลือกฮารดแวรหรือ Tool > Board > NodeMCU1.0 (ESP-12E module) และเลือกชองการเชือมต ่ อในเมนู Tool > Port ใหถูกตอง กอนทํา การคอมไพลและอัปโหลดโคดโปรแกรม


26   IoTIoT Education Kit - Lite

3.3.2 ใชงานพอรตเอาตพุตขับ LED 3.3.2.1 คุณสมบัติของขาพอรตเอาตพุต สําหรับขาพอรตทุกขาของ NodeMCU-12E กําหนดใหเปนเอาตพุตดิจิตอลไดทั้งหมด เมื่อทํา การกําหนดเปนเอาตพุตดิจิตอลแลว ขาพอรตจะมีสถานะเปนอิมพีแดนซตํ่า ทําใหจายกระแสไฟฟา ใหกับวงจรภายนอกไดสูงสุด 15mA ซึงเพี ่ ยงพอสําหรับขับให LED สวาง (ตองตอตัวตานทานอนุกรม เพือจํ ่ ากัดกระแสไฟฟาให LED ดวย) หรือใชกับอุปกรณเอาตพุตดิจิตอลอืนๆ ่ ได แตไมเพียงพอสําหรับ ขับรีเลย โซลีนอยด หรือมอเตอรโดยตรง

3.3.2.2 การกําหนดโหมดของขาพอรต ในรูปที่3-3 แสดงขั้นตอนการใชงานขาพอรตของโมดูล NodeMCU-12E เปนพอรตเอาตพุต ดิจิตอล โดยกอนใชงานตองกําหนดโหมดการทํางานเสียกอน ดวยฟงกชัน่ pinMode()มีรูปแบบดังนี้ pinMode(pin,mode);

เมือ่

คือ หมายเลขขาพอรตที่ตองการ Mode คือ โหมดการทํางานเปนอินพุต (INPUT) หรือ เอาตพุต (OUTPUT) pin

หลังจากกําหนดใหเปนพอรตเอาตพุตแลว เมือต ่ องการเขียนคาไปยังขาพอรตนันๆ ้ ใหเรียกใช ฟงกชั่น digitalWrite() โดยมีรูปแบบดังนี้ digitalWrite(pin,value);

เมือ่

คือ หมายเลขขาพอรตที่ตองการ value สถานะลอจิกทีต ่ องการ (HIGH หรือ LOW) pin

 analogWrite(pin, value)





pinMode(pin,INPUT)

HIGH 

 pinMode(pin,OUTPUT)



digitalWrite(pin, value)



LOW 

รูปที่ 3-3 ไดอะแกรมแสดงกลไกการกําหนดใหขาพอรตของ NodeMCU-12E เปนพอรตเอาตพุตดิจิตอล (บล็อกสีเทาแทนการทํางานหรือเงือนไขที ่ ต่ องการ) ในการเขียนโปรแกรมดวย Arduino IDE


 IoTIoT Education Kit - Lite  27

R3 1k D3/GPIO0

LED2 YEL

ZX-LED

R2 1k D2/GPIO4

LED1 RED

ZX-LED

R1 1k D1/GPIO5

ZX-LED

   

NodeMCU-12E*

LED3 GRN

+S

+S

+S

O

O

O

 A0 POWER

5 0

D1

D2

GPIO

TxD0 RxD0

+Vcc +5V +3V3

D10

1

D9

3

14

D5 13

D7 5

D8

2

D4

WiFi

D3

12

D0 16 D1 5 D2 4 D3 0 D4 2 +3V3 GND D5 14 D6 12 D7 13 D8 15 D9 3 D10 1 GND

ESP-12E

D6

A0 RSV RSV SD3 10 D12 SD2 9 D11 INT/SD1 MOSI/CMD MISO/SD0 SCK/CLK GND +3V3 EN nRST GND

GPIO

TxD2

INT/SD1 MOSI/CMD MISO/SD0 SCK/CLK

D3

NodeMCU carrier board

D1

+5Vdc 16

Vin

D0

SD2

D11 9

ADC SELECT

ON

AX-NodeMCU

4

VR

D2

SD3

D12 10

A0

IoT Education Kit

รูปที่ 3-4 วงจรสําหรับทดลองใชงานขาพอรตเอาตพุตของ NodeMCU-12E ในการขับ LED 3 ดวง

3.3.2.3 ตัวอยางโปรแกรมขับ LED ในตัวอยางนีเป ้ นการสังให ่ พอรตทํางานเปนเอาตพุต จากนันสั ้ งให ่ ขาพอรตเอาตพุตนันๆ ้ เปน ลอจิก “0” หรือ “1” ตามที่ตองการ โดยตอกับ LED สั่งให LED ติดดับตอเนืองกั ่ น เริมต ่ นดวยการตอวงจร ดังรูปที่ 3-4 โดยในรูปที่ 3-4 (A) เปนวงจรทดลองทีแนะนํ ่ าใหตอลงบน เบรดบอรดหรือแผงตอวงจร สวนรูปที่ 3-4 (B) เปนการตอทดลองโดยใชอุปกรณทีมี่ ในชุด IoT Education Kit - Lite โดย LED ทํางานที่ลอจิก “1” คือเมือสั ่ งให ่ ขาพอรตเปน HIGH จะทําให LED ติด เมื่อสังให ่ ขาเปน LOW หรือ “0” LED จะดับ เมื่อตออุปกรณแลว ใหเขียนโปรแกรมที่ 3-1 ทดลองคอมไพล อัป โหลดลง NodeMCU-12E ศึกษาผลการทํางาน เมื่ออัปโหลดโคดและรันโปรแกรม LED ที่ตอกับขาพอรต D1 ติดดับทุกๆ 1 วินาที


28   IoTIoT Education Kit - Lite

#define ledPin1 D1 void setup() { pinMode(ledPin1,OUTPUT); } void loop() { digitalWrite(ledPin1, 0); delay(1000); digitalWrite(ledPin1, 0); delay(1000); }

// Define pin name

//Set D1 pin as output

//Set display pattern off-off-on //Delay 1 second //Set display pattern off-on-on //Delay 1 second

คําอธิบายโปรแกรมเพิมเติ ่ ม ในโปรแกรมนีมี้ การกําหนดชือของขาพอร ่ ตทีใช ่ ในตอนตนของโปรแกรมดวยคําสัง่ #define ยกตัวอยาง ในโปรแกรมกําหนดคาคงทีให ่ ขอความ ledPin1 มีคาเทากับ D1 หลังจากบรรทัดนีในโปรแกรมเมื ้ อพบข ่ อความ ledPin1 จะหมายถึง ขาพอรต D1 เปนตน สวนของฟงกชั่น setup() ใชกําหนดการทํางานของขาพอรตใหเปนเอาตพุตดวยคําสัง่ pinMode สวนของฟงกชัน่ loop() เปนโปรแกรมกําหนดให LED ทํางานติดดับคันด ่ วยการหนวงเวลา 1 วินาที ดวยคําสั่ง delay(1000); อันเปนการเรียกใชฟงกชั่น delay()โดยสงคา 1000 ใหกับฟงกชั่น เพื่อให เกิดการหนวงเวลา 1000 มิลลิวินาที (ms) หรือ 1 วินาที เปลียนค ่ าในวงเล็บเปนคาอืนๆ ่ ได หากคายิงมากการ ่ ทํางานของแตละรูปแบบจะนานขึน้

โปรแกรมที่ 3-1 ไฟล NodeMCU_LED1.ino โปรแกรมสําหรับใชงานขาพอรตเอาตพุตของ NodeMCU-12E เพื่อขับ LED


 IoTIoT Education Kit - Lite  29

3.3.3 สรางสัญญาณ PWM ผานพอรตเอาตพุตของ NodeMCU ใน Arduino มีฟงกชั่น analogWrite() ทําให NodeMCU-12E สรางสัญญาณอะนาลอกสง ออกทางขาพอรตเอาตพุตได โดยอาศัยเทคนิคการสรางสัญญาณ PWM (Pulse Width Modulation) หรือ สัญญาณมอดูเลชั่นทางความกวางพัลส ผูใชงานสามารถปรับคาดิวตี้ไซเกิลของสัญญาณพัลสไดระ หวาง 0 ถึง 255 เมื่อคาเปน 0 แรงดันของขาพอรตที่กําหนดไวจะมีคาเปน 0V หากมีคาเปน 255 แรงดันที่ขาพอรตจะเปน +3.3V สําหรับคา 0 ถึง 255 จะทําใหขาที่กําหนดไวมีคาแรงดันเปลี่ยนแปลง สลับไปมาระหวาง 0 และ +3.3V ถามีคาสูง ชวงเวลาที่ขาพอรตนั้นมีแรงดัน +3.3V จะนานขึ้น ถาคาเปน 51 สัญญาณพัลสจะมีระดับสัญญาณ +3.3V เปนเวลานาน 20% ของคาบเวลา และ มีแรงดัน 0V นาน 80% ของคาบเวลา หรือมีคาดิวตี้ไซเกิลเทากับ 20%นั่นเอง ถามีคาเปน 127 สัญญาณพัลสจะมีระดับสัญญาณ +3.3V เปนเวลานานครึงหนึ ่ งของคาบเวลา ่ และ 0V นานครึ่งหนึงของคาบเวลา ่ หรือมีคาดิวตี้ไซเกิล 50% ถามีคาเปน 191 นั่นคือ สัญญาณพัลสจะมีระดับสัญญาณ +3.3V เปนเวลานานสามสวนสี่ ของคาบเวลา และมีแรงดัน 0V นานหนึงส ่ วนสีของคาบเวลา ่ หรือมีคาดิวตี้ไซเกิล 75% ในรูปที่ 3-5 แสดงสัญญาณ PWM ที่คาดิวตี้ไซเกิลตางๆ

20%

50%

75%

รูปที่ 3-5 แสดงสัญญาณ PWM ทีค่ าดิวตีไซเกิ ้ ลตางๆ


30   IoTIoT Education Kit - Lite

คาแรงดันของสัญญาณพัลสจะไดเปนคาเฉลี่ยของสัญญาณพัลส ซึ่งสามารถคํานวณไดจาก ความสัมพันธทางคณิตศาสตรตอไปนี้ แรงดันเอาตพุต = (คาเวลาของลอจิกสูง / คาเวลาของลอจิกตํ่า) x ไฟเลี้ยง ผูใชงานสามารถนําสัญญาณ PWM ที่ไดจากคําสั่งนี้ไปใชในการปรับความสวางของ LED หรือตอขยายกระแสเพือต ่ อปรับความเร็วของมอเตอรได หลังจากเรียกใชคําสังนี ่ ้ ทีขาพอร ่ ตทีกํ่ าหนด จะมีสัญญาณ PWM สงออกมาอยางตอเนื่อง จนกวาจะเรียกใชฟงกชั่น analogWrite ในรอบใหม หรือเรียกใชฟงกชั่น digitalRead หรือ digitalWrite ที่ขาพอรตเดียวกัน

3.3.3.1 ฟงกชั่นสําหรับสรางสัญญาณ PWM ฟงกชั่นใน Arduino IDE ที่ใชสรางสัญญาณ PWM คือ analogWrite()สําหรับ NodeMCU12E ทํางานรวมกับฟงกชั่นนีได ้ เปนอยางดี โดยผูพัฒนาโปรแกรมสําหรับกําหนดใหขาพอรตดิจิตอล ทุกขาของ NodeMCU เปนขาพอรตเอาตพุตเพือขั ่ บสัญญาณ PWM ไดทั้งหมด นับเปนความสามารถ ที่ยอดเยี่ยมของ NodeMCU รายละเอียดของฟงกชั่น analogWrite()มีดังนี้ รูปแบบ analogWrite(pin, value)

ใชในการเขียนคาอะนาลอกไปยังขาพอรตที่กําหนดไว เพื่อสรางสัญญาณ PWM โดยมีคา ความถีประมาณ ่ 490Hz พารามิเตอร pin - หมายเลขขาพอรตของ NodeMCU value - เปนคาดิวตีไซเกิ ้ ลมีคาระหวาง 0 ถึง 255 เมื่อคาเปน 0 แรงดันของขาพอรตที่กําหนดจะเปน 0V เมื่อมีคาเปน 255 แรงดันที่ขา พอรตจะเปน +5V สําหรับคาระหวาง 0 ถึง 255 จะทําใหขาพอรตที่กําหนดไวมีคาแรงดัน เปลี่ยนแปลงในยาน 0 ถึง 5V คาที่สงกลับจากฟงกชั่น เลขจํานวนเต็มจาก 0 ถึง 255


 IoTIoT Education Kit - Lite  31

3.3.3.2 ตัวอยางโปรแกรมใชงานขาพอรต NodeMCU ขับ LED ดวยสัญญาณ PWM ใชวงจรในรูปที่ 3-4 ในการทดลอง จากนั้นเขียนโปรแกรมที่ 3-2 ทําการคอมไพลและอัปโหลดไปยัง NodeMCU-12E จากนั้นทํา การรันโปรแกรมเพือทดสอบการทํ ่ างาน LED จะเริ่มตนดวยการดับ แลวคอยๆ สวางขึ้น จนสวางเต็มที่ จากนั้นจะคอยหรี่ลงจน ดับ วนทํางานแบบนีอย ้ างตอเนือง ่ #define LED_PIN D1 // LED at D1 int value = 0; // variable to keep the actual value void setup() { pinMode(LED_PIN,OUTPUT); } void loop() { for (value = 0; value <= 255; value += 5) // fade in (min to max) { analogWrite(LED_PIN, value); // sets the value (0 to 255) delay(30); // waits for 30 milliseconds } for (value = 255; value >= 0; value -= 5) // fade out (max to min) { analogWrite(LED_PIN, value); delay(30); } delay(1000); }

โปรแกรมที่ 3-2 ไฟล NodeMCU_PWM.ino โปรแกรมสําหรับใชงานขาพอรตเอาตพุตของ NodeMCU-12E เพือควบคุ ่ มความสวางของ LED ดวยสัญญาณ PWM


32   IoTIoT Education Kit - Lite

3.3.4 ใชงานพอรตอินพุตดิจิตอล 3.3.4.1 คุณสมบัติของขาพอรตอินพุต ขาพอรตของ NodeMCU เมื่อถูกกําหนดเปนอินพุตดิจิตอล จะมีสถานะเปนอิมพีแดนซสูง ทําใหมีความตองการกระแสไฟฟาจากอุปกรณที่ตองการอานคาอินพุตนอยมาก ไมสามารถรับหรือ จายกระแสใหกับวงจรภายนอก สําหรับขาอินพุต เมือไม ่ มีอินพุตปอนใหจะตองกําหนดคาแรงดันใหแนนอน ทําไดโดยตอตัวตาน ทานพูลอัป (pull-up resistor) โดยตอขาของตัวตานทานขาหนึงไปยั ่ งไฟเลียง ้ หรือตอพูลดาวน (pull- down) ซึงต ่ อขาหนึงของตั ่ วตานทานจากขาพอรตลงกราวด คาตัวตานทานทีใช ่ ทัวไปคื ่ อ 10k ดังรูปที่ 3-6 ขาพอรตดิจิตอลของ NodeMCU รองรับการกําหนดใหเปนอินพุตไดทังหมด ้ เมือต ่ องการกําหนด เปนอินพุต ดิจิอลตองกําหนดดวยฟงกชัน่ pinMode และอานคาอินพุตไดจากฟงกชัน่ digitalRead ซึงมี ่ รูปแบบดังนี้ pinMode(pin,INPUT);

เมื่อ pin คือ หมายเลขขาพอรตที่ตองการ digitalRead(pin);

เมือ่ pin คือหมายเลขขาทีต่ องการอานคาสถานะ เมื่อฟงกชั่นทํางาน จะคืนคาเปนสถานะของขาที่ตองการอานคา โดยคืนคาเปน LOW (คาเปน “0”) หรือ HIGH (คาเปน “1”) +Vcc

ปกติเปนลอจิกต่ํา (LOW หรือ "0") Rpull-up Di

INPUT

ปกติเปนลอจิกสูง (HIGH หรือ "1")

(ก) การตอตัวตานทานพูลอัป

Di

INPUT Rpull-down

(ข) การตอตัวตานทานพูลดาวน

รูปที่ 3-6 แสดงการตอตัวตานทานเพื่อกําหนดสภาวะของขาพอรตอินพุตของไมโครคอนโทรลเลอร ในขณะทียั่ งไมมีอินพุตสงเขามา


 IoTIoT Education Kit - Lite  33



 digitalWrite(pin, HIGH)





pinMode(pin,INPUT)



 pinMode(pin,OUTPUT)





val = digitalRead(pin);

 val

รูปที่ 3-7 ไดอะแกรมแสดงกลไกการกําหนดใหขาพอรตของ NodeMCU-12E เปนพอรตอินพุต ดิจิตอล (บล็อกสีเทาแทนการทํางานหรือเงือนไขที ่ ต่ องการ) ในรูปที่ 3-7 แสดงไดอะแกรมการเขียนคําสังเพื ่ อกํ ่ าหนดใหใชงานขาพอรตของ NodeMCU-12E ทํางานเปนขาพอรตอินพุตดิจิตอล

3.3.4.2 ทดลองรับคาสวิตชอยางงาย ในการทดลองนี้จะทดลองอานคาสถานะของสวิตชแบบกดติดปลอยดับเพื่อควบคุม LED เมื่อกดสวิตช ทําให LED ติดสวาง เมื่อปลอยสวิตช LED จะดับ โดยมีวงจรแสดงไดดังรูปที่ 3-8 และ เขียนเปนโปรแกรมไดดังโปรแกรมที่ 3-3 ในการใชงานขาอินพุตดิจิตอลตองตอตัวตานทานพูลอัป (ตอตัวตานทานจากไฟเลี้ยง +3.3V มายังขาอินพุต) เพือกํ ่ าหนดสถานะที่แนนอนใหกับขาอินพุตในภาวะที่ไมมีการกดสวิตช ดังวงจรใน รูปที่ 4-13 (A) เมื่อไมไดกดสวิตช ที่ขาพอรต D1 จะมีสถานะเปนลอจิกสูงหรือ HIGH หรือ “1” เมื่อ กดสวิตช จะทําใหขา D1 ตอลงกราวด อานคาสถานะเปนลอจิกตํ่าหรือ LOW หรือ “0” การทํางานของ LED1 จะตรงขามกับสถานะของสวิตชคือ เมื่อไมกดสวิตช จะอานสถานะ ของขา D1 ไดลอจิกสูง จึงตองสังให ่ ขา D3 เปนลอจิกตํ่าหรือ “0” เพือทํ ่ าให LED1 ดับ เมื่อกดสวิตช อานคาสถานะของขา D1 ไดลอจิก “0” ตองสังให ่ ขา D3 เปน “1” เพือขั ่ บ LED1 ติดสวาง


34   IoTIoT Education Kit - Lite

R1 4.7k D1/GPIO5 SW1

R2 1k D3/GPIO0

ZX-SWITCH01

ZX-LED

   

+3.3V

NodeMCU-12E*

D

LED1 RED

+S

+S

O

 A0 POWER

NodeMCU carrier board

5

+5Vdc

D1

AX-NodeMCU

Vin

D1

0

D3 4

RxD0

D3 14 13

D7

D5

D2 2

TxD0

+Vcc +5V

5

WiFi

D4

ESP-12E

12

D0 16 D1 5 D2 4 D3 0 D4 2 +3V3 GND D5 14 D6 12 D7 13 D8 15 D9 3 D10 1 GND

D6

A0 RSV RSV SD3 10 D12 SD2 9 D11 INT/SD1 MOSI/CMD MISO/SD0 SCK/CLK GND +3V3 EN nRST GND

GPIO

TxD2

INT/SD1 MOSI/CMD MISO/SD0 SCK/CLK

GPIO

D8

SD2

D11 9

ADC SELECT

ON

16

VR

D0

SD3

D12 10

A0

 IoT Education Kit

+3V3

D10

1

D9

3

รูปที่ 3-8 วงจรสําหรับทดลองใชงานขาพอรตอินพุตของ NodeMCU-12E ในการรับคาสวิตชเพือขั ่ บ LED #define sw1 D1 #define ledPin1 D3 int st_sw1 = 0; void setup() { pinMode(ledPin1, OUTPUT); pinMode(sw1, INPUT); } void loop() { st_sw1 = digitalRead(sw1); digitalWrite(ledPin1, ~st_sw1); }

// Define D1 as switch pin // Define D1 as LED pin

// Set pin as output // set pin as input

// Read input // Invert output

โปรแกรมที่ 3-3 ไฟล NodeMCU_SW.ino โปรแกรมทดลองใชงานขาพอรตอินพุตของ NodeMCU-12E ในการ รับคาสวิตชเพือขั ่ บ LED


 IoTIoT Education Kit - Lite  35

3.4 ใชงานอินพุตอะนาลอกของ NodeMCU-12E 3.4.1 เกี่ยวกับอินพุตอะนาลอกของ NodeMCU-12E ความสามารถในการแปลงสัญญาณอะนาลอกเปนดิจิตอลของ NodeMCU-12E ถือวาอยูใน เกณฑที่ใชงานไดดี โดยมีความละเอียดในการแปลงสัญญาณ 10 บิต ใหขอมูลดิจิตอลมีคา 0 ถึง 1,023 (เลขฐานสิบ) แตที่เปนขอจํากัดเล็กนอยคือ NodeMCU-12E มีอินพุตอะนาลอกเพียง 1 ชองคือ A0 และโดยปกติแลวตัว ESP8266-12E ทีเป ่ นโมดูลหลักของ NodeMCU-12E จะรับแรงดันไฟตรงสําหรับ อินพุตอะนาลอกไดในยาน 0 ถึง 1V เทานัน้ ในการออกแบบ NodeMCU-12E จึงมีการตอวงจรลดทอน แรงดันเขาที่อินพุตอะนาลอก เพือให ่ รองรับแรงดันไฟตรงไดสูงถึง +3.3V ดังนั้น NodeMCU-12E จึงมีอินพุตอะนาลอก 1 ชอง ที่รับแรงดันได 0 ถึง +3.3V และมีความ ละเอียดในการแปลงสัญญาณอะนาลอกเปนดิจิตอล 10 บิต ใหขอมูลดิจิตอลในชวง 0 ถึง 1,023 รวม 1,024 คา จึงวัดระดับการเปลี่ยนแปลงของสัญญาณไฟฟาไดละเอียดถึง 0.003 V (ที่ +3.3V)

3.4.2 ฟงกชันอ ่ านคาสัญญาณอะนาลอกใน Arduino IDE สําหรับ NodeMCU-12E มีเพียง 1 ฟงกชั่นคือ analogRead() มีคําอธิบายโดยสรุปดังนี้ รูปแบบ int analogRead(pin)

เปนฟงกชันอ ่ านคาจากขาพอรตทีกํ่ าหนดใหเปนอินพุตอะนาลอกของ NodeMCU-12E ซึงมี ่ ชอง เดียวคือ A0 มีวงจรแปลงสัญญาณอะนาลอกเปนดิจิตอลความละเอียด 10 บิต ทําใหแปลงคาแรง ดันอินพุต 0 ถึง +3.3V ใหเปนขอมูลตัวเลขจํานวนเต็ม ระหวาง 0 ถึง 1,023 พารามิเตอร ่ คือขา A0 pin - หมายเลขของขาอินพุตอะนาลอก ซึงก็ คาที่สงกลับ เลขจํานวนเต็มจาก 0 ถึง 1023 หมายเหตุ สําหรับขาอินพุตอะนาลอกไมจําเปนตองประกาศแจงวา เปนอินพุตหรือเอาตพุต


36   IoTIoT Education Kit - Lite

3.4.3 ตัวอยางโปรแกรมอานคาอินพุตอะนาลอกของบอรด AX-NodeMCU ในตัวอยางจะใชตัวตานทานปรับคาไดบนบอรด AX-NodeMCU เปนแหลงกําเนิดแรงดันไฟตรง เพือป ่ อนสูอิ นพุตอะนาลอกของ NodeMCU-12E ดังรูปที่ 3-9 หากผูทดลองที  ไม ่ ไดใชบอรด AX-NodeMCU ใหใชตัวตานทานปรับคาไดตอลงบนเบรดบอรดดังวงจรในรูปที่ 3-10 (A) สวนผูที ใช ่ ชุด IoT Education Kit ใหตอวงจรดังรูปที่ 3-10 (B) สําหรับโปรแกรมทดลองแสดงในโปรแกรมที่ 3-4 ใหเปดซอฟตแวร Arduino IDE เพือเขี ่ ยนโปรแกรมและอัปโหลดไปยัง NodeMCU-12E

ตัวตานทานปรับคาไดสําหรับใช เปนแหลงจายไฟตรงเพือการ ่ ทดสอบวงจรแปลงสัญญาณ อะนาลอกเปนดิจิตอลของ NodeMCU-12E

รูปที่ 3-9 แสดงตําแหนงของตัวตานทานปรับคาไดบนบอรด AX-NodeMCU ที่ใชเปนแหลงกําเนิด แรงดันอะนาลอกเพือการทดสอบการแปลงสั ่ ญญาณอะนาลอกเปนดิจิตอลของ NodeMCU-12E #define ANALOG_PIN A0 int analogValue = 0; void setup() { Serial.begin(115200); }

// Analog input at pin A0. // Variable for store analog value

// set serial port at 115200 bps

void loop() { analogValue = analogRead(ANALOG_PIN);// Read analog input at pin An 0. Serial.print("Analog input0 = "); // Send string to serial port. Serial.println(analogValue); // Send analog value to serial port. delay(300); // Delay 0.3 second. }

โปรแกรมที่ 3-4 ไฟล NodeMCU_AnalogTest.ino โปรแกรมอานคาอินพุตอะนาลอกของ NodeMCU-12E เพือนํ ่ ามาแสดงทีหน ่ าตาง Serial Monitor


 IoTIoT Education Kit - Lite  37

     A0

A0

NodeMCU carrier board

TxD0 RxD0

5

D3 14

D5 13

D7 5

D8

2

D4

WiFi

12

ESP-12E

D6

D0 16 D1 5 D2 4 D3 0 D4 2 +3V3 GND D5 14 D6 12 D7 13 D8 15 D9 3 D10 1 GND

D2

GPIO A0 GPIO RSV RSV SD3 10 D12 SD2 9 D11 INT/SD1 MOSI/CMD MISO/SD0 SCK/CLK GND +3V3 EN nRST GND

TxD2

INT/SD1 MOSI/CMD MISO/SD0 SCK/CLK

 

D1

AX-NodeMCU

+5Vdc

4

SD2

D11 9

ADC SELECT

Vin

ON

0

VR

16

SD3

A0

POWER D12 10

VR1 10k

NodeMCU-12E*

D0

+3.3V

+Vcc +5V +3V3

D10

1

D9

3

IoT Education Kit รูปที่ 3-10 การตอวงจรเพือทดลองอ ่ านคาอินพุตอะนาลอกของ NodeMCU-12E มาแสดงทีหน ่ าตาง Serial Monitor

รูปที่ 3-11 แสดงการเปดหนาตาง Serial Monitor ของ Arduino IDE เพือแสดงข ่ อมูลของการสือสารระหว ่ าง คอมพิวเตอรกับ NodeMCU-12E ผานพอรตอนุกรมเสมือนจากพอรต USB (USB serial port)


38   IoTIoT Education Kit - Lite

เมืออั ่ ปโหลดโปรแกรมเสร็จแลว ตองเปดหนาตาง Serial Monitor โดยคลิกทีปุ่ มของ  Serial Minitor ทีอยู ่ มุ มบนขวา ดังรูปที่ 3-11 จะเห็นหนาตาง Serial Monitor ปรากฏขึนมา ้ ตังค ้ าการทํางานดังนี้ (1) ตั้งคาอัตราบอดหรือบอดเรตที่ชองมุมขวาลางสุดเปน 115200 บิตตอวินาที (2) เลือก No line ending (3) คลิกทําเครืองหมายที ่ ช่ อง Autoscroll เพือให ่ การแสดงผลเกิดการเลือนบรรทั ่ ดอัตโนมัติ เมือมี ่ ขอมูลใหมเขามา จะไดผลการทํางานตามรูปที่ 3-12 จากการทํางานของโปรแกรมที่ 3-4 พบวาตัวโปรแกรมจะสงผลการแปลงสัญญาณอะนาลอก ซึ่งก็คือ คาแรงดันไฟตรงจากขาอินพุต A0 เปนขอมูลดิจิตอลของเลขจํานวนเต็มมาแสดงที่หนาตาง Serial Monitor จากการทดสอบการทํางานหลายๆ ครั้ง พบวา บางครั้งที่แรงดันอินพุต 0V (วัดดวย มัลติมิเตอร) คาการแปลงสัญญาณไมไดคาเปน 0 อาจมีคา 7 ถึง 8 ในขณะทีแรงดั ่ นอินพุตสูงสุด (เทา ไฟเลี้ยง +3.3V) อานไดคา 1024 คา 7 หรือ 8 ที่ไดจากการแปลงสัญญาณอะนาลอกเปนดิจิตอล เมื่อนํามาคํานวณกลับเปน แรงดันไฟตรง จะไดคาแรงดันเทากับ (7/1023) x 3.3V = 0.02256V หรือ (8/1024) x 3.3V = 0.0258V ซึงมี ่ คาใกลเคียง 0V ทําใหคาทีวั่ ดไดนียั้ งอยูในกรอบที  นํ่ าไปใชกับงานทีไม ่ ตองการวัดแรงดันไฟตรงทีตํ่ า่ มากๆ ได ในขณะที่คา 1024 เมื่อเทียบกับมาเปนแรงดันไฟตรงในทางปฏิบัติก็จะไมมีทางเกินไฟเลี้ยง +3.3V ไปได ดังนั้นจึงอาจยอมรับคาขอมูลสูงสุดทั้ง 1023 และ 1024 ได

รูปที่ 3-12 ผลการอานคาอินพุตอะนาลอกของโมดูล NodeMCU-12E มาแสดงผล ทีหน ่ าตาง Serial Monitor


 IoTIoT Education Kit - Lite  39

ดังนันการใช ้ งาน NodeMCU-12E ในการอานคาแรงดันอินพุตอะนาลอกจึงเหมาะกับตัวตรวจ จับทีให ่ คาแรงดัน 0.05V ถึง +3.2V ถาตองการใหสงขอมูลเปนคาของแรงดันในหนวยโวลต (V) ทีมี่ การแสดงเปนตัวเลขทศนิยม ที่หนาตาง Serial Monitor จะตองมีการแกไขโปรแกรม ดังโปรแกรมที่ 3-5 ในโปรแกรมที่ 3-5 นี้ ทําการคํานวณเพือแปลงค ่ าทีอ่ านไดจากอินพุต A0 ใหเปนแรงดันดวยสูตร temp = analogValue*3.3/1023;

จะไดคาแรงดันเปนตัวเลขทศนิยม เสร็จแลวใหนําคาที่ไดไปเขาฟงกชั่น sprintf()เพื่อ แปลงคาตัวเลขใหเปนตัวอักษร จากการทดลองพบวา ฟงกชั่น sprintf() ของ Arduino ไมสามารถ ใชกับตัวแปรเลขทศนิยมได จึงตองดัดแปลงสูตรการแปลงคาเปนแรงดัน ดังนี้ temp = analogValue*3.3/1023*1000;

คําตอบทีได ่ เปนเลขจํานวนเต็มจาก 0022 (0.022V) ถึง 3303 (3.303V) แลวจึงแปลงเปนขอความ และสงออกพอรตอนุกรมทีละตัวอักษร โดยตองใสตําแหนงของจุดทศนิยมใหถูกตอง #include <stdio.h> // include file stdio.h for function sprintf() #define ANALOG_PIN A0 // Analog input at pin An 0. int analogValue = 0; // variable to store analog value void setup() { Serial.begin(115200);// set serial port at 9600 bps } void loop() { char str[5]; // Declare string variable int temp; // Temporary variable. analogValue = analogRead(ANALOG_PIN);// Read analog input A0. temp = analogValue * 3.3/1023* 1000; // convert to volt and scale *1000 sprintf(str, "%4d", temp); // convert interger to string Serial.print("Analog input0 = "); // print string Serial.print(str[0]); // print voltage in first digit Serial.print("."); if (str[1] == ' ') Serial.print("0"); else Serial.print(str[1]); // print voltage in 3rd digit (0.1 volt) if (str[2] == ' ') Serial.print("0"); else Serial.print(str[2]); // print voltage in 4th digit (0.01 volt) Serial.print(str[3]); // print voltage in 5th digit (0.001 volt) Serial.println(" Volt"); delay(200); // wait 0.2 second }

โปรแกรมที่ 3-5 ไฟล NodeMCU_AnalogTest02.ino โปรแกรมอานคาอินพุตอะนาลอกของ NodeMCU-12E แปลงเปนคาแรงดันในหนวยโวลต (V) ทศนิยม 3 ตําแหนง แลวนํามาแสดงทีหน ่ าตาง Serial Monitor


40   IoTIoT Education Kit - Lite

รูปที่ 3-13 ผลการอานคาอินพุตอะนาลอกของโมดูล NodeMCU-12E จากโปรแกรมที่ 3-5 นํามาแสดงผล ทีหน ่ าตาง Serial Monitor ในหนวยโวลต (Volts) ความละเอียดทศนิยม 3 ตําแหนง

3.5 ใชงาน ZX-DHT11 มินิบอรดวัดความชืนสั ้ มพัทธและอุณหภูมิ ZX-DHT11 เปนแผงวงจรขนาดเล็กทีบรรจุ ่ โมดูลตรวจจับและวัดความชืนสั ้ มพัทธเบอร DHT11 ซึ่งนอกจากจะวัดความชื้นสัมพัทธไดแลว ยังใหคาของอุณหภูมิของพื้นที่ที่ตรวจวัดความชื้นดวย การติดตอเปนแบบหนึงสาย ่ นันคื ่ อใชขาพอรตของไมโครคอนโทรลเลอรเพียง 1 หนึงขาในการทํ ่ างาน รูปที่ 3-14 หนาตาและการจัดขาของ ZX-DHT11 แผงวงจรวัดความชืนสั ้ มพัทธและอุณหภูมิ หมายเหตุ : มีผูผลิตแผงวงจรตรวจจับที่ใชโมดูล DHT11 หลายราย หากไมไดใชรุนที  แนะนํ ่ า อาจมี ความเปนไปไดที่จะมีการจัดขาที่แตกตางออกไป ดังนัน้ จึงควรตรวจสอบตําแหนงขาใหถูกตอง กอน เชือมต ่ อเพือใช ่ งาน


 IoTIoT Education Kit - Lite  41

3.5.1 คุณสมบัติทางเทคนิคของ ZX-DHT11 ZX-DHT มีคุณสมบัติทางเทคนิคที่ควรทราบเพือเป ่ นขอมูลประกอบในการใชงานดังนี้  ใชโมดูล DHT11 ติดตั้งบนแผนวงจรพิมพ ่ DATA ทําใหเชือมต ่ อกับขาพอรตของไมโครคอนโทรลเลอร  มีตัวตานทานตอพูลอัปทีขา ไดโดยไมตองตอตัวตานทานเพิม่  ใชไฟเลี้ยง +3 ถึง +5.5V ตองการกระแสไฟฟา 2.5mA  วัดความชื้นสัมพัทธได 20 ถึง 80%RH มีความผิดพลาด 5%RH และมีความละเอียด ในการวัด 1 % ขนาดของขอมูล 8 บิต  วัดอุณหภูมิได 0 ถึง 50 องศาเซลเซียส มีความผิดพลาด 2 องศาเซลเซียส ความละเอียด ในการวัด 1 องศาเซลเซียส ขนาดของขอมูล 8 บิต  อัตราการสุมวั  ด 1 วินาที  ความเร็วในการตอบสนองตอการเปลี่ยนแปลงในการวัด 6 ถึง 30 วินาที  ขนาด 12 x 28 มิลลิเมตร รูปที่ 3-14 แสดงหนาตาของ ZX-DHT11 และการจัดขา

3.5.2 การติดตอกับ DHT11 DHT11 ติดตอกับไมโครคอนโทรลเลอรดวยสายสัญญาณ 1 เสน บางครังเรี ้ ยกการติดตอแบบนีว้ า การสื่อสารแบบบัสเดี่ยว (single bus communication) จึงตองมีการกําหนดจังหวะระหวางไมโคร คอนโทรลเลอรและ DHT11 ใหเหมาะสม (synchronization) จึงจะอานและเขียนคากับ DHT11 ไดถูกตอง

3.5.2.1 รูปแบบขอมูลของ DHT11 ขอมูลใน 1 รอบของการติดตอมีทั้งสิ้น 40 บิต และ DHT11 จะสงขอมูลบิตนัยสําคัญสูงสุด ออกมากอนเปนบิตแรก รูปแบบของขอมูลเปนดังนี้

     

     

     


42   IoTIoT Education Kit - Lite

1  

+Vcc

2 

3 





 

"1"

"0"

4 

GND

        รูปที่ 3-15 ไดอะแกรมเวลาแสดงกระบวนการติดตอสือสารระหว ่ างไมโครคอนโทรลเลอรกับ DHT11

3.5.2.2 กระบวนการสื่อสารกับ DHT11 ในรูปที่3-15 เปนไดอะแกรมเวลาแสดงกระบวนการติดตอระหวางไมโครคอนโทรลเลอรกับ DHT11 (1) ไมโครคอนโทรลเลอรสงสัญญาณเริมต ่ น ดวยการทําใหบัสเปนลอจิกตํานานอย ่ างนอย 18 ไมโครวินาที จากนันทํ ้ าใหบัสกลับมาเปนลอจิกสูง เพือรอการตอบสนองจาก ่ DHT11 โดยจะรอประมาณ 20 ถึง 40 ไมโครวินาที (2) เมื่อ DHT11 ไดรับสัญญาณเริ่มตนการติดตอ ก็จะตอบสนองกลับมา ดวยการทําให สถานะของบัสเปนลอจิกตํ่านาน 80 ไมโครวินาทีและลอจิกสูงนาน 80 ไมโครวินาทีเพือแจ ่ งกลับมา ยังไมโครคอนโทรลเลอรจะเริ่มตนสงขอมูลกลับมา 40 บิต (3) DHT11 เริมต ่ นสงขอมูลดวยบิตเริมต ่ นเปนลอจิกตํานาน ่ 50 ไมโครวินาที จากนันทยอย ้ สงขอมูลตอเนือง ่ 40 บิต โดยขอมูล “0” จะทําใหบัสมีสถานะลอจิกสูงนาน 26 ถึง 28 ไมโครวินาที ใน ขณะทีข่ อมูล “1” จะทําใหบัสมีสถานะลอจิกสูงนาน 70 ไมโครวินาที ขอมูลแตละบิตจะถูกคั่นดวย สถานะลอจิกตํานาน ่ 50 ไมโครวินาที (4) เมื่อสงขอมูลครบ DHT11 จะทําใหบัสมีสถานะลอจิกตํ่านาน 50 ไมโครวินาทีอีกครัง้ เพือแจ ่ งวาขอมูลสงครบแลว จากนั้น DHT11 จะทําใหบัสกลับมามีสถานะลอจิกสูงอีกครัง้ เพือกลั ่ บ เขาสูสภาวะพร  อมทํางานในรอบใหมตอไป


 IoTIoT Education Kit - Lite  43

3.5.3 ติดตังและผนวกไฟล ้ ไลบรารี DHT.h ในการใชงานโมดูล DHT11 กับ NodeMCU-12E และใชซอฟตแวร Arduino IDE 1.6.5r5 ใน การพัฒนาโปรแกรมจะตองติดตังไฟล ้ ไลบรารี DHT.h เสียกอน โดยไฟลไลบรารีจะมาพรอมกับไฟล ติดตั้งโปรแกรมที่ดาวนโหลดจาก https://www.dropbox.com/home?preview=IoTeduKit_Tools.rar เมือต ่ องการผนวกไฟลไลบรารี DHT.h เขาไปในโปรแกรม ใหใชคําสัง่ #include <DHT.h> กําหนดไวที่ตอนตนของโปรแกรม

3.5.4 ตัวอยางการทดสอบอานคาจาก DHT11 ดวย NodeMCU-12E ตัวอยางที่นําเสนอตอไปนี้ เปนการทดลองติดตอกับ ZX-DHT11 โดยใช NodeMCU-12E เพือ่ อานคาความชืนสั ้ มพัทธและอุณหภูมิ โดยพัฒนาโปรแกรมดวย Arduino IDE (3.5.4) ตอวงจรตามรูปที่ 3-16 เพือทดสอบการทํ ่ างาน NodeMCU-12E*

DHT-11 DHT11

out

D4/GPIO2 +3.3V GND

 A0 POWER

D4

5 0

D3

+3.3V

13

D7

GND

5

WiFi

D4

ESP-12E

12

D0 16 D1 5 D2 4 D3 0 D4 2 +3V3 GND D5 14 D6 12 D7 13 D8 15 D9 3 D10 1 GND

DHT11

14

D1

16

GPIO A0 RSV RSV SD3 10 D12 SD2 9 D11 INT/SD1 MOSI/CMD MISO/SD0 SCK/CLK GND +3V3 EN nRST GND

GPIO

out

INT/SD1 MOSI/CMD MISO/SD0 SCK/CLK

4

NodeMCU carrier board

D2

D0

AX-NodeMCU

+5Vdc

D6

SD2

D11 9

ADC SELECT

Vin

ON

2

VR

TxD2

SD3

D12 10

A0

    

GND

+Vcc +5V +3V3

D10

1

D9

3

IoT Education Kit รูปที่ 3-16 การตอวงจรเพื่อทดลองใชงาน ZX-DHT11ดวย NodeMCU-12E เพื่อวัดความชื้นสัมพัทธ แลวนําคามาแสดงทีหน ่ าตาง Serial Monitor ของ Arduino IDE


44   IoTIoT Education Kit - Lite

#include <DHT.h> #define DHTTYPE DHT11 #define DHTPIN D4

// Include DHT sensor library // Define type of sensor // Define connected pin

DHT dht(DHTPIN, DHTTYPE, 15);

// Initial DHT sensor

void setup() { dht.begin(); // Start DHT sensor operation Serial.begin(115200); // set serial port at 115200 bps } void loop() { float humid = dht.readHumidity(); // Read humidity data float temp = dht.readTemperature(); // Read temperature data Serial.print("Humidity = "); // Send string to serial port. Serial.print(humid); // Send analog value to serial port. Serial.print(" Temperature = "); // Send string to serial port. Serial.println(temp); // Send analog value to serial port. delay(300); // Delay 0.3 second before restart }

โปรแกรมที่ 3-6 ไฟล NodeMCU_DHT11.ino โปรแกรมทดลองใชงานโมดูล DHT11 ดวย NodeMCU-12E นําคามาแสดงทีหน ่ าตาง Serial Monitor ของ Arduino IDE

รูปที่ 3-17 ผลการอานคาจาก DHT11 ของโมดูล NodeMCU-12E มาแสดงผล ทีหน ่ าตาง Serial Monitor


 IoTIoT Education Kit - Lite  45

(3.5.2) เขียนคําสั่งตามโปรแกรมที่ 3-6 บันทึกไฟลเปน NodeMCU_DHT11.ino (3.5.3) อัปโหลดโปรแกรม เปดหนาตาง Serial Monitor โดยคลิกทีปุ่ มของ  Serial Minitor ทีอยู ่ มุ มบนขวาของหนาตางโปรแกรม Arduiono IDE จะเห็นหนาตาง Serial Monitor ปรากฏขึนมา ้ ตัง้ คาการทํางานดังนี้ (3.5.3.1) ตั้งคาอัตราบอดหรือบอดเรตที่ชองมุมขวาลางสุดเปน 115200 บิตตอวินาที (3.5.3.2) เลือก No line ending (3.5.3.3) คลิกทําเครืองหมายที ่ ช่ อง Autoscroll เพือให ่ การแสดงผลเกิดการเลือนบรรทั ่ ด อัตโนมัติเมือมี ่ ขอมูลใหมเขามา จะไดผลการทํางานตามรูปที่ 3-17

3.6 ทดสอบการเชือมต ่ อเครือขาย WiFi ของ NodeMCU-12E ในการทดสอบการเชื่อมตอเครือขาย WiFi ของ NodeMCU-12E จะตองเตรียมการดังนี้ (1) จัดเตรียมตัวกระจายคลื่น WiFi หรือเราเตอร (2) เตรียมรหัส SSID หรือชือเครื ่ อขายและ Password หรือรหัสผานของเครือขาย (3) เปดเราเตอรและรอจนพรอมทํางาน (4) สวนของ NodeMCU-12E ไมตองมีอุปกรณอินพุตเอาตพุตตอเพิมเติ ่ ม เพียงจายไฟให กับ NodeMCU-12E ดวยการเชือมต ่ อกับพอรต USB ของคอมพิวเตอร ก็พรอมสําหรับการรับโปรแกรม และสื่อสารขอมูลกับคอมพิวเตอร

รูปที่ 3-18 แสดงสวนของโมดูล WiFi และสายอากาศของ NodeMCU-12E


46   IoTIoT Education Kit - Lite

#include <ESP8266WiFi.h> // Include ESP8266 library const char* ssid = "Your SSID"; // SSID is set const char* password = "Your password"; // Password is set #define LEDpin D0 void setup() { Serial.begin(115200); // Enable UART Serial.println(); Serial.println(); Serial.print("Connecting to "); // Print title message Serial.println(ssid); // Print SSID name pinMode(LEDpin, OUTPUT); digitalWrite(LEDpin, 0); // WiFi detected indicator - active low WiFi.begin(ssid, password); // Send password while (WiFi.status() != WL_CONNECTED) // Check WiFi status { delay(500); Serial.print("."); // Print dot for showing the progress status } Serial.println(""); Serial.println("WiFi connected"); // Print the connected message Serial.println("IP address: "); // Print IP address Serial.println(WiFi.localIP()); } void loop() { digitalWrite(LEDpin, 0); // WiFi connected indicator - active low while (WiFi.status() != WL_CONNECTED)// Check WiFi status { digitalWrite(LEDpin, 0); // LED at D0 blink when disconnect WiFi delay(400); Serial.println("connection WiFi failed"); // Print error message digitalWrite(LEDpin, 1); delay(100); } }

คําอธิบายโปรแกรมเพิมเติ ่ ม สวนสําคัญของโปรแกรมนีคื้ อ การผนวกไฟลไลบรารี ESP8266.h เพราะไลบรารีนีจะทํ ้ าหนาทีกํ่ าหนด การทํางานของ WiFi ภายในตัว NodeMCU-12E ทังหมด ้ สิงที ่ ต่ องกระทําคือ กําหนดชือ่ SSID และ password หรือรหัสผานของเครือขาย WiFi ทีใช ่ ในการทดสอบ ดังนันผู ้ พั ฒนาโปรแกรมตองระบุใหถูกตอง การแจงสถานะการทํางานมี 2 สวนคือ แสดงผลผานทางหนาตาง Serial Monitor ดวยการใชคําสั่ง Serial.println(); และผาน LED บนตัว NodeMCU ที่ตอกับขาพอรต D0 โดยการขับให LED ตัวนี้ สวางตองเขียนขอมูล 0 ไปยังขาพอรต D0 (แอกตีฟดวยลอจิกตํา) ่ การกําหนดคารวมถึงการเชื่อมตอ WiFi จะเกิดขึ้นในฟงกชั่น setup(); ทั้งหมด สวนในฟงกชั่น loop(); เปนโปรแกรมตรวจสอบการเชื่อมตอ WiFi ดวยคําสั่ง while (WiFi.status() != WL_CONNECTED) หากการเชื่อมตอเปนปกติ LED ที่ขา D0 จะติดสวาง แตถาหากการเชื่อมตอลมเหลว LED จะกะพริบ และมีการแสดงขอความแจงการเชือมต ่ อลมเหลวทีหน ่ าตาง Serial Monitor

โปรแกรมที่ 3-7 ไฟล NodeMCU_WiFiTest.ino โปรแกรมทดสอบการเชือมต ่ อ WiFi ของ NodeMCU-12E


 IoTIoT Education Kit - Lite  47

เมื่อเตรียมความพรอมเรียบรอยแลว ทําการเขียนโปรแกรมที่ 3-7 คอมไพล และอัปโหลด โปรแกรมไปยัง NodeMCU-12E โดยในบรรทัด const char* ssid

= "Your SSID";

และ const char* password = "Your password";

ของโปรแกรมที่ 3-7 ผูพั ฒนาตองกําหนดชือ่ SSID และรหัสผาน password ของตัวเองทีเตรี ่ ยม ไวใสลงในโปรแกรม เมื่ออัปโหลดโปรแกรมเสร็จแลว คลิกปุม Serial Monitor เพือเป ่ ดหนาตาง Serial Monitor โดยการทํางานของ NodeMCU-12E นับจากนี้จะมีการรายงานสถานะการทํางานในทุกขั้นตอนที่ สําคัญมายังหนาตาง Serial Monitor นี้ เมื่อ NodeMCU-12E เริมทํ ่ างาน มันจะทําการเชื่อมตอกับเครือขาย WiFi ที่กําหหนด หนาตาง Serial Monitor แสดงขอความ Connecting to INEX และจุด .... ไปอยางตอเนืองดั ่ งรูป จนกวา จะเชื่อมตอ WiFi สําเร็จ


48   IoTIoT Education Kit - Lite

เมื่อ NodeMCU-12E เชื่อมตอ WiFi ไดแลว จะแสดงหมายเลข IP ที่ไดรับดังรูป พรอมกันนั้น LED ที่ตําแหนง D0 บนตัว NodeMCU-12E จะติดคาง

ในกรณีทีเครื ่ อขาย WiFi หยุดทํางาน ไมวาจะดวยสาเหตุใด NodeMCU-12E จะแสดงสถานะ การเชื่อมตอผานหนาตาง Serial Monitor ดวยขอความ connection WiFi failed ดังรูป LED ที่ตําแหนง D0 บนตัว NodeMCU-12E จะติดกะพริบเพือแจ ่ งเตือน

จากการทดสอบในบทนี้เปนการแสดงใหเห็นวา NodeMCU-12E สามารถเชือมต ่ อกับเครือขาย WiFi ไดไมยาก ดวยการกําหนดพารามิเตอรหลักๆ 2 ตัว นับเปนการเริมต ่ นทีดี่ สําหรับการพัฒนาอุปกรณ IoT ดวย ตัวเอง โดยใช NodeMCU-12E


IoTIoT Education Kit - Lite  49

 

    แนวคิดของ IoT (Internet of Things) คือ ตองการทําใหทุกอุปกรณสามารถติดตอสื่อสารกัน ไดทั่วโลก การจะบรรลุเปาหมายดังกลาวจะตองมีการวางระบบการทํางานที่ชัดเจน และมีความเปน มาตรฐานอยางเพียงพอ เพราะจะตองใหนักพัฒนาอุปกรณ IoT เห็นสอดคลอง และยอมรับกรอบกติกา ของรูปแบบการสือสารข ่ อมูล ระบบ IoT จะเกิดขึ้นไดตองมีองคประกอบครบอยางนอย 5 อยางคือ 1. สิ่งของ 2. อุปกรณ (ตัวควบคุม, ตัวตรวจจับ และอุปกรณขับโหลดหรืออุปกรณเอาตพุต) 3. ระบบเชื่อมตออินเทอรเน็ต (จะเปนแบบมีสายหรือไรสายก็ได) 4. ขอมูล 5. ระบบจัดการฐานขอมูลคลาวดเซิรฟเวอร (Cloud server) ในบทกอนหนานี้ไดอธิบายถึงอุปกรณ อันประกอบดวย บอรดควบคุม NodeMCU-12E ตัวตรวจจับ และตัวแสดงผลแบบตางๆ รวมถึง การเชือมต ่ อกับเครือขายขอมูลไรสาย WiFi ในบทนี้ จะอธิบายเกี่ ยวกั บการเชื่อมตอเครื อขายอินเทอรเน็ตและกับคลาวดเซิรฟเวอร นําเสนอตัวอยาง โปรแกรมในการทดสอบการทํางาน เพื่อใหเขาใจถึงกลไกในการทํางาน

4.1 กลไกการทํางานโดยรวมของอุปกรณ IoT ในรูปที่ 4-1 แสดงไดอะแกรมการทํางานโดยรวมของอุปกรณ IoT อยางงายโดยใช NodeMCU12E เปนตัวควบคุมหลัก จะเห็นวา NodeMCU จะตองเชื่อมตอกับเครือขาย WiFi ภายใน โดยตอกับ เราเตอรในแบบไรสาย จากนั้นเชื่อมตอกับเครือขายอินเทอรเน็ตโดยใชบริการของผูให  บริการหรือ Internet Service Provider (ISP) แลวสงผานขอมูลไปเก็บไวยังคลาวดเซิรฟเวอร ซึ่งทําหนาทีเป ่ นตัว กลางหรือโบรกเกอร (broker) เพื่อแลกเปลี่ยนขอมูลที่สงขึ้นไปจาก NodeMCU-12E กับอุปกรณอื่นๆ บนเครือขายอินเทอรเน็ต โดยคลาวดเซิรฟเวอรที่เลือกมาเปนตัวอยางคือ dweet.io


50 IoTIoT Education Kit - Lite

รูปที่ 4-1 ไดอะแกรมการทํางานโดยรวมของอุปกรณ IoT อยางงายโดยใช NodeMCU-12E เปนตัวควบคุม หลัก


IoTIoT Education Kit - Lite  51

เมือข ่ อมูลถูกฝากไวที่ dweet.io แลว จะมีขันตอนการจั ้ ดการเล็กนอย เพือทํ ่ าใหผูดู แลระบบหรือ ใชขอมูลไดรับตําแหนงของเซิรฟเวอรทีใช ่ เก็บขอมูล ซึงข ่ อมูลนันมั ้ กเปนขอมูลดิบ อาจสือสารกั ่ บบุคคล ทัวไปได ่ อยางจํากัด จึงตองหาตัวชวยเพือทํ ่ าใหขอมูลทีอุ่ ปกรณ IoT เก็บรักษาไวสือสารกั ่ บผูสนใจให  ดู งายขึน้ เว็บไซตทีเลื ่ อกมาใชในการอธิบายในทีนี่ คื้ อ freeboard.io ทําหนาทีเป ่ นหนาปดของระบบ โดย ตัว freeboard มีการจัดการขอมูลทีเข ่ ากับ dweet.io ไดเปนอยางดี ที่ freeboard.io จะมีตัวอยางของหนาปด แสดงผลใหเลือกคอนขางหลากหลาย และผูใช  งานสามารถตังชื ้ อของข ่ อมูลและหนวยทีต่ องการแสดงผล ในการใชงานทัง้ dweet.io และ freeboard.io มีทังแบบฟรี ้ และแบบมีคาใชจาย สําหรับในหนังสือเลมนี้ เลือกแบบไมมีคาใชจาย เพือให ่ ผูสนใจทุ  กคนไดทดลองใชงานใหคลองกอน หากตองการความสามารถ หรือขนาดของพืนที ้ เก็ ่ บขอมูลมากขึน้ จึงคอยเลือกชองทางแบบมีคาใชจายตอไป ดังนั้น โดยสรุปขั้นตอนการพัฒนาอุปกรณ IoT อยางงาย มีดังนี้ (1) พัฒนาฮารดแวร (2) พัฒนาโปรแกรมบนตัวฮารดแวรหรืออุปกรณเพืออ ่ านคาหรือสังการอุ ่ ปกรณตอพวงให สมบูรณ (3) พัฒนาโปรแกรมเพื่อเชือมต ่ อกับเว็บไซต dweet.io (4) นําขอมูลจาก dweet.io มาแสดงผลดวยหนาปดที่เลือกจากเว็บไซต freeboard.io

4.2 เกี่ยวกับ dweet.io dweet.io (อานวา ดะ-วีต) เปนเว็บไซตที่ทําหนาทีเป ่ นคลาวดเซิรฟเวอร (cloud server) สําหรับ งาน IoT โดยเฉพาะ จัดตังโดย ้ Bug Labs, Inc. โดย dweet.io ทําหนาทีเป ่ นไดทั้งตัวใหขอมูลหรือพับ ลิชเชอร (publisher) และตัวบอกรับขอมูลหรือซับสไครเบลอร (subscribler) จึงทําให dweet.io ทําหนา ทีเป ่ นตัวกลางจัดการขอมูลหรือโบรกเกอรไดเปนอยางดี ในรูปที่ 4-2 แสดงไดอะแกรมของความเกียว ่ ของของสวนประกอบที่ชวยในการจัดการขอมูลของอุปกรณ IoT อุปกรณใหขอมูล (Publisher) โนดตัวตรวจจับ แอปพลิเคชั่น

แจงสงขอมูล ขอมูลที่สง

ตัวกลางจัดการขอมูล (Broker)

แจงสถานะ พรอมรับขอมูล

อุปกรณบอกรับขอมูล (Subscribe)

ขอมูลที่สง

โนดอุปกรณขับโหลด แอปพลิเคชั่น

รูปที่ 4-2 ไดอะแกรมการทํางานของสวนจัดการขอมูลในคราวดเซิรฟเวอรของอุปกรณ IoT


52 IoTIoT Education Kit - Lite

จุดเดนของ dweet.io คือ ใชรูปแบบการถายทอดขอมูลในลักษณะขอความสัน้ คลายๆ กับการ ทวีตในเว็บไซตทวีตเตอร (tweeter.com) นันคื ่ อ dweet จึงเปนการลอคํามาจาก tweet โปรโตคอลการรับ สงขอมูลของ dweet.io เปนแบบ http แตเนืองจากใช ่ แนวคิดแบบขอความสัน้ จึงทําใหขนาดของการสง ผานขอมูลมีขนาดกะทัดรัด เพียงระบุชือของตํ ่ าแหนงทีเก็ ่ บขอมูลหรือเรียกวา Thing แลวตามดวยชือของ ่ ขอมูล คาของขอมูล ซึงเพี ่ ยงพอตอการสงและอานขอมูลของตัวตรวจจับ, ตัวควบคุม, หุนยนต  และ อุปกรณสือสารสมั ่ ยใหม ซึงนั ่ นเป ่ นไปตามความตองการของการพัฒนาอุปกรณ IoT ขนาดของขอมูลที่ dweet.io รองรับไดตอการถายทอดขอมูลแตละครั้งคือ สูงสุดไมเกิน 2,000 ตัวอักษร หากเทียบกับ tweeter นับวา ใหญกวามาก เพราะ tweeter จํากัดไวที่ 140 ตัวอักษร การใชงาน dweet.io มีทั้งแบบไมมีคาใชจายและแบบเสียคาใชจาย ในกรณีที่เปดใหการเขาถึง Thing แตละตัวใน dweet.io เปนแบบสาธารณะ จะใชงานไดโดยมีคาใชจาย แตถาหากตองการชือ่ Thing ที่เฉพาะเจาะจง เปนสวนตัว รวมถึงมีการปองกันการเขาถึง จะตองเสียคาใชจายในราคา 0.99 ดอลลารสหรัฐตอล็อก (lock) ตอเดือน ดานการเก็บรักษาขอมูล dweet.io จะเก็บขอมูล 500 ครังล ้ าสุดไวภายใน 24 ชัวโมง ่ และถาหาก ไมมีการใชงานขอมูลในตําแหนงนันเลย ้ 24 ชัวโมง ่ ขอมูลทังหมดจะหายไป ้ เมือเป ่ นเชนนัน้ ผูใช  งาน สามารถเชือมต ่ อขอมูลในแตละตําแหนงไปยังเว็บไซตสํารองขอมูลชือดั ่ ง อาทิ Dropbox, AWS, TempoDB ซึงการทํ ่ าเชนนันผู ้ ใช  งานตองดําเนินการเอง ทาง dweet.io ยังไมมีเครืองมื ่ อรองรับ (ในขณะทีจั่ ดทํา หนังสือเลมนี)้ ดังนัน้ หากตองการใชฟรีและไดความเปนสวนตัว แนะนําใหตังชื ้ อตํ ่ าแหนงหรือ Thing ที่เปนพิเศษ และยากที่จะมีคนอื่นใชซํ้าได สําหรับการถายทอดขอมูล dweet.io มี API (Application Programming Interface) ชวย โดย เขาไปที่ https://dweet.io/play ทําใหใชงานงาย โดย dweet.io ไมตองการการติดตังหรื ้ อการลงทะเบียน ใดๆ เพียงใหขอมูลแลวสงตอออกไป ขั้นตอนจึงสั้น งาย กระชับ เหมาะอยางยิ่งกับการสือสารข ่ อมูล ระหวางเครื่องจักรตอเครื่องจักรหรือ M2M (machine-to-machine) ซึ่งก็คือ แนวคิดของ IoT นั่นเอง

4.3 ตัวอยางการทดลองเพือเชื ่ อมต ่ อ NodeMCU-12E กับ dweet.io 4.3.1 ติดตอเบื้องตน ในตัวอยางแรกนี้จะทดสอบการเชือมต ่ อกับเว็บไซต dweet.io ของ NodeMCU-12E (4.3.1.1) พิมพโปรแกรมที่ 4-1 ลงบน Arduino IDE (4.3.1.2) อัปโหลดไปยัง NodeMCU-12E


IoTIoT Education Kit - Lite  53

#include <ESP8266WiFi.h> const char* ssid = "Your SSID"; const char* password = "Your password"; const char* host = "dweet.io"; void setup() { Serial.begin(115200); delay(10); Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); }

// // // //

Include main library Set SSID Set password Set host

// Print setting message

// Print WiFi status

// Print connect status // Print IP address

void loop() { // Use WiFiClient class to create TCP connections WiFiClient client; const int httpPort = 80; // Set HTTP Port if (!client.connect(host, httpPort)) // Test connection { Serial.println("connection failed"); // Print connection fail messag return; } //https://dweet.io/get/latest/dweet/for/Test01 client.print(String("GET /get/latest/dweet/for/Test01 HTTP/1.1\r\n") + "Host: " + host + "\r\n" + "Connection: keep-alive\r\n" + "Cache-Control: max-age=0\r\n\r\n"); delay(3000); while (client.available()) { String line = client.readStringUntil('\r'); Serial.println(line); } }

โปรแกรมที่ 4-1 ไฟล NodeMCU_dweetTest.ino โปรแกรมทดสอบการติดตอเว็บไซต dweet.io ของ NodeMCU-12E (มีตอ)


54 IoTIoT Education Kit - Lite

คําอธิบายโปรแกรมเพิมเติ ่ ม เมือรั ่ นโปรแกรม NodeMCU-12E จะทําการเชือมต ่ อกับเครือขาย WiFi เพือออกสู ่ เครื  อขายอินเทอรเน็ตผาน เราเตอร คําสังในการเชื ่ อมต ่ อจะอยูในฟ  งกชัน่ setup() ทังหมด ้ เมือเชื ่ อมต ่ อไดแลว จะทําการสรางการเชือมต ่ อแบบ TCP โดยใชคําสัง่ client.connect(host, httpPort) เพือทดสอบการเชื ่ อมต ่ อกับเว็บไซตกอน ถาเชือมต ่ อไมได จะแสดงขอความ “connection failed” ใน โปรแกรมกําหนด host เปน dweet.io ตามการประกาศตัวแปร const char* host = "dweet.io"; ทีส่ วนหัวของโปรแกรม และ httpPort เปน 80 ตามการประกาศทีบรรทั ่ ด const int httpPort = 80; ลําดับตอไปเปนสงคําขอไปยังเซิรฟเวอร dweet.io ดวยคําสัง่ client.print() ใชเมธอด GET ไปยังโลคัลพาธ /get/latest/dweet/for/Test01 ทีต่ องการถาม สําหรับเวอรชันของ ่ HTTP กําหนดเปน HTTP/ 1.1 สวน Host ใช dweet.io การเชื่อมตอกับเซิรฟเวอรจะเปนแบบ Connection: keep-alive คือ ไม ตองปดการเชือมต ่ อ เพราะจะมีการเชือมต ่ ออยางตอเนือง ่ ตอมาทําการแสดง Response Code, Response Headers และ Response Body ตามทีปรากฏใน ่ รูปที่ 8-3 และ 8-4 ดวยคําสัง่ client.readStringUntil('\r') นํามาแสดงเปนขอความดวยคําสัง่ Serial.println()

โปรแกรมที่ 4-1 ไฟล NodeMCU_dweetTest.ino โปรแกรมทดสอบการติดตอเว็บไซต dweet.io ของ NodeMCU-12E (จบ) (4.3.1.3) เปดหนาตาง Serial Monitor จะเห็นผลการทํางานตามรูปที่ 4-3 เริ่มตนดวยการพิมพสถานะการเชือมต ่ อ, ชื่อ SSID, หมายเลข IP แอดเดรส ตามดวย ขอความแจงรูปแบบของโปรโตคอล จนถึงบรรทัดแสดงสถานะการติดตอจริงแจงวา {"this":"failed","with":404,"because":"We couldn’t find this"}

หมายถึง ไมพบขอมูลหรือ Thing ที่ตองการเชื่อมตอ

รูปที่ 4-3 หนาตาง Serial Monitor แสดงผลการติดตอกับ dweet.io ของ NodeMCU-12E ทีล่ มเหลว


IoTIoT Education Kit - Lite  55

(4.3.1.4) จากผลในขอ (4.3.1.3) จึงตองทําการกําหนดชือตํ ่ าแหนงหรือ Thing ที่ตองการ ในเว็บไซต dweet.io เสียกอน โดยเปดเว็บบราวเซอร อาทิ Google Chrome แลวพิมพคําสังต ่ อไปนี้ ลงในชองปอน URL หรือตําแหนงของเว็บไซต แลวกด Enter https://dweet.io/dweet/for/Test01?Hello

เปนการกําหนดชื่อ Thing เปน Test01 และกําหนดขอความเปน Hello (4.3.1.5) กลับไปดูที่หนาตาง Serial Monitor ใหม จะไดผลดังรูปที่ 4-4 จะเห็นการเปลี่ยนแปลงขึ้นที่บรรทัดสุดทาย เปนการแจงวา {"this":"succeeded","by":"dweeting","the":"dweet", "with":"thing":"Test01","created":"2015-11-19T11:36: 27.801Z","content":{"Hello":""}}}

หมายถึง ขณะนี้ NodeMCU-12E ติดตอกับ dweet.io ดวย thing ที่ชือว ่ า Test01 และ อานขอความไดวา Hello

ขอพึงปฏิบติั กอนการอานคาจาก dweet.io จะตองมีการกําหนดชือตํ ่ าแหนงหรือ Thing กอนเสมอ ดวยคําสัง่ ทีมี่ รูปแบบดังนี้ https://dweet.io/dweet/for/Thing_name?Message

โดยที่

คือชือของข ่ อมูลหรือ Thing Message คือ ขอความใดๆ Thing_name

รูปที่ 4-4 หนาตาง Serial Monitor แสดงผลการติดตอกับ dweet.io ของ NodeMCU-12E ไดสําเร็จ


56 IoTIoT Education Kit - Lite

4.3.2 สงคาของตัวตรวจจับไปยังคลาวดเซิรฟเวอร ในตัวอยางนีจะเพิ ้ มความซั ่ บซอนและความสามารถของระบบ จากตัวอยางแรกเปนการทดสอบ การเชือมต ่ อ โดยในตัวอยางนี้จะทําใหเห็นการทํางานเปนตัวกลางในการแพรขอมูลหรือโบรกเกอร (broker) ของคลาวดเซิรฟเวอร dweet.io มากยิงขึ ่ น้ NodeMCU-12E จะสงขอมูลไปยังคลาวดเซิรฟเวอรซึงทํ ่ าหนาทีเป ่ นตัวกลางหรือโบรกเกอรเพือ่ ใหอุปกรณอืนๆ ่ หรือแมกระทังผู ่ ใช  งานอินเทอรเน็ตติดตอสือสารผ ่ านทางนี้ แทนทีจะเข ่ าถึงตัวอุปกรณ NodeMCU-12E โดยตรง ในทีนี่ ใช ้ เว็บไซต dweet.io ทําหนาทีเป ่ นโบรกเกอร เพือเขี ่ ยนและอานคา

4.3.2.1 การระบุตําแหนงของคลาวเซิรฟเวอร เมื่อใช dweet.io ในการใช dweet.io เปนคลาวดเซิรฟเวอรและทําหนาทีเป ่ นโบรกเกอรในระบบ IoT จะมีขอ กําหนดในการเก็บและอานขอมูลกับคลาวดเซิรฟเวอร (4.3.2.1.1) เริ่มจากตังชื ้ ่อตําแหนงหรือชื่อของ Thing เปนของตัวเองกอน เพราะชือ่ Thing เปนตัวระบุบตัวตนของอุปกรณที่สงขอมูลไปยัง dweet.io มีรูปแบบดังนี้ http://www.dweet.io/dweet/for/Thing_name?Value=Data

โดยที่

คือชือของข ่ อมูลหรือ Thing Message คือ ขอความใดๆ Data คือ คาหรือขอมูล Thing_name

ตัวอยางที่ 4-1 http://www.dweet.io/dweet/for/Test_Thing?val=b1101

สรุปไดวา Thing คือ Test_Thing ชื่อขอมูล คือ val คาทีต่ องการสงไปยัง dweet.io คือ b1101 หรือ เลขฐานสอง 1101 (4.3.2.1.2) เปดเว็บบราวเซอรขึนมา ้ นํา URL ทีได ่ ไปใสลงในชองปอนตําแหนง URL ดังรูปที่ 8-5 กดคีย Enter จะเริมการส ่ งขอมูลไปยังเว็บไซต dweet.io ในรูปแบบ เมธอด GET

รูปที่ 4-5 แสดงการสงขอความไปยัง dweet.io และการแสดงผล


IoTIoT Education Kit - Lite  57

(4.3.2.13) เมือเว็ ่ บบราวเซอรไดรับคําสัง่ ก็จะเปดเว็บเพจเพือแสดงผล ่ ดังรูปที่ 4-5 คาทีแสดงอยู ่  รูปในรูปแบบ json เปนดังนี้ {"this":"succeeded","by":"dweeting","the":"dwee t" , "with":{"thing":"Test_Thing,"creatd":”2015-07-19T05:27:25. 952Z”,“content":{"val":"b1101"}}}

จะเห็นไดวา ขอความที่ไดจะมีชือ่ Thing ที่กําหนดไว และ คาอื่นๆ ที่ระบุดวย ดังนั้นใน การทดลองนับจากนี้จะใชวิธีนี้ ในการสงคาไปยัง dweet.io

4.3.2.2 การดูขอมูลจากคลาวเซิรฟเวอร เมื่อใช dweet.io เมื่อทําการสงขอมูลไปยัง dweet.io แลว หากตองการดูขอมูล มีขั้นตอนดังนี้ (4.3.2.2.1) เขาไปที่ http://www.dweet.io/ ดังรูป แลวคลิกที่ Play

(4.3.2.2.2) คลิกไปที่ /get/latest/dweet/for/{thing} จะปรากฏชองใสชือ่ Thing ที่เคยสง ขึ้นไป ในที่นี้คือ Test_Thing


58 IoTIoT Education Kit - Lite

(4.3.2.2.3) จะสังเกตไดวา ทีรายการ ่ Resquest URL จะแสดง URL ทีทํ่ าการถามคาลาสุด ซึงส ่ งมายัง dweet.io จะใช URL นีในการดู ้ คาลาสุดจาก dweet.io และขอมูลทีได ่ กลับมาจะอยูในรู  ปแบบ json ดังรูป

จะมี ชือ่ Thing ที่ระบุ, วันเวลาทีส่ ง (created), คาตางๆ ที่สงเขามา นอกจากนั้น ยังมี ความสามารถในการดูคาทังหมดที ้ ส่ งเขามา ศึกษารายละเอียดเพิมเติ ่ มไดจาก dweet.io

4.3.3 ตัวอยางโปรแกรมทดสอบใชงาน dweet.io เปนโบรกเกอร ในการทดลองนี้ NodeMCU-12E จะสงคาจํานวนนับและคาขอมูลดิจิตอลที่ไดจากการแปลง สัญญาณอะนาลอกเปนดิจิตอลไปยังเว็บไซต dweet.io (4.3.3.1) ตอวงจรตามรูปที่ 4-6 (4.3.3.2) พิมพคําสั่งในโปรแกรมที่ 4-2 ลงใน Arduino IDE (4.3.3.3) ทําการอัปโหลดไฟลไปยัง NodeMCU-12E


IoTIoT Education Kit - Lite  59

     A0

A0

NodeMCU carrier board

TxD0 RxD0

5

D3 14

D5 13

D7 5

D8

2

D4

WiFi

12

ESP-12E

D6

D0 16 D1 5 D2 4 D3 0 D4 2 +3V3 GND D5 14 D6 12 D7 13 D8 15 D9 3 D10 1 GND

D2

GPIO A0 GPIO RSV RSV SD3 10 D12 SD2 9 D11 INT/SD1 MOSI/CMD MISO/SD0 SCK/CLK GND +3V3 EN nRST GND

TxD2

INT/SD1 MOSI/CMD MISO/SD0 SCK/CLK

 

D1

AX-NodeMCU

+5Vdc

4

SD2

D11 9

ADC SELECT

Vin

ON

0

VR

16

SD3

A0

POWER D12 10

VR1 10k

NodeMCU-12E*

D0

+3.3V

+Vcc +5V +3V3

D10

1

D9

3

IoT Education Kit รูปที่ 4-6 วงจรทดลองการนําขอมูลของอินพุตอะนาลอกของ NodeMCU-12E สงไปยังคลาวดเซิรฟเวอร

รูปที่ 4-7 หนาตาง Serial Monitor แสดงผลการทํางานของการติดตอระหวาง NodeMCU-12E และเว็บไซต dweet.io


60 IoTIoT Education Kit - Lite

#include <ESP8266WiFi.h> // Include main library const char* ssid = "Your SSID"; // Set your SSID const char* password = "Your password"; // Set your password const char* thing = "NodeMCU_Send"; // Set Thing name const char* host = "dweet.io"; // Set host int count = 0; int sensorValue = 0; void setup() { Serial.begin(115200); // Print setting message delay(10); Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); // Print WiFi status } Serial.println(""); Serial.println("WiFi connected"); // Print connect status Serial.println("IP address: "); Serial.println(WiFi.localIP()); // Print IP address } void loop() { sensorValue = analogRead(A0); // Read analog input delay(1000); ++count; // Count value WiFiClient client; const int httpPort = 80; // Set HTTP port if (!client.connect(host, httpPort))// Test connection { Serial.println("connection failed"); // Print connection fail message return; } String url = String("/dweet/for/") + thing + "?"; // Set message url += "count="; url += count; url += "&Analog="; url += sensorValue; client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: keep-alive\r\n" + "Cache-Control: max-age=0\r\n\r\n"); Serial.println("URL : ");

โปรแกรมที่ 4-2 ไฟล NodeMCU_dweetGet.ino โปรแกรมสําหรับกําหนดให NodeMCU เชือมต ่ อกับเว็บไซต dweet.io เพือส ่ งคาอินพุตอะนาลอก โดยรหัส SSID และ password จะขึนกั ้ บเครือขายทีใช ่ งาน (มีตอ)


IoTIoT Education Kit - Lite  61 Serial.println(url); delay(3000);

// Print URL

while (client.available()) { String line = client.readStringUntil('\r'); Serial.print(line); } Serial.println(); Serial.println("closing connection"); // Print closing status }

คําอธิบายโปรแกรมเพิมเติ ่ ม เมือ่ NodeMCU-12E ทํางาน จะทําการตอ WiFi และแสดงหมายเลข IP แอดเดรสทีได ่ จากนันกระทํ ้ าคําสัง่ ่ อมต ่ อ WiFi ถัดมาทําการ while (WiFi.status() != WL_CONNECTED) เพือตรวจสอบการเชื แสดง URL ทีจะส ่ งไปยัง dweet.io ดวยคําสัง่ client.print แลวแสดง Response ทีได ่ จากการสงขอมูลดวยคําสัง่ client.readStringUntil('\r')

ดานการประกาศตัวแปร มีดังนี้ ่ ่อ thing const char* thing = "NodeMCU_Send"; เปนตัวแปรทีระบบชื const char* host = "dweet.io";

เปนชื่อโฮสตที่สงขอมูลเขาไป (ชื่อเว็บไซต) ถาตองการสงขอมูลมากกวา 1 คา จะมีรูปแบบดังนี้ /dweet/for/NodeMCU_Send?count=2&Analog=703

โดยที่

NodeMCU_Send คือชื่อ Thing count เปนชือที ่ ระบุ ่ คาจํานวนนับ

่ ระบุ ่ คาอะนาลอกทีอ่ านได Analog เปนชือที & คันระหว & คันไว สังเกตไดวาจะมีเครืองหมาย ่ ่ างชุดขอมูล ถาตองการเพิมชุ ่ ดขอมูลใหใชเครืองหมาย ่ ่ สําหรับรูปแบบการสงขอมูลเปนแบบ เมธอด GET

โปรแกรมที่ 4-2 ไฟล NodeMCU_dweetGet.ino โปรแกรมสําหรับกําหนดให NodeMCU เชือมต ่ อกับเว็บไซต dweet.io เพือส ่ งคาอินพุตอะนาลอก โดยรหัส SSID และ password จะขึนกั ้ บเครือขายทีใช ่ งาน (จบ)


62 IoTIoT Education Kit - Lite

(4.3.3.4) เปดหนาตาง Serial Monitor เพื่อแสดงผลลัพธดังรูปที่ 8-7 (4.3.3.5) ลําดับถัดมาเปนการตรวจสอบขอมูลที่สงไปยัง dweet.io ไปที่เว็บไซต http:// www.dweet.io/ แลวคลิกที่ Play (4.3.3.6) จากนั้นคลิกที่ /get/latest/dweet/for/{thing}

(4.3.3.7) จะปรากฏชองใสชือ่ Thing ดังรูป แลวคลิกที่ Try is out!


IoTIoT Education Kit - Lite  63

(4.3.3.8) จะสังเกตไดวา ที่ตําแหนง Resquest URL จะแสดง URL ทีทํ่ าการถามคาลาสุด ที่สงไปยัง dweet.io ดังรูป

(4.3.3.9) ใช URL นี้ในการดูคาลาสุดจาก dweet.io ขอมูลที่ไดกลับมาอยูในรูปแบบ json มีการแสดงชือ่ Thing และวันเวลาที่สรางขึ้นหรือสงขึ้นมา ดังรูปที่ 4-8

รูปที่ 4-8 หนาเว็บเพจของ dweet.io แสดงการอานขอมูลจาก Thing ทีชื่ อ่ NodeMCU_Send โดยขอมูลจริงจะ มีการปรับปรุงทุกๆ 1 วินาที แตถาตองการดูผานเว็บเพจ จะตองกดคีย F5 เพือปรั ่ บปรุงการแสดงผลของ เว็บเพจ


64 IoTIoT Education Kit - Lite

IoT Education Kit - Lite manual