วันอาทิตย์ที่ 30 กันยายน พ.ศ. 2561

งานแก้สอบ อธิบายส่วนต่างๆของ Project

HARDWARE
1.Arduino Uno 
2.HC05 Bluetooth Module 
3.2N2222 ทรานซิสเตอร์ X4
4.Load
5.1N4007 ไดโอด
6.Relay
7.ตัวต้านทาน 10KΩ
8.ตัวต้านทาน 20KΩ
9.ตัวต้านทาน 1KΩ X4                                           
                                                                     INPUT

                                                       HC05 Bluetooth Module
                                                                     
                                                                       MCU
                                                               
                                                                 Arduino Uno
                                                                         
                                                                    OUTPUT

                                                                       LOAD
                                                                             
                                                                        Relay
                                                                         
SOFTWARE
#include <SoftwareSerial.h> //กำหนดเรียกใช้ใน ไลบรารี่ Bluetooth
const int rxPin = 4; //กำหนดไปที่ rxPinขา4
const int txPin = 2; //กำหนดไปที่ txPinขา2
SoftwareSerial mySerial(rxPin, txPin); //ไว้ใช้กำหนดค่าลงใน ไลบรารี่ Bluetooth
const int Loads[] = {9, 10, 11, 12}; //ตัวแปรอาเรย์
int state = 0; //นี่คือตัวแปล state = 0
int flag = 0; ////นี่คือตัวแปล flag = 0
void setup() //เป็นฟังก์ชั่นแรกที่เมื่อ Arduino ทำงานแล้วจะเรียกเพื่อทำการ setup ค่าตามจุดประสงค์ของฟังก์ชั่น 
{
for (int i=0;i<4;i++) //int=0<4และi+เรื่อยๆ
{
pinMode(Loads[i], OUTPUT); //สั่งกำหนดใช้ Load เก็บค่าตัวแปร อาเรย์ i เป็น OUTPUT ครับ
}
mySerial.begin(9600); //แสดงค่าออกทาง Serial Monitor
for (int i=0;i<4;i++) //int=0<4และi+เรื่อยๆ
{
digitalWrite(Loads[i], LOW); //Load[i]เป็นLOW
}
}
void loop()  //คำสั่งต่างๆในการทำงาน
{
if(mySerial.available() > 0) //ถ้าพูดถึง if คำสั่งนี้สามารถต่อไปได้เรื่อยๆจนกว่าจะพอใจ // ถ้าmySerial.available>0
{
state = mySerial.read(); //stateคือการอ่านค่า
flag=0; //flag คือ 0
}
switch(state) //มันจะตรวจสอบว่าตัวแปรมีค่าเท่ากับ case ใด
{
case '0':digitalWrite(Loads[0], HIGH); //กำหนดcase 0 แสดงค่า Load อาเรย์ 0 ตั้งเป็น High
flag=1; //ตัวนี้ตรงตัวเลยครับ flag=1 คือ flag เท่ากับ 1
break; //หยุดทำงาน
case '1':digitalWrite(Loads[0], LOW); //กำหนดcase 1 แสดงค่า Load อาเรย์ 0 ตั้งเป็น LOW
flag=1; //flag=1
break; //หยุดทำงาน
case '2':digitalWrite(Loads[1], HIGH); //กำหนดcase 2 แสดงค่า Load อาเรย์ 1 ตั้งเป็น HIGH
flag=1; //flag=1
break; //หยุดทำงาน
case '3':digitalWrite(Loads[1], LOW); //กำหนดcase 3 แสดงค่า Load อาเรย์ 1 ตั้งเป็น LOW
flag=1; //flag=1
break; //หยุดทำงาน
case '4':digitalWrite(Loads[2], HIGH); //กำหนดcase 4 แสดงค่า Load อาเรย์ 2 ตั้งเป็น HIGH
flag=1; //flag=1
break; //หยุดทำงาน
case '5':digitalWrite(Loads[2], LOW); //กำหนดcase 5 แสดงค่า Load อาเรย์ 2 ตั้งเป็น LOW
flag=1; //flag=1
break; //หยุดทำงาน
case '6':digitalWrite(Loads[3], HIGH); //กำหนดcase 6 แสดงค่า Load อาเรย์ 3 ตั้งเป็น HIGH
flag=1; //flag=1
break; //หยุดทำงาน
case '7':digitalWrite(Loads[3], LOW); //กำหนดcase 7 แสดงค่า Load อาเรย์ 3 ตั้งเป็น LOW
flag=1; //flag=1
break; //หยุดทำงาน
case '8':digitalWrite(Loads[0], LOW); //กำหนดcase 8 แสดงค่า Load อาเรย์ 0 ตั้งเป็น LOW
digitalWrite(Loads[1], LOW); //กำหนดแสดงค่า Load อาเรย์ 1 สั่งเป็น LOW
digitalWrite(Loads[2], LOW); //กำหนดแสดงค่า Load อาเรย์ 2 สั่งเป็น LOW
digitalWrite(Loads[3], LOW); //กำหนดแสดงค่า Load อาเรย์ 3 สั่งเป็น LOW
flag=1; //flag=1
break; //หยุดทำงาน
}

} FLOWCHART
                                                                         
*เสร็จครับ ปล.เทมอหน้าผมจะขยันกว่าเดิม --

MINI project arduino เปิดปิดไฟบ้านด้วยบลูทูธ hc-05

เปิด-ปิดไฟบ้านด้วย บลูทูธ HC-05


อุปกรณ์
          1. arduino nano 
          2. bluetooth module hc-05
          3. relay 5v 3 channal
          4.หลอดไฟ 220V
          5. แป้นฐานหลอดไฟ

Wiring diagram

Block

การต่อสาย Wiring diagram
Bluetooth
   Rx = 11
   Tx = 10
   Vcc = 5v
   Gnd = Gnd
Relay
   Ch1 = A1
   Ch2 = A0
   Vcc = 5v
   Gnd = Gnd


Code
#include <SoftwareSerial.h>//เป็นการเรียกใช้ไลบรารี่ SoftwareSerial.h SoftwareSerial mySerial(10, 11); // RX, TX//ฟังก์ชั่นรับสัญญาณเข้าออกแบบอนุกรม const int relay1=A1;//เป็นตัวแปรชนิด อินทิเจอร์ const int relay2=A0;//เป็นตัวแปรชนิด อินทิเจอร์ const int led1=A2;//เป็นตัวแปรชนิด อินทิเจอร์ const int led2=A3;//เป็นตัวแปรชนิด อินทิเจอร์ void setup() { pinMode(relay1,OUTPUT);// รีเลย์1เป็นเอาท์พุต pinMode(relay2,OUTPUT);// รีเลย์2เป็นเอาท์พุต pinMode(led1,OUTPUT);// led 1 เป็นเอาท์พุต pinMode(led2,OUTPUT);// led 2 เป็นเอาท์พุต digitalWrite(relay1,LOW);//คำสั่ง relay1 เป็นปิด digitalWrite(relay2,LOW);//คำสั่ง relay2 เป็นปิด digitalWrite(led1,LOW);//คำสั่ง led1 เป็นปิด digitalWrite(led2,LOW);//คำสั่ง led2 เป็นปิด mySerial.begin(9600);//กำหนดค่าเริ่มต้น 9600บิตต่อวินาที แบบอนุกรม } char x;//ชนิดข้อมูลของตัวแปร void loop() { // run over and over if (mySerial.available())//ถ้ามีข้อมูลเข้ามาในวงเล็บให้ทำตามเงื่อนไขแบบอนุกรม { x=mySerial.read();//อ่านข้อมูลอนุกรมแล้วเอาปเก้บไว้ในตัวแปร x } switch(x) //ทำตามเงื่อนไข case { case'1': digitalWrite(relay1,HIGH);//คำสั่งรีเลย์ 1 ทำงาน break; case'2': digitalWrite(relay1,LOW);//คำสั่งรีเลย์ 1 ไม่ทำงาน break; case'3': digitalWrite(relay2,HIGH);//คำสั่งรีเลย์ 2 ทำงาน break; case'4': digitalWrite(relay2,LOW);//คำสั่งรีเลย์ 2 ไม่ทำงาน break; case'5': digitalWrite(led1,HIGH);//คำสั่ง led 1 ทำงาน break; case'6': digitalWrite(led1,LOW);//คำสั่ง led 1 ไม่ทำงาน break; case'7': digitalWrite(led2,HIGH);//คำสั่ง led 2 ทำงาน break; case'8': digitalWrite(led2,LOW); //คำสั่ง led 2 ไม่ทำงาน break; } }
หลักการทำงาน 
    คือ ควบคุมไฟบ้าน ผ่าน Module Bluetooth HC-05 ให้ปิดเปิดตามคำสั่งที่ส่งผ่านโทรศัพท์มือถือ
Code+แอปบลูทูธ
https://drive.google.com/drive/u/2/my-drive?ogsrc=32
ชื่อสมาชิกกลุ่ม
นาย อภิสิทธิ์ ปิ่นล้ม สมค.1 รหัส 21
นาย อมรสิริ ทวยโพธิ์ สมค.1 รหัส 22
ลิ้งค์ youtube 
https://youtu.be/DVkF7gOyJ7s


วันอังคารที่ 25 กันยายน พ.ศ. 2561

LiquidCrystal

บทความ การใช้งาน Character LCD Display กับ Arduino

(ตอนที่1 - รูปแบบการเชื่อมต่อแบบ Parallel)

 

ความรู้ทั่วไปเกี่ยวกับ LCD Display

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

     

 

โครงสร้างโดยทั่วไปของ LCD 
          โครงสร้างของ LCD ทั่วไปจะประกอบขึ้นด้วยแผ่นแก้ว 2 แผ่นประกบกันอยู่ โดยเว้นช่องว่างตรงกลางไว้ 6-10 ไมโครเมตร ผิวด้านในของแผ่นแก้วจะเคลือบด้วยตัวนำไฟฟ้าแบบใสเพื่อใช้แสดงตัวอักษร ตรงกลางระหว่างตัวนำไฟฟ้าแบบใสกับผลึกเหลวจะมีชั้นของสารที่ทำให้โมเลกุลของผลึกรวมตัวกันในทิศทางที่แสงส่องมากระทบเรียกว่า Alignment Layer และผลึกเหลวที่ใช้โดยทั่วไปจะเป็นแบบ Magnetic โดย LCD สามารถแสดงผลให้เรามองเห็นได้ทั้งหมด 3 แบบด้วยกันคือ 
- แบบใช้การสะท้อนแสง (Reflective Mode) LCD แบบนี้ใช้สารประเภทโลหะเคลือบอยู่ที่แผ่นหลังของ LCD ซึ่ง LCD ประเภทนี้เหมาะกับการนำมาใช้งานในที่ที่มีแสงสว่างเพียงพอ
- แบบใช้การส่งผ่าน (Transitive Mode) LCD แบบนี้วางหลอดไฟไว้ด้านหลังจอ เพื่อทำให้การอ่านค่าที่แสดงผลทำได้ชัดเจน 
- แบบส่งผ่านและสะท้อน (Transflective Mode) LCD แบบนี้เป็นการนำเอาข้อดีของจอแสดงผล LCD ทั้ง 2 แบบมารวมกัน

          ในบทความนี้เราจะกล่าวถึงจอ LCD ที่แสดงผลเป็นอักขระหรือตัวอักษร ตามท้องตลาดทั่วไปจะมีหลายแบบด้วยกัน มีทั้ง 16 ตัวอักษร 20 ตัวอักษรหรือมากกว่า และจำนวนบรรทัดจะมีตั้งแต่ 1 บรรทัด 2 บรรทัด 4 บรรทัดหรือมากกว่าตามแต่ความต้องการและลักษณะของงานที่ใช้ หรืออาจจะมีแบบสั่งทำเฉพาะงานก็เป็นได้ ในบทความนี้เราจะยกตัวอย่างจอ LCD ขนาด 16x2 Character หรือที่นิยมเรียกกันว่าจอ LCD 16 ตัวอักษร 2 บรรทัด สามารถหาซื้อได้ง่ายและมีราคาไม่สูง เหมาะสมกับการใช้งานแสดงผลไม่มากในหน้าจอเดียว

          จอ LCD 16x2 Character ที่นิยมวางจำหน่ายจะมีอยู่ 2 แบบด้วยกันคือ LCD แบบปกติที่เชื่อมต่อแบบขนาน (Parallel) และ LCD แบบที่เชื่อมต่ออนุกรม (Serial) แบบ I2C โดยทั้ง 2 แบบตัวจอมีลักษณะเดียวกันเพียงแต่แบบ I2C จะมีบอร์ดเสริมทำให้สื่อสารแบบ I2C ได้เชื่อมต่อได้สะดวกขึ้น

รูปที่ 1 จอ LCD 16x2 Character (Parallel)

 

 

รูปที่ 2 จอ LCD 16x2 Character (I2C)

ต่อมาเราจะมาดูกันว่าทั้ง 2 แบบมีขาหรือ Pin ในการเชื่อมต่อแตกต่างกันอย่างไร โดยแบบแรกเป็นแบบ Parallel มีทั้งหมด 16 ขาด้วยกัน ส่วนแบบที่สองเป็นแบบ I2C มีเพียง 4 ขา สามารถแยกออกตามตารางด้านล่างครับ

1. แบบ Parallel มี 16 ขา

รูปที่ 3 ด้านหน้าจอ LCD 16x2 (Parallel)

 ตารางที่ 1 ตารางขาของจอ LCD 16x2 แบบ Parallel

2. แบบ I2C มี 4 ขา (คลิกอ่าน บทความการเชื่อมต่อแบบ I2C)

รูปที่ 4 ด้านหลังจอ LCD 16x2 (I2C)

ตารางที่ 2 ตารางขาของจอ LCD 16x2 แบบ I2C

การควบคุมการแสดงผลของ LCD

          ในการควบคุมหรือสั่งงาน ตัวจอ LCD นั้นมีส่วนควบคุม (Controller) รวมไว้ในตัวแล้ว ผู้ใช้สามารถส่งรหัสคำสั่งควบคุมการทำงานของจอ LCD ผ่าน Controller ว่าต้องการใช้แสดงผลอย่างไร โดย LCD Controller ของจอตัวนี้เป็น Hitachi เบอร์ HD44780 และขาในการเชื่อมต่อระหว่าง LCD กับ Microcontroller มีดังนี้
          1. GND เป็นกราวด์ใช้ต่อระหว่าง Ground ของระบบ Microcontroller กับ LCD 
          2. VCC เป็นไฟเลี้ยงวงจรที่ป้อนให้กับ LCD ขนาด +5VDC 
          3. VO ใช้ปรับความสว่างของหน้าจอ LCD 
          4. RS ใช้บอกให้ LCD Controller ทราบว่า Code ที่ส่งมาทางขา Data เป็นคำสั่งหรือข้อมูล 
          5. R/W ใช้กำหนดว่าจะอ่านหรือเขียนข้อมูลกับ LCD Controller 
          6. E เป็นขา Enable หรือ Chips Select เพื่อกำหนดการทำงานให้กับ LCD Controller 
          7-14. DB0-DB7 เป็นขาสัญญาณ Data ใช้สำหรับเขียนหรืออ่านข้อมูล/คำสั่ง กับ LCD Controller

          วิธีการสั่งงานจะแตกต่างกันไป โดย LCD Controller สามารถรับรหัสคำสั่งจาก Microcontroller ได้จากสัญญาณ RS R/W และ DB0-DB7 ในขณะที่สัญญาณ E มีค่า Logic เป็น “1” ซึ่งสัญญาณเหล่านี้จะใช้ร่วมกันเพื่อกำหนดเป็นรหัสคำสั่งสำหรับสั่งงาน LCD โดยหน้าที่ของแต่ละสัญญาณพอสรุปได้ดังนี้ 

          - E เป็นสัญญาณ Enable เมื่อมีค่าเป็น 
                   “1” เป็นการบอกให้ LCD ทราบว่าอุปกรณ์ภายนอกต้องการติดต่ออ่านหรือเขียนข้อมูล
                   “0” ให้ LCD ไม่สนใจสัญญาณ RS R/W และ DB7-DB0 
          - RS เป็นสัญญาณสำหรับกำหนดให้ LCD ทราบว่าอุปกรณ์ภายนอกต้องการติดต่อกับ LCD ในขณะนั้นเป็นรหัสคำสั่งหรือข้อมูล โดยถ้า 
                    RS = “0” หมายถึง คำสั่ง
                    RS = “1” หมายถึง ข้อมูล 
          - R/W เป็นสัญญาณสำหรับบอกให้ LCD ทราบว่าอุปกรณ์ภายนอกต้องการอ่านหรือเขียนกับ LCD โดยถ้า 
                    R/W = “0” หมายถึง เขียน
                    R/W = “1” หมายถึง อ่าน 
          - DB0-DB7 เป็นสัญญาณแบบ 2 ทิศทาง โดยจะสัมพันธ์กับสัญญาณ R/W ใช้สำหรับรับสั่ง คำสั่งและข้อมูลระหว่าง LCD กับอุปกรณ์ภายนอก โดยถ้า R/W =   “0” สัญญาณ DB7-DB0 จะส่งจากอุปกรณ์ภายนอกมาที่ LCD แต่ถ้า R/W = “1” สัญญาณ DB7-DB0 จะส่งจาก LCD ไปยังอุปกรณ์ภายนอก

การเชื่อมต่อสัญญาณขาข้อมูลระหว่าง Microcontroller กับ LCD Controller

          การเชื่อมต่อสัญญาณขาข้อมูลระหว่าง Microcontroller กับ LCD Controller สามารถทำได้ 2 ลักษณะ คือ การเชื่อมต่อแบบ 8 บิต (DB0-DB7) และการเชื่อมต่อแบบ 4 บิต (DB4-DB7) ทั้งสองแบบแตกต่างกันเพียงจำนวนขาที่ใช้คือ 8 หรือ 4 ขา และยังสามารถทำงานได้เหมือนกัน อย่างที่แน่นอนในการส่งข้อมูลแบบ 4 ขา ย่อมทำได้ช้ากว่า 8 ขา แต่ไม่ได้ช้ามากจนสังเกตุได้ด้วยสายตา ในการต่อกับ Arduino นั้นจึงนิยมต่อเพียง 4 ขา หรือ 4 บิตเท่านั้น เพื่อเป็นการประหยัดขาในการต่อใช้งานไปไว้ต่อกับอุปกรณ์อื่น ตัวอย่างเช่น Arduino UNO R3 นั้นมีขาให้ใช้งานค่อนข้างน้อย

ขาที่ใช้ในการเชื่อมต่อกับ Arduino UNO R3

ตารางขาที่ใช้ในการเชื่อมต่อกับ Arduino UNO R3

รายละเอียดคำสั่งในการสั่งงานระหว่าง Arduino กับ จอ LCD

         คำสั่งในการควบคุมจอ LCD ของ Arduino นั้น ทาง Arduino.cc เขียนเป็น Library มาให้เพื่อสะดวกในการนำไปใช้งาน หลังจากต่อสายเสร็จเรียบร้อย ขั้นตอนแรกในการเริ่มเขียนโปรแกรมคือการเรียกใช้ Library ของ LCD จากไฟล์ชื่อ LiquidCrystal.h หลังจากนั้นมาดูกันว่ามีฟังก์ชั่นที่สำคัญอะไรบ้างที่ใช้สั่งงานให้จอ LCD
         ฟังก์ชั่น LiquidCrystal(); ใช้ประกาศขาที่ต้องการส่งข้อมูลไปยังจอ LCD รูปแบบในการสั่งงานคือ
LiquidCrystal lcd(rs, enable, d4, d5, d6, d7) <<<<<<< ในกรณีใช้งานแบบ 4 บิต
LiquidCrystal lcd(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7) <<<<<<< ในกรณีใช้งานแบบ 8 บิต
         ในบทความนี้ใช้แบบ 4 บิต คือ LiquidCrystal lcd(12, 11, 4, 5, 6, 7); ก็หมายถึงการเชื่อมต่อ rs ที่ขา 12 , Enable ที่ขา 11 , และ DB4-DB7 ที่ขา 4-7 ของ Arduino ตามลำดับ
         ฟังก์ชั่น begin(); ใช้กำหนดขนาดของจอ ในบทความนี้เราใช้ขนาด 16 ตัวอักษร 2 บรรทัด จึงประกาศเป็น lcd.begin(16, 2); 
         ฟังก์ชั่น setCursor(); ใช้กำหนดตำแหน่งและบรรทัดของ Cursor เช่น lcd.setCursor(0, 1); คือ ให้เคอร์เซอร์ไปที่ตำแหน่งที่ 0 บรรทัดที่ 1 การนับตำแหน่งเริ่มจาก 0 ดังนั้น LCD 16x2 มีตำแหน่ง 0 – 15 บรรทัด คือ 0 กับ 1
         ฟังก์ชั่น print(); ใช้กำหนดข้อความที่ต้องการแสดง เช่น lcd.print("ThaiEasyElec"); คือ ให้แสดงข้อความ “ThaiEasyElec” ออกทางหน้าจอ LCD