หายไปพักนึงคับ
เขียนบน Arduino UNO นะครับสำหรับบทความนี้เพราะ ส่วนตัวคิดว่าใช้ Arduino IDE เหมือนกันปล ระบบไฟ บนขา Arduno Uno เป็น 5 Volt เหมือนกัน แต่ เวลาใช้ Pin เป็น PWM mode ESP จะมี Clock ที่สูงกว่านะครับ
Default frequency of each PWM pin of Arduino UNO:
PWM frequency for D5 & D6 : 976.56 Hz (The DEFAULT)
controlled by timer0: 16 Mhz / 64 / 256 = 976.56 Hz
PWM frequency for D3 & D11& D9 & D10: 490.20 Hz (The DEFAULT)
controlled by timer1: 16 Mhz / 64 / 510 = 490.20 Hz
เพราะงั้นถ้าเอาไปจับ Input หรือ ส่งเป็น Output อะไรสักอย่าง เช่นให้ มอร์เตอร์ เคลื่อนที่ด้วยความร็วเท่ากัน ต้องระวังด้วยนะครับ แต่จริงๆก็มีคำสั่ง map() มาช่วยเป็นตัวปรับได้เช่นกัน ซึ่งผมจะเขียนการปรับมอเตอร์ให้วิ่งเท่ากันในโพสน์หน้า
โม้มาละ มาเริ่มโครงงานนี้กัน
โครงงานนี้ไว้สำหรับการออกแบบในบอร์ดทีเรามีขาใช้งานจำกัด และไม่อยากเปลี่ยนหรือซื้ออุปกรณ์เพิ่ม
ง่ายๆคือประหยัดงบ
โดยปกติเราควรมี สวิทกดปล่อย กดลอย หรือ พุชสวิท push switch ไว้กดเพื่อ เปิดปิดไฟ หรืออุปกรณ์อะไรซักอย่าง 1ตัวสวิทต่อ 1 อุปกรณ์ แต่เราใช้ความสามารถของ PWM mode ในการรับ Input จากสวิทว่ามีการกดนานแค่ไหน โดยที่เราจะนับเวลาในการกดแช่เพื่อระบุปิดเปืด อุปกรณ์ต่างๆ ในโครงงานนี้จะเปิดปิดแค่ 2LEDs แต่ที่ทำเล่นๆไว้ ก็ใช้ถึง 4อุปกรณ์ได้ สบายๆ
เมื่อกดปุ่ม 1 วินาทีแล้วปล่อย หลอดที่ 1จะติด เมื่อกดอีกครั้งจะดับ
เมื่อกดปุ่ม 3 วินาทีแล้วปล่อย หลอดที่ 2 จะติด เมื่อกดอีกครั้งนาน 3วินาที จะดับ
มาเริ่มต่อวงจรกัน
การ on / off คือการสั่งให้ ขา Pinต่างๆ ส่งไฟ 5Volt ออกมาตามขานั้น เพื่อให้อุปกรณ์เปิดปิด และ R ที่เอามากันไว้
220 Ω โดยนำมาใช้เพื่อ กันVoltให้ตกคร่อม หลอดไม่เกิน 2Volt (น่าจะพอ คำนวน V=IR)เป็นนะ
มาดูดโค้ด Sketch กัน
//รับค่าการะยะเวลากดปุ่มเพื่อจัดทำคำสั่งต่างๆ
float pressLength_milliSeconds = 0; //ตั้งค่าการกดเวลาการกดให้เป็น 0
// กำหนดค่าเวลาที่ใช้กด ในหน่วย milli-seconds เพื่อไปเลือกเปิกปิดอันไหน,
int optionOne_milliSeconds = 100; //กด 1 sec เป็น Option 1
int optionTwo_milliSeconds = 300; //กด 3 sec เป็น Option 2
int buttonPin = 2; //กำหนด Pin2 ต่อ Push Switch
int ledPin_Option_1 = 12; //กำหนด Pin13 ต่อ LED เขียว
int ledPin_Option_2 = 13 ; //กำหนด Pin12 ต่อ LED แดง
float pressLength_milliSeconds = 0; //ตั้งค่าการกดเวลาการกดให้เป็น 0
// กำหนดค่าเวลาที่ใช้กด ในหน่วย milli-seconds เพื่อไปเลือกเปิกปิดอันไหน,
int optionOne_milliSeconds = 100; //กด 1 sec เป็น Option 1
int optionTwo_milliSeconds = 300; //กด 3 sec เป็น Option 2
int buttonPin = 2; //กำหนด Pin2 ต่อ Push Switch
int ledPin_Option_1 = 12; //กำหนด Pin13 ต่อ LED เขียว
int ledPin_Option_2 = 13 ; //กำหนด Pin12 ต่อ LED แดง
void setup(){
// Keep in mind, when pin 2 has ground voltage applied, we know the button is being pressed
pinMode(buttonPin, INPUT_PULLUP); // กำหนดชนิด ของPin เป็นชนิด input pullup
pinMode(ledPin_Option_1, OUTPUT); //กำหนดชนิด ของPinที่ต่อ LED เป็นชนิด output
pinMode(ledPin_Option_2, OUTPUT);
Serial.begin(9600); //กำหนด ความเร็ว Serial port ( บน USB)ให้เป็น 9600
} // close setup
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
//Record *roughly* the tenths of seconds the button in being held down
while (digitalRead(buttonPin) == LOW ){
delay(100); //กำหนดค่า delay 100 ms = 1 sec เพื่อให้นับเวลาที่กดแช่ไว้
pressLength_milliSeconds = pressLength_milliSeconds + 100; // ทำการบวกค่าเพิ่มจากครั้งที่ผ่านมา
//แสดงผลบน Serial Portว่ากดไปนานเท่าไหร่
Serial.print("ms = ");
Serial.println(pressLength_milliSeconds);
}//close while
//ถ้า Option 2 - ให้ทำดังนี้
if (pressLength_milliSeconds >= optionTwo_milliSeconds){
// Keep in mind, when pin 2 has ground voltage applied, we know the button is being pressed
pinMode(buttonPin, INPUT_PULLUP); // กำหนดชนิด ของPin เป็นชนิด input pullup
pinMode(ledPin_Option_1, OUTPUT); //กำหนดชนิด ของPinที่ต่อ LED เป็นชนิด output
pinMode(ledPin_Option_2, OUTPUT);
Serial.begin(9600); //กำหนด ความเร็ว Serial port ( บน USB)ให้เป็น 9600
} // close setup
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
//Record *roughly* the tenths of seconds the button in being held down
while (digitalRead(buttonPin) == LOW ){
delay(100); //กำหนดค่า delay 100 ms = 1 sec เพื่อให้นับเวลาที่กดแช่ไว้
pressLength_milliSeconds = pressLength_milliSeconds + 100; // ทำการบวกค่าเพิ่มจากครั้งที่ผ่านมา
//แสดงผลบน Serial Portว่ากดไปนานเท่าไหร่
Serial.print("ms = ");
Serial.println(pressLength_milliSeconds);
}//close while
//ถ้า Option 2 - ให้ทำดังนี้
if (pressLength_milliSeconds >= optionTwo_milliSeconds){
digitalWrite(ledPin_Option_2,!digitalRead(ledPin_Option_2));
//กลับค่า Pin เป็นตรงกันข้าม อันนี้สุด Cool HIGH <=> LOW
}
//ถ้า Option 1 - ให้ทำดังนี้
else if(pressLength_milliSeconds >= optionOne_milliSeconds){
}
//ถ้า Option 1 - ให้ทำดังนี้
else if(pressLength_milliSeconds >= optionOne_milliSeconds){
digitalWrite(ledPin_Option_1, !digitalRead(ledPin_Option_1));
}//close if options
pressLength_milliSeconds = 0; //ทุกครั้งที่จบ จะ Resetเวลากดให้เป็น 0
} // close void loop
}//close if options
pressLength_milliSeconds = 0; //ทุกครั้งที่จบ จะ Resetเวลากดให้เป็น 0
} // close void loop
เอาไปทดลองแล้วได้อย่างไร comment กันมาได้ที่ A.J Moo ครับ tumrong2018@gmail.com
ความคิดเห็น
แสดงความคิดเห็น