โปรเจคสั่งงาน Arduino ผ่าน Bluetooth





ครั้งที่แล้ว blog เรื่องตั้งค่า HC-05 แต่ไม่ได้บอกว่าเอามาทำอะไร โปรเจคที่ใช้ Bluetooth ส่วนใหญ่จะใช้งานด้านการสื่อสารหรือส่งข้อมูลเป็นหลัก เพราะ HC-05 สามารถทำงานได้ 2 โหมด เป็น Server หรือ Client ได้ เราสามารถประยุกต์ใช้ Bluetooth Module มาเป็นช่องทางในควบคุมอุปกรณ์ระหว่างมือถือกับ Arduino โดยหลักการง่ายๆ ของการใช้ Bluetooth คือต้องมีการ pair อุปกรณ์เข้าหากัน หาก Arduino ของคุณต่อกับ Relay Board คุณก็สามารถสั่งงานผ่าน Mobile App ได้ ก่อนจะถึงการควบคุม Relay มาดูวิธีการสื่อสารแบบง่ายๆ กันก่อน ต่อ Bluetooth Module กับ Arduino ดังภาพ
จากนั้นสั่งอัพโหลดโค้ดดังนี้
char BYTE;
int LED = 13; // LED on pin 13
void setup() {
Serial.begin(9600);
pinMode(LED, OUTPUT);
}
void loop() {
Serial.println("Press 1 to turn Arduino pin 13 LED ON or 0 to turn it OFF:");
while (!Serial.available()); // stay here so long as COM port is empty
BYTE = Serial.read(); // read next available byte
Serial.print(BYTE);
if( BYTE == '0' ) digitalWrite(LED, LOW); // if it's a 0 (zero) tun LED off
if( BYTE == '1' ) digitalWrite(LED, HIGH); // if it's a 1 (one) turn LED on
delay(50);
}
view rawbluetooth_basic.ino hosted with ❤ by GitHub
โปรแกรมนี้ไม่ซับซ้อน แค่ต้องการตัวเลข 0,1 เพื่อเปิด/ปิด LED ที่ขา 13 เท่านั้น เมื่ออัพโหลดโค้ดแล้ว ให้เปิด Serial Monitor ขึ้นมา จากนั้นพิมพ์เลข 1 ลงไป
จะพบว่า LED ที่ขา 13 ติดขึ้นมาแล้ว :) การสื่อสารของ Bluetooth รับส่งข้อมูลแบบ serial ดังนั้นหากข้อมูลมีมากกว่า 0,1 คุณควรสร้าง pattern หรือเป็น pigyback ในชุดข้อมูลเพื่อให้สื่อสารเข้าใจตรงกันได้ และง่ายต่อการทำความเข้าใจ เช่น
  • *10|06|2# หมายถึง Digital PIN 6 = LOW
  • *10|06|3# หมายถึง Digital PIN 6 = HIGH
  • *11|03|100# หมายถึง Digital PIN 3 ค่า PWM = 100
  • *11|05|100# หมายถึง Digital PIN 5 ค่า PWM = 255
เรื่อง pattern ของข้อมูลแล้วแต่เราจะกำหนด ลองมาดูตัวอย่างเพื่อให้เข้าใจมากขึ้นจาก App ArduDroid  ให้ดาวน์โหลด App มาติดตั้งที่มือถือจากนั้น แก้โค้ด Arduino ของเรานิดหน่อยดังนี้
char BYTE;
void setup() {
Serial.begin(9600);
}
void loop() {
while (!Serial.available()); // stay here so long as COM port is empty
BYTE = Serial.read(); // read next available byte
Serial.print(BYTE);
delay(50);
}
จากนั้นอัพโหลดโค้ดไปยัง ​Arduino จากนั้นเปิด ArduDroid แล้ว pair กับ Arduino ของเราให้เรียบร้อย
เปิด Serial Monitor ขึ้นมา แล้วลองกด Digital Write Toggle ON/OFF สักปุ่ม แล้วดูค่าใน Serial Monitor กัน ค่าที่ได้จะเป็นแบบนี้
กดปุ่ม 6 ค่าที่ได้คือ *10|06|3# คือ Digital Pin 6 = HIGH กดปุ่ม 6 อีกครั้ง ค่าที่ได้คือ *10|06|2# คือ Digital Pin 6 = LOW เป็นต้น จากโค้ดข้างต้น ถ้าจะใช้ App ArduDroid เพื่อทดสอบโดยใช้ pattern ของค่าที่ส่งมาจาก App ลักษณะนี้ มาเพิ่ม LED เข้าไปสัก 2 ตัวจะได้เห็นภาพมากขึ้นครับ
เขียนโค้ดในฝั่ง Arduino เพื่ออ่านค่าจาก ArduDroid ให้ถูกต้องดังนี้
/*
PROJECT: ArduDroid
PROGRAMMER: Hazim Bitar (techbitar at gmail dot com)
DATE: Oct 31, 2013
FILE: ardudroid.ino
LICENSE: Public domain
*/
#define START_CMD_CHAR '*'
#define END_CMD_CHAR '#'
#define DIV_CMD_CHAR '|'
#define CMD_DIGITALWRITE 10
#define CMD_ANALOGWRITE 11
#define CMD_TEXT 12
#define CMD_READ_ARDUDROID 13
#define MAX_COMMAND 20 // max command number code. used for error checking.
#define MIN_COMMAND 10 // minimum command number code. used for error checking.
#define IN_STRING_LENGHT 40
#define MAX_ANALOGWRITE 255
#define PIN_HIGH 3
#define PIN_LOW 2
String inText;
void setup() {
Serial.begin(9600);
Serial.println("ArduDroid 0.12 Alpha by TechBitar (2013)");
Serial.flush();
}
void loop()
{
Serial.flush();
int ard_command = 0;
int pin_num = 0;
int pin_value = 0;
char get_char = ' '; //read serial
// wait for incoming data
if (Serial.available() < 1) return; // if serial empty, return to loop().
// parse incoming command start flag
get_char = Serial.read();
if (get_char != START_CMD_CHAR) return; // if no command start flag, return to loop().
// parse incoming command type
ard_command = Serial.parseInt(); // read the command
// parse incoming pin# and value
pin_num = Serial.parseInt(); // read the pin
pin_value = Serial.parseInt(); // read the value
// 1) GET TEXT COMMAND FROM ARDUDROID
if (ard_command == CMD_TEXT){
inText =""; //clears variable for new input
while (Serial.available()) {
char c = Serial.read(); //gets one byte from serial buffer
Serial.println(c);
delay(5);
if (c == END_CMD_CHAR) { // if we the complete string has been read
// add your code here
break;
}
else {
if (c != DIV_CMD_CHAR) {
inText += c;
delay(5);
}
}
}
}
// 2) GET digitalWrite DATA FROM ARDUDROID
if (ard_command == CMD_DIGITALWRITE){
if (pin_value == PIN_LOW) pin_value = LOW;
else if (pin_value == PIN_HIGH) pin_value = HIGH;
else return; // error in pin value. return.
set_digitalwrite( pin_num, pin_value); // Uncomment this function if you wish to use
return; // return from start of loop()
}
// 3) GET analogWrite DATA FROM ARDUDROID
if (ard_command == CMD_ANALOGWRITE) {
analogWrite( pin_num, pin_value );
// add your code here
return; // Done. return to loop();
}
// 4) SEND DATA TO ARDUDROID
if (ard_command == CMD_READ_ARDUDROID) {
// char send_to_android[] = "Place your text here." ;
// Serial.println(send_to_android); // Example: Sending text
Serial.print(" Analog 0 = ");
Serial.println(analogRead(A0)); // Example: Read and send Analog pin value to Arduino
return; // Done. return to loop();
}
}
// 2a) select the requested pin# for DigitalWrite action
void set_digitalwrite(int pin_num, int pin_value)
{
switch (pin_num) {
case 13:
pinMode(13, OUTPUT);
digitalWrite(13, pin_value);
// add your code here
break;
case 12:
pinMode(12, OUTPUT);
digitalWrite(12, pin_value);
// add your code here
break;
case 11:
pinMode(11, OUTPUT);
digitalWrite(11, pin_value);
// add your code here
break;
case 10:
pinMode(10, OUTPUT);
digitalWrite(10, pin_value);
// add your code here
break;
case 9:
pinMode(9, OUTPUT);
digitalWrite(9, pin_value);
// add your code here
break;
case 8:
pinMode(8, OUTPUT);
digitalWrite(8, pin_value);
// add your code here
break;
case 7:
pinMode(7, OUTPUT);
digitalWrite(7, pin_value);
// add your code here
break;
case 6:
pinMode(6, OUTPUT);
digitalWrite(6, pin_value);
// add your code here
break;
case 5:
pinMode(5, OUTPUT);
digitalWrite(5, pin_value);
// add your code here
break;
case 4:
pinMode(4, OUTPUT);
digitalWrite(4, pin_value);
// add your code here
break;
case 3:
pinMode(3, OUTPUT);
digitalWrite(3, pin_value);
// add your code here
break;
case 2:
pinMode(2, OUTPUT);
digitalWrite(2, pin_value);
// add your code here
break;
// default:
// if nothing else matches, do the default
// default is optional
}
}
view rawardudroid.ino hosted with ❤ by GitHub
อัพโหลดโค้ดไปยัง Arduino แล้วลองใหม่ครับ ลองกดปุ่ม 6 หรือปุ่ม 7 จะพบว่า กดครั้งแรก LED จะติด กดครั้งต่อไป LED จะดับ เป็น Toggle Switch เอาไปประยุกต์ต่อกับ Relay Board แทน LED คุณก็จะได้ระบบควบคุม Switch อุปกรณ์ไฟฟ้าแบบง่ายๆ ได้แล้ว :)
แหล่งที่มา:

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

ความรู้เบื้องต้นเกี่ยวกับไมโครคอนโทรลเลอร์

มินิโปรเจค ให้อาหารปลาด้วย arduino

โปรเจค งานเครื่องกระปุกออมสินนับเงินอัตโนมัติ