มาทำสวิทช์ ปิด-เปิดไฟด้วยรีโมทกันเถอะ
ธันวาคม 22, 2024, 09:52:48 pm *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
 
   หน้าแรก   ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก  
หน้า: [1] 2   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: มาทำสวิทช์ ปิด-เปิดไฟด้วยรีโมทกันเถอะ  (อ่าน 134851 ครั้ง)
kiano♥
kiano555@gmail.com
กลุ่มสนับสนุนLSV+มีน้ำใจ
member
****

คะแนน337
ออฟไลน์ ออฟไลน์

กระทู้: 570


การให้น่าภูมิใจกว่าได้รับ Line ID : Tech64

kiano555@windowslive.com kiano555@yahoo.com
เว็บไซต์ อีเมล์
« เมื่อ: ตุลาคม 21, 2009, 10:58:35 pm »



คุณ...ไปปิดไฟสิ จะนอนแล้ว...
คุณนั่นแหละ ไปปิดที...

ต่อไปไม่ต้องเกี่ยงกันเรื่องปิดไฟแล้วครับ ถ้าทำโครงงานนี้
"สวิทช์ปิด-เปิดไฟด้วยรีโมทคอนโทรล"  เป็นโครงงาน PIC Microcontroller มีคุณสมบัติดังนี้คือ
- ต่อเอาพุตได้ 3 ช่อง กำลังไฟฟ้าโหลด 500 วัตต์ต่อช่อง
- ควบคุมการทำงานด้วยรีโมททีวี วีซีดีทั่วไป โดยมีโปรแกรมจำค่าปุ่มกดที่รีโมท
- มีสวิทช์ควบคุมในตัว ในกรณีไม่ใช้รีโมท
- ติดตั้งง่าย ใช้ใส่เข้าไปแทนที่สวิทช์ธรรมดาได้เลย

การทำงานของวงจร ทุกอย่างจะถูกควบคุมการทำงานด้วยไอซี Microcontroller เบอร์ PIC12F629 หรือเรียกสั้นๆว่า MCU
โดย IR Module จะทำหน้าที่รับสัญญาณรีโมทที่ส่งมาจากตัวรีโมท แล้วส่งไปประมวลผลคำสั่งภายใน MCU
เช่นเดียวกันกับ SW จะรับคำสั่งจากการกดของผู้ใช้งาน แล้วส่งผลการกดสวิทช์ไปประมวลคำสั่งภายใน MCU
ซึ่งจะได้ดูรายละเอียดการประมวลผลคำสั่งในหัวข้ออธิบายการทำงานของโค๊ดโปรแกรม
หลักจากประมวลผลคำสั่งแล้ว MCU จะส่งคำสั่งปิด-เปิดไฟไปที่ MOC3063 เพื่อทริกให้ไตรแอคทำงาน หรือหยุดทำงานแล้วแต่คำสั่งทีรับมาจาก MCU
และไตรแอคจะจ่ายไฟให้กับหลอดไฟต่อไป
PZ คือลำโพงเปียซโซ โดยทุกครั้งที่ MCU สั่งงานไปที่ออปโต้จะมีเสียง บี๊ป เพื่อให้รู้ถึงสถานะการทำงาน


รูปด้านล่างจะเป็นลายแผ่น PCB และการวางอุปกรณ์ลงบนแผ่น ในการวางอุปกรณ์จะใ่ส่ด้านที่เป็นทองแดงเลย ต้องดูขาของอุปกรณ์ให้แน่ในก่อนที่จะบัดกรี
เพราะวงจรเกียวข้องกับไฟ 220v โดยตรง ทำให้เกิดความเสียหายได้ง่ายถ้าใส่ผิด



รูปด้านล่างแสดงไดอะแกรมการต่อสวิทช์รีโมทเข้ากับหลอดไฟ 3 หลอด


รูปแสดงหลังจากติดตั้งสวิทช์รีโมทเสร็จแล้ว














สำหรับฝาปิดของสวิทช์ ใช้ฝาทึบทัวไปมาเจาะรูปสำหรับรับแสงอินฟาเรด แล้วตัดส่วนนูนของหลอด LED 3 มิลลิเมตรมาติดไว้ที่รูดังรูปด้านล่าง




บันทึกการเข้า

m077531424
member
*

คะแนน4
ออฟไลน์ ออฟไลน์

กระทู้: 433


อีเมล์
« ตอบ #1 เมื่อ: ตุลาคม 22, 2009, 04:31:09 pm »

พี่สนใจทำเป็นชุดคิทขายไหมครับผมสนใจมากๆๆครับ
บันทึกการเข้า
kiano♥
kiano555@gmail.com
กลุ่มสนับสนุนLSV+มีน้ำใจ
member
****

คะแนน337
ออฟไลน์ ออฟไลน์

กระทู้: 570


การให้น่าภูมิใจกว่าได้รับ Line ID : Tech64

kiano555@windowslive.com kiano555@yahoo.com
เว็บไซต์ อีเมล์
« ตอบ #2 เมื่อ: ตุลาคม 22, 2009, 05:48:49 pm »

วันนี้จะมาดูว่า ไอซีอ่านโค๊ดที่ส่งมาจากรีโมทได้อย่างไรนะครับ

ก่อนอื่นเราต้องรู้ก่อนว่า รีโมทนั้น ส่งอะไรออกมา จึงจะเขียนโปรแกรมให้อ่านโค๊ด แล้วเอาโค๊ดนั้นมาใช้งานได้
การดูว่า รีโมทส่งอะไรมานั้น ก็อาจจะต่อสโคป กับตัว IR Module ส่วนผมใช้วิธีต่อ PIC Kit-2 โดยใช้ฟังก์ชั่น Logic Analyzer
ตัวที่ทำเป็นตัวอย่าง เป็นรีโมทวีซีดี ของจีนแดงทั่วไปครับ  แล้วเราได้อะไร มาดูกันครับ ...

ตามรูปแนบด้านล่าง จะเห็นว่า รีโมททุกตัว จะส่งสัญญาณออกมาคล้ายๆกันครับ
Start Code เป็นสัญญาณอย่างแรกที่ส่งออกมาเลย โดยจะมีสองสถานะ คือ เป็น low 8ms แล้วตามด้วย Hight 4.5ms
Device Code สำหรับรีโมทตัวนี้ จะมีทั้งหมด 16 บิต ถ้าจะแปลตามตัวก็คือ เป็นรหัสของรีโมทตัวนั้นๆ คือถ้าเรากดปุ่มไหนของรีโมท มันก็จะส่งสัญญาณแบบนี้ออกมาก่อนครับ
บันทึกการเข้า
m077531424
member
*

คะแนน4
ออฟไลน์ ออฟไลน์

กระทู้: 433


อีเมล์
« ตอบ #3 เมื่อ: ตุลาคม 22, 2009, 06:36:21 pm »

พี่ครับผมPMไม่ได้ไม่ทราบว่าเป็นอะไร
รบกวนพี่PMราคามาละกันครับ
แล้วจะทำให้มีหลายๆๆช่องได้ไหมครับ(มากกว่า3)

ได้ครับ ทำกี่ช่องก็ได้
-ต้องแก้ไขวงจรใหม่
-ต้องแก้ไขโค๊ดใหม่

kiano
บันทึกการเข้า
kiano♥
kiano555@gmail.com
กลุ่มสนับสนุนLSV+มีน้ำใจ
member
****

คะแนน337
ออฟไลน์ ออฟไลน์

กระทู้: 570


การให้น่าภูมิใจกว่าได้รับ Line ID : Tech64

kiano555@windowslive.com kiano555@yahoo.com
เว็บไซต์ อีเมล์
« ตอบ #4 เมื่อ: ตุลาคม 22, 2009, 08:05:20 pm »

จากรูปด้านบน จะเห็นแล้วนะครับ ว่าสัญญาณที่ส่งมานั้น ระหว่าง Logic 0 กับ Logic 1 นั้น มีอะไรที่ต่างกัน
ครับ อธิบายเพิ่มคือ

0 จะประกอบด้วย คาบเวลาที่เป็น low 500us และคาบเวลาที่เป็น hi 500us
1 จะประกอบด้วย คาบเวลาที่เป็น low 500us และคาบเวลาที่เป็น hi 1800us

จากรูปด้านล่าง เป็นโค๊ดที่ส่งมาจากรีโมท ยกตัวอย่าง 5 ปุ่มครับ
จะเห็นได้ว่า 16 บิตแรก จะเหมือนกันทุกปุ่ม นั่นคือ device id data นั่นเอง
ต่อมา 16 บิตด้านหลัง จะเป็น bottom data ซึ่งแต่ละปุ่มนั้น จะมีโค๊ดที่ส่งออกมาไม่เหมือนกัน
และเราจะใช้ส่วนที่ไม่เหมือนกันนี่เองครับ มาใช้งาน ในโครงงานของเรา

ไม่รู้ผมเรียกชื่อต่างๆถูกหรือไม่นะครับ จำไม่ค่อยได้ครับ ว่าเค้าเรียกว่าอะไร
ดูรูปอธิบายแล้วอย่างเพิ่งตาลายนะครับ ผมทำเองผมยังตาลายเลย
กระทู้ต่อไปจะเป็นโฟว์ชาร์ทการทำงานของโปรแกรมครับ
กระทู้ต่อไปสงสัยต้องทำรูปเหนื่อยเลยครับ

รูปประกอบ   http://upload.mwake.com/v3.php?id=AO/FnkE0Liqej.jpg
บันทึกการเข้า
ถาวร-LSVteam
.กลุ่มผู้มีน้ำใจงาม.
member
*

คะแนน955
ออฟไลน์ ออฟไลน์

กระทู้: 7987



อีเมล์
« ตอบ #5 เมื่อ: ตุลาคม 22, 2009, 08:10:33 pm »

บอกขายได้เลยครับ ทางเว็บสนับสนุน คนที่คิดค้นทำ ครับ
 ชุดแรกเป็นเฮดพัลท์ จะบอกชนิดของอุปกรณ์ IRว่าเป็นคำสั่งของอะไร เช่น TV  VDO  หรือแอร์ ฯ ชุดที่2 น่าจะเป็นอีควอไรเซอร์พั้ลท์ เป็นเหมือนการ์ด กั้น คำสั่ง ซึ่งเป็นชุดที่3 ถ้าผมจำไม่ผิดนะครับเพราะว่าเรียนมาก็20ปีเข้าไปแล้ว อาจจะจำผิดมั่งก็ได้ จะหาหนังสือกลับมาอ่านคงรื้อบ้านกันไม่น้อย
บันทึกการเข้า

ยังสร้างความฉิบหายให้ประเทศไทยไมพอกันอีกหรือ 
 ผู้ใดคิดร้ายให้ร้ายพระองค์ มันจงพินาจฉิบหายในเวลาอันใกล้
ถาวร-LSVteam
.กลุ่มผู้มีน้ำใจงาม.
member
*

คะแนน955
ออฟไลน์ ออฟไลน์

กระทู้: 7987



อีเมล์
« ตอบ #6 เมื่อ: ตุลาคม 22, 2009, 10:06:22 pm »

แผ่นปริ้นจ้างทำเขาคิดเป็นตารางนิ้วครับ ผมว่าแรกๆทำเองลดต้นทุนครับ ใช้แผ่นอีพร๊อกซี่ ใช้ดรายฟลีม หัดสักพักก็จะออกมาสวยครับ ก็เหลือแต่เคลือบสีปริ้น ก็จะออกมาสวยแล้วครับ คนมีความคิดสร้างสรรค์น่าสนับสนุนครับ
  ควรหารีโหมดราคาถูกตัวละ20กว่าบาทมาใช้ครับ เพราะเจอต่างยี่ห้อ พั้ลท์คำสั่งมันจะไม่ตรงกันครับ
บันทึกการเข้า

ยังสร้างความฉิบหายให้ประเทศไทยไมพอกันอีกหรือ 
 ผู้ใดคิดร้ายให้ร้ายพระองค์ มันจงพินาจฉิบหายในเวลาอันใกล้
kiano♥
kiano555@gmail.com
กลุ่มสนับสนุนLSV+มีน้ำใจ
member
****

คะแนน337
ออฟไลน์ ออฟไลน์

กระทู้: 570


การให้น่าภูมิใจกว่าได้รับ Line ID : Tech64

kiano555@windowslive.com kiano555@yahoo.com
เว็บไซต์ อีเมล์
« ตอบ #7 เมื่อ: ตุลาคม 23, 2009, 01:27:29 am »

ขอต่ออีกนิดครับ...
มาดูโฟว์ชาร์ทการทำงานของโปรแกรมกันครับ จะว่าในส่วนของโปรแกรม main ก่อนเลยครับ
ดูตามภาพแล้ว ก็ไม่ได้มีออะไรมากมายครับ คือ ถ้าไม่มีการกดสวิทช์ หรือกดรีโมท โปรแกรมจะวนภายในลูป main
เพื่อคอยตรวจสอบ ว่ามีการกด สวิทช์ หรือกดรีโมทหรือไม่ แค่นั้นเองครับ แต่ถ้ามีการกดรีโมท มันก็จะกระโดดไปทำงาน
ในส่วนของโปรแกรม อ่านค่ารีโมท ถ้ากดสวิทช์ มันก็จะกระโดดไปทำงานในส่วนของโปรแกรมอ่านค่าสวิทช์
บันทึกการเข้า
kiano♥
kiano555@gmail.com
กลุ่มสนับสนุนLSV+มีน้ำใจ
member
****

คะแนน337
ออฟไลน์ ออฟไลน์

กระทู้: 570


การให้น่าภูมิใจกว่าได้รับ Line ID : Tech64

kiano555@windowslive.com kiano555@yahoo.com
เว็บไซต์ อีเมล์
« ตอบ #8 เมื่อ: ตุลาคม 23, 2009, 01:36:55 am »

ดูโฟว์ชาร์ท แล้วมาดูโค๊ดกันเลยครับ ...

MAIN:
   DECFSZ      STACK_0, F
   GOTO      $-1
   BTFSS      IR
   GOTO      READ_IR
   DECFSZ      STACK_0, F
   GOTO      $-1
   BTFSC      SW
   GOTO      READ_SW
   GOTO      MAIN

นี่เลยครับ ไม่มีอะไรมากมาย ในโค๊ดส่วนนี้ แต่จะเห็นว่ามีอะไรเพิ่มเข้ามานิดหน่อย คือ
หน่วงเวลาครับ ผมให้มันหน่วงเวลาสักนิด เพิ่อป้องกันการทำงานพลาดจาก นอยส์ที่เข้ามาทาง AC Line นั่นเองครับ

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


ปล.นี่เป็นโครงงานชิ้นแรกที่เขียนด้วยโค๊ด asm จริงๆครับ ถ้าท่านใดมีข้อเสนอแนะ หรือความคิดเห็นเพิ่มเติม ก็แทรกได้เลยนะครับ
บันทึกการเข้า
kiano♥
kiano555@gmail.com
กลุ่มสนับสนุนLSV+มีน้ำใจ
member
****

คะแนน337
ออฟไลน์ ออฟไลน์

กระทู้: 570


การให้น่าภูมิใจกว่าได้รับ Line ID : Tech64

kiano555@windowslive.com kiano555@yahoo.com
เว็บไซต์ อีเมล์
« ตอบ #9 เมื่อ: ตุลาคม 23, 2009, 01:50:18 am »

ต่อมาเป็นโฟว์ชาร์ทการทำงานของส่วนอ่านค่าจากการกดสวิทช์
ในส่วนนี้ จะทำงานโดยการอ่านว่า สวิทช์ถูกกดกี่ครั้ง ในเวลาที่กำหนดไว้
ซึ่งจะนำค่าที่อ่านได้จากการกด ไปทำงานแบบนี้ครับ

กด 1 ครั้ง ให้สั่ง ปิด-เปิด หลอดไฟหลอดที่ 1
กด 2 ครั้ง ให้สั่ง ปิด-เปิด หลอดไฟหลอดที่ 2
กด 3 ครั้ง ให้สั่ง ปิด-เปิด หลอดไฟหลอดที่ 3

กด 6 ครั้ง ตั้งค่าปุ่มกดที่รีโมท ปุ่มที่ 1 ที่ควบคุมการทำงาน ให้ปิดหลอดไฟทุกหลอด หรือทุก CH นั่นเอง
กด 7 ครั้ง ตั้งค่าปุ่มกดที่รีโมท ปุ่มที่ 2 ที่ควบคุมการทำงาน ปิด-เปิด หลอดไฟหลอดที่ 1
กด 8 ครั้ง ตั้งค่าปุ่มกดที่รีโมท ปุ่มที่ 3 ที่ควบคุมการทำงาน ปิด-เปิด หลอดไฟหลอดที่ 2
กด 9 ครั้ง ตั้งค่าปุ่มกดที่รีโมท ปุ่มที่ 4 ที่ควบคุมการทำงาน ปิด-เปิด หลอดไฟหลอดที่ 3
กด 10 ครั้ง ตั้งค่าปุ่มกดที่รีโมท ปุ่มที่ 5 ที่ควบคุมการทำงาน ให้เปิดหลอดไฟทุกหลอด หรือทุก CH นั่นเอง

จะเห็นว่า ฟังก์ชั่นของสวิทช์ จะมีส่วนเกี่ยวข้องกับฟังก์ชั่นอ่านค่า จากรีโมทด้วย ตัวอย่าง ถ้ากดสวิทช์ 6 ครั้ง มันก็จะไปรอรับสัญญาณจากรีโมท
เพื่อรอให้เรากดปุ่ม ที่ต้องการสั่งงานให้ปิดหลอดไฟทุกหลอด หลังจากได้ค่าที่ส่งมาจากรีโมทแล้ว มันจะสั่งให้ eeprom เก็บค่าที่อ่านได้
เพื่อการใช้งานครั้งต่อไป ค่าที่ตั้งเอาไว้จะได้ไม่ลบหาย แม้เวลาไฟดับ

ด้วยเหตุที่ต้องเกี่ยวข้องกับฟังก์ชั่น IR ด้วย จึงต้องเพิ่มทางเลือกให้มันครับ โดยการกำหนดตัวแปรที่ชือ case ให้มัน โดยตัว case นี้จะเป็นตัวกำหนดว่า
หลังจากอ่านค่า IR เสร็จแล้ว ให้ไปทำงานที่ส่วนไหนต่อ
เพื่อเข้าใจง่ายขึ้น ดูโฟว์ชาร์ทด้านล่างประกอบเลยครับ
เป็นโฟว์ชาร์ทการทำงานรวมของฟังก์ชั่นสวิทช์
บันทึกการเข้า
kiano♥
kiano555@gmail.com
กลุ่มสนับสนุนLSV+มีน้ำใจ
member
****

คะแนน337
ออฟไลน์ ออฟไลน์

กระทู้: 570


การให้น่าภูมิใจกว่าได้รับ Line ID : Tech64

kiano555@windowslive.com kiano555@yahoo.com
เว็บไซต์ อีเมล์
« ตอบ #10 เมื่อ: ตุลาคม 23, 2009, 06:45:33 pm »

หลังจากดูแล้วว่าฟังก์ชั่นสวิทช์มีการทำงานโดยรวมเป็นอย่างไร
ต่อไปเราจะมาดูรายละเอียดของฟังก์ชั่นนี้ ว่าแต่ละส่วนนั้นทำงานอย่างไร

READ_SW:
   CLRF           SW_DATA
   CALL           BEEP
   INCF           SW_DATA, F
   MOVLW      0X50
   MOVWF      STACK_4
   DECFSZ      STACK_3, F
   GOTO         $-1
   DECFSZ      STACK_4, F
   GOTO         $-3
   BTFSC        SW                ;ถ้ายังกดค้างอยู่ ให้กลับไป delay
   GOTO        $-7

ตามโค๊ดด้านบนอธิบายได้ว่า หลังจากที่สวิทช์ถูกกดไป 1 ครั้งจากฟังก์ชั้นเมน
แล้วยังไม่มีการปล่อยสวิทช์ ตัวแปรที่เก็บค่าการกดสวิทช์จะถูกเพิ่มขึ้น 1 ค่า
แล้วจะหน่วงเวลาก่อน 20ms เพื่อรอการปล่อยมือจากสวิทช์
แต่ถ้าหน่วงเวลาแล้ว ก็ยังไม่มีการปล่อยมืออีก จะกลับไปหน่วงเวลาต่อ
ซึ่งโฟว์ชาร์ทการทำงาน ดูได้จะรูปแนบด้านล่างครับ จะเห็นภาพการทำงานที่ชัดเจนขึ้น
บันทึกการเข้า
kiano♥
kiano555@gmail.com
กลุ่มสนับสนุนLSV+มีน้ำใจ
member
****

คะแนน337
ออฟไลน์ ออฟไลน์

กระทู้: 570


การให้น่าภูมิใจกว่าได้รับ Line ID : Tech64

kiano555@windowslive.com kiano555@yahoo.com
เว็บไซต์ อีเมล์
« ตอบ #11 เมื่อ: ตุลาคม 23, 2009, 07:09:16 pm »

หลังจากที่มีการปล่อยสวิทช์แล้ว โปรแกรมจับเวลาก็จะเริ่มจับเวลา
ว่า ภายในเวลา 3 วินาทีนั้น มีการกดสวิทช์ไปกี่ครั้ง
โปรแกรมจับเวลาจะเริ่มจากแถว SW_L1: ไปจนถึง แถว SW_L2:

   MOVLW     0X07              ;จับเวลา 3 sec มีการกดกี่ครั้ง
   MOVWF     STACK_2
SW_L1:
   DECFSZ     STACK_0, F
   GOTO        SW_L2
   DECFSZ    STACK_1, F
   GOTO       SW_L1
   DECFSZ    STACK_2, F
   GOTO       SW_L1
   GOTO       SW_L3            ;สิ้นสุดการจับเวลา
SW_L2:
   BTFSS      SW                  ;ช่วงที่จับเวลามีการกดสวิทช์หรือไม่
   GOTO      SW_L1
   INCF        SW_DATA, F     ;ถ้ากด ก็ให้เพิ่่มค่าตัวแปร
   CALL        BEEP
   MOVLW   0X50
   MOVWF   STACK_4
   DECFSZ   STACK_3, F
   GOTO      $-1
   DECFSZ   STACK_4, F
   GOTO      $-3
   BTFSS      SW                 ;ยังกดค้างอยู่หรือไม่
   GOTO      SW_L1
   GOTO      $-8                  ;ถ้ายังกดค้างอยู่ให้กลับไป delay จนกว่าจะไม่กดค้าง

ในระหว่างการจับเวลา โปรแกรมจะกระโดดไปตรวจสอบสวิทช์อยู่ทุกรอบไซเคิล
เพื่อดูว่ามีการกดสวิทช์หรือไม่ ถ้ากดสวิทช์ แต่ยังไม่ปล่อย ก็จะมีการหน่วงเวลาซ้ำเข้าไปอีก
ซึ่งจะเริ่มจากแถว SW_L2: ไปจนจบโปรแกรมอ่านสวิทช์

หลังจากที่ครบเวลา 3 วินาทีแล้ว เราจะได้อะไรจากโปรแกรมอ่านสวิทช์
ครับ จะได้ค่าการกดสวิทช์ นั่นก็คือค่า sw_data นั่นเอง ซึ่งจะใช้ค่านี้
ไปสั่งงานในโปรแกรมส่วนต่อไป...

รูปประกอบ  http://upload.mwake.com/v3.php?id=Or/EfPuWPJw9e.jpg
บันทึกการเข้า
kiano♥
kiano555@gmail.com
กลุ่มสนับสนุนLSV+มีน้ำใจ
member
****

คะแนน337
ออฟไลน์ ออฟไลน์

กระทู้: 570


การให้น่าภูมิใจกว่าได้รับ Line ID : Tech64

kiano555@windowslive.com kiano555@yahoo.com
เว็บไซต์ อีเมล์
« ตอบ #12 เมื่อ: ตุลาคม 23, 2009, 07:22:55 pm »

คิดไม่ออกครับ ว่าต่อไปจะอธิบายอย่างไร เพราะมันทำงานเกี่ยวเนื่องกัน
เอาเป็นว่ามาดูโฟว์ชาร์ทรวมของโปรแกรมกันดีกว่าครับ ถ้าไม่เข้าใจจุดไหนก็ถามแทรกมาได้เลยครับ
ส่วนผมจะอธิบายไปเรื่อยๆ เท่าที่จะคิดได้ แต่ส่วนสำคัญก็คงจะเป็นส่วนของ
โปรแกรมอ่านค่า จากรีโมทนั่นเองครับ จะมาดูกันว่า มันใช้ได้กับทุกรีโมทอย่างที่ผมเกริ่นไว้ได้จริงหรือไม่

รูปประกอบ   http://upload.mwake.com/v3.php?id=zZ/o2zLV0fI9I.jpg
บันทึกการเข้า
kiano♥
kiano555@gmail.com
กลุ่มสนับสนุนLSV+มีน้ำใจ
member
****

คะแนน337
ออฟไลน์ ออฟไลน์

กระทู้: 570


การให้น่าภูมิใจกว่าได้รับ Line ID : Tech64

kiano555@windowslive.com kiano555@yahoo.com
เว็บไซต์ อีเมล์
« ตอบ #13 เมื่อ: ตุลาคม 23, 2009, 07:37:54 pm »

จากรูปโฟว์ชาร์ทรวมการทำงานด้านบน จะเห็นได้ว่า ผมได้แยกสีไว้ครับ
อธิบายได้ดังนี้คือ...

สีเขียว จะเป็นฟังก์ชั่นเมนของโปรแกรม ที่จะคอยตรวจสอบการสั่งงานจาก ยูสเซอร์
จะดูว่า มีการกดสวิทช์ หรือมีการกดรีโมทหรือไม่ ถ้าไม่ได้กดอะไร มันก็จะทำงานวนอยู่ในลูปของมัน

สีฟ้า จะเป็นส่วนของโปรแกรมอ่านค่าจากการกดสวิทช์ จะนับว่า เรากดสวิทช์ไปกี่ครั้ง ในเวลา 3 วินาที
กด 1 ครั้ง โปรแกรมจะกำหนดให้ ค่า IR เท่ากับค่าที่อ่านได้จากอีพรอม นั่นก็คือปุ่มที่ 2 แล้วมันจะไปสั่งงาน
ให้โปรแกรมควบคุมหลอดไฟทำงาน โดยจะตรวจสอบสถานะของหลอดไฟหลอดที่ 1 ถ้าเปิดอยู่ มันก็จะสั่งให้ปิด
ถ้าหลอดไฟปิดอยู่ มันก็จะสั่งให้เปิด ซึ่งโปรแกรมควบคุมหลอดไฟ ก็จะอยู่ในกลุ่มสีม่วงนั่นเองครับ

แต่ถ้ากดสวิทช์ 6 ครั้งล่ะ มันก็จะสั่งงานในโหมดตั่งค่าปุ่มกดครับ โดยมันจะกระโดดไปรอรับคำสั่งจากตัวรีโมท
รอให้เรากดปุ่มที่รีโมท แล้วก็จะจำค่าปุ่มนั่นเอาไว้ เพื่อนำมาใช้เป็นค่าอ้างอิงให้กับโปรแกรม ควบคุมหลอดไฟนั่นเอง

สีแดง จะเป็นโปรแกรมอ่านโค๊ดจากรีโมท จะอ่านได้สูงสุดขนาด 16 bit ซึ่งจะได้อธิบายในหัวข้อต่อไปครับ
หลังจากอ่านโค๊ดจากตัวรีโมทได้ 16 บิตแล้ว มันก็จะนำค่าที่อ่านได้ มาเปรียบเทียบกับค่าอ้างอิง
ที่ได้จากการตั้งค่าตามคำอธิบายด้านบน ถ้าค่าตรงกัน มันก็จะสั่งให้หลอดไฟ เปิด หรือ ปิด
บันทึกการเข้า
Ptn-LSVteam♥
.กลุ่มผู้มีน้ำใจงาม.
member
*

คะแนน780
ออฟไลน์ ออฟไลน์

กระทู้: 2770


« ตอบ #14 เมื่อ: ตุลาคม 23, 2009, 09:03:22 pm »

แนวคิดการออกแบบดีมากๆครับ     
บันทึกการเข้า

AV Electronic  Pattani.
kiano♥
kiano555@gmail.com
กลุ่มสนับสนุนLSV+มีน้ำใจ
member
****

คะแนน337
ออฟไลน์ ออฟไลน์

กระทู้: 570


การให้น่าภูมิใจกว่าได้รับ Line ID : Tech64

kiano555@windowslive.com kiano555@yahoo.com
เว็บไซต์ อีเมล์
« ตอบ #15 เมื่อ: ตุลาคม 23, 2009, 09:20:52 pm »

มาดูโปรแกรมอ่านค่ารีโมทกันครับ
เริ่มจากอ่าน เฮดพัลล์ ก่อนครับ ถ้าดูรูปด้านล่างประกอบ จะเห็นว่า เฮดพัลล์ ประกอบไปด้วย
Low 8 ms ตามมาด้วย HI 4.5 ms
ซึ่งรีโมทแต่ละตัว จะส่งออกมาเวลาจะใกล้เคียงกัน งั้นผมก็เลยกำหนดเอาเลยว่า

ช่วงที่เป็น Low นั้น มันจะอยู่ในเวลาระหว่าง 255 us - 10000 us ถ้าไม่ได้อยู่ในช่วงเวลานี้
ก็แสดงว่า มันไม่ใช่เฮดพัลล์ ให้กระโดดไป Error

ช่วงที่เป็น่ HI ก็จะเขียนโปรแกรมอ่านลักษณะเดียวกันครับ คือจับเวลาว่า มันจะต้องอยู่ในช่วงเวลา 255 - 10000 us
ถ้าไม่ได้เวลาตามนี้ ก็ให้โดดไปที่ Error
ดูโค๊ดกันเลยครับ ส่วนของการอ่านเฮดพัลล์

MOVLW    0X08                    ;จับเวลา 10 ms   
MOVWF    STACK_1
DECFSZ    STACK_0, F
GOTO       $+4
DECFSZ    STACK_1, F
GOTO       $-3
GOTO       ERR                       ;ถ้านานเกิน 10 ms ให้โดดไป Error
INCF        COUNT_0, F
BTFSC      STATUS, Z
INCF        COUNT_1, F
BTFSS      IR
GOTO       $-9
                                              ;จับเวลาน้อยกว่า 255 us หรือไม่
MOVLW    0X01
SUBWF    COUNT_1, W
BTFSS      STATUS, C
GOTO       ERR                        ;ถ้าน้อยกว่า 255 us ให้โดดไป Error

รูปประกอบ    http://upload.mwake.com/v3.php?id=b0/UkKQW3Jcjo.jpg


ขอขอบคุณ คุณพี่ Ptn-LSVteam♥ มากๆครับ ที่แวะมาให้กำลังใจครับ
บันทึกการเข้า
kiano♥
kiano555@gmail.com
กลุ่มสนับสนุนLSV+มีน้ำใจ
member
****

คะแนน337
ออฟไลน์ ออฟไลน์

กระทู้: 570


การให้น่าภูมิใจกว่าได้รับ Line ID : Tech64

kiano555@windowslive.com kiano555@yahoo.com
เว็บไซต์ อีเมล์
« ตอบ #16 เมื่อ: ตุลาคม 23, 2009, 09:57:33 pm »

หลังจากอ่านเฮดพัลล์เสร็จแล้วโดยไม่มีการเออเร่อ คือถ้ามันเออเร่อ โปรแกรมมันจะเข้ามาในส่วนต่อไปนี้ไม่ได้
จึงไม่ต้องกังวลเลย ว่ามันจะแอบเปิดไฟของเราโดยที่เราไม่ได้สั่ง... และถึงแม้นอยส์ หรืออะไรก็แล้วแต่
ทำให้มันทำงานพลาด มันสามารถผ่านด่านเออเร่อสองครั้งของการอ่านเฮดพัลล์
แล้วเข้ามาส่วนนี้ได้ แต่มันก็ต้องเจอด่านอรหันต์ด่านต่อไปครับ คือ Lighting control นั่นเองครับ

ก่อนอื่นเรามาวิเคราะห์กันอีกทีครับ ว่าสัญญาณโค๊ดที่ส่งมาจากรีโมทนั้น หน้าตาเป็นอย่างไร
ดูจากรูปแนบแล้วจะเห็นว่า ถ้ามันส่ง Logic 0 ออกมา มันจะประกอบไปด้วย 2 สถานะ นั่นคือ
เป็น LO 500us แล้วเป็น HI 500us

แล้วถ้ามันส่ง Logic 1 ออกมา มันจะประกอบไปด้วย 2 สถานะเหมือนกัน แต่คาบเวลาจะต่างกัน นั่นคือ
เป็น LO 500us แล้วเป็น HI 1800us       ....... ข้อมูลอ้างอิงจากรีโมทเครืองวีซีดีจีนแดงทั่วไป

เอาล่ะครับ เราจะเขียนโปรแกรมอย่างไร ให้มันแยกแยะออก ว่าอันไหนเป็น Logic 0 หรือ 1 แถมยังต้องให้ครอบคลุม
ได้กับรีโมททุกยี่ห้ออีก เพราะแต่ละยี่ห้อ มันต้องส่งออกมาคาบเวลาไม่เหมือนกันแน่นอน แถมจำนวนบิตที่ส่งออกมา
ก็อาจจะไม่ใช่ 32 บิตเหมือนกับรีโมทยี่ห้อนี้....
บันทึกการเข้า
kiano♥
kiano555@gmail.com
กลุ่มสนับสนุนLSV+มีน้ำใจ
member
****

คะแนน337
ออฟไลน์ ออฟไลน์

กระทู้: 570


การให้น่าภูมิใจกว่าได้รับ Line ID : Tech64

kiano555@windowslive.com kiano555@yahoo.com
เว็บไซต์ อีเมล์
« ตอบ #17 เมื่อ: ตุลาคม 24, 2009, 08:11:09 am »

เอางี้นะครับ เราปล่อยวางก่อน อย่าเพิ่งไปคิดอะไรมาก อย่าเพิ่งไปคิดว่ามันส่ง device code , data bottom อะไรของมันก็ให้มันส่งมา
ช่วงที่มันเป็น LO เราจะจับเวลาลองดู เพิ่มค่าเวลาในตัวแปรของเรา ดูซิ ว่าตัวแปรของเรามันจะได้ค่าเท่าไหร่กัน
โดยโค๊ดจับเวลาช่วงที่มันเป็น LO 500us ตามด้านล่างเลยครับ

IR_L1:
  CLRF         STACK_1
IR_L2:
  MOVLW    1
  ADDWF     STACK_1, 1      ;เก็บเวลาช่่วง 0 ไว้ที่ตัวแปร STACK_1
  NOP
  NOP
  NOP
  NOP
  NOP
  BTFSC      STATUS, C        ;stack-1 อยู่ระหว่าง 0~50 ถ้าวนเกิน 255 ให้ไปที่ case( 500us / 10us = 50 )
  GOTO      CASE
  BTFSS      IR
  GOTO       IR_L2              ;ถ้า ir ยังเป็น 0 ก็ให้กลับไปเพิ่มเวลา

จากโค๊ดจะเห็นได้ว่า ในการนับวน 1 รอบหรือเพิ่มค่าตัวแปร 1 ครั้งนั้น ต้องใช้คำสั่งถึง 10 คำสั่ง ซึ่งแต่ละคำสั่งจะใช้เวลา 1 us
แล้วช่วงเวลาที่มันเป็น LOW นั้นมันใช้เวลา 500 us ใช่ไหมครับ งั้นตัวแปรของเราจะมีค่า 500/10 = 50 แล้วเก็บค่าไว้ในตัวแปร stack_1
ซึ่ง stack_1 นั้นจะรับค่าได้สูงสุดคือ 255 มันจะมีรีโมทตัวไหนบ้างนะ ที่จะส่งดาต้า LOW ออกมาเกิน 255x10 = 2550 us โอเคครับ คงไม่มีแน่ๆ
ผมคิดว่าอย่างนั้นนะครับ ดังนั้นค่าที่จับเวลาได้ ผมจึงใช้แค่ 8 บิต หรือใช้ตัวแปรแค่ตัวเดียวครับ

หลังจากที่ลองจับเวลาช่วงเป็น LOW และได้ค่าตัวแปร STACK_1 มาแล้ว
จะมาลองจับเวลาช่วงเป็น HI กัน โดยโค๊ดตามด้านล่างครับ

   CLRF       STACK_2
IR_L3:
   MOVLW       1
   ADDWF     STACK_2, 1               ;เก็บค่าที่นับได้ ไว้ที่ตัวแปร STACK_2
   NOP
   NOP
   NOP
   NOP
   NOP
   BTFSC       STATUS, C           ;stack-2 อยู่ระหว่าง 0~180 ถ้าวนเกิน 255 ครั้งให้ไปที่ case ( 1800us / 10us = 180 )
   GOTO        CASE
   BTFSC       IR
   GOTO        IR_L3                            ;ถ้า ir ยังเป็น 1 ก็ให้กลับไปเพิ่มเวลา

จะเห็นว่าเป็นโค๊ดตัวเดียวกันกับตัวจับเวลา LOW เพียงแต่จะเก็บค่าที่ได้ไว้ใน stack_2
มาดูกันครับ stack_2 จะมีค่าเท่าไหร่ 500/10 = 50
ตอนนี้เราจะได้ค่าตัวแปร 2 ตัวแล้วนะครับ คือค่าตัวแปร stack_1 = 50 และตัวแปร stack_2 =50
ซึ่งคาบเวลาเท่ากันก็หมายถึงเป็น Logic 0 นั่นเองครับ
แล้วถ้าตัวแปรที่ได้เป็นอย่างนี้ครับ stack_1 = 50 และตัวแปร stack_2 = 180 (1800us / 10 = 180)
ถ้าค่าตัวแปรออกมาแบบนี้ ก็หมายถึงรีโมทมันส่งค่า Logic 1 ออกมานั่นเอง
ต่อไปจะดูโค๊ดตัวที่จะเป็นตัวตัดสินว่า บิตไหนจะเป็น 0 หรือบิตไหนจะเป็น 1

    MOVF       STACK_1, W
    ADDWF    STACK_2, F
    MOVLW   0X9B
    SUBWF     STACK_2, F
    BTFSC      STATUS, C
    GOTO       $+3
    BCF           IR_DATA, 0
    GOTO        IR_L1
    BSF            IR_DATA, 0
    GOTO        IR_L1

จากโปรแกรมด้านบนอธิบายได้แบบนี้ครับ...
จะเห็นว่า จะนำค่า stack_1 กับ stack_2 มาบวกกัน แล้วลบด้วย 155
(Stack_1+stack_2)-155
แล้วจะตรวจสอบผลลัพธ์ที่ได้ ถ้าติดลบ ก็หมายถึง เป็น Logic 0 ถ้าค่าที่ได้ออกมาเป็นเลขบวก ก็หมายถึง Logic 1
ลองแทนค่าตัวแปรดูนะครับ
(50+50)-155 = -55    --->  Logic 0
(50+180)-155 = 75   --->  Logic 1
บันทึกการเข้า
Nattawut-LSV Team
E23IUY
.กลุ่มผู้มีน้ำใจงาม.
member
*

คะแนน808
ออฟไลน์ ออฟไลน์

กระทู้: 3581


อีเมล์
« ตอบ #18 เมื่อ: ตุลาคม 24, 2009, 08:36:49 am »

เข้ามาดู มาเป็นกำลังใจให้ด้วยคนครับ .....  HAPPY2!!  Smiley  ping!
บันทึกการเข้า
ลุงเคี้ยง-LSVteam♥
.กลุ่มผู้มีน้ำใจงาม..
member
*

คะแนน1138
ออฟไลน์ ออฟไลน์

กระทู้: 6667


ขอเป็นข้ารองบาททุกชาติไป


« ตอบ #19 เมื่อ: ตุลาคม 24, 2009, 09:23:58 am »

ผมขอสนับสนุนอีกคนครับ HAPPY2!! Embarrassed THANK!! Kiss
บันทึกการเข้า
alassy
member
*

คะแนน2
ออฟไลน์ ออฟไลน์

กระทู้: 40


อีเมล์
« ตอบ #20 เมื่อ: ตุลาคม 25, 2009, 11:26:29 pm »

เขียนเป็นแอสแซมบลี้เลยหรือครับท่าน มึนจัง อิอิ
บันทึกการเข้า
moo
member
*

คะแนน3
ออฟไลน์ ออฟไลน์

กระทู้: 125


« ตอบ #21 เมื่อ: ตุลาคม 28, 2009, 06:19:54 am »

น่าสนใจมากครับขอถามนิดนึ่งเวลาโปรแกรม IC ใช้วงจรอะไรครับ Cheesy

ผมใช้ pic Kit-2 OEM ครับ
จะมีวิธีการโปรแกรมให้ดูด้วยครับ ในช่วงท้าย
รวมทั้งการประกอบ การใช้งาน แต่ต้องรอหน่อยครับ
และจะหาวิธีโปรแกรมที่ง่ายที่สุด สำหรับคนที่ยังไม่มีเครื่องโปรแกรมครับ
จะได้ทำได้ทุกคนที่อยากทำ
kiano
บันทึกการเข้า
kiano♥
kiano555@gmail.com
กลุ่มสนับสนุนLSV+มีน้ำใจ
member
****

คะแนน337
ออฟไลน์ ออฟไลน์

กระทู้: 570


การให้น่าภูมิใจกว่าได้รับ Line ID : Tech64

kiano555@windowslive.com kiano555@yahoo.com
เว็บไซต์ อีเมล์
« ตอบ #22 เมื่อ: ตุลาคม 28, 2009, 08:12:56 pm »

หลังจากที่โปรแกรมคำนวนเวลาของพัลล์แต่ละลูกออกมาและได้รู้ว่าพัลล์ลูกไหนเป็น 0 หรือ 1 แล้วก็จะเก็บค่าเอาไว้ในตัวแปร 2 ตัวนั่นก็คือ IR_DATA และ IR_DATA_2 เราจะเขียนโปรแกรมได้ดังนี้ครับ

IR_L1:
  CLRF      STACK_1
IR_L2:
  MOVLW 1
  ADDWF  STACK_1, 1
  NOP
  NOP
  NOP
  NOP
  NOP
  BTFSC     STATUS, C
  GOTO      CASE
  BTFSS      IR
  GOTO      IR_L2
  CLRF       STACK_2
IR_L3:
  MOVLW   1
  ADDWF    STACK_2, 1
  NOP
  NOP
  NOP
  NOP
  NOP
  BTFSC      STATUS, C
  GOTO       CASE
  BTFSC      IR
  GOTO       IR_L3

  RLF          IR_DATA_2, F
  BTFSS      IR_DATA, 7
  GOTO      $+3
  BSF         IR_DATA_2, 0
  GOTO      $+2
  BCF         IR_DATA_2, 0
  RLF         IR_DATA, F
  MOVF      STACK_1, W
  ADDWF   STACK_2, F
  MOVLW   0X9B
  SUBWF    STACK_2, F
  BTFSC     STATUS, C
  GOTO      $+3
  BCF         IR_DATA, 0
  GOTO      IR_L1
  BSF         IR_DATA, 0
  GOTO      IR_L1

จากโค๊ดส่วนของการอ่านค่าที่รีโมทส่งมา จะเห็นว่าโปรแกรมจะไม่แยกแยะ ว่ารีโมทส่งอะไรออกมา
จะอ่านแค่เฮดพัลล์ และโค๊ด 16 บิทหลังสุดดังนั้น โค๊ดนี้จึงอ่านได้กับทุกรีโมทครับ
เพราะหลังจากอ่านแล้ว มันก็จะเก็บค่าที่อ่านได้ ไว้ใน ee-prom เพื่อเป็นค่าอ้างอิง
ในการควบคุมการปิด-เปิดหลอดไฟ ซึ่งจะดูได้จากส่วนของโปรแกรมคุมหลอดไฟต่อไปครับ
ดูการเก็บค่าไว้ในตัวแปรได้จากรูปแนบครับ

รูปประกอบ  http://upload.mwake.com/v3.php?id=Hm/I198UMvDuI.jpg
บันทึกการเข้า
msoamsoa
member
*

คะแนน4
ออฟไลน์ ออฟไลน์

กระทู้: 56


« ตอบ #23 เมื่อ: พฤศจิกายน 02, 2009, 10:51:14 pm »

น่าสนใจมากเลยครับ แต่ผมอ่านแล้วไม่ค่อยจะเข้าใจเท่าไรเลยอ่าครับ พื้นฐานไม่มี   
บันทึกการเข้า
ถาวร-LSVteam
.กลุ่มผู้มีน้ำใจงาม.
member
*

คะแนน955
ออฟไลน์ ออฟไลน์

กระทู้: 7987



อีเมล์
« ตอบ #24 เมื่อ: พฤศจิกายน 03, 2009, 09:19:06 am »

ผมแนะนำเรื่องตัวสวิท หน่อยครับ จะใช้ ฝาปิด ใหญ่ เป็นตัวกดสวิทใช่รึเปล่า  ถ้าใช่ ผมแนะนำให้ ใส่สวิท ที่4มุม มุมละตัวครับ แทนที่จะใส่ตรงกลางเพียงตัวเดียว

--------------------------------------------------------------

ไม่ค่อยเข้าใจที่อาจารย์ถาวรแนะนำครับ คือหมายถึงใส่ตัวละมุม เพื่อรับแรงกดได้ทั่วแบบนี้หรือไม่ครับ
หรือ ใส่ตัวละมุม แล้วให้แยกฟังก์ชั่นการทำงานของสวิทช์แต่ละตัวออก ตัวหนึ่ง ก็คุมไฟหลอดหนึ่ง แบบนี้หรือไม่ครับ

พอดีมีคนแนะนำผมมาว่า น่าจะแยกสวิทช์ออก ไม่ให้มีสวิทช์เดียว เพราะตอนใช้งานจะไม่ค่อยสะดวก ถ้ายังไงคงจะปรับปรุงแล้วทำเป็นอีกเวอร์ชั่นน่ะครับ
ขอบคุณครับ
kiano
บันทึกการเข้า

ยังสร้างความฉิบหายให้ประเทศไทยไมพอกันอีกหรือ 
 ผู้ใดคิดร้ายให้ร้ายพระองค์ มันจงพินาจฉิบหายในเวลาอันใกล้
pop_9919
member
*

คะแนน1
ออฟไลน์ ออฟไลน์

กระทู้: 27


« ตอบ #25 เมื่อ: พฤศจิกายน 10, 2009, 03:32:33 pm »

กด 1 ครั้ง ให้สั่ง ปิด-เปิด หลอดไฟหลอดที่ 1
กด 2 ครั้ง ให้สั่ง ปิด-เปิด หลอดไฟหลอดที่ 2
กด 3 ครั้ง ให้สั่ง ปิด-เปิด หลอดไฟหลอดที่ 3

กด 6 ครั้ง ตั้งค่าปุ่มกดที่รีโมท ปุ่มที่ 1 ที่ควบคุมการทำงาน ให้ปิดหลอดไฟทุกหลอด หรือทุก CH นั่นเอง
กด 7 ครั้ง ตั้งค่าปุ่มกดที่รีโมท ปุ่มที่ 2 ที่ควบคุมการทำงาน ปิด-เปิด หลอดไฟหลอดที่ 1
กด 8 ครั้ง ตั้งค่าปุ่มกดที่รีโมท ปุ่มที่ 3 ที่ควบคุมการทำงาน ปิด-เปิด หลอดไฟหลอดที่ 2
กด 9 ครั้ง ตั้งค่าปุ่มกดที่รีโมท ปุ่มที่ 4 ที่ควบคุมการทำงาน ปิด-เปิด หลอดไฟหลอดที่ 3........

คือผมสงสัยว่าเรากดรีโมท 1ครั้ง เปิด-ปิดหลอด1
กด2ครั้ง เปิดปิดหลอด2...คือว่ากด2ครั้งปุ่มเดี๋ยวกันหรือคนละปุ่ม
แล้วถ้าเราจะตั้งให้มันเป็น 1หลอดต่อหนึ่งปุ่มบนรีโมทได้หรือป่าวคับ


--------------------------------

ถ้าดูตามวงจร จะเห็นว่ามันมีสวิทช์อยู่ตัวเดียวครับ ซื่งการทำงานของสวิทช์ตามด้านบนวรรคแรก
ส่วนการทำงานที่รีโมทนั้น จะมีปุ่มสั่งงานทั้งหมด 5 ปุ่มดังนี้

1 เปิดทุกหลอด
2 ปิด-เปิด หลอดที่ 1
3 ปิด-เปิด หลอดที่ 2
4 ปิด-เปิด หลอดที่ 3
5 ปิดหมดทุกหลอด

รีโมททั่วไปมันมีหลายปุ่มใช่ไหมครับ แต่ผมใช้แค่ 5 ปุ่มนี้มาใช้งาน
ซึ่งการตั้งค่าที่ตัวรีโมท ว่าปุ่มไหนสั่งงานอะไร ก็ย้อนกลับไปอ่านด้านบนวรรคสอง
kiano
บันทึกการเข้า
ถาวร-LSVteam
.กลุ่มผู้มีน้ำใจงาม.
member
*

คะแนน955
ออฟไลน์ ออฟไลน์

กระทู้: 7987



อีเมล์
« ตอบ #26 เมื่อ: พฤศจิกายน 10, 2009, 07:11:06 pm »

เป็นสวิทขนานกันไงครับ ไม่ว่าจะกดด้านไหน ลืมไปคำสั่งแบบนี้จะมีปัญหาเรื่องการกดอีกเพราะว่ามันอาจจะนับเป็นครั้งไปเลย ถ้าสวิทเริ่มไม่ดี ผมว่าใช้สักพักจะมีปัญหาเรื่องสวิทตัวนี้แน่นอน
บันทึกการเข้า

ยังสร้างความฉิบหายให้ประเทศไทยไมพอกันอีกหรือ 
 ผู้ใดคิดร้ายให้ร้ายพระองค์ มันจงพินาจฉิบหายในเวลาอันใกล้
kiano♥
kiano555@gmail.com
กลุ่มสนับสนุนLSV+มีน้ำใจ
member
****

คะแนน337
ออฟไลน์ ออฟไลน์

กระทู้: 570


การให้น่าภูมิใจกว่าได้รับ Line ID : Tech64

kiano555@windowslive.com kiano555@yahoo.com
เว็บไซต์ อีเมล์
« ตอบ #27 เมื่อ: พฤศจิกายน 15, 2009, 09:09:18 am »

หลังจากหายไปนาน จะว่ากันต่อในส่วนของโค๊ดตัวที่คุมการปิด เปิดหลอดไฟครับ

CONTROL:
     MOVF           BOTTOM_0, W
     XORWF         IR_DATA, W
     BTFSS          STATUS, Z
     GOTO           B1
     MOVF           BOTTOM_00, W
     XORWF        IR_DATA_2, W
     BTFSS          STATUS, Z
     GOTO           B1
     BCF              CH1
     BCF              CH2
     BCF             CH3
     CALL            BEEP
     CALL            DELAY
     GOTO          MAIN

สมมุติก่อนครับว่า ค่าของปุ่มกดที่รีโมท 5 ปุ่มนั้น เราได้ทำการตั้งค่าไว้ใน ee-prom แล้ว
คราวนี้ ตัวโค๊ดด้านบนนี้ จะดึงค่าปุ่มกดปุ่มที่ 1 ออกมาก่อน เพื่อจะเปรียบเทียบค่าที่อ่านได้จากการกดรีโมท
ถ้าตรงกัน ก็จะสั่งงานให้ปิดไฟหมดทุกหลอด แต่ถ้าไม่ตรง ก็จะกระโดดไปเปรียบเทียบกับค่าป่มต่อไป
ตามโค๊ดด้านล่างครับ

B1:
     MOVF          BOTTOM_1, W
     XORWF       IR_DATA, W
     BTFSS         STATUS, Z   
     GOTO          B2
     MOVF          BOTTOM_11, W
     XORWF       IR_DATA_2, W
     BTFSS         STATUS, Z   
     GOTO          B2
     MOVF          GPIO, W
     MOVWF       STACK_0
     MOVLW      0X01
     XORWF      STACK_0, F
     BTFSS        STACK_0, 0
     GOTO         $+3
     BSF            CH1
     GOTO         $+2
     BCF           CH1
     CALL          BEEP
     CALL          DELAY
     GOTO         MAIN

จากโค๊ดจะเห็นว่า จะดึงค่าปุ่มกดปุ่มที่ 2 ออกมาเปรียบเทียบกับค่าที่อ่านได้จากการกดรีโมท
ถ้าค่าเท่ากัน ก็จะตรวจสอบว่า หลอดไฟหลอดที่ 1 เปิด หรือ ปิด อยู่ ถ้าเปิดอยู่ ก็จะสั่งให้ปิด
หรือกลับกัน ถ้าปิดอยู่ ก็จะสั่งให้เปิด แต่ถ้าเปรียบเทียบแล้ว ค่าไม่เท่ากัน ก็จะกระโดดไปเปรียบเทียบกับปุ่มต่อไป
ซึ่งโปรแกรมจะเขียนเหมือนกันครับ
บันทึกการเข้า
moo
member
*

คะแนน3
ออฟไลน์ ออฟไลน์

กระทู้: 125


« ตอบ #28 เมื่อ: พฤศจิกายน 18, 2009, 06:48:22 pm »

อยากได้ไอซีที่เบิร์นแล้วครับไม่ทราบว่าถ้าขายตัวละเท่าไรครับ
น่าลองทำเล่นดู
บันทึกการเข้า
หน้า: [1] 2   ขึ้นบน
  พิมพ์  
 
กระโดดไป:  

Powered by MySQL Powered by PHP Powered by SMF 1.1 RC2 | SMF © 2001-2006, Lewis Media

lsv2555Please follow the new website at https://www.pohchae.com

Valid CSS!