จุดประสงค์การเรียนรู้
สามารถเขียนCodeภาษาCในArduino IDEสร้างMenu Codeได้
สาระการเรียนรู้
การสร้างMenu Code เป็นการลดปริมาณจำนวนครั้ังของการUpload เมื่อต้องการเรียกใช้งานหลายๆฟังก์ชันผ่านMenu ในการUpload Codeเพียงครั้งเดียว ตัวอย่างการใช้ Menu Code อาจจะใช้งานในEmbeded system ดังนี้
Menu 1 เล่นเสียงดนตรี 1 ครั้ง
Menu 2 เล่นเสียงดนตรี 2 ครั้ง
Menu 3 เล่นเสียงดนตรี 3 ครั้ง
Menu 4 เล่นเสียงดนตรี 4 ครั้ง เป็นต้น
2. คำสั่งการใช้งาน
รูปแบบการใช้งานคำสั่งในภาษาซีของArduino IDEในเนื้อหานี้ จะใช้คำสั่งดังต่อไปนี้
คำสั่งในArduino IDE
การทำงาน
void setup() {
//คำสั่ง
}
เป็นคำสั่งการประกาศฟังก์ชันการทำงานเพียงครั้งเดียวในตอนแรก
void loop() {
//คำสั่ง
}
เป็นคำสั่งประกาศฟังก์ชันการทำงานแบบวนรอบ
run(ความเร็วมอเตอร์ซ้าย,ความเร็วมอเตอร์ขวา);
เป็นฟังก์ชันที่ประกาศการใช้งานในการหมุนของมอเตอร์ โดยความเร็วของมอเตอร์ตามสัญญาณPWMมีค่าได้ระหว่าง0-255 เช่น
1.เดินหน้า จะใช้คำสั่ง run(255,255);
2.ถอยหลัง จะใช้คำสั่ง run(-255,-255);
3.เลี้ยวซ้าย จะใช้คำสั่ง run(-255,255);
4.เลี้ยวขวา จะใช้คำสั่ง run(255,-255);
5.หยุด จะใช้คำสั่ง run(0,0);
sv1.write(องศาเซอร์โว);
เป็นฟังก์ชันที่ใช้งานในการสั่งองศาเซอร์โว
tone(snd,ความถี่เสียงHz,ความยาวเสียง);
เป็นฟังก์ชันที่ใช้งานคำสั่งเสียงดนตรี
วิธีทำการทดลอง
1. หากทำการทดลอง Lab1-Lab10 แล้ว ไม่จำเป็นต้องต่ออะไรเพิ่มเติมอีก
2. ทำการCopy Codeด้านล่างก่อนUpload code Arduino IDE ลงไปใบนบอร์ด ESP32 Devkit v1 ควรเลือกที่Tool -> Board -> ESP32 Arduino ->ESP32 Dev Module (ดังภาพประกอบด้านล่าง)
#include <ESP32Servo.h>
///////// ผนวกไลบรารี่ ////////////
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 OLED(-1);
///////////ตั้งค่าปุ่มกด///////////////////
int button = 34; /// กำหนดปุ่มกดสวิตซ์ขา 34
int snd = 18;
/////////////////////////////////////////////////////////////////////
void setup() {
OLED.begin(SSD1306_SWITCHCAPVCC,0x3C); // กำหนดแอดเดรสของพอร์ตจอเป็น 0x3C (for the 128x64)
pinMode(button, INPUT); // ตั้งค่าขา button เป็น INPUT
}
void loop(){
int sw = digitalRead(button); // ให้ sw อ่านค่า digital จากพอร์ต 2(button)
int nob = analogRead(35); // ให้ nob อ่านค่าพอร์ตAnalog 35
int menu = map(nob,0,4095,0,12); // เทียบอัตราส่วนของพอร์ตAnalog 35 จาก 0-4095เพื่อทำเป็นเมนู 0-12
OLED.clearDisplay(); // ล้างค่าหน้าจอ
OLED.setTextColor(WHITE,BLACK); //สีอักษรเป็นสีขาว ,พื้นหลังดำ
OLED.setCursor(0, 0); // เซตตำแหน่ง 0,0
OLED.setTextSize(2); // เซตขนาดอักษรมีขนาดเป็น 2
OLED.println("ROBOT MENU"); // พิมพ์คำว่า ROBOT MENU
OLED.setTextSize(2); // เซตขนาดอักษรมีขนาดเป็น 2
OLED.print(" "); // วรรค
OLED.println(menu); // แสดงค่า Menu ที่ได้จากการ map nob ให้เหลือ 0-12
OLED.setTextSize(1); // เซตขนาดอักษรมีขนาดเป็น 2
OLED.println(" HNT-BoT "); // พิมพ์คำว่า HNT-BoT
OLED.print(" "); // วรรค
OLED.print(nob); // แสดงค่าที่อ่านได้จาก nob หรือ Analog7
OLED.display();
if ((sw == 0)and(menu==0)) { OLED.clearDisplay();OLED.display();}
if ((sw == 0)and(menu==1)) {t();} //เมนู 1 เสียงดัง 1 ครั้ง
if ((sw == 0)and(menu==2)) {t();t();} //เมนู 2 เสียงดัง 2 ครั้ง
if ((sw == 0)and(menu==3)) {t();t();t();} //เมนู 3 เสียงดัง 3 ครั้ง
if ((sw == 0)and(menu==4)) {t();t();t();t();} //เมนู 4 เสียงดัง 4 ครั้ง
if ((sw == 0)and(menu==5)) {t();t();t();t();t();} //เมนู 5 เสียงดัง 5 ครั้ง
if ((sw == 0)and(menu==6)) {t();t();t();t();t();t();} //เมนู 6 เสียงดัง 6 ครั้ง
if ((sw == 0)and(menu==7)) {t();t();t();t();t();t();t();} //เมนู 7 เสียงดัง 7 ครั้ง
if ((sw == 0)and(menu==8)) {t();t();t();t();t();t();t();t();} //เมนู 8 เสียงดัง 8 ครั้ง
if ((sw == 0)and(menu==9)) {t();t();t();t();t();t();t();t();t();} //เมนู 9 เสียงดัง 9 ครั้ง
if ((sw == 0)and(menu==10)) {t();t();t();t();t();t();t();t();t();t();} //เมนู 10 เสียงดัง 10 ครั้ง
if ((sw == 0)and(menu==11)) {t();t();t();t();t();t();t();t();t();t();t();} //เมนู 11 เสียงดัง 11 ครั้ง
if ((sw == 0)and(menu==12)) {t();t();t();t();t();t();t();t();t();t();t();t();} //เมนู 12 เสียงดัง 12 ครั้ง
delay(100);
}
void t() // ฟังก์ชันเสียงดังที่พอร์ต 3
{tone(snd,1000,100);delay(300); }