สารบัญ:

การใช้งานเซนเซอร์ท่าทางสัมผัส APDS9960 แบบไม่ปิดกั้น: 5 ขั้นตอน
การใช้งานเซนเซอร์ท่าทางสัมผัส APDS9960 แบบไม่ปิดกั้น: 5 ขั้นตอน

วีดีโอ: การใช้งานเซนเซอร์ท่าทางสัมผัส APDS9960 แบบไม่ปิดกั้น: 5 ขั้นตอน

วีดีโอ: การใช้งานเซนเซอร์ท่าทางสัมผัส APDS9960 แบบไม่ปิดกั้น: 5 ขั้นตอน
วีดีโอ: Raspberry Pi Zero (W) MQTT Setup Without Monitor/Keyboard | Reyax RYC1001 Demo 2024, พฤศจิกายน
Anonim
การใช้งานเซ็นเซอร์ท่าทางสัมผัส APDS9960 แบบไม่ปิดกั้น
การใช้งานเซ็นเซอร์ท่าทางสัมผัส APDS9960 แบบไม่ปิดกั้น
การใช้งานเซ็นเซอร์ท่าทางสัมผัส APDS9960 แบบไม่ปิดกั้น
การใช้งานเซ็นเซอร์ท่าทางสัมผัส APDS9960 แบบไม่ปิดกั้น
การใช้งานเซ็นเซอร์ท่าทางสัมผัส APDS9960 แบบไม่ปิดกั้น
การใช้งานเซ็นเซอร์ท่าทางสัมผัส APDS9960 แบบไม่ปิดกั้น

คำนำ

คำแนะนำนี้มีรายละเอียดเกี่ยวกับวิธีการสร้างการใช้งานเซ็นเซอร์ท่าทางสัมผัส APDS9960 แบบไม่ปิดกั้นโดยใช้ SparkFun_APDS-9960_Sensor_Arduino_Library

บทนำ

ดังนั้นคุณอาจถามตัวเองว่าอะไรคือสิ่งที่ไม่ปิดกั้น? หรือแม้แต่การปิดกั้นในเรื่องนั้น?

ที่สำคัญกว่านั้นทำไมการมีสิ่งที่ไม่ปิดกั้นจึงสำคัญ?

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

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

เหตุใดจึงสำคัญ

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

ในส่วนของฉัน ฉันต้องการสร้าง MQTT ผ่านอุปกรณ์เดสก์ท็อป IoT ที่รองรับ WiFi ซึ่งอ่านค่าอุณหภูมิ/ความชื้นในเครื่องและระยะไกล ระดับแสงโดยรอบ ความกดอากาศ ติดตามเวลา แสดงพารามิเตอร์ทั้งหมดเหล่านี้บน LCD บันทึกไปยัง uSD การ์ดแบบเรียลไทม์ อ่านอินพุตของปุ่ม เขียนไปยัง LED เอาต์พุต และตรวจสอบท่าทางสัมผัสเพื่อควบคุมสิ่งต่างๆ ในโครงสร้างพื้นฐาน IoT ของฉัน และทั้งหมดนั้นจะถูกควบคุมโดย ESP8266-12

น่าเสียดายที่ไลบรารี APDS9960 เพียงสองแหล่งเท่านั้นที่ฉันพบได้คือไลบรารี SparkFun และ AdaFruit ซึ่งทั้งคู่คัดลอกมาจากโค้ดแอปพลิเคชันจาก Avago (ผู้ผลิต ADPS9960) และมีการเรียกชื่อ 'readGesture' ซึ่งมีในขณะที่(1){}; วนซ้ำซึ่งเมื่อใช้ในโครงการข้างต้นจะทำให้ ESP8266-12E รีเซ็ตเมื่อใดก็ตามที่เซ็นเซอร์ ADPS9960 อิ่มตัว (เช่น เมื่อวัตถุอยู่ใกล้ ๆ หรือมีแหล่งกำเนิด IR อื่นที่ส่องสว่างเซ็นเซอร์)

ด้วยเหตุนี้ เพื่อแก้ไขพฤติกรรมนี้ ฉันจึงเลือกที่จะย้ายการประมวลผลของ Gestures ไปยังโปรเซสเซอร์ตัวที่สอง โดยที่ ESP8266-12E กลายเป็นไมโครคอนโทรลเลอร์หลัก และระบบนี้เป็นสเลฟ ดังที่แสดงในภาพ 1 & 2 ด้านบน ภาพรวมระบบ และไดอะแกรมองค์ประกอบของระบบตามลำดับ. รูปที่ 3 แสดงวงจรต้นแบบ

เพื่อจำกัดการเปลี่ยนแปลงที่ฉันต้องทำในโค้ดที่มีอยู่ ฉันยังเขียนคลาส/ไลบรารีแรปเปอร์ในจินตนาการที่ชื่อว่า 'APDS9960_NonBlocking'

ต่อไปนี้เป็นคำอธิบายโดยละเอียดของโซลูชันที่ไม่บล็อก

ฉันต้องการชิ้นส่วนอะไร?

หากคุณต้องการสร้างโซลูชัน I2C ซึ่งใช้งานได้กับไลบรารี APDS9960_NonBlocking คุณจะต้องใช้ส่วนต่างๆ ต่อไปนี้

  1. 1 ส่วนลด ATMega328P ที่นี่
  2. PCF8574P 1 เครื่องที่นี่
  3. ลด 6 ตัวต้านทาน 10K ที่นี่
  4. 4 จากตัวต้านทาน 1K ที่นี่
  5. 1 ปิด 1N914 Diode ที่นี่
  6. 1 ปิด PN2222 ทรานซิสเตอร์ NPN ที่นี่
  7. 1 จากคริสตัล 16MHz ที่นี่
  8. 2 ปิดตัวเก็บประจุ 0.1uF ที่นี่
  9. 1 ปิด 1000uF ตัวเก็บประจุด้วยไฟฟ้าที่นี่
  10. 1 ปิด 10uF ตัวเก็บประจุด้วยไฟฟ้าที่นี่
  11. 2 ปิดตัวเก็บประจุ 22pF ที่นี่

หากคุณต้องการอ่านเอาต์พุตของเซ็นเซอร์ท่าทางสัมผัสผ่านอินเทอร์เฟซแบบขนาน คุณสามารถวาง PCF8574P และตัวต้านทาน 10K สามตัวออกได้

ฉันต้องการซอฟต์แวร์อะไร

Arduino IDE 1.6.9

ฉันต้องการทักษะอะไร?

ในการตั้งค่าระบบ ให้ใช้ซอร์สโค้ด (ที่ให้มา) และสร้างวงจรที่จำเป็น คุณจะต้องมีสิ่งต่อไปนี้

  • เข้าใจอุปกรณ์อิเล็กทรอนิกส์เพียงเล็กน้อย
  • ความรู้เกี่ยวกับ Arduino และ IDE
  • ความเข้าใจเกี่ยวกับวิธีการตั้งโปรแกรม Arduino แบบฝัง (ดูคำแนะนำ 'การเขียนโปรแกรม ATTiny85, ATTiny84 และ ATMega328P: Arduino As ISP')
  • อดทนบ้าง.

หัวข้อที่ครอบคลุม

  • ภาพรวมโดยย่อของวงจร
  • ภาพรวมโดยย่อของซอฟต์แวร์
  • การทดสอบอุปกรณ์ตรวจจับท่าทางสัมผัส APDS9960
  • บทสรุป
  • อ้างอิง

ขั้นตอนที่ 1: ภาพรวมวงจร

ภาพรวมวงจร
ภาพรวมวงจร

วงจรแบ่งออกเป็นสองส่วน

  • อย่างแรกคือ I2C แบบอนุกรมเป็นการแปลงแบบขนานที่ทำได้โดยใช้ตัวต้านทาน R8…10 และ IC1 ที่นี่ R8…R10 ตั้งค่าที่อยู่ I2C สำหรับชิปตัวขยาย I/O 8 บิต IC1 และ NXP PCF8574A ช่วงที่อยู่ที่ถูกต้องสำหรับอุปกรณ์นี้คือ 0x38 … 0x3F ตามลำดับ ในตัวอย่างซอฟต์แวร์ I2C ที่ระบุ 'I2C_APDS9960_TEST.ino' '#define GESTURE_SENSOR_I2C_ADDRESS' จะต้องมีการเปลี่ยนแปลงเพื่อให้เหมาะกับช่วงที่อยู่นี้
  • ส่วนประกอบอื่น ๆ ทั้งหมดเป็นทาสที่ฝัง Arduino Uno และมีฟังก์ชันดังต่อไปนี้

    • R1, T1, R2 และ D1 ให้อินพุตรีเซ็ตอุปกรณ์รอง ที่นี่พัลส์สูงที่ทำงานอยู่บน IC1 - P7 จะบังคับให้ U1 รีเซ็ต
    • R3, R4 เป็นตัวต้านทานจำกัดกระแสสำหรับอุปกรณ์ฝังตัวที่เขียนโปรแกรมสาย TX/RX
    • C5 และ R7 อนุญาตให้ Arduino IDE ตั้งโปรแกรม U1 โดยอัตโนมัติผ่านพัลส์บนสาย DTR ของอุปกรณ์ FTDI ที่ต่ออยู่
    • R5 และ R6 เป็นตัวต้านทานแบบดึงขึ้น I2C สำหรับ APDS9960 พร้อม C6 ที่ให้การแยกรางจ่ายไฟในท้องถิ่น
    • U1, C1, C2 และ Q1 สร้าง Arduino Uno แบบฝังและเป็นนาฬิกาตามลำดับ
    • สุดท้าย C3 และ C4 ให้การแยกรางจ่ายไฟในพื้นที่สำหรับ U1

ขั้นตอนที่ 2: ภาพรวมซอฟต์แวร์

ภาพรวมซอฟต์แวร์
ภาพรวมซอฟต์แวร์
ภาพรวมซอฟต์แวร์
ภาพรวมซอฟต์แวร์
ภาพรวมซอฟต์แวร์
ภาพรวมซอฟต์แวร์

คำนำ

ในการรวบรวมซอร์สโค้ดนี้ให้สำเร็จ คุณจะต้องมีไลบรารีเพิ่มเติมต่อไปนี้เพื่อตั้งโปรแกรม Arduino Uno U1 ที่ฝังไว้

SparkFun_APDS9960.h

  • โดย: Steve Quinn
  • วัตถุประสงค์: นี่เป็นเวอร์ชันแยกของเซ็นเซอร์ SparkFun APDS9960 ที่แยกจาก jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library มีการดัดแปลงเล็กน้อยเพื่อช่วยในการแก้ปัญหาและมีตัวตรวจจับที่ไม่รู้สึกไวเพื่อลดการกระตุ้นที่หลอกลวง
  • จาก:

APDS9960_NonBlocking.h

  • โดย: Steve Quinn
  • วัตถุประสงค์: จัดเตรียมอินเทอร์เฟซที่สะอาดเพื่อฝังการใช้งานเซ็นเซอร์ท่าทางสัมผัส APDS9960 แบบไม่ปิดกั้นลงในโค้ด Arduino ของคุณ
  • จาก:

ดูคำแนะนำต่อไปนี้เกี่ยวกับวิธีการตั้งโปรแกรมไมโครคอนโทรลเลอร์ Arduino Uno (ATMega328P) แบบฝัง หากคุณไม่คุ้นเคยกับวิธีการบรรลุเป้าหมายนี้

การเขียนโปรแกรม ATTINY85, ATTINY84 และ ATMEGA328P: ARDUINO AS ISP

ภาพรวมการทำงาน

ไมโครคอนโทรลเลอร์ทาสที่ฝังตัว ATMega328P จะสำรวจบรรทัด INT จาก ADPS9960 เมื่อบรรทัดนี้เหลือน้อย ไมโครคอนโทรลเลอร์จะอ่านการลงทะเบียน ADPS9960 และพิจารณาว่ามีการตรวจจับท่าทางที่ถูกต้องหรือไม่ หากตรวจพบท่าทางที่ถูกต้อง โค้ดสำหรับท่าทางสัมผัส 0x0…0x6, 0xF จะถูกวางบนพอร์ต B และ 'nGestureAvailable' จะถูกยืนยันในระดับต่ำ

เมื่ออุปกรณ์หลักเห็นว่า 'nGestureAvailable' ทำงานอยู่ อุปกรณ์จะอ่านค่าบนพอร์ต B จากนั้นจึงกะพริบ 'nGestureClear' ต่ำชั่วคราวเพื่อรับทราบการรับข้อมูล

จากนั้นอุปกรณ์ทาสจะยกเลิกการยืนยัน 'nGestureAvailable' สูงและล้างข้อมูลในพอร์ต B รูปที่ 5 ด้านบนแสดงการดึงหน้าจอที่นำมาจากตัววิเคราะห์ลอจิกระหว่างรอบการตรวจจับ/อ่านแบบเต็ม

ภาพรวมรหัส

Pic 1 ด้านบนให้รายละเอียดว่าซอฟต์แวร์ใน U1 ทำงานอย่างไรกับ Arduino Uno ทาสที่ฝังตัวพร้อมกับ Pic 2 ว่างานพื้นหลัง / เบื้องหน้าทั้งสองมีปฏิสัมพันธ์กันอย่างไร Pic 3 เป็นส่วนรหัสที่สรุปวิธีใช้ APDS9960_NonBlockinglibrary Pic 4 ให้การจับคู่ระหว่าง Arduino Uno Digital Pins และพินฮาร์ดแวร์จริงบน ATMega328P

หลังจากรีเซ็ตไมโครคอนโทรลเลอร์ทาสที่ฝังไว้จะเริ่มต้น APDS9960 ซึ่งอนุญาตให้ตรวจจับท่าทางเพื่อทริกเกอร์เอาต์พุต INT และกำหนดค่าเป็น I/O โดยแนบรูทีนบริการขัดจังหวะ (ISR) 'GESTURE_CLEAR ()' เพื่อขัดจังหวะเวกเตอร์ INT0 (พินดิจิตอล 2, ฮาร์ดแวร์ IC พิน 4) กำหนดค่าสำหรับทริกเกอร์ขอบตก รูปแบบนี้เป็นอินพุต nGestureClear จากอุปกรณ์หลัก

พินเอาต์พุตขัดจังหวะ 'INT' จาก APDS9960 เชื่อมต่อกับ Digital Pin 4, Hardware IC Pin 6 ซึ่งกำหนดค่าเป็นอินพุตไปยัง U1

สายสัญญาณ 'nGestureAvailable' บนพินดิจิตอล 7, พิน IC ฮาร์ดแวร์ 13 ได้รับการกำหนดค่าเป็นเอาต์พุตและตั้งค่าสูง ไม่ทำงาน (ไม่ยืนยัน)

สุดท้าย Port B บิต 0…3 ตามลำดับได้รับการกำหนดค่าเป็นเอาต์พุตและตั้งค่าต่ำ สิ่งเหล่านี้เป็นข้อมูลแทะซึ่งแสดงถึงประเภทท่าทางสัมผัสต่างๆ ที่ตรวจพบ ไม่มี = 0x0, ข้อผิดพลาด = 0xF, ขึ้น = 0x1, ลง = 0x2, ซ้าย = 0x3, ขวา = 0x4, ใกล้ = 0x5 และ Far = 0x6

งานพื้นหลัง 'Loop' มีกำหนดการซึ่งจะสำรวจ INT เอาต์พุตขัดจังหวะ APDS9960 อย่างต่อเนื่องผ่านการอ่าน Digital Pin 4 เมื่อเอาต์พุต INT จาก APDS9960 ทำงานต่ำแสดงว่าเซ็นเซอร์ถูกทริกเกอร์ ไมโครคอนโทรลเลอร์พยายามตีความท่าทางใด ๆ โดยการเรียก 'readGesture ()' ด้วยในขณะที่ (1) {}; วงไม่มีที่สิ้นสุด

หากตรวจพบท่าทางที่ถูกต้อง ค่านี้จะถูกเขียนไปยังพอร์ต B เอาต์พุต 'nGestureAvailable' จะถูกยืนยันและตั้งค่าสัญญาณบูลีน 'bGestureAvailable' เพื่อป้องกันไม่ให้มีการบันทึกท่าทางสัมผัสเพิ่มเติม

เมื่อต้นแบบตรวจพบเอาต์พุต 'nGestureAvailable' ที่ใช้งานอยู่ ค่าใหม่นี้จะอ่านค่าและพัลส์ 'nGestureClear' ที่ทำงานต่ำ ขอบที่ตกลงมานี้จะทริกเกอร์งานเบื้องหน้า 'ISR GESTURE_CLEAR()' เพื่อจัดกำหนดการระงับการดำเนินการของงานเบื้องหลัง 'Loop' การล้างพอร์ต B สัญญาณ 'bGestureAvailable' และเอาต์พุต 'nGestureAvailable'

งานเบื้องหน้า 'GESTURE_CLEAR()' ถูกระงับ และงานเบื้องหลัง 'Loop' ถูกจัดกำหนดการใหม่ ขณะนี้สามารถสัมผัสท่าทางเพิ่มเติมจาก APDS9960 ได้แล้ว

โดยการใช้อินเตอร์รัปต์ทริกเกอร์งานเบื้องหน้า/พื้นหลังในลักษณะนี้ ลูปอนันต์ที่อาจเกิดขึ้นใน 'readGesture()' ของอุปกรณ์สเลฟจะไม่ส่งผลกระทบต่ออุปกรณ์หลักจากการทำงานและจะไม่ขัดขวางการทำงานของอุปกรณ์สเลฟเช่นกัน นี่เป็นพื้นฐานของระบบปฏิบัติการแบบเรียลไทม์ (RTOS) ที่ง่ายมาก

หมายเหตุ: คำนำหน้า 'n' หมายถึงแอ็คทีฟต่ำหรือถูกยืนยันเช่นเดียวกับใน 'nGestureAvailable'

ขั้นตอนที่ 3: การทดสอบอุปกรณ์ตรวจจับท่าทางสัมผัส APDS9960 แบบไม่ปิดกั้น

การทดสอบ NonBlocking APDS9960 Gesture Sensing Device
การทดสอบ NonBlocking APDS9960 Gesture Sensing Device
การทดสอบ NonBlocking APDS9960 Gesture Sensing Device
การทดสอบ NonBlocking APDS9960 Gesture Sensing Device
การทดสอบ NonBlocking APDS9960 Gesture Sensing Device
การทดสอบ NonBlocking APDS9960 Gesture Sensing Device
การทดสอบ NonBlocking APDS9960 Gesture Sensing Device
การทดสอบ NonBlocking APDS9960 Gesture Sensing Device

คำนำ

แม้ว่าโมดูล APDS9960 จะมาพร้อมกับ +5v แต่จะใช้ตัวควบคุมออนบอร์ด +3v3 ซึ่งหมายความว่าสาย I2C นั้นสอดคล้องกับ +3v3 และไม่ใช่ +5v นี่คือเหตุผลที่ฉันเลือกใช้ Arduino Due ที่สอดคล้องกับ +3v3 เป็นตัวควบคุมไมโครทดสอบ เพื่อขจัดความจำเป็นในการเปลี่ยนระดับ

อย่างไรก็ตาม หากคุณต้องการใช้ Arduino Uno จริง คุณจะต้องเลื่อนระดับเส้น I2C เป็น U1 ดูคำแนะนำต่อไปนี้ซึ่งฉันได้แนบชุดสไลด์ที่มีประโยชน์ (I2C_LCD_With_Arduino) ซึ่งให้คำแนะนำที่เป็นประโยชน์มากมายเกี่ยวกับการใช้ I2C

การทดสอบอินเทอร์เฟซ I2C

ภาพที่ 1 และ 2 ด้านบนแสดงวิธีการตั้งค่าและโปรแกรมระบบสำหรับอินเทอร์เฟซ I2C คุณจะต้องดาวน์โหลดและติดตั้งไลบรารี APDS9960_NonBlocking ก่อน ที่นี่

การทดสอบอินเทอร์เฟซแบบขนาน

ภาพ 3 และ 4 มีรายละเอียดเหมือนกันสำหรับอินเทอร์เฟซแบบขนาน

ขั้นตอนที่ 4: บทสรุป

บทสรุป
บทสรุป

ทั่วไป

รหัสทำงานได้ดีและตรวจจับท่าทางตอบสนองโดยไม่มีผลบวกปลอม มันใช้งานได้สองสามสัปดาห์แล้วในฐานะอุปกรณ์ทาสในโครงการต่อไปของฉัน ฉันได้ลองใช้โหมดความล้มเหลวที่แตกต่างกันมากมาย (และมี moggie ในครัวเรือนของ Quinn ที่อยากรู้อยากเห็น) ซึ่งก่อนหน้านี้ส่งผลให้มีการรีเซ็ต ESP8266-12 โดยไม่มีผลเสีย

การปรับปรุงที่เป็นไปได้

  • ที่ชัดเจน. เขียนไลบรารี APDS9960 Gesture Sensor ใหม่อีกครั้งเพื่อไม่ให้บล็อก

    ที่จริงแล้ว ฉันได้ติดต่อ Broadcom ซึ่งส่งฉันไปยังตัวแทนจำหน่ายในพื้นที่ซึ่งเพิกเฉยต่อคำขอการสนับสนุนของฉันโดยทันที ฉันไม่ใช่ SparkFun หรือ AdaFruit ฉันเดา อย่างนี้คงต้องรออีกซักพัก

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

ขั้นตอนที่ 5: การอ้างอิง

จำเป็นสำหรับโปรแกรม Arduino ฝังตัว (ATMega328P - U1)

SparkFun_APDS9960.h

  • โดย: Steve Quinn
  • วัตถุประสงค์: นี่เป็นเวอร์ชันแยกของเซ็นเซอร์ SparkFun APDS9960 ที่แยกจาก jonn26/SparkFun_APDS-9960_Sensor_Arduino_Library มีการดัดแปลงเล็กน้อยเพื่อช่วยในการแก้ปัญหาและมีตัวตรวจจับที่ไม่รู้สึกไวเพื่อลดการกระตุ้นที่หลอกลวง
  • จาก:

จำเป็นต้องฝังฟังก์ชันที่ไม่บล็อกนี้ลงในโค้ด Arduino ของคุณและให้ตัวอย่างการทำงาน

APDS9960_NonBlocking.h

  • โดย: Steve Quinn
  • วัตถุประสงค์: จัดเตรียมอินเทอร์เฟซที่สะอาดเพื่อฝังการใช้งาน APDS9960 Gesture Sensor ที่ไม่ปิดกั้นนี้ในโค้ด Arduino ของคุณ
  • จาก:

ระบบปฏิบัติการตามเวลาจริง

https://en.wikipedia.org/wiki/Real-time_operating_system

APDS9960 เอกสารข้อมูลสินค้า

https://cdn.sparkfun.com/assets/learn_tutorials/3/2/1/Avago-APDS-9960-datasheet.pdf

เอกสารข้อมูล PCF8574A

แนะนำ: