ใบงานที่ 4.20 การเขียนโปรแกรมแสดงผลดว้ ยจอ OLED 128×64 245
ใบงานที่ 4.20
การเขยี นโปรแกรมแสดงผลด้วยจอ OLED ทเี่ ช่ือมต่อแบบ I2C
1. จุดประสงค์ทวั่ ไป
เพื่อใหส้ ามารถเขียนโปรแกรมแสดงผลดว้ ยจอ OLED ท่ีเช่ือมตอ่ แบบ I2C ได้
2. จุดประสงค์เชิงพฤตกิ รรม
1. บอกวธิ ีเขียนโปรแกรมแสดงผลดว้ ยจอ OLED ท่ีเชื่อมต่อแบบ I2C ได้
2. บอกข้นั ตอนการตอ่ วงจรเพอ่ื ทดลองบนบอร์ดทดลองได้
3. ทดสอบการทางานของบอร์ด Arduino ได้
4. ปฏิบตั ิงานตามใบงานเสร็จทนั เวลาท่ีกาหนด
3. เคร่ืองมือและอปุ กรณ์
1. บอร์ดทดลอง Breadboard 830 Point 1 แผน่
2. บอร์ด Arduino Nano 3.0 1 ตวั
3. OLED ขนาด 128×64 แบบ I2C ที่ใชไ้ ดร์เวอร์เบอร์ SSD1306 1 ตวั
4. สายเช่ือมต่อ USB (Mini USB) 1 เส้น
5. สายเช่ือมตอ่ วงจร 1 ชุด
6. คอมพิวเตอร์ 1 เครื่อง
4. ลาดบั ข้นั การปฏบิ ตั งิ าน
1. ศึกษาจุดประสงคท์ วั่ ไป จุดประสงคเ์ ชิงพฤติกรรมและทฤษฎีพ้ืนฐานท่ีเกี่ยวขอ้ ง
2. ดาเนินการต่อวงจรลงบอร์ดทดลองตามวงจรที่กาหนด
3. เขียนโปรแกรมควบคุมและทดสอบการทางานของวงจร
4. สรุปผลการปฏิบตั ิงาน
246 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]
5. ทฤษฎพี ืน้ ฐาน
OLED (Organic Light-Emitting Diode) เป็ นจอแสดงผลกราฟิ กประเภทหน่ึงท่ีสร้างจากวสั ดุ
"สารก่ึงตวั นาอินทรีย"์ (Organic Semiconductor) ที่สามารถเปล่งแสงเองได้เมื่อได้รับพลงั งานไฟฟ้า
เรียกวา่ กระบวนการอิเล็คโทรลูมิเนเซนส์ (Electroluminescence) โดยท่ีไม่ตอ้ งพ่ึงพาแสงสวา่ งท่ีส่องมา
จากดา้ นหลงั (Backlight) และจะไม่มีการเปล่งแสงแสดงในบริเวณท่ีเป็ นภาพสีดาส่งผลให้สีดาน้ันดา
สนิทและยงั ช่วยประหยดั พลงั งาน โมดูลแสดงผล OLED ขนาด 128×64 มีหลายแบบใหผ้ ใู้ ชง้ านสามารถ
เลือกใชต้ ามความเหมาะสมของแตล่ ะงานไดด้ งั รูปท่ี 4.20-1
รูปที่ 4.20-1 โมดูลจอ OLED ที่นิยมนามาใชง้ านกบั ไมโครคอนโทรลเลอร์
โมดูลจอแสดงผลกราฟิ กแบบ OLED 128×64 ท้งั ท่ีใชก้ ารเช่ือมต่อแบบ I2C และแบบ SPI มีชิพ
ไดร์เวอร์อยดู่ ว้ ยกนั 2 เบอร์ท่ีมีการใชง้ านอยา่ งแพร่หลายคือ SSD1306 และ SH1106 ดงั น้นั การเตรียมการ
จดั หาอุปกรณ์เพ่ือนามาใชง้ านตอ้ งรู้วา่ โมดูลจอ OLED ใชช้ ิพไดร์เวอร์ตวั ใดเนื่องจากจะตอ้ งใชไ้ ลบรารี่
ใหต้ รงกบั ชิพไดร์เวอร์ของโมดูลจอ
ใบงานน้ีเป็นการทดลองใชง้ านโมดูลจอแสดงผลกราฟิ กแบบ OLED ขนาด 128×64 พกิ เซลเป็ น
จอแสดงผลแบบให้แสงเพียงสีเดียว (Monochrome) ที่ใชก้ ารเช่ือมต่อส่ือสารแบบ I2C และใชช้ ิพควบคุม
เบอร์ SSD1306 การเขียนโคด้ โปรแกรมเพ่ือใชง้ านการแสดงผลจอ OLED จาเป็นตอ้ งใชไ้ ลบรารี่ช่วยงาน
พร้อม ๆ กนั สองตวั ซ่ึงท้งั หมดตอ้ งดาวน์โหลดเพิ่มเติมเนื่องจากโปรแกรม Arduino IDE ไม่ไดม้ ีการ
ติดต้งั มาใหต้ ้งั แต่เริ่มตน้ จึงจาเป็ นตอ้ งมีการติดต้งั เพม่ิ เติ่มเขา้ ไปในโปรแกรม ไลบราร่ีท้งั สองตวั คือ
ไลบรารี่ แหล่งดาวน์โหลด
Adafruit_GFX.h https://github.com/adafruit/Adafruit-GFX-Library
Adafruit_SSD1306.h https://github.com/adafruit/Adafruit_SSD1306
สาหรับ OLED ที่ใชช้ ิพควบคุม SH1106.h จะตอ้ งเปล่ียนไลบราร่ีมาใช้ Adafruit_SH1106.h แทน
Adafruit_SH1106.h https://github.com/wonho-maker/Adafruit_SH1106
ใบงานท่ี 4.20 การเขียนโปรแกรมแสดงผลดว้ ยจอ OLED 128×64 247
การตดิ ต้ังไลบรารี่ มีข้นั ตอนการดาเนินการเพื่อนาไลบราร่ีมาใชง้ านดงั น้ี
1. ดาวนโ์ หลดไลบราร่ี Adafruit_GFX.h ซ่ึงเป็นไฟล์ Zip ดงั รูป
รูปท่ี 4.20-2 การดาวน์โหลดไลบราร่ีท่ีนามาใชง้ าน
2. ดาวน์โหลดไลบรารี่ Adafruit_SSD1306.h ซ่ึงเป็นไฟล์ Zip ดงั รูป
รูปที่ 4.20-3 การดาวน์โหลดไลบรารี่ท่ีนามาใชง้ าน
3. ทาการเพิม่ ไลบราร่ีท้งั สองตวั ลงในโปรแกรม Arduino IDE โดยการเพ่ิมจากไฟล์ zip แลว้ ทาการ
หาไฟล์ zip ที่ไดจ้ ากการดาวนโ์ หลดในขอ้ 1 และ 2
รูปท่ี 4.20-4 การเพิม่ ไลบรารี่ลงในโปรแกรม Arduino IDE
เน่ืองจากค่าเร่ิมตน้ ของไลบรารี่กาหนดขนาด OLED เป็ น 128×32 ดงั น้นั เมื่อใชง้ านกบั OLED
ขนาด 128×64 จะทาให้ตวั อกั ษรยืดในแนวต้งั ซ่ึงจะตอ้ งแกไ้ ขไฟลไ์ ลบาร่ี Adafruit_SSD1306.h โดยเขา้
ไปยงั โฟลเดอร์ที่เกบ็ ไลบราร่ี แลว้ ทาการแกไ้ ขค่าในไฟลด์ งั กล่าว ซ่ึงมีข้นั ตอนดงั น้ี
248 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]
1. เขา้ โฟลเดอร์ Documents ของเครื่องแลว้ เขา้ โฟลเดอร์ Arduino (คลิก 1, 2, 3)
รูปท่ี 4.20-5 วธิ ีเขา้ โฟลเดอร์ Arduino
2. เขา้ ไปในโฟลเดอร์ libraries ซ่ึงอยภู่ ายในโฟลเดอร์ Arduino
รูปท่ี 4.20-6 วธิ ีเขา้ โฟลเดอร์ libraries
3. เขา้ ไปในโฟลเดอร์ Adafruit_SSD1306 ซ่ึงอยภู่ ายในโฟลเดอร์ libraries
รูปท่ี 4.20-7 วธิ ีเขา้ โฟลเดอร์ Adafruit_SSD1306
4. เขา้ ไปแกไ้ ขไฟล์ Adafruit_SSD1306.h โดยใชโ้ ปรแกรมท่ีใชเ้ ปิ ดไฟล์เอกสารไดเ้ ช่น WordPad
รูปท่ี 4.20-8 ไฟล์ Adafruit_SSD1306.h
ใบงานที่ 4.20 การเขียนโปรแกรมแสดงผลดว้ ยจอ OLED 128×64 249
5. คน้ หาค่าเดิมท่ีต้งั คา่ ไวด้ งั รูป
รูปท่ี 4.20-9 คา่ เดิมของไลบรารี่ Adafruit_SSD1306.h
6. ทาการแกไ้ ขใหเ้ ป็นการกาหนดคา่ ใชง้ าน OLED ขนาด 128x64
รูปที่ 4.20-10 การแกค้ ่าใหม่
ฟังก์ช่ันทม่ี ใี ห้ใช้งานของไลบราร่ี
ฟังกช์ นั่ ใชง้ าน OLED จากไลบรารี่ที่ติดต้งั มีใหใ้ ชง้ านมากพอสมควรดงั ตารางที่ 4.20-1
ตารางที่ 4.20-1 รายการฟังกช์ น่ั ท่ีมีใหใ้ ชง้ าน
ฟังกช์ นั่ ใชง้ าน OLED ฟังกช์ น่ั ใชง้ าน OLED
.begin(SSD1306_SWITCHCAPVCC,addr); .fillRect(x0,y0,w,h,color);
.clearDisplay(); .fillRoundRect(x0,y0,w,h,radius,color);
.dim(dim) .fillScreen(color);
.display(); .fillTriangle(x0,y0,x1,y1,x2,y2,color);
.drawBitmap( x,y,*bitmap,w,h,color) .invertDisplay(i)
.drawChar(x,y,c,color,background,size); .print();
.drawCircle(x0,y0,radius,color); .println();
.drawFastHLine(x0,y0,length,color); .setCursor(x0,y0);
.drawFastHLineInternal(x0,y0,w,color) .setRotation(rotation);
.drawFastVLine(x0,y0,length,color); .setTextColor(color);
.drawFastVLineInternal(x,y,h,color) .setTextColor(color,background)
.drawLine(x0,y0,x1,y1,color); .setTextSize(sizes);
.drawPixel(x, y,color); .startscrolldiagleft(start,stop)
.drawRect(x0,y0, w,h,color); .startscrolldiagright(start,stop)
.drawRoundRect(x0,y0,w,h,radius,color); .startscrollleft(start,stop)
.drawTriangle(x0,y0,x1,y1,x2,y2,color); .startscrollright(start,stop)
.fillCircle(x0,y0,radius,color); .stopscroll()
// Dim the display, dim = true: display is dimmed, dim = false: display is normal
//i=1,0
//The rotation screen parameter can be 0, 1, 2 or 3.
// printable sizes from 1 to 8; typical use is 1, 2 or 3
250 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]
การกาหนดพิกดั ตาแหน่งของฟังกช์ น่ั เขียนภาพในแตล่ ะฟังกช์ นั่ จะมีการกาหนดคา่ พกิ ดั ตา่ ง ๆ
ในแตล่ ะฟังกช์ น่ั ตวั อยา่ งเช่น
1. ฟังกช์ น่ั พลอ๊ ตจุด .drawPixel(x, y,color);
รูปท่ี 4.20-11 การกาหนดพิกดั ของฟังกช์ น่ั พลอ๊ ตจุด
2. ฟังกช์ น่ั ลากเส้น เช่น .drawLine(x0,y0,x1,y1,color);
รูปที่ 4.20-12 การกาหนดพกิ ดั ของฟังกช์ นั่ ลากเส้น
3. ฟังกช์ น่ั วาดรูปสี่เหล่ียม เช่น .drawRect(x0,y0, w,h,color);
รูปท่ี 4.20-13 การกาหนดพิกดั ของฟังกช์ น่ั วาดรูปสี่เหล่ียม
ใบงานที่ 4.20 การเขียนโปรแกรมแสดงผลดว้ ยจอ OLED 128×64 251
4. ฟังกช์ นั่ วาดรูปวงกลม เช่น .drawCircle(x0,y0,radius,color);
รูปท่ี 4.20-14 การกาหนดพกิ ดั ของฟังกช์ นั่ วาดรูปวงกลม
5. ฟังกช์ น่ั วาดรูปสี่เหล่ียมหวั มน เช่น .drawRoundRect(x0,y0,w,h,radius,color);
รูปที่ 4.20-15 การกาหนดพิกดั ของฟังกช์ นั่ วาดรูปส่ีเหล่ียมหวั มน
6. ฟังกช์ น่ั วาดรูปสามเหล่ียม เช่น .drawTriangle(x0,y0,x1,y1,x2,y2,color);
รูปท่ี 4.20-16 การกาหนดพกิ ดั ของฟังกช์ นั่ วาดรูปสามเหลี่ยม
252 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]
ฟอนต์ทม่ี ใี ห้ใช้งานของไลบรารี่
การแสดงผลที่เป็ นขอ้ ความผูใ้ ช้งานสามารถเปล่ียนฟอนต์ได้ โดยไฟล์ฟอนตจ์ ะอยู่ในไลบรารี่
Adafruit_GFX ภายในโฟลเดอร์ \libraries\Adafruit_GFX_Library\Fonts มีรายการฟอนตใ์ ห้เลือกใช้ได้
ดงั ตารางท่ี 4.20-2
ตารางที่ 4.20-2 รายการฟอนตท์ ี่มีใหเ้ ลือกใชง้ าน
Font Font
FreeMono12pt7b.h FreeSansBoldOblique12pt7b.h
FreeMono18pt7b.h FreeSansBoldOblique18pt7b.h
FreeMono24pt7b.h FreeSansBoldOblique24pt7b.h
FreeMono9pt7b.h FreeSansBoldOblique9pt7b.h
FreeMonoBold12pt7b.h FreeSansOblique12pt7b.h
FreeMonoBold18pt7b.h FreeSansOblique18pt7b.h
FreeMonoBold24pt7b.h FreeSansOblique24pt7b.h
FreeMonoBold9pt7b.h FreeSansOblique9pt7b.h
FreeMonoBoldOblique12pt7b.h FreeSerif12pt7b.h
FreeMonoBoldOblique18pt7b.h FreeSerif18pt7b.h
FreeMonoBoldOblique24pt7b.h FreeSerif24pt7b.h
FreeMonoBoldOblique9pt7b.h FreeSerif9pt7b.h
FreeMonoOblique12pt7b.h FreeSerifBold12pt7b.h
FreeMonoOblique18pt7b.h FreeSerifBold18pt7b.h
FreeMonoOblique24pt7b.h FreeSerifBold24pt7b.h
FreeMonoOblique9pt7b.h FreeSerifBold9pt7b.h
FreeSans12pt7b.h FreeSerifBoldItalic12pt7b.h
FreeSans18pt7b.h FreeSerifBoldItalic18pt7b.h
FreeSans24pt7b.h FreeSerifBoldItalic24pt7b.h
FreeSans9pt7b.h FreeSerifBoldItalic9pt7b.h
FreeSansBold12pt7b.h FreeSerifItalic12pt7b.h
FreeSansBold18pt7b.h FreeSerifItalic18pt7b.h
FreeSansBold24pt7b.h FreeSerifItalic24pt7b.h
FreeSansBold9pt7b.h FreeSerifItalic9pt7b.h
ผูใ้ ช้งานสามารถเรียกใช้ได้โดยการ include ไฟล์ฟอนต์ดงั กล่าวเขา้ ในโปรแกรมแล้วทาการ
เรียกใช้ เพยี งแต่ตาแหน่งของตวั อกั ษรที่ใชก้ าหนดตาแหน่งจะแตกต่างกนั กบั ที่ไม่ไดม้ ีการใชฟ้ อนตด์ งั รูป
รูปที่ 4.20-17 การกาหนดพิกดั เมื่อใชฟ้ อนตป์ กติกบั ฟอนตใ์ หม่
ใบงานท่ี 4.20 การเขียนโปรแกรมแสดงผลดว้ ยจอ OLED 128×64 253
6. ฟังก์ชั่น Arduino ทใ่ี ช้งานในใบงาน
1. ฟังก์ชั่นหน่วงเวลาหรือฟังก์ช่ันหยุดค้าง การใช้งานสามารถกาหนดตวั เลขของเวลาท่ี
ตอ้ งการหยุดคา้ งโดยตวั เลขท่ีใส่เป็ นตวั เลขของเวลาหน่วยเป็ นมิลลิวินาที ตวั เลขของเวลาที่
ใส่ไดส้ ูงสุดคือ 4,294,967,295 ซ่ึงเป็นขนาดของตวั แปร unsigned long
delay(ms);
ms: ตวั เลขท่ีหยดุ คา้ งของเวลาหน่วยมิลลิวนิ าที (unsigned long)
ฟังก์ช่ันใช้งานของไลบรารี่ (เฉพาะในใบงาน)
การใช้งานแสดงผลดว้ ยโมดูลจอ OLED ที่ใช้ไลบรารี่ของ Adafruit มีฟังก์ชนั่ ให้ใช้งานจานวน
มากดงั ไดก้ ล่าวมาแลว้ ขา้ งตน้ สาหรับรายละเอียดการใชง้ านของแต่ละฟังกช์ นั่ จะกล่าวเฉพาะที่นามาใช้
งานในการทดลองเพือ่ เป็นแนวทางในการใชง้ านฟังกช์ นั่ ๆ ไดแ้ ก่
1. ฟังก์ชั่นเร่ิมต้นการใช้งานและกาหนดแอดเดรส ใช้ในการเร่ิมตน้ การใช้งานไลบรารี่และ
กาหนดแอดเดรสของโมดูลจอ OLED ที่สื่อสารแบบ I2C รูปแบบเป็นดงั น้ี
.begin(SSD1306_SWITCHCAPVCC,addr);
addr: แอดเดรสของโมดูล I2C
ตัวอย่าง OLED.begin(SSD1306_SWITCHCAPVCC,0x3C);
หมายถงึ เริ่มตน้ การใชง้ านไลบราร่ีโดยโมดูลเชื่อมตอ่ มีแอดเดรสเป็น 3CH
2. ฟังก์ชั่นล้างข้อมูลหน้าจอ ใชใ้ นการลา้ งขอ้ มูลที่แสดงผลบนหนา้ จอ OLED รูปแบบเป็นดงั น้ี
.clearDisplay();
3. ฟังก์ช่ันแสดงผล ใชใ้ นการแสดงผลบนหนา้ จอ OLED จากขอ้ มูลในบฟั เฟอร์ รูปแบบเป็ น
ดงั น้ี
.display();
4. ฟังก์ช่ันวาดเส้นวงกลม ใชใ้ นการวาดเส้นวงกลมไม่มีสีพ้นื รูปแบบเป็นดงั น้ี
.drawCircle(x0,y0,radius,color);
254 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]
ตัวอย่าง x0: พิกดั ท่ีตาแหน่งเร่ิมวาดแกน x
หมายถึง y0: พิกดั ท่ีตาแหน่งเริ่มวาดแกน y
radius: รัศมีของวงกลม
color: สีท่ีตอ้ งการแสดง (BLACK, WHITE)
OLED.drawCircle(110, 50, 12, WHITE);
วาดเส้นวงกลมสีขาวท่ีพิกดั (110,50) โดยมีรัศมี 12 พิกเซล
5. ฟังก์ช่ันวาดเส้นตรง ใชใ้ นการเส้นตรง รูปแบบเป็นดงั น้ี
.drawLine(x0,y0,x1,y1,color);
ตวั อย่าง x0: พิกดั ท่ีตาแหน่งเร่ิมวาดแกน x
หมายถงึ y0: พิกดั ท่ีตาแหน่งเริ่มวาดแกน y
x1: พิกดั ท่ีตาแหน่งทา้ ยของการวาดเส้นตรงในแกน x
y1: พกิ ดั ที่ตาแหน่งทา้ ยของการวาดเส้นตรงในแกน y
color: สีท่ีตอ้ งการแสดง (BLACK, WHITE)
OLED.drawLine(0, 63, 127, 0, WHITE);
วาดเส้นตรงสีขาวเร่ิมท่ีพกิ ดั (0,63) ไปสิ้นสุดที่พิกดั (127,0)
6. ฟังก์ชั่นวาดรูปสี่เหลย่ี ม วาดรูปสี่เหลี่ยมพ้ืนโปร่งใส รูปแบบเป็นดงั น้ี
.drawRect(x0,y0, w,h,color);
ตัวอย่าง x0: พกิ ดั ท่ีตาแหน่งเร่ิมวาดแกน x
หมายถงึ y0: พิกดั ท่ีตาแหน่งเริ่มวาดแกน y
w: ความกวา้ งของรูปสี่เหล่ียม
h: ความสูงของรูปสี่เหล่ียม
color: สีท่ีตอ้ งการแสดง (BLACK, WHITE)
OLED.drawRect(10,10, 100,40,WHITE);
วาดรูปส่ีเหล่ียมสีขาวเร่ิมท่ีพกิ ดั (10,10) ไปสิ้นสุดที่พิกดั (100,40)
7. ฟังก์ช่ันวาดรูปสามเหลยี่ ม วาดรูปสามเหล่ียมพ้ืนโปร่งใส รูปแบบเป็นดงั น้ี
.drawTriangle(x0,y0,x1,y1,x2,y2,color);
x0: พิกดั ที่ตาแหน่งเริ่มวาดแกน x
y0: พิกดั ท่ีตาแหน่งเร่ิมวาดแกน y
ใบงานที่ 4.20 การเขียนโปรแกรมแสดงผลดว้ ยจอ OLED 128×64 255
ตัวอย่าง x1: พิกดั จุดท่ีสองของการลากเส้นของแกน x
หมายถึง y1: พิกดั ที่จุดที่สองของการลากเส้นของแกน y
x2: พิกดั จุดท่ีสามของการลากเส้นของแกน x
y2: พกิ ดั จุดท่ีสามของการลากเส้นของแกน y
color: สีที่ตอ้ งการแสดง (BLACK, WHITE)
OLED.drawTriangle(70, 60, 90, 60, 80, 46, WHITE);
วาดรูปสามเหลี่ยมสีขาวท่ีพิกดั แกน x, y ดงั น้ี (70,60) (90,60) (80,46)
8. ฟังก์ชั่นวาดวงกลมชนิดมีสีพืน้ รูปแบบเป็นดงั น้ี
.fillCircle(x0,y0,radius,color);
ตัวอย่าง x0: พิกดั ท่ีตาแหน่งเร่ิมวาดแกน x
หมายถึง y0: พกิ ดั ที่ตาแหน่งเริ่มวาดแกน y
radius: รัศมีของวงกลม
color: สีท่ีตอ้ งการแสดง (BLACK, WHITE)
OLED.fillCircle(110, 50, 12, WHITE);
วาดวงกลมทึบสีพ้ืนเป็นสีขาวที่พกิ ดั (110,50) โดยมีรัศมี 12 พกิ เซล
9. ฟังก์ช่ันวาดรูปส่ีเหลย่ี มชนิดมีสีพืน้ รูปแบบเป็นดงั น้ี
.fillRect(x0,y0,w,h,color);
ตวั อย่าง x0: พกิ ดั ท่ีตาแหน่งเร่ิมวาดแกน x
หมายถึง y0: พิกดั ท่ีตาแหน่งเร่ิมวาดแกน y
w: ความกวา้ งของรูปส่ีเหลี่ยม
h: ความสูงของรูปสี่เหล่ียม
color: สีท่ีตอ้ งการแสดง (BLACK, WHITE)
OLED.fillRect(10,10, 100,40,WHITE);
วาดรูปสี่เหลี่ยมพ้นื สีขาวเร่ิมท่ีพิกดั (10,10) ไปสิ้นสุดที่พิกดั (100,40)
10. ฟังก์ชั่นวาดรูปส่ีเหลยี่ มหวั มนชนิดมีสีพืน้ รูปแบบเป็นดงั น้ี
.fillRoundRect(x0,y0,w,h,radius,color);
x0: พิกดั ท่ีตาแหน่งเร่ิมวาดแกน x
y0: พิกดั ท่ีตาแหน่งเร่ิมวาดแกน y
256 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]
ตัวอย่าง w: ความกวา้ งของรูปส่ีเหล่ียม
หมายถงึ h: ความสูงของรูปส่ีเหล่ียม
radius: รัศมีของส่วนโคง้ หวั มน
color: สีที่ตอ้ งการแสดง (BLACK, WHITE)
OLED.fillRoundRect (10,10, 100,40,WHITE);
วาดรูปสี่เหล่ียมพ้นื สีขาวเร่ิมท่ีพกิ ดั (10,10) ไปสิ้นสุดที่พกิ ดั (100,40)
11. ฟังก์ชั่นพิมพ์ข้อความ เป็ นฟังก์ชนั่ ที่ใช้ในพิมพข์ อ้ ความหรือค่าในตวั แปรให้แสดงบนจอ
OLED รูปแบบการใชง้ านคลา้ ยคลึงกบั Serial.print() นน่ั คือเมื่อพิมพเ์ สร็จตวั เคอร์เซอร์จะ
รออยทู่ ่ีทา้ ยสิ่งที่พิมพน์ ้นั ๆ รูปแบบเป็นดงั น้ี
.print();
12. ฟังก์ช่ันพมิ พ์ข้อความ ใชใ้ นพิมพข์ อ้ ความหรือค่าในตวั แปรใหแ้ สดงบนจอ OLED รูปแบบ
การใช้งานคลา้ ยคลึงกบั Serial.println() น่ันคือเมื่อพิมพ์เสร็จตวั เคอร์เซอร์จะขยบั มาข้ึน
บรรทดั ใหมร่ อฟังกช์ นั่ พิมพข์ อ้ ความตอ่ ไป รูปแบบเป็นดงั น้ี
.println();
13. ฟังก์ช่ันกาหนดตาแหน่งเคอร์เซอร์สาหรับพิมพ์ข้อความ เป็ นฟังก์ช่ันกาหนดพิกดั ให้กบั
เคอร์เซอร์เพื่อใชพ้ ิมพข์ อ้ ความในตาแหน่งที่ตอ้ งการ รูปแบบเป็นดงั น้ี
.setCursor(x0,y0);
x0: พิกดั แกน x
y0: พิกดั แกน y
14. ฟังก์ชั่นเรียกใช้งานฟอนต์ เป็ นฟังก์ชน่ั ท่ีใชเ้ รียกใชง้ านฟอนต์ท่ีตอ้ งการโดยใส่ชื่อฟอนต์ที่
ตอ้ งการใชง้ าน (ช่ือฟอนตใ์ นตารางท่ี 4.20-2) รูปแบบเป็นดงั น้ี
.setFont(&Font);
Font: ช่ือฟอนตท์ ่ีตอ้ งการใชง้ าน(ไมต่ อ้ งใส่สกลุ .h)
ตัวอย่าง OLED.setFont(&FreeMonoBold9pt7b);
หมายถึง ใชง้ านฟอนตท์ ี่ชื่อวา่ FreeMonoBold9pt7b
ใบงานที่ 4.20 การเขียนโปรแกรมแสดงผลดว้ ยจอ OLED 128×64 257
15. ฟังก์ช่ันกาหนดสีข้อความ ใชใ้ นการกาหนดสีของตวั ขอ้ ความและพ้ืนหลงั ขอ้ ความ รูปแบบ
เป็นดงั น้ี
.setTextColor(color,background)
color: สีของขอ้ ความที่ตอ้ งการแสดง (BLACK, WHITE)
background: สีของพ้ืนหลงั ขอ้ ความที่ตอ้ งการแสดง (BLACK, WHITE)
16. ฟังก์ช่ันกาหนดขนาดของตัวอกั ษร ใชใ้ นการกาหนดขนาดของตวั อกั ษรท่ีตอ้ งการแสดงผล
บนจอ OLED รูปแบบเป็นดงั น้ี
.setTextSize(sizes);
sizes: ตวั เลขขนาดท่ีตอ้ งการสามารถใชง้ านไดต้ ้งั แต่ 1-8
7. วงจรทใี่ ช้ทดลอง
วงจรเพื่อใชท้ ดลองในใบงานสามารถทาได้ 2 แนวทาง คือ
1. วงจรไมโครคอนโทรลเลอร์ Arduino ท่ีสร้างเองจากไมโครคอนโทรลเลอร์ AVR
2. วงจรไมโครคอนโทรลเลอร์ Arduino ท่ีใชบ้ อร์ดโมดูล Arduino สาเร็จรูป
เนื่องจากไม่มีโมเดลจาลอง OLED ในโปรแกรม Proteus จึงไม่สามารถจาลองการทางานได้
กรณีที่ใชว้ งจรท่ีสร้างข้ึนเองจากไอซีไมโครคอนโทรลเลอร์ AVR ที่ลงบูตโหลดเดอร์เป็ น Arduino
เรียบร้อยแลว้ ต่อวงจรดงั รูป
D1 VCC Peripheral circuit
1N5819
CPU circuit VCC
R1
10k 7,20 ATMEGA328 VCC GND SCL SDA
VCC
SW1
1 RST AVCC
C1
0.1uF
A4(SDA) 27
A5(SCL) 28
USB to UART (TTL Level) R2,R3 3
1k 2
DTR
RXD D1(TXD)
TXD D0(RXD)
+5V
GND
3V3
X1 9 XTAL1
16MHz 10 XTAL2
C2,C3 GND
22pF
8,22
รูปท่ี 4.20-18 วงจรท่ีใชไ้ อซี AVR ในการทดลอง
258 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]
กรณีท่ีใช้ Arduino ในการทดลอง ตอ่ วงจรดงั รูป VCC
ARDUINO
VCC
A4(SDA)
A5(SCL)
VCC GND SCL SDA
GND
รูปท่ี 4.20-19 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง
การตอ่ วงจรไมโครคอนโทรลเลอร์ Arduino ที่ใชบ้ อร์ดโมดูล Arduino สาเร็จรูปลงบอร์ดทดลอง
F GH I J 20 20 25 25 30 30 35 35 40 40 45 45 50 50 55 55 60 60 F GH I J
D12 1
D11
D10
D9
D8 5
D7
D6
D5
D4
D3 10
D2
GND
RST
D0
D1 15
ABCDE VCC GND S CL S DA
D13
3V3 ABCDE
REF
A0
A1
A2
A3
A4
A5
A6
A7
5V
RST
GND
VIN
1
5
10
15
รูปท่ี 4.20-20 การต่อลงบอร์ดทดลอง
8. การเขยี นโค้ดโปรแกรมควบคุม
การทดลองท่ี 1 เขียนโปรแกรมแสดงผลบนจอ OLED ท่ีมีท้งั ขอ้ ความและค่าในตวั แปร
ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี
START
กาหนดค่าเริม่ ต้นต่าง
แสดงผล
แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino
1 #include <Wire.h>
2 #include <Adafruit_GFX.h>
3 #include <Adafruit_SSD1306.h>
4 Adafruit_SSD1306 OLED(4);
5 int x;
6 void setup()
7{
8 OLED.begin(SSD1306_SWITCHCAPVCC,0x3C); // initialize with the I2C addr 0x3C
9}
10 void loop()
11 {
12 OLED.clearDisplay();
ใบงานท่ี 4.20 การเขียนโปรแกรมแสดงผลดว้ ยจอ OLED 128×64 259
13 OLED.setTextColor(WHITE,BLACK); //Text is white ,background is black
14 OLED.setCursor(0, 0);
15 OLED.setTextSize(2);
16 OLED.println("OLED ");
17 OLED.setTextSize(1);
18 OLED.println("Arduino Laboratory");
19 OLED.setTextColor(BLACK,WHITE); // 'inverted' text
20 OLED.print("www.praphas.com");
21 OLED.setTextColor(WHITE,BLACK); // 'inverted' text again
22 OLED.setCursor(60,0);
23 OLED.setTextSize(2);
24 OLED.println(x,DEC);
25 OLED.display(); //
26 x++;
27 delay(250);
28 }
รายละเอยี ดโค้ดโปรแกรม
- บรรทดั ท่ี 1 รวมไฟลไ์ ลบราร่ี Wire.h เขา้ มาในโคด้ โปรแกรม
- บรรทดั ท่ี 2 รวมไฟลไ์ ลบราร่ี Adafruit_GFX.h เขา้ มาในโคด้ โปรแกรม
- บรรทดั ท่ี 3 รวมไฟลไ์ ลบรารี่ Adafruit_SSD1306.h เขา้ มาในโคด้ โปรแกรม
- บรรทดั ท่ี 4 กาหนดชื่อเรียกโมดูลจอวา่ OLED
- บรรทดั ที่ 8 ประกาศเริ่มใชง้ านไลบรารี่พร้อมระบุแอดเดรสจอ OLED
- บรรทดั ที่ 12 ลา้ งขอ้ มูลท่ีแสดงผลหนา้ จอ
- บรรทดั ท่ี 13 กาหนดสีตวั อกั ษรและสีพ้นื หลงั ของตวั อกั ษร
- บรรทดั ที่ 14 กาหนดพิกดั ที่จะพิมพข์ อ้ ความ
- บรรทดั ที่ 15 กาหนดขนาดของตวั อกั ษร
- บรรทดั ท่ี 16 แสดงผลขอ้ ความแลว้ ใหเ้ คอร์เซอร์ข้ึนไปรอท่ีบรรทดั ใหม่
- บรรทดั ที่ 24 แสดงผลจากคา่ ของตวั แปรแลว้ ใหเ้ คอร์เซอร์ข้ึนไปรอที่บรรทดั ใหม่
- บรรทดั ที่ 25 สัง่ ใหแ้ สดงผล
ทดลองการทางาน
1. ทดลองดว้ ยวงจรจริง
2. ทดลองเปล่ียนรูปแบบการแสดงผล
การทดลองที่ 2 เขียนโปรแกรมวาดวตั ถุแบบต่าง ๆ โดยแสดงผลท่ีจอ OLED
ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี
START
กาหนดคา่ เริม่ ต้นต่าง
วาดวัตถแุ บบต่าง
แสดงผล
260 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]
แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino
1 #include <Wire.h>
2 #include <Adafruit_GFX.h>
3 #include <Adafruit_SSD1306.h>
4 Adafruit_SSD1306 OLED(4);
5 void setup()
6{
7 OLED.begin(SSD1306_SWITCHCAPVCC,0x3C); //initialize I2C addr 0x3c
8}
9 void loop()
10 {
11 OLED.clearDisplay();
12 OLED.setTextColor(WHITE,BLACK);
13 OLED.drawRect(10,10, 100,40,WHITE);
14 OLED.drawLine(0, 63, 127, 0, WHITE);
15 OLED.drawCircle(110, 50, 12, WHITE);
16 OLED.fillCircle(45, 50, 8, WHITE);
17 OLED.drawTriangle(70, 60, 90, 60, 80, 46, WHITE);
18 OLED.fillRect(15,15,20,20,WHITE);
19 OLED.fillRoundRect(50,15,50,20,10,WHITE);
20 OLED.setCursor(5,30);
21 OLED.setTextSize(1);
22 OLED.println("www.praphas.com");
23 OLED.display(); //
24 delay(250);
25 }
รายละเอยี ดโค้ดโปรแกรม
- บรรทดั ที่ 1 รวมไฟลไ์ ลบราร่ี Wire.h เขา้ มาในโคด้ โปรแกรม
- บรรทดั ท่ี 2 รวมไฟลไ์ ลบราร่ี Adafruit_GFX.h เขา้ มาในโคด้ โปรแกรม
- บรรทดั ท่ี 3 รวมไฟลไ์ ลบราร่ี Adafruit_SSD1306.h เขา้ มาในโคด้ โปรแกรม
- บรรทดั ท่ี 4 กาหนดชื่อเรียกโมดูลจอวา่ OLED
- บรรทดั ที่ 7 ประกาศเร่ิมใชง้ านไลบรารี่พร้อมระบุแอดเดรสจอ OLED
- บรรทดั ที่ 11 ลา้ งขอ้ มูลที่แสดงผลหนา้ จอ
- บรรทดั ที่ 12 กาหนดสีตวั อกั ษรและสีพ้นื หลงั ของตวั อกั ษร
- บรรทดั ท่ี 13 วาดรูปส่ีเหลี่ยมพ้นื โปร่งใส
- บรรทดั ที่ 14 วาดเส้นตรง
- บรรทดั ท่ี 15 วาดรูปวงกลมพ้นื โปร่งใส
- บรรทดั ที่ 16 วาดรูปวงกลมพ้ืนทึบสีขาว
- บรรทดั ที่ 17 วาดรูปสามเหลี่ยมพ้นื โปร่งใส
- บรรทดั ที่ 25 สั่งใหแ้ สดงผล
ทดลองการทางาน
1. ทดลองดว้ ยวงจรจริง
2. ทดลองเปลี่ยนรูปแบบการแสดงผล
ใบงานท่ี 4.20 การเขียนโปรแกรมแสดงผลดว้ ยจอ OLED 128×64 261
การทดลองที่ 3 เขียนโปรแกรมแสดงขอ้ ความโดยเปลี่ยนฟอน์ตการแสดงผล
ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี
START
กาหนดค่าเริม่ ต้นต่าง
เลือกใช้ฟอนต์
แสดงผล
แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino
1 #include <Wire.h>
2 #include <Adafruit_GFX.h>
3 #include <Adafruit_SSD1306.h>
4 #include <Fonts/FreeMonoBold9pt7b.h> //include font MonoBold size 9pt7b
5 Adafruit_SSD1306 OLED(4);
6 void setup()
7{
8 OLED.setFont(&FreeMonoBold9pt7b); // Use font from file include
9 OLED.begin(SSD1306_SWITCHCAPVCC,0x3C); // initialize with the I2C addr 0x3C
10 }
11 void loop()
12 {
13 OLED.clearDisplay();
14 OLED.setTextColor(WHITE,BLACK); //Text is white ,background is black
15 OLED.setCursor(0,20);
16 OLED.setTextSize(1);
17 OLED.println("Change font");
18 OLED.setCursor(0,50);
19 OLED.print("OLED 128x64");
20 OLED.display(); //
21 delay(250);
22 }
รายละเอยี ดโค้ดโปรแกรม
- บรรทดั ที่ 1 รวมไฟลไ์ ลบรารี่ Wire.h เขา้ มาในโคด้ โปรแกรม
- บรรทดั ที่ 2 รวมไฟลไ์ ลบรารี่ Adafruit_GFX.h เขา้ มาในโคด้ โปรแกรม
- บรรทดั ท่ี 3 รวมไฟลไ์ ลบรารี่ Adafruit_SSD1306.h เขา้ มาในโคด้ โปรแกรม
- บรรทดั ท่ี 4 รวมไฟลฟ์ อนตเ์ ขา้ มาในโคด้ โปรแกรม
- บรรทดั ที่ 5 กาหนดช่ือเรียกโมดูลจอวา่ OLED
- บรรทดั ท่ี 8 ประกาศใชง้ านฟอนต์
- บรรทดั ที่ 9 ประกาศเริ่มใชง้ านไลบราร่ีพร้อมระบุแอดเดรสจอ OLED
- บรรทดั ท่ี 13 ลา้ งขอ้ มูลที่แสดงผลหนา้ จอ
- บรรทดั ที่ 14 กาหนดสีตวั อกั ษรและสีพ้ืนหลงั ของตวั อกั ษร
- บรรทดั ที่ 15 กาหนดพิกดั ที่จะพิมพข์ อ้ ความ
262 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]
- บรรทดั ที่ 16 กาหนดขนาดของตวั อกั ษร
- บรรทดั ที่ 17 แสดงผลขอ้ ความแลว้ ใหเ้ คอร์เซอร์ข้ึนไปรอที่บรรทดั ใหม่
- บรรทดั ท่ี 20 สั่งใหแ้ สดงผล
ทดลองการทางาน
1. ทดลองดว้ ยวงจรจริง
2. ทดลองเปล่ียนรูปแบบการแสดงผล
9. สรุปผลการปฏบิ ตั งิ าน
10. งานทมี่ อบหมาย
1. เขียนโปรแกรมแสดงผลเวลาที่บอร์ดเริ่มทางานโดยให้แสดงผลเวลาหน่วยเป็ นวินาทีพร้อม
ขอ้ ความบอกรายละเอียดต่าง ๆ พอสมควร วงจรที่ใชท้ ดลองเป็นดงั รูป
ARDUINO
VCC VCC
A4(SDA)
A5(SCL)
VCC GND SCL SDA
GND
รูปท่ี 4.20-21 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง
ใบงานท่ี 4.21 การเขียนโปรแกรมแสดงผลรูปภาพดว้ ยจอ OLED 128×64 263
ใบงานท่ี 4.21
การเขยี นโปรแกรมแสดงผลรูปภาพด้วยจอ OLED 128×64
1. จุดประสงค์ทว่ั ไป
เพ่อื ใหส้ ามารถเขียนโปรแกรมแสดงผลรูปภาพดว้ ยจอ OLED 128×64 ได้
2. จุดประสงค์เชิงพฤตกิ รรม
1. บอกวธิ ีเขียนโปรแกรมแสดงผลรูปภาพดว้ ยจอ OLED 128×64ได้
2. บอกข้นั ตอนการต่อวงจรเพ่อื ทดลองบนบอร์ดทดลองได้
3. ทดสอบการทางานของบอร์ด Arduino ได้
4. ปฏิบตั ิงานตามใบงานเสร็จทนั เวลาท่ีกาหนด
3. เคร่ืองมือและอปุ กรณ์
1. บอร์ดทดลอง Breadboard 830 Point 1 แผน่
2. บอร์ด Arduino Nano 3.0 1 ตวั
3. OLED ขนาด 128×64 แบบ I2C ท่ีใชไ้ ดร์เวอร์เบอร์ SSD1306 1 ตวั
4. สายเชื่อมตอ่ USB (Mini USB) 1 เส้น
5. สายเชื่อมต่อวงจร 1 ชุด
6. คอมพวิ เตอร์ 1 เคร่ือง
4. ลาดับข้นั การปฏบิ ัติงาน
1. ศึกษาจุดประสงคท์ ว่ั ไป จุดประสงคเ์ ชิงพฤติกรรมและทฤษฎีพ้นื ฐานท่ีเกี่ยวขอ้ ง
2. ดาเนินการต่อวงจรลงบอร์ดทดลองตามวงจรท่ีกาหนด
3. เขียนโปรแกรมควบคุมและทดสอบการทางานของวงจร
4. สรุปผลการปฏิบตั ิงาน
264 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]
5. ทฤษฎพี ืน้ ฐาน
รูปภาพที่แสดงผลบนจอ OLED ขนาด 128×64 สามารถทาได้ 2 วิธีหลกั ๆ คือ เขียนข้ึนมาใหม่
และใชร้ ูปภาพท่ีมีอยูแ่ ลว้ สาหรับการเขียนรูปภาพข้ึนมาใหม่สามารถใช้โปรแกรมวาดรูปภาพทว่ั ๆ ไป
เขียนรูปภาพที่ตอ้ งการไดเ้ พียงการเขียนรูปภาพให้ไดต้ ามตอ้ งการมีความซบั ซอ้ นมากพอสมควรสาหรับ
ผทู้ ่ีไมม่ ีทกั ษะในการวาดรูปดว้ ยแลว้ แทบจะเป็ นไปไม่ไดเ้ ลย งานคร้ังน้ีเสนอการนารูปภาพที่มีอยแู่ ลว้ ซ่ึง
เป็นวธิ ีที่ง่ายสุดคือการคน้ หารูปภาพที่ตอ้ งการทางอินเตอร์เน็ตมีข้นั ตอนการดาเนินการดงั น้ี
ข้นั ตอนการดาเนินการ
1. เปิ ดหาภาพทต่ี ้องการ เป็นการหารูปภาพจากแหล่งตา่ ง ๆ ที่มีลกั ษณะตามท่ีตอ้ งการและมีขนาดท่ี
สามารถใช้งานได้ ตวั อย่างเช่นจากเวปไซต์ http://www.alessioatzeni.com/meteocons ซ่ึงเป็ น
ภาพขาวดาและมีขนาดใกลเ้ คียงกบั ท่ีตอ้ งการ หากภาพเล็กหรือใหญ่เกินความตอ้ งการสามารถ
ปรับขยาย/ยอ่ การแสดงผลในโปรแกรมบราวน์เซอร์ (โปรแกรมท่ีกาลงั เปิ ดเวป) เพือ่ ใหไ้ ดข้ นาด
ที่ตอ้ งการและมีขนาดไม่เกินขนาดของหนา้ จอ OLED ที่ใชง้ าน การปรับขยาย/ยอ่ ทาไดโ้ ดยการ
กดแป้นพมิ พ์ Ctrl คา้ งไวแ้ ลว้ กลิ้งเมาส์ใหไ้ ดข้ นาดตามตอ้ งการ
รูปท่ี 4.21-1 ตวั อยา่ งภาพจากเวปไซตท์ ี่ตอ้ งการจบั ภาพ
2. จับภาพหน้าจอด้วยโปรแกรมจับภาพ เช่นโปรแกรม SnagIt สามารถดาวน์โหลดโปรแกรมไดท้ ี่
https://www.techsmith.com/download/snagit ทาการจบั ภาพเฉพาะไอคอนท่ีตอ้ งการ โดยขนาด
ของภาพท้งั แนวต้งั และแนวนอนจะตอ้ งเป็นค่าที่เลข 8 สามารถหารไดล้ งตวั ถึงจะสามารถนาไป
แสดงผลไดถ้ ูกตอ้ ง เช่น 56×56 ดงั รูป
รูปท่ี 4.21-2 จบั ภาพท่ีตอ้ งการโดยขนาดที่ใชเ้ ลข 8 หารลงตวั
ใบงานท่ี 4.21 การเขียนโปรแกรมแสดงผลรูปภาพดว้ ยจอ OLED 128×64 265
รูปท่ี 4.21-3 ภาพท่ีจบั ไดจ้ ากหนา้ จอดว้ ยโปรแกรม Snagit
3. ใช้โปรแกรมแปลงภาพเป็ นรหัส "LCD Image Converter" สามารถดาวน์โหลดโปรแกรมไดท้ ี่
http://www.riuson.com/lcd-image-converter ทาการเปิ ดให้โปรแกรมค้างไว้ แล้วกลับไปยงั
โปรแกรม Snagit (รูปที่ 4.21-3) ทาการคดั ลอกภาพโดยใช้ Ctrl+c แลว้ กลบั มายงั โปรแกรม LCD
Image Converter อีกคร้ังทาการวางภาพที่คดั ลอกมาโดยใช้ Ctrl+v ทาการซูมภาพเพื่อใหส้ ามารถ
ปรับสีในแต่ละพิกเซลได้ถนัดโดยการกดคีย์ Ctrl คา้ งไวแ้ ล้วกลิ้งลูกกลิ้งเมาส์ให้ได้ขนาดที่
สามารถแกไ้ ขภาพไดอ้ ยา่ งถนดั ตามความตอ้ งการ ทาการปรับสีภาพแต่ละพิกเซลให้ไดต้ ามท่ี
ตอ้ งการโดยใชก้ ารคลิกเมาส์ที่เคร่ืองมือดินสอ แลว้ มาคลิกที่ภาพดงั น้ี
- คลิกซา้ ยจะเติมสีดา
- คลิกขวาจะเติมสีขวา
รูปที่ 4.21-4 ภาพท่ีนาเขา้ โปรแกรม LCD Image Converter
รูปที่ 4.21-5 ภาพท่ีตกแต่งเรียบร้อยแลว้
266 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]
4. การดูขนาดรูปภาพ วา่ ใชง้ านไดห้ รือไม่ หากเป็ นขนาดที่เลข 8 หารไม่ลงตวั จะตอ้ งทาการปรับ
เพม่ิ /ลดขนาดใหห้ ารลงตวั ใหไ้ ด้ การดูขนาดดูไดท้ ่ีมุมขวาล่างของโปรแกรมดงั รูป
รูปที่ 4.21-6 ดูขนาดภาพ
5. ปรับขนาดรูปภาพให้แสดงผลได้ ขนาดรูปภาพท่ีใชง้ านไดจ้ ะตอ้ งมีขนาดพกิ เซลไม่เกินจอคือไม่
เกิน 128×64 และตอ้ งเป็ นขนาดท่ีเลข 8 หารลงตวั หากดูขนาดจากข้นั ตอนท่ี 4 แลว้ เห็นวา่ ขนาด
ยงั ไม่ถูกตอ้ งจะตอ้ งปรับขนาดโดยดาเนินการดงั รูป
รูปที่ 4.21-6 ดูขนาดภาพ
รูปท่ี 4.21-7 ปรับขนาดภาพเพม่ิ ลดซา้ ย/ขวา/บน/ล่าง
6. กลบั สีรูปภาพเป็ นตรงข้าม ในกรณีท่ีรูปภาพที่ไดต้ อ้ งการใหต้ ิดสวา่ งบริเวณที่เป็ นสีขาวและให้
มืดบริเวณที่เป็นสีดาจะตอ้ งทาการกลบั สีภาพโดยใชเ้ มนู Image-> Inverse ดงั รูป
รูปท่ี 4.21-7 กลบั สีภาพ
ใบงานที่ 4.21 การเขียนโปรแกรมแสดงผลรูปภาพดว้ ยจอ OLED 128×64 267
รูปที่ 4.21-8 ผลของการกลบั สีรูปภาพ
7. เตรียมการคัดลอกโค้ด คลิกที่เมนู Option เลือก Conversion คลิกเลือก Monochrome(1) และ
Show Preview(2)
รูปที่ 4.21-9 เตรียมการคดั ลอกโคด้ รูปภาพ
8. คดั ลอกโค้ดรูปภาพ โดยการคลิกขวาที่บริเวณโคด้ เลือก Select All และ Copy ตามลาดบั
รูปท่ี 4.21-10 เลือกโคด้ ภาพท้งั หมด
รูปท่ี 4.21-11 คดั ลอกโคด้ ภาพ
268 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]
9. นาโค้ดรูปภาพไปวางในโปรแกรม โดยวางไวใ้ นตวั แปรอาเรยท์ ี่เก็บขอ้ มูลไวใ้ นหน่วยความจา
เกบ็ โปรแกรม const unsigned char logo [] PROGMEM = {
รูปท่ี 4.21-12 วางโคด้ รูปภาพในตวั แปรอาเรย์
10. แก้ขนาดรูปภาพทกี่ าหนด ทาการแกข้ นาดรูปภาพใหต้ รงตามขนาดจริงในฟังกช์ น่ั .drawBitmap
รูปที่ 4.21-13 แกข้ นาดใหต้ รงกบั ขนาดภาพท่ีใชง้ าน
6. ฟังก์ชั่น Arduino ทใี่ ช้งานในใบงาน
1. ฟังก์ช่ันหน่วงเวลาหรือฟังก์ช่ันหยุดค้าง การใช้งานสามารถกาหนดตัวเลขของเวลาที่
ตอ้ งการหยดุ คา้ งโดยตวั เลขที่ใส่เป็ นตวั เลขของเวลาหน่วยเป็ นมิลลิวนิ าที ตวั เลขของเวลาที่
ใส่ไดส้ ูงสุดคือ 4,294,967,295 ซ่ึงเป็นขนาดของตวั แปร unsigned long
delay(ms);
ms: ตวั เลขที่หยดุ คา้ งของเวลาหน่วยมิลลิวนิ าที (unsigned long)
ฟังก์ชั่นใช้งานของไลบราร่ี (เฉพาะในใบงาน)
ฟังกช์ นั่ ท่ีใชใ้ นการทดลองในใบงาน ไดแ้ ก่
1. ฟังก์ช่ันเร่ิมต้นการใช้งานและกาหนดแอดเดรส ใช้ในการเริ่มตน้ การใช้งานไลบรารี่และ
กาหนดแอดเดรสของโมดูลจอ OLED ท่ีส่ือสารแบบ I2C รูปแบบเป็นดงั น้ี
.begin(SSD1306_SWITCHCAPVCC,addr);
addr: แอดเดรสของโมดูล I2C
ใบงานที่ 4.21 การเขียนโปรแกรมแสดงผลรูปภาพดว้ ยจอ OLED 128×64 269
2. ฟังก์ช่ันวาดรูปภาพ ใชใ้ นวาดรูปภาพท่ีเก็บไวใ้ นตวั แปร รูปแบบเป็นดงั น้ี
.drawBitmap( x,y,*bitmap,w,h,color)
ตวั อย่าง x: พกิ ดั ท่ีตาแหน่งเร่ิมวาดแกน x
หมายถงึ y: พกิ ดั ท่ีตาแหน่งเร่ิมวาดแกน y
*bitmap: ชื่อตวั แปรที่เกบ็ รูปภาพ
w: ขนาดพกิ เซลดา้ นความกวา้ งของรูปภาพ
h: ขนาดพิกเซลดา้ นความสูงของรูปภาพ
color: สีท่ีใชว้ าด (0,1)
OLED.drawBitmap(20,10,logo,56,56,1);
วาดรูปภาพจากตวั แปร logo ที่พกิ ดั (20,10) โดยขนาดของรูปภาพคือ (56,56)
3. ฟังก์ชั่นล้างข้อมูลหน้าจอ ใชใ้ นการลา้ งขอ้ มูลท่ีแสดงผลบนหนา้ จอ OLED รูปแบบเป็นดงั น้ี
.clearDisplay();
4. ฟังก์ชั่นแสดงผล ใชใ้ นการแสดงผลบนหนา้ จอ OLED จากขอ้ มูลในบฟั เฟอร์ รูปแบบเป็ น
ดงั น้ี
.display();
5. ฟังก์ชั่นพมิ พ์ข้อความ เป็ นฟังก์ชนั่ ที่ใชใ้ นการพิมพข์ อ้ ความหรือค่าในตวั แปรให้แสดงบน
จอ OLED โดยรูปแบบการใช้งานคล้ายคลึงกับ Serial.print() นั่นคือเมื่อพิมพ์เสร็จตัว
เคอร์เซอร์จะรออยทู่ ี่ทา้ ยส่ิงที่พมิ พน์ ้นั ๆ รูปแบบเป็นดงั น้ี
.print();
6. ฟังก์ชั่นพมิ พ์ข้อความ ใชใ้ นการพิมพข์ อ้ ความหรือค่าในตวั แปรให้แสดงบนจอ OLED โดย
รูปแบบการใชง้ านคลา้ ยคลึงกบั Serial.println() นนั่ คือเมื่อพิมพเ์ สร็จตวั เคอร์เซอร์จะขยบั มา
ข้ึนบรรทดั ใหม่รอฟังกช์ น่ั พมิ พข์ อ้ ความต่อไป รูปแบบเป็นดงั น้ี
.println();
7. ฟังก์ช่ันกาหนดตาแหน่งเคอร์เซอร์สาหรับพิมพ์ข้อความ เป็ นฟังก์ชน่ั กาหนดพิกดั ให้กบั
เคอร์เซอร์เพอื่ ใชพ้ มิ พข์ อ้ ความในตาแหน่งท่ีตอ้ งการ รูปแบบเป็นดงั น้ี
270 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]
.setCursor(x0,y0);
x0: พกิ ดั แกน x
y0: พกิ ดั แกน y
8. ฟังก์ช่ันเรียกใช้งานฟอนต์ เป็ นฟังก์ชนั่ ที่ใชเ้ รียกใชง้ านฟอนต์ที่ตอ้ งการโดยใส่ช่ือฟอนตท์ ่ี
ตอ้ งการใชง้ าน (ช่ือฟอนตใ์ นตารางที่ 4.20-2) รูปแบบเป็นดงั น้ี
.setFont(&Font);
Font: ช่ือฟอนตท์ ี่ตอ้ งการใชง้ าน (ไม่ตอ้ งใส่สกุล .h)
9. ฟังก์ชั่นกาหนดสีข้อความ ใชใ้ นการกาหนดสีของตวั ขอ้ ความและพ้ืนหลงั ขอ้ ความ รูปแบบ
เป็นดงั น้ี
.setTextColor(color,background)
color: สีของขอ้ ความท่ีตอ้ งการแสดง (BLACK, WHITE)
background: สีของพ้ืนหลงั ขอ้ ความท่ีตอ้ งการแสดง (BLACK, WHITE)
10. ฟังก์ช่ันกาหนดขนาดของตัวอักษร ใชใ้ นการกาหนดขนาดของตวั อกั ษรท่ีตอ้ งการแสดงผล
บนจอ OLED รูปแบบเป็นดงั น้ี
.setTextSize(sizes);
sizes: ตวั เลขขนาดท่ีตอ้ งการสามารถใชง้ านไดต้ ้งั แต่ 1-8
7. วงจรทใ่ี ช้ทดลอง
วงจรเพือ่ ใชท้ ดลองในใบงานสามารถทาได้ 2 แนวทาง คือ
1. วงจรไมโครคอนโทรลเลอร์ Arduino ท่ีสร้างเองจากไมโครคอนโทรลเลอร์ AVR
2. วงจรไมโครคอนโทรลเลอร์ Arduino ที่ใชบ้ อร์ดโมดูล Arduino สาเร็จรูป
เนื่องจากไม่มีโมเดลจาลอง OLED ในโปรแกรม Proteus จึงไม่สามารถจาลองการทางานได้
กรณีที่ใชว้ งจรท่ีสร้างข้ึนเองจากไอซีไมโครคอนโทรลเลอร์ AVR ที่ลงบูตโหลดเดอร์เป็น Arduino
เรียบร้อยแลว้ ต่อวงจรดงั รูป
ใบงานท่ี 4.21 การเขียนโปรแกรมแสดงผลรูปภาพดว้ ยจอ OLED 128×64 271
1DN15819 VCC Peripheral circuit
R1 CPU circuit VCC
10k
7,20 ATMEGA328 VCC GND SCL SDA
SW1 VCC
1 RST AVCC
C1
0.1uF
A4(SDA) 27
A5(SCL) 28
USB to UART (TTL Level) R2,R3 3
1k 2
DTR
RXD D1(TXD)
TXD D0(RXD)
+5V
GND
3V3
X1 9 XTAL1
16MHz 10 XTAL2
C2,C3 GND
22pF
8,22
รูปท่ี 4.20-18 วงจรที่ใชไ้ อซี AVR ในการทดลอง
กรณีที่ใช้ Arduino ในการทดลอง ต่อวงจรดงั รูป VCC
ARDUINO
VCC
A4(SDA)
A5(SCL)
VCC GND SCL SDA
GND
รูปท่ี 4.20-19 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง
การตอ่ วงจรไมโครคอนโทรลเลอร์ Arduino ที่ใชบ้ อร์ดโมดูล Arduino สาเร็จรูปลงบอร์ดทดลอง
F GH I J 20 20 25 25 30 30 35 35 40 40 45 45 50 50 55 55 60 60 F GH I J
D12 1
D11
D10
D9
D8 5
D7
D6
D5
D4
D3 10
D2
GND
RST
D0
D1 15
ABCDE VCC GND S CL S DA
D13
3V3 ABCDE
REF
A0
A1
A2
A3
A4
A5
A6
A7
5V
RST
GND
VIN
1
5
10
15
รูปที่ 4.20-20 การต่อลงบอร์ดทดลอง
272 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]
8. การเขยี นโค้ดโปรแกรมควบคุม
การทดลองท่ี 1 เขียนโปรแกรมแสดงภาพบนจอ OLED
ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี
START
กาหนดคา่ เริ่มต้นต่าง
แสดงผล
แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino
1 #include <Wire.h>
2 #include <Adafruit_GFX.h>
3 #include <Adafruit_SSD1306.h>
4 Adafruit_SSD1306 OLED(4);
5 const unsigned char logo [] PROGMEM = {
6 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
7 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
8 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
10 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00,
11 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00,
12 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00,
13 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00,
14 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
15 0x00, 0x18, 0x00, 0x00, 0x0c, 0x00, 0x00,
16 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00,
17 0x00, 0x0e, 0x00, 0x00, 0x38, 0x00, 0x00,
18 0x00, 0x06, 0x07, 0xf8, 0x30, 0x00, 0x00,
19 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 0x00,
20 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x00, 0x00,
21 0x00, 0x00, 0x78, 0x0f, 0x00, 0x00, 0x00,
22 0x00, 0x00, 0xf0, 0x07, 0x80, 0x00, 0x00,
23 0x00, 0x01, 0xe0, 0x03, 0x80, 0x00, 0x00,
24 0x00, 0x01, 0xc0, 0x01, 0xc0, 0x00, 0x00,
25 0x00, 0x03, 0x80, 0x01, 0xc0, 0x00, 0x00,
26 0x00, 0x03, 0x80, 0x00, 0xe0, 0x00, 0x00,
27 0x03, 0xc3, 0x80, 0xff, 0xe1, 0xe0, 0x00,
28 0x07, 0xe3, 0x81, 0xff, 0xf3, 0xf0, 0x00,
29 0x03, 0xc3, 0x87, 0xff, 0xf9, 0xe0, 0x00,
30 0x00, 0x03, 0x8f, 0x80, 0x7c, 0x00, 0x00,
31 0x00, 0x01, 0xfe, 0x00, 0x1e, 0x00, 0x00,
32 0x00, 0x01, 0xfc, 0x00, 0x0f, 0x00, 0x00,
33 0x00, 0x0f, 0xf8, 0x00, 0x07, 0xfc, 0x00,
34 0x00, 0x3f, 0xf0, 0x00, 0x03, 0xff, 0x00,
35 0x00, 0x7f, 0xc0, 0x00, 0x01, 0xff, 0x80,
36 0x00, 0xfc, 0x00, 0x00, 0x00, 0x07, 0xc0,
37 0x01, 0xf0, 0x00, 0x00, 0x00, 0x01, 0xe0,
38 0x03, 0xe0, 0x00, 0x00, 0x00, 0x00, 0xf0,
39 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x70,
40 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78,
41 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c,
42 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c,
43 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c,
44 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c,
45 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x78,
46 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x78,
47 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xf0,
48 0x03, 0xc0, 0x00, 0x00, 0x00, 0x01, 0xf0,
ใบงานท่ี 4.21 การเขียนโปรแกรมแสดงผลรูปภาพดว้ ยจอ OLED 128×64 273
49 0x01, 0xe0, 0x30, 0x00, 0x01, 0x83, 0xe0,
50 0x00, 0xfc, 0x78, 0x00, 0x07, 0xc7, 0xc0,
51 0x00, 0x7f, 0xfc, 0x00, 0x1f, 0xff, 0x80,
52 0x00, 0x3f, 0xff, 0x00, 0x3f, 0xff, 0x00,
53 0x00, 0x0f, 0xcf, 0xe0, 0xfe, 0x7c, 0x00,
54 0x00, 0x00, 0x07, 0xff, 0xfc, 0x00, 0x00,
55 0x00, 0x00, 0x03, 0xff, 0xf0, 0x00, 0x00,
56 0x00, 0x00, 0x00, 0xff, 0xc0, 0x00, 0x00,
57 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
58 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
59 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
60 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
61 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
62 };
63 void setup()
64 {
65 OLED.begin(SSD1306_SWITCHCAPVCC,0x3C); // initialize with the I2C addr 0x3C
66 OLED.clearDisplay();
67 OLED.drawBitmap(20,10,logo,56,56,1);
68 OLED.display();
69 }
70 void loop()
71 {
72 delay(250);
73 }
รายละเอยี ดโค้ดโปรแกรม
- บรรทดั ที่ 1 รวมไฟลไ์ ลบรารี่ Wire.h เขา้ มาในโคด้ โปรแกรม
- บรรทดั ท่ี 2 รวมไฟลไ์ ลบราร่ี Adafruit_GFX.h เขา้ มาในโคด้ โปรแกรม
- บรรทดั ที่ 3 รวมไฟลไ์ ลบรารี่ Adafruit_SSD1306.h เขา้ มาในโคด้ โปรแกรม
- บรรทดั ที่ 4 กาหนดช่ือเรียกโมดูลจอวา่ OLED
- บรรทดั ที่ 5-62 ตวั แปรท่ีใชเ้ ก็บรูปภาพ
- บรรทดั ท่ี 65 ประกาศเร่ิมใชง้ านไลบราร่ีพร้อมระบุแอดเดรสจอ OLED
- บรรทดั ที่ 66 ลา้ งขอ้ มูลที่แสดงผลหนา้ จอ
- บรรทดั ที่ 67 วาดรูปภาพจากตวั แปรเกบ็ รูปภาพ
- บรรทดั ที่ 68 ส่งั ใหแ้ สดงผล
ทดลองการทางาน
1. ทดลองดว้ ยวงจรจริง
2. ทดลองเปลี่ยนรูปภาพในการแสดงผล
9. สรุปผลการปฏบิ ตั งิ าน
274 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]
10. งานทม่ี อบหมาย
1. เขียนโปรแกรมแสดงรูปภาพ (เป็ นรูปภาพท่ีเลือกเองตามตอ้ งการ) พร้อมแสดงขอ้ ความ
ประกอบและเวลาท่ีบอร์ดเปิ ดใชง้ านผา่ นมา (หน่วยเป็นวนิ าที) วงจรท่ีใชท้ ดลองเป็นดงั รูป
ARDUINO
VCC VCC
A4(SDA)
A5(SCL)
VCC GND SCL SDA
GND
รูปท่ี 4.20-21 วงจรที่ใชบ้ อร์ด Arduino ในการทดลอง
ใบงานท่ี 4.22 การประยกุ ตก์ ารแสดงผลท่ี LCD 4 bit กบั เซนเซอร์ต่าง ๆ 275
ใบงานที่ 4.22
การประยุกต์การแสดงผลที่ LCD 4 bit กบั เซนเซอร์ต่าง ๆ
1. จุดประสงค์ทว่ั ไป
เพ่ือใหส้ ามารถประยกุ ตก์ ารแสดงผลที่ LCD 4 bit กบั เซนเซอร์ตา่ ง ๆ ได้
2. จุดประสงค์เชิงพฤติกรรม
1. บอกวธิ ีประยกุ ตก์ ารแสดงผลท่ี LCD 4 bit กบั เซนเซอร์ตา่ ง ๆ ได้
2. บอกข้นั ตอนการต่อวงจรเพ่ือทดลองบนบอร์ดทดลองได้
3. ทดสอบการทางานของบอร์ด Arduino ได้
4. ปฏิบตั ิงานตามใบงานเสร็จทนั เวลาท่ีกาหนด
3. เคร่ืองมือและอปุ กรณ์
1. บอร์ดทดลอง Breadboard 830 Point 1 แผน่
2. อุปกรณ์อิเล็กทรอนิกส์ประกอบดว้ ย 4 ตวั
4 ตวั
2.1 Trim pot 10k 1 ตวั 2.5 LED 3mm 1 ตวั
2.6 ตวั ทา้ นทาน 220 1 ตวั
2.2 Potentiometer 10k 1 ตวั 2.7 ตวั ทา้ นทาน 4.7k
2.8 ตวั ทา้ นทาน 10k 1 เส้น
2.3 Thermistor NTC 10k 1 ตวั 1 ชุด
3.5 สายเช่ือมตอ่ USB (Mini) 1 เคร่ือง
2.4 IC DS18B20 1 ตวั 3.6 สายเช่ือมต่อวงจร
3.7 คอมพิวเตอร์
3. อุปกรณ์ร่วมอ่ืน ๆ
3.1 บอร์ด Arduino Nano 3.0 1 ตวั
3.2 LCD ชนิดตวั อกั ษร 16×2 1 ตวั
3.3 โมดูลวดั อุณหภูมิ DHT22 1 ตวั
3.4 โมดูลอลั ตร้าโซนิค HC-SR04 1 ตวั
4. ลาดบั ข้นั การปฏบิ ตั ิงาน
1. ศึกษาจุดประสงคท์ ว่ั ไป จุดประสงคเ์ ชิงพฤติกรรมและทฤษฎีพ้นื ฐานที่เกี่ยวขอ้ ง
2. ดาเนินการต่อวงจรลงบอร์ดทดลองตามวงจรที่กาหนด
3. เขียนโปรแกรมควบคุมและทดสอบการทางานของวงจร
4. สรุปผลการปฏิบตั ิงาน
276 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]
5. ทฤษฎพี ืน้ ฐาน
การประยุกตใ์ ชง้ านในใบงานน้ีเป็ นการเปลี่ยนเป้าหมายการแสดงผลจากเดิมในใบงานท่ี 4.6,
4.7, 4.8, 4.9 และ 4.10 ท่ีเป็ นการอ่านค่าจากเซนเซอร์แบบต่าง ๆ แลว้ นาผลมาคานวณ (หรือนามาใช้ได้
เลยในบางใบงาน) ไปแสดงผลผ่านทางจอคอมพิวเตอร์ผ่านทางการส่ือสารทางพอร์ตอนุกรมซ่ึงการ
ดาเนินการดังกล่าวเป็ นการเขียนโค้ดโปรแกรมเพื่อใช้ทดสอบผลการทางานกบั เซนเซอร์ต่าง ๆ ใน
เบ้ืองตน้ ซ่ึงไม่ตอ้ งต่อตวั แสดงผลอ่ืน ๆ สาหรับใบงานน้ีเป็ นการเปลี่ยนเป้าหมายจากการแสดงผลจาก
จอคอมพิวเตอร์มาเป็นจอ LCD ชนิดตวั อกั ษรที่ต่อเช่ือมแบบ 4 บิต
6. วงจรทใ่ี ช้ทดลอง
วงจรเพอื่ ใชท้ ดลองในใบงานเป็นการทดลองจากเซนเซอร์ท้งั 5 แบบโดยแสดงผลท่ีจอ LCD
ชนิดตวั อกั ษรท่ีเช่ือมต่อแบบ 4 บิต วงจรที่ใชท้ ดลองมีดงั น้ี
1. วงจรที่ใชเ้ ซนเซอร์เป็นตวั ตา้ นทานปรับคา่ ได้
2. วงจรท่ีใชเ้ ซนเซอร์เป็นเทอร์มิสเตอร์วดั อุณหภูมิที่อ่านค่ามาเป็นแรงดนั แอนาลอก
3. วงจรที่ใชเ้ ซนเซอร์เป็น DHT22
4. วงจรที่ใชเ้ ซนเซอร์เป็น Ultrasonic
5. วงจรที่ใชเ้ ซนเซอร์เป็น DS18B20
วงจรทใี่ ช้เซนเซอร์เป็ นตัวต้านทานปรับค่าได้
D1 VCC Peripheral circuit
1N5819
CPU circuit
R1 7,20 ATMEGA328
10k
VCC
SW1 1 RST AVCC
C1 D2 4 11 D4
0.1uF D3 5 12 D5
D4 6 13 D6
D5 11 14 D7
USB to UART (TTL Level) R2,R3 3 E R/W RS Vo VCC GND
1k 2 6 54321
DTR
RXD D1(TXD) D6 12 VCC
TXD D0(RXD) D7 13 10k
+5V
GND
3V3
VCC
X1 9 XTAL1 A5 28 10k
16MHz 10 XTAL2
C2,C3 GND
22pF
8,22
รูปท่ี 4.22-1 วงจรที่ใชไ้ อซี AVR ในการทดลอง
รูปท่ี 4.22-4 การต่อวงจรทดลองในโปรแกรมจาลองการทางาน รูปที่ 4.22-3 การตอ่ ลงบอร์ดทดลอง ABCDE F GH I J การต่อวงจรไมโครคอนโทรลเลอร์ Arduino ที่ใชบ้ อร์ดโมดูล Arduino สาเร็จรูปลงบอร์ดทดลอง รูปที่ 4.22-2 วงจรที่ใชบ้ อร์ด Arduino ในการทดลอง ใบงานที่ 4.22 การประยกุ ตก์ ารแสดงผลที่ LCD 4 bit กบั เซนเซอร์ตา่ ง ๆ 277
การตอ่ วงจรเพอ่ื ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus 1 D13 D12 1
D11 กรณีที่ใช้ Arduino ในการทดลอง ต่อวงจรดงั รูป
3V3 D10
REF D9 VCC ARDUINO
A0 D8 5
5 A1 D7 5V D2 11 D4
A2 D6 D3 12 D5
A3 D5 D4 13 D6
A4 D4 D5 14 D7
A5 D3 10 E R/W RS Vo VCC GND
10 A6 D2 654321
A7 D6 VCC
5V GND D7
RST RST 10k
GND
15 VIN D0 VCC
D1 15
20 20 A5
GND
25 25
30 30
35 35 10k
40 40
45 45
50 50
55 55
60 60
ABCDE F GH I J
278 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]
การทดลองท่ี 1 เขียนโปรแกรมแสดงค่าที่อา่ นไดจ้ ากโพเทนธิโอมิเตอร์
ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี
START
กา นดค่าเริม่ ต้นต่าง ๆ
อ่านค่าจาก POT
แสดงค่าทอี่ ่านได้
แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino
1 #include <LiquidCrystal.h> // set up the LCD's connection pins
2 /* The circuit: // set LCD size
3 * LCD RS pin to digital pin 7
4 * LCD E pin to digital pin 6
5 * LCD D4 pin to digital pin 2
6 * LCD D5 pin to digital pin 3
7 * LCD D6 pin to digital pin 4
8 * LCD D7 pin to digital pin 5
9 * LCD R/W pin to ground
10 */
11 #define POT 5
12 LiquidCrystal lcd(7,6,2,3,4,5);
13 void setup()
14 {
15 lcd.begin(16, 2);
16 lcd.print("Analog Read :");
17 }
18 void loop()
19 {
20 int adc=analogRead(POT);
21 lcd.setCursor(8,1);
22 lcd.print(adc);
23 delay(100);
24 }
ทดลองการทางาน
1. จาลองการทางานดว้ ยโปรแกรม Proteus
2. ทดลองดว้ ยวงจรจริง
3. ทดลองเปลี่ยนแปลงคา่ โพเทนธิโอมิเตอร์แลว้ สงั เกตผล
ใบงานที่ 4.22 การประยกุ ตก์ ารแสดงผลท่ี LCD 4 bit กบั เซนเซอร์ต่าง ๆ 279
วงจรทใ่ี ช้เซนเซอร์เป็ นเทอร์มสิ เตอร์วดั อณุ ภูมิ
D1 VCC Peripheral circuit
1N5819
CPU circuit
R1 7,20 ATMEGA328
10k VCC
SW1 1 RST AVCC
D2 4
C1 D3 5 11 D4
0.1uF D4 6 12 D5
D5 11 13 D6
14 D7
USB to UART (TTL Level) R2,R3 3 R/W RS Vo VCC GND
1k 2 E 54321
DTR 6
RXD D1(TXD) D6 12
TXD D0(RXD) D7 13 VCC
+5V 10k
GND
3V3
VCC
X1 9 XTAL1 A5 28 R4
16MHz 10 XTAL2 10k
GND T NTC
Thermistor
C2,C3 8,22 10k
22pF
รูปท่ี 4.22-5 วงจรที่ใชไ้ อซี AVR ในการทดลอง
กรณีที่ใช้ Arduino ในการทดลอง ต่อวงจรดงั รูป
VCC ARDUINO
5V D2 11 D4 R/W RS Vo VCC GND
D3 12 D5 54321
D4 13 D6
D5 14 D7
D6 E
D7 6
A5 VCC
GND 10k
VCC
R1 NTC
10k T1h0ekrmistor
T
รูปท่ี 4.22-6 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง
การต่อวงจรไมโครคอนโทรลเลอร์ Arduino ที่ใชบ้ อร์ดโมดูล Arduino สาเร็จรูปลงบอร์ดทดลอง
F GH I J 20 20 25 25 30 30 35 35 40 40 45 45 50 50 55 55 60 60 F GH I J
D12 1
D11
D10
D9
D8 5
D7
D6
D5
D4
D3 10
D2
GND
RST
D0
D1 15
ABCDE ABCDE
D13
3V3
REF
A0
A1
A2
A3
A4
A5
A6
A7
5V
RST
GND
VIN
1
5
10
15
รูปที่ 4.22-7 การต่อลงบอร์ดทดลอง
280 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]
การตอ่ วงจรเพ่อื ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus
รูปที่ 4.22-8 การต่อวงจรทดลองในโปรแกรมจาลองการทางาน
การทดลองที่ 2 เขียนโปรแกรมแสดงผลท่ีอ่านค่าจากเทอร์มิสเตอร์แลว้ คานวนเป็นอุณหภูมิ
ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี
START
กา นดคา่ เริม่ ต้นต่าง ๆ
อ่านคา่ จาก NTC
คานวณ
แสดงผล
แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino
1 #include <LiquidCrystal.h>
2 /* The circuit:
3 * LCD RS pin to digital pin 7
4 * LCD E pin to digital pin 6
5 * LCD D4 pin to digital pin 2
6 * LCD D5 pin to digital pin 3
7 * LCD D6 pin to digital pin 4
8 * LCD D7 pin to digital pin 5
9 * LCD R/W pin to ground
10 */
11 #define NTC A5
12 double Thermistor(int RawADC) ;
13 LiquidCrystal lcd(7,6,2,3,4,5); // set up the LCD's connection pins
14 void setup()
15 {
16 lcd.begin(16, 2); // set LCD size
17 lcd.print("Temperature is:");
18 lcd.setCursor(13,1);
19 lcd.print("'C");
20 }
21 void loop()
22 {
23 float Temp=Thermistor(analogRead(NTC));
24 lcd.setCursor(7,1);
25 lcd.print(Temp);
ใบงานท่ี 4.22 การประยกุ ตก์ ารแสดงผลที่ LCD 4 bit กบั เซนเซอร์ตา่ ง ๆ 281
26 delay(500);
27 }
28 double Thermistor(int RawADC)
29 {
30 double Cal;
31 Cal = log(10000.0/((1024.0/RawADC-1)));
32 Cal = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Cal * Cal))* Cal);
33 Cal = Cal - 273.15; // Convert Kelvin to Celcius
34 return Cal;
35 }
ทดลองการทางาน
1. จาลองการทางานดว้ ยโปรแกรม Proteus
2. ทดลองดว้ ยวงจรจริง
3. ทดลองเพมิ่ /ลดอุณหภูมิที่เทอร์มิสเตอร์สงั เกตผล
วงจรทใ่ี ช้เซนเซอร์เป็ น DHT22
D1 VCC Peripheral circuit
1N5819
CPU circuit
R1 7,20 ATMEGA328
10k VCC
SW1 1 RST AVCC
D2 4
C1 D3 5 11 D4
0.1uF D4 6 12 D5
D5 11 13 D6
14 D7
USB to UART (TTL Level) R2,R3 3 R/W RS Vo VCC GND
1k 2 E 54321
DTR 6
RXD D1(TXD) D6 12
TXD D0(RXD) D7 13 VCC
+5V 10k
GND
3V3
VCC
X1 R4 DHT22
16MHz 4k7
9 XTAL1 D8 14
10 XTAL2 DATA
C2,C3 GND
22pF
8,22
รูปท่ี 4.22-9 วงจรที่ใชไ้ อซี AVR ในการทดลอง
กรณีที่ใช้ Arduino ในการทดลอง ตอ่ วงจรดงั รูป
VCC ARDUINO
5V
D2 11 D4
D3 12 D5 VCC
D4 13 D6 10k
D5 14 D7
E R/W RS Vo VCC GND
654321
D6
D7
VCC
R1 DHT22
4k7
D8
GND DATA
รูปที่ 4.22-10 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง
F GH I J282 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]20 2025 25 30 30 35 35 40 40 45 45 50 50 55 55 60 60 F GH I J
D12 1
D11การต่อวงจรไมโครคอนโทรลเลอร์ Arduino ท่ีใชบ้ อร์ดโมดูล Arduino สาเร็จรูปลงบอร์ดทดลอง
D10
D9 รูปที่ 4.22-11 การตอ่ ลงบอร์ดทดลอง
D8 5การตอ่ วงจรเพือ่ ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus
D7
D6รูปท่ี 4.22-12 การต่อวงจรทดลองในโปรแกรมจาลองการทางาน
D5การทดลองท่ี 3 เขียนโปรแกรมแสดงอุณภูมิและความช้ืนจาก DHT22
D4ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี
D3 10
D2START
กา นดคา่ เริม่ ต้นต่าง ๆ
GNDอ่านคา่ จากโมดลู DHT22
RST
แสดงผล
D0
D1 15แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino
ABCDE1 #include <LiquidCrystal.h> ABCDE
1 D132 /* The circuit:
3 * LCD RS pin to digital pin 7
3V34 * LCD E pin to digital pin 6
REF5 * LCD D4 pin to digital pin 2
A06 * LCD D5 pin to digital pin 3
5 A17 * LCD D6 pin to digital pin 4
A28 * LCD D7 pin to digital pin 5
A3
A4
A5
10 A6
A7
5V
RST
GND
15 VIN
ใบงานท่ี 4.22 การประยกุ ตก์ ารแสดงผลท่ี LCD 4 bit กบั เซนเซอร์ตา่ ง ๆ 283
9 * LCD R/W pin to ground
10 */
11 #include <DHT.h>
12 #define DHTPIN 8 // pin to connect DHT22
13 #define DHTTYPE DHT22 // Type of use DHT11,DHT21,DHT22
14 DHT dht(DHTPIN, DHTTYPE);
15 LiquidCrystal lcd(7,6,2,3,4,5); // set up the LCD's connection pins
16 void setup()
17 {
18 lcd.begin(16, 2); // set LCD size
19 lcd.print("Humidity:");
20 lcd.setCursor(0,1);
21 lcd.print("Temp:");
22 dht.begin();
23 }
24 void loop()
25 {
26 delay(2000);
27 float h = dht.readHumidity();
28 float t = dht.readTemperature();
29 if (isnan(h) || isnan(t))
30 {
31 lcd.clear();
32 lcd.print("Failed read DHT");
33 return;
34 }
35 lcd.setCursor(10,0);
36 lcd.print(h);
37 lcd.setCursor(10,1);
38 lcd.print(t);
39 }
ทดลองการทางาน
1. จาลองการทางานดว้ ยโปรแกรม Proteus
2. ทดลองดว้ ยวงจรจริง
3. ทดลองเพมิ่ /ลดอุณหภูมิและความช้ืน สงั เกตผล
วงจรทใี่ ช้เซนเซอร์เป็ น Ultasonic
D1 VCC Peripheral circuit
1N5819
CPU circuit
R1
10k 7,20 ATMEGA328
VCC
SW1 11 D4
1 RST AVCC D2 4 12 D5
C1 D3 5 13 D6
0.1uF D4 6 14 D7
D5 11
E
USB to UART (TTL Level) R2,R3 3 D6 12 6 R/W RS Vo VCC GND
1k 2 D7 13 54321
DTR
RXD D1(TXD) VCC
TXD D0(RXD) 10k
+5V
GND
3V3
X1 9 XTAL1 D9 15 VCC HC-SR04
16MHz 10 XTAL2 D8 14 1 VCC
2 Trig
C2,C3 GND 3 Echo
22pF 4 GND
8,22
รูปที่ 4.22-13 วงจรที่ใชไ้ อซี AVR ในการทดลอง
รูปที่ 4.22-16 การตอ่ วงจรทดลองในโปรแกรมจาลองการทางาน รูปท่ี 4.22-15 การต่อลงบอร์ดทดลอง ABCDE F GH I J รูปท่ี 4.22-14 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง VCC กรณีท่ีใช้ Arduino ในการทดลอง ตอ่ วงจรดงั รูป 284 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]
การต่อวงจรเพอ่ื ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus 1 D13 D12 1 การตอ่ วงจรไมโครคอนโทรลเลอร์ Arduino ที่ใชบ้ อร์ดโมดูล Arduino สาเร็จรูปลงบอร์ดทดลอง 5V
D11
3V3 D10 D9
REF D9 D8
A0 D8 5
5 A1 D7 GND
A2 D6
A3 D5
A4 D4
A5 D3 10
10 A6 D2
A7
5V GND
RST RST
GND
15 VIN D0
D1 15
20 20 E ARDUINO
6
HC-SR04 HC-SR04 D6 D2
D3
VCC D7 D4
Trig D5
Echo
25 25 GND 11 D4
12 D5
13 D6
14 D7
30 30
35 35 R/W RS Vo VCC GND
54321
40 40 VCC
1 VCC
2 Trig
3 Echo
4 GND
45 45
50 50
55 55 VCC
10k
60 60
ABCDE F GH I J
ใบงานท่ี 4.22 การประยกุ ตก์ ารแสดงผลท่ี LCD 4 bit กบั เซนเซอร์ตา่ ง ๆ 285
การทดลองที่ 4 เขียนโปรแกรมวดั ระยะดว้ ย Ultrasonic แสดงผลดว้ ยจอ LCD
ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี
START
กา นดคา่ เริ่มต้นต่าง ๆ
อ่านคา่ จากโมดลู Ultrasonic
แสดงผล
แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino
1 #include <LiquidCrystal.h>
2 /* The circuit:
3 * LCD RS pin to digital pin 7
4 * LCD E pin to digital pin 6
5 * LCD D4 pin to digital pin 2
6 * LCD D5 pin to digital pin 3
7 * LCD D6 pin to digital pin 4
8 * LCD D7 pin to digital pin 5
9 * LCD R/W pin to ground
10 */
11 #include <Ultrasonic.h>
12 Ultrasonic ultrasonic(9,8); // (Trig PIN,Echo PIN)
13 LiquidCrystal lcd(7,6,2,3,4,5); // set up the LCD's connection pins
14 void setup()
15 {
16 lcd.begin(16, 2); // set LCD size
17 lcd.print("Length is :");
18 lcd.setCursor(13,1);
19 lcd.print("cm");
20 }
21 void loop()
22 {
23 delay(500);
24 lcd.setCursor(7,1);
25 float L=ultrasonic.Ranging(CM);
26 lcd.print(L);
27 }
ทดลองการทางาน
1. จาลองการทางานดว้ ยโปรแกรม Proteus
2. ทดลองดว้ ยวงจรจริง
3. ทดลองเปล่ียนแปลงรูปแบบการแสดงผล
286 เรียนรู้และลองเล่น Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]
วงจรทใ่ี ช้เซนเซอร์เป็ น DS18B20
D1 VCC Peripheral circuit
1N5819
CPU circuit
R1
10k 7,20 ATMEGA328
VCC
SW1 11 D4
1 RST AVCC D2 4 12 D5
C1 D3 5 13 D6
0.1uF D4 6 14 D7
D5 11
E
USB to UART (TTL Level) R2,R3 3 D6 12 6 R/W RS Vo VCC GND
1k 2 D7 13 54321
DTR
RXD D1(TXD) VCC
TXD D0(RXD)
+5V
GND R4 10k
3V3 4.7k 4R.75k VCC
VCC
3 DS18B20 3 DS18B20
2 DQ VCC
D8 14 2 VCC
D9 15 GND DQ
X1 1 GND
16MHz 9 XTAL1
10 XTAL2 1
C2,C3 GND
22pF
8,22
รูปท่ี 4.22-17 วงจรที่ใชไ้ อซี AVR ในการทดลอง
กรณีท่ีใช้ Arduino ในการทดลอง ต่อวงจรดงั รูป
VCC ARDUINO
5V D2 11 D4 R/W RS Vo VCC GND
D3 12 D5 54321
D4 13 D6
D5 14 D7
D6 E
D7 6
D8 VCC
D9
GND 10k
R1 VCC R2 VCC
4.7k 4.7k
3 DS18B20 3 DS18B20
2 VCC 2 DQ VCC
DQ GND
GND 1
1
รูปที่ 4.22-18 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง
การตอ่ วงจรไมโครคอนโทรลเลอร์ Arduino ที่ใชบ้ อร์ดโมดูล Arduino สาเร็จรูปลงบอร์ดทดลอง
F GH I J 20 20 25 25 30 30 35 35 40 40 45 45 50 50 55 55 60 60 F GH I J
D12 1
D11
D10
D9
D8 5
D7
D6
D5
D4
D3 10
D2
GND
RST
D0
D1 15
ABCDE D S1 8 D S1 8 ABCDE
D13 B 20 B 20
3V3
REF
A0
A1
A2
A3
A4
A5
A6
A7
5V
RST
GND
VIN
1
5
10
15
รูปที่ 4.22-19 การต่อลงบอร์ดทดลอง
ใบงานท่ี 4.22 การประยกุ ตก์ ารแสดงผลท่ี LCD 4 bit กบั เซนเซอร์ตา่ ง ๆ 287
การต่อวงจรเพอ่ื ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus
รูปที่ 4.22-20 การต่อวงจรทดลองในโปรแกรมจาลองการทางาน
การทดลองท่ี 5 เขียนโปรแกรมแสดงค่าอุณหภูมิที่วดั จากไอซี DS18B20 จานวน 2 ตวั โดยแสดงผลที่จอ
LCD ที่เชื่อมตอ่ แบบ 4 บิต
ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี
START
กา นดค่าเริ่มต้นต่าง ๆ
อ่านคา่ จากไอซี
แสดงค่าทอ่ี า่ นได้
แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino
1 #include <LiquidCrystal.h>
2 #include <OneWire.h>
3 #include <DallasTemperature.h>
4 OneWire ds_1(8); //sensor 1 on pin D8
5 OneWire ds_2(9); //sensor 2 on pin D9
6 DallasTemperature sensor_1(&ds_1);
7 DallasTemperature sensor_2(&ds_2);
8 float temp_1; //variable keep temp value
9 float temp_2; //variable keep temp value
10 void temp_read();
11 LiquidCrystal lcd(7,6,2,3,4,5); // 7->RS,6->E,2->D4,3->D5,4->D6,5->D7
12 void setup()
13 {
14 lcd.begin(16, 2); // set LCD size
15 lcd.print("Sensor1: 'C");
16 lcd.setCursor(0,1);
17 lcd.print("Sensor2: 'C");
18 sensor_1.begin();
19 sensor_2.begin();
20 }
21 void loop()
22 {
288 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]
23 temp_read();
24 lcd.setCursor(10,0);
25 lcd.print(temp_1,1);
26 lcd.setCursor(10,1);
27 lcd.print(temp_2,1);
28 delay(500);
29 }
30 void temp_read()
31 {
32 sensor_1.requestTemperatures();
33 sensor_2.requestTemperatures();
34 //------------------------------------------
35 temp_1 = sensor_1.getTempCByIndex(0); //read temp from sensor_1
36 temp_2 = sensor_2.getTempCByIndex(0); //read temp from sensor_2
37 }
ทดลองการทางาน
1. จาลองการทางานดว้ ยโปรแกรม Proteus (ใช้ Arduino IDE v. 1.6.5 ในการคอมไพล)์
2. ทดลองดว้ ยวงจรจริง
3. ทดลองใหอ้ ุณหภูมิท่ีตวั ไอซีเปล่ียนแปลงแลว้ สงั เกตผล
9. สรุปผลการปฏบิ ัติงาน
10. งานทม่ี อบ มาย
1. เขียนโปรแกรมที่ใช้เซนเซอร์วดั อุณหภูมิและความช้ืน DHT22 โดยใช้ค่าอุณภูมิและ
ความช้ืนเป็นตวั ควบคุมการทางานของ LED พร้อมท้งั แสดงผลท่ีจอ LCD
VCC ARDUINO 11 D4
5V 12 D5
D2 13 D6
D3 14 D7
D4
D5
D6 E R/W RS Vo VCC GND
D7 6 54321
D10
D11 R1-R4 220 VCC
D12 10k
D13 LED1-LED4 VCC
R5 DATA DHT22
D8 4k7
GND
รูปที่ 4.22-21 วงจรที่ใชท้ ดลอง
ใบงานที่ 4.23 การประยกุ ตก์ ารแสดงผลท่ี LCD I2C กบั เซนเซอร์ตา่ ง ๆ 289
ใบงานท่ี 4.23
การประยุกต์การแสดงผลท่ี LCD I2C กบั เซนเซอร์ต่าง ๆ
1. จุดประสงค์ทว่ั ไป
เพอื่ ใหส้ ามารถประยกุ ตก์ ารแสดงผลท่ี LCD I2C กบั เซนเซอร์ตา่ ง ๆ ได้
2. จุดประสงค์เชิงพฤติกรรม
1. บอกวธิ ีประยกุ ตก์ ารแสดงผลท่ี LCD I2C กบั เซนเซอร์ต่าง ๆ ได้
2. บอกข้นั ตอนการต่อวงจรเพ่ือทดลองบนบอร์ดทดลองได้
3. ทดสอบการทางานของบอร์ด Arduino ได้
4. ปฏิบตั ิงานตามใบงานเสร็จทนั เวลาที่กาหนด
3. เคร่ืองมือและอปุ กรณ์
1. บอร์ดทดลอง Breadboard 830 Point 1 แผน่
2. อุปกรณ์อิเลก็ ทรอนิกส์ประกอบดว้ ย
2.1 Potentiometer 10k 1 ตวั 2.5 ตวั ทา้ นทาน 220 ohm 4 ตวั
2.6 ตวั ทา้ นทาน 4.7k 1 ตวั
2.2 Thermistor NTC 10k 1 ตวั 2.7 ตวั ทา้ นทาน 10k 1 ตวั
2.3 IC DS18B20 1 ตวั
2.4 LED 3mm 4 ตวั
3. อุปกรณ์ร่วมอื่น ๆ
3.1 บอร์ด Arduino Nano 3.0 1 ตวั 3.5 โมดูลอลั ตร้าโซนิค HC-SR04 1 ตวั
3.2 LCD ชนิดตวั อกั ษร 16x2 1 ตวั 3.6 สายเชื่อมต่อ USB (Mini) 1 เส้น
3.3 โมดูล I2C สาหรับ LCD 1 ตวั 3.7 สายเช่ือมตอ่ วงจร 1 ชุด
3.4 โมดูลวดั อุณหภูมิ DHT22 1 ตวั 3.8 คอมพิวเตอร์ 1 เคร่ือง
4. ลาดับข้นั การปฏบิ ตั งิ าน
1. ศึกษาจุดประสงคท์ วั่ ไป จุดประสงคเ์ ชิงพฤติกรรมและทฤษฎีพ้นื ฐานท่ีเก่ียวขอ้ ง
2. ดาเนินการตอ่ วงจรลงบอร์ดทดลองตามวงจรท่ีกาหนด
3. เขียนโปรแกรมควบคุมและทดสอบการทางานของวงจร
4. สรุปผลการปฏิบตั ิงาน
290 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]
5. ทฤษฎพี ืน้ ฐาน
การประยุกต์ใช้งานในใบงานน้ีเป็ นการเปล่ียนเป้าหมายการแสดงผลจากเดิมในใบงานท่ี 4.6,
4.7, 4.8, 4.9 และ 4.10 ที่เป็ นการอ่านค่าจากเซนเซอร์แบบต่าง ๆ แลว้ นาผลมาคานวณ (หรือนามาใช้ได้
เลยในบางใบงาน) ไปแสดงผลผ่านทางจอคอมพิวเตอร์ผ่านทางการส่ือสารทางพอร์ตอนุกรมซ่ึงการ
ดาเนินการดงั กล่าวเป็ นการเขียนโค้ดโปรแกรมเพื่อใช้ทดสอบผลการทางานกบั เซนเซอร์ต่าง ๆ ใน
เบ้ืองตน้ ซ่ึงไม่ตอ้ งต่อตวั แสดงผลอื่น ๆ สาหรับใบงานน้ีเป็ นการเปลี่ยนเป้าหมายจากการแสดงผลจาก
จอคอมพวิ เตอร์มาเป็นจอ LCD ชนิดตวั อกั ษรท่ีต่อเช่ือมแบบ I2C ผา่ นทางโมดูลสื่อสาร
6. วงจรทใี่ ช้ทดลอง
วงจรเพื่อใชท้ ดลองในใบงานเป็นการทดลองจากเซนเซอร์ท้งั 5 แบบโดยแสดงผลท่ีจอ LCD
ชนิดตวั อกั ษรท่ีเชื่อมต่อแบบ 4 บิต วงจรที่ใชท้ ดลองมีดงั น้ี
1. วงจรท่ีใชเ้ ซนเซอร์เป็นตวั ตา้ นทานปรับคา่ ได้
2. วงจรท่ีใชเ้ ซนเซอร์เป็นเทอร์มิสเตอร์วดั อุณหภูมิที่อ่านค่ามาเป็นแรงดนั แอนาลอก
3. วงจรที่ใชเ้ ซนเซอร์เป็น DHT22
4. วงจรที่ใชเ้ ซนเซอร์เป็น Ultrasonic
5. วงจรท่ีใชเ้ ซนเซอร์เป็น DS18B20
วงจรทใ่ี ช้เซนเซอร์เป็ นตวั ต้านทานปรับค่าได้
D1 VCC Peripheral circuit
1N5819
CPU circuit VCC VCC
R1 SDA
10k 7,20 ATMEGA328 SCL
VCC GND
SW1
1 RST AVCC
C1
0.1uF
A4(SDA) 27
A5(SCL) 28
USB to UART (TTL Level) R2,R3 3
1k 2
DTR
RXD D1(TXD)
TXD D0(RXD)
+5V
GND
3V3
X1 9 XTAL1 A3 26 VCC
16MHz 10 XTAL2 10k
C2,C3 GND
22pF
8,22
รูปท่ี 4.23-1 วงจรท่ีใชไ้ อซี AVR ในการทดลอง
รูปท่ี 4.23-4 การต่อวงจรทดลองในโปรแกรมจาลองการทางาน รูปที่ 4.23-3 การต่อลงบอร์ดทดลอง ABCDE F GH I J VCC ARDUINO กรณีท่ีใช้ Arduino ในการทดลอง ต่อวงจรดงั รูป
การตอ่ วงจรเพ่ือทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus 1 D13 D12 1 VCC VCC
การทดลองที่ 1 เขียนโปรแกรมแสดงคา่ ที่อ่านไดจ้ ากโพเทนธิโอมิเตอร์ D11 A3 10k
ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี 3V3 D10
REF D9 GND
A0 D8 5
5 A1 D7 รูปที่ 4.23-2 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง
A2 D6 การตอ่ วงจรไมโครคอนโทรลเลอร์ Arduino ที่ใชบ้ อร์ดโมดูล Arduino สาเร็จรูปลงบอร์ดทดลอง
A3 D5
A4 D4
A5 D3 10
10 A6 D2
A7
5V GND
RST RST
GND
15 VIN D0
D1 15
20 20 A4(SDA) ใบงานท่ี 4.23 การประยกุ ตก์ ารแสดงผลท่ี LCD I2C กบั เซนเซอร์ตา่ ง ๆ 291
A5(SCL)
25 25
GND
VCC
SDA
SCL
30 30 GND
VCC
SDA
SCL
35 35
40 40
45 45
50 50
55 55
60 60
ABCDE F GH I J
292 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]
START
กา นดคา่ เริ่มต้นต่าง ๆ
อ่านค่าจาก POT
แสดงค่าท่ีอา่ นได้
แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino
1 #include <Wire.h>
2 #include <LiquidCrystal_I2C.h>
3 #define POT 3
4 LiquidCrystal_I2C lcd(0x3F,16,2); //0x27 for PCF8574 and 0x3F for PCF8574A
5 void setup()
6{
7 lcd.init();
8 lcd.backlight(); // set LCD size
9 lcd.begin(16, 2);
10 lcd.print("Analog Read :");
11 }
12 void loop()
13 {
14 int adc=analogRead(POT);
15 lcd.setCursor(8,1);
16 lcd.print(adc);
17 delay(100);
18 }
ทดลองการทางาน
1. จาลองการทางานดว้ ยโปรแกรม Proteus
2. ทดลองดว้ ยวงจรจริง
3. ทดลองเปล่ียนแปลงค่าโพเทนธิโอมิเตอร์แลว้ สงั เกตผล
วงจรทใ่ี ช้เซนเซอร์เป็ นเทอร์มสิ เตอร์วดั อณุ ภูมิ
D1 VCC Peripheral circuit
1N5819
CPU circuit VCC VCC
R1 SDA
10k 7,20 ATMEGA328 SCL
VCC GND
SW1
1 RST AVCC
C1
0.1uF
A4(SDA) 27
A5(SCL) 28
USB to UART (TTL Level) R2,R3 3
1k 2
DTR
RXD D1(TXD)
TXD D0(RXD)
+5V
GND
3V3
VCC
X1 9 XTAL1 A3 26 1R04k
16MHz 10 XTAL2
T
GND NTC
C2,C3 Thermistor
22pF 8,22 10k
รูปท่ี 4.23-5 วงจรท่ีใชไ้ อซี AVR ในการทดลอง
รูปท่ี 4.23-8 การตอ่ วงจรทดลองในโปรแกรมจาลองการทางาน รูปที่ 4.23-7 การต่อลงบอร์ดทดลอง ABCDE F GH I J การต่อวงจรไมโครคอนโทรลเลอร์ Arduino ที่ใชบ้ อร์ดโมดูล Arduino สาเร็จรูปลงบอร์ดทดลอง รูปที่ 4.23-6 วงจรท่ีใชบ้ อร์ด Arduino ในการทดลอง ARDUINO กรณีท่ีใช้ Arduino ในการทดลอง ต่อวงจรดงั รูป
การต่อวงจรเพอ่ื ทดลองดว้ ยการจาลองการทางานดว้ ยโปรแกรม Proteus 1 D13 D12 1 VCC VCC
D11
3V3 D10
REF D9
A0 D8 5
5 A1 D7
A2 D6
A3 D5
A4 D4
A5 D3 10
10 A6 D2
A7
5V GND
RST RST
GND
15 VIN D0
D1 15
A3 A4(SDA)
GND A5(SCL)
20 20 ใบงานที่ 4.23 การประยกุ ตก์ ารแสดงผลท่ี LCD I2C กบั เซนเซอร์ตา่ ง ๆ 293
25 25
GND
VCC
SDA
SCL
30 30 R1 GND
10k VCC
SDA
T SCL
VCC
35 35 NTC
Thermistor
10k
40 40
45 45
50 50
55 55
60 60
ABCDE F GH I J
294 เรียนรู้และลองเลน่ Arduino เบ้ืองตน้ [ครูประภาส สุวรรณเพชร]
การทดลองท่ี 2 เขียนโปรแกรมแสดงผลท่ีอา่ นคา่ จากเทอร์มิสเตอร์แลว้ คานวนเป็นอุณหภูมิ
ผงั งาน จากโจทยส์ ามารถเขียนเป็นผงั งานไดด้ งั น้ี
START
กา นดค่าเริ่มต้นต่าง ๆ
อ่านคา่ จาก NTC
คานวณ
แสดงผล
แปลงผงั งานเป็ นโปรแกรม จากผงั งานสามารถเขียนเป็นโคด้ โปรแกรมควบคุม Arduino
1 #include <Wire.h>
2 #include <LiquidCrystal_I2C.h>
3 #define NTC A3
4 double Thermistor(int RawADC) ;
5 LiquidCrystal_I2C lcd(0x3F,16,2); // 0x27 for PCF8574 and 0x3F for PCF8574A
6 void setup()
7{
8 lcd.init();
9 lcd.backlight();
10 lcd.begin(16, 2); // set LCD size
11 lcd.print("Temperature is:");
12 lcd.setCursor(13,1);
13 lcd.print("'C");
14 }
15 void loop()
16 {
17 float Temp=Thermistor(analogRead(NTC));
18 lcd.setCursor(7,1);
19 lcd.print(Temp);
20 delay(500);
21 }
22 double Thermistor(int RawADC)
23 {
24 double Cal;
25 Cal = log(10000.0/((1024.0/RawADC-1)));
26 Cal = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Cal * Cal))* Cal);
27 Cal = Cal - 273.15; // Convert Kelvin to Celcius
28 return Cal;
29 }
ทดลองการทางาน
1. จาลองการทางานดว้ ยโปรแกรม Proteus
2. ทดลองดว้ ยวงจรจริง
3. ทดลองเพ่ิม/ลดอุณหภูมิท่ีเทอร์มิสเตอร์สงั เกตผล