หน้าเว็บ

วันอังคารที่ 19 กุมภาพันธ์ พ.ศ. 2556

เฉลยโจทย์การแข่งขันทักษะอาชีวะศึกษา ไมโครคอนโทรลเลอร์ระดับภาค ปวส.อิเล็กทรอนิกส์ ปีการศึกษา 2555 ตอนที่ 1

ข้อที่ 1 สร้างวงจรขยายเสียง (10 คะแนน) 
  ข้อนี้คงไม่ต้องเฉลยเพราะ เป็นการลงมือทำครับ

ข้อที่ 2 สร้างระบบ User Interface ผ่านเมนู (10 คะแนน)


แสดงข้อความที่หน้าจอ GLCD และตวบคุมรีเลย์ด้วยสัญญาณอะนาลอก


2. สร้างระบบติดต่อกับผู้ใช้ผ่านการเลื่อนเมนู โดยใช้ตัวต้านทานปรับค่าได้ ZX-POTH เป็นตัวเลื่อน เมนู และใช้สวิตช์ เป็นตัวยืนยันการทำงานเพื่อกระตุ้นรีเลย์ให้ติดดับตามต้องการ (10 คะแนน) 
หมายเหตุ การเชื่อมต่อวงจรไม่จำเป็นต้องยึดตำแหน่งขาพอร์ตตามที่ระบุในโจทย์
2.1 สร้างข้อความที่หน้าจอด้วยขนาดตัวอักษร 2X แสดงข้อความ Relay 1 ,Relay 2, Relay 3 และ Relay 4 ที่แถว 0,1,2,3 ดังรูป โดยใช้สีตัวอักษรสีดำพื้นหลังสีเหลือง และที่ตัวอักษรคอลัมน์ที่ 8 ของแต่ละบรรทัดแสดงข้อความ OFF สีดำบนพื้นหลังสีเขียว ( 2 คะแนน)
2.2 เมื่อเลื่อนปรับตัวต้านทานปรับค่าได้ พื้นหลังของข้อความ Relay 1 ถึง Relay 4 เปลี่ยนเป็นสีแดงตามค่าของตัวต้านทานปรับค่าได้ที่เลื่อนไป (ปรับซ้ายสุดอยู่ที่ Relay 1 ปรับขวาสุดอยู่ที่ Relay 4) (2 คะแนน)
2.3 เมื่อเลื่อนตัวต้านทานปรับค่าได้ไปยังตำแหน่ง Relay 1 แล้วกดสวิตช์ข้อความที่บรรทัด Relay 1 เปลี่ยนจาก OFF เป็น ON และพื้นหลังเปลี่ยนจากสีเขียวเป็นสีฟ้าถ้ากดสวิตช์อีกครั้งข้อความจะต้องเปลี่ยนกลับเป็น OFF และพื้นหลังเปลี่ยนเป็นสีเขียว เมื่อเลื่อนเมนูไปที่ตำแหน่ง Relay 2, Relay 3 และ Relay 4 ก็ให้ผลการทำงานแบบเดียวกัน (3 คะแนน)
2.4 เมื่อกดสวิตช์ในข้อ 2.3 แล้ว ผลลัพธ์ที่ได้ไปสั่งให้รีเลย์ที่บอร์ด Relay4i ติดดับตามตำแหน่งที่ต้องการได้ (3 คะแนน)

การทำงานของโปรแกรม
  ส่วนที่ 1 สร้างข้อความตัวอักษรต่าง ๆ ก็จะอยู่ในฟังก์ชัน Show_menu() และฟังก์ชั่น Show_off
  ส่วนที่ 2 เมื่อเลื่อนปรับค่าความต้านทาน  เนื่องจากมีเมนูอยู่ 4 เมนู จึงต้องเขียนเงื่อนไข IF ขึ้น 4 ช่วงด้วยกัน ดังนั้

  if(menu < 255)
  else if (menu > 255&&menu < 512)
else if (menu > 512&&menu < 768)
else if (menu > 768)

เมื่ออยู่ในเงื่อนไขใดเงื่อนไขหนึ่ง ก็แสดงการทำงานของหน้าจอตามเมนูนั้น ๆ
  ส่วนที่ 3 คือการกดสวิตช์แล้วให้รีเลย์ติดดับในตำแหน่งที่ต้องการ
  ถ้าต้องการให้ติดหรือดับเพียงอย่างเดียว เราอาจจะสั่งขับด้วยลอจิก "0" หรือ "1" ไปยังขาพอร์ตตรง ๆ ได้ แต่ถ้ามีการสั่งให้ติดและดับสลับกัน ต้องมีตัวแปร R1-R4 ทำหน้าที่ระบุการติดและดับของ รีเลย์

โปรแกรมทั้งหมดมีดังนี้



Exported from Notepad++
#include "<"unicon .h">" int menu=1024,x=0,R1=0,R2=0,R3=0,R4=0; void Show_menu(){ setTextBackgroundColor(GLCD_YELLOW); glcd(0,0,"Relay 1"); glcd(1,0,"Relay 2"); glcd(2,0,"Relay 3"); glcd(3,0,"Relay 4"); } void Show_off(){ setTextBackgroundColor(GLCD_SKY); glcd(0,8,"OFF"); glcd(1,8,"OFF"); glcd(2,8,"OFF"); glcd(3,8,"OFF"); } void setup() { setTextColor(GLCD_BLACK); // Set text color to red setTextSize(2); Show_menu(); Show_off(); out(19,0); out(20,0); out(21,0); out(22,0); } void loop() { if (!in(7)){ sleep(100); while(!in(7)); if(x==1){ if(R1==0){ out(19,1); R1=1; setTextBackgroundColor(GLCD_GREEN); glcd(0,8,"ON "); } else { out(19,0); R1=0; setTextBackgroundColor(GLCD_SKY); glcd(0,8,"OFF"); } } else if (x==2){ if(R2==0){ out(20,1); R2=1; setTextBackgroundColor(GLCD_GREEN); glcd(1,8,"ON "); } else { out(20,0); R2=0; setTextBackgroundColor(GLCD_SKY); glcd(1,8,"OFF"); } } else if (x==3){ if(R3==0){ out(21,1); R3=1; setTextBackgroundColor(GLCD_GREEN); glcd(2,8,"ON "); } else { out(21,0); R3=0; setTextBackgroundColor(GLCD_SKY); glcd(2,8,"OFF"); } } else if (x==4){ if(R4==0){ out(22,1); R4=1; setTextBackgroundColor(GLCD_GREEN); glcd(3,8,"ON "); } else { out(22,0); R4=0; setTextBackgroundColor(GLCD_SKY); glcd(3,8,"OFF"); } } } if (menu!=analog(0)){ menu=analog(0); if(menu<255){ if(x!=1){ Show_menu(); setTextBackgroundColor(GLCD_RED); glcd(0,0,"Relay 1"); x=1; } } else if (menu>255 &&menu<512){ if(x!=2){ Show_menu(); setTextBackgroundColor(GLCD_RED); glcd(1,0,"Relay 2"); x=2; } } else if (menu>512&&menu<768){ if(x!=3){ Show_menu(); setTextBackgroundColor(GLCD_RED); glcd(2,0,"Relay 3"); x=3; } } else if (menu>768 ){ if(x!=4){ Show_menu(); setTextBackgroundColor(GLCD_RED); glcd(3,0,"Relay 4"); x=4; } } } }

ไม่มีความคิดเห็น: