สารบัญ:

DS1803 โพเทนชิโอมิเตอร์แบบดิจิตอลคู่พร้อม Arduino: 5 ขั้นตอน
DS1803 โพเทนชิโอมิเตอร์แบบดิจิตอลคู่พร้อม Arduino: 5 ขั้นตอน

วีดีโอ: DS1803 โพเทนชิโอมิเตอร์แบบดิจิตอลคู่พร้อม Arduino: 5 ขั้นตอน

วีดีโอ: DS1803 โพเทนชิโอมิเตอร์แบบดิจิตอลคู่พร้อม Arduino: 5 ขั้นตอน
วีดีโอ: DFT_#A92 DOUBLE POTENTIOMETRE NUMERIQUE - I2C - DS1803 - ATTINY85 2024, กรกฎาคม
Anonim
DS1803 โพเทนชิโอมิเตอร์แบบดิจิตอลคู่พร้อม Arduino
DS1803 โพเทนชิโอมิเตอร์แบบดิจิตอลคู่พร้อม Arduino

ฉันชอบที่จะแบ่งปันการใช้มิเตอร์ดิจิตอล DS1803 กับ Arduino IC นี้ประกอบด้วยมิเตอร์ดิจิตอลสองตัวซึ่งสามารถควบคุมได้ผ่านอินเทอร์เฟซแบบสองสาย สำหรับสิ่งนี้ ฉันใช้ไลบรารี wire.h

IC นี้สามารถแทนที่พอตมิเตอร์แบบแอนะล็อกปกติได้ ด้วยวิธีนี้ คุณจะสามารถควบคุมได้ เช่น แอมพลิฟายเออร์หรือพาวเวอร์ซัพพลาย

ในคำแนะนำนี้ฉันควบคุมความสว่างของ LED สองดวงเพื่อแสดงการทำงาน

Arduino นับพัลส์ของตัวเข้ารหัสแบบหมุนและใส่ค่าลงใน pot[0] และ pot[1] แบบแปรผัน เมื่อคุณกดสวิตช์บนตัวเข้ารหัส คุณสามารถสลับระหว่าง pot[0] และ pot[1]

มูลค่าที่แท้จริงของหม้อจะอ่านกลับมาจาก DS1803 และใส่ไว้ในตัวแปร potValue[0] และ potValue[1] ที่ปรับเปลี่ยนได้ และแสดงบนจอ LCD

ขั้นตอนที่ 1: การเชื่อมต่อของ DS1803

การเชื่อมต่อของ DS1803
การเชื่อมต่อของ DS1803

คุณสามารถดูการเชื่อมต่อของ DS1803 ได้ที่นี่ H คือด้านสูงของโพเทนชิออมิเตอร์ L ด้านต่ำและ W ที่ปัดน้ำฝน SCL และ SDA เป็นการเชื่อมต่อบัส

ด้วยการเชื่อมต่อ A0, A1 และ A2 คุณสามารถให้ DS1803 เป็นที่อยู่ของตัวเองได้ ด้วยวิธีนี้ คุณจะสามารถควบคุมอุปกรณ์ต่างๆ ได้มากขึ้นผ่านบัสเดียว ในตัวอย่างของฉัน ฉันได้ให้ที่อยู่ DS1803 0 โดยเชื่อมต่อหมุดทั้งหมดกับพื้น

ขั้นตอนที่ 2: คำสั่ง Byte

คำสั่งไบต์
คำสั่งไบต์

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

ขั้นตอนที่ 3: การควบคุม DS1803

การควบคุม DS1803
การควบคุม DS1803

ไบต์ควบคุม (รูปที่ 3) มีตัวระบุอุปกรณ์ ซึ่งจะยังคงเหมือนเดิมเสมอ ในตัวอย่างของฉัน A0, A1 และ A2 เป็น 0 เพราะเราเลือกที่อยู่โดยวางหมุด A ทั้งหมดลงบนพื้น R/W บิตสุดท้ายจะถูกตั้งค่าเป็น 0 หรือ 1 โดยคำสั่ง "Wire.beginTransmission" และ "Wire.requestFrom" ใน Arduino ในรูปที่ 5 คุณสามารถดูโทรเลขทั้งหมดได้ โทรเลขอ่านจะแสดงใน รูปที่ 4

ขั้นตอนที่ 4: ตั้งค่า

ติดตั้ง
ติดตั้ง

วงจรนี้แสดงวิธีเชื่อมต่อทุกอย่าง จอ LCD ของ Nokia สามารถใช้ได้กับการเชื่อมต่อที่แตกต่างกัน ตรวจสอบให้แน่ใจว่าคุณเชื่อมต่อถูกต้อง นอกจากนี้โรตารี่เอ็นโค้ดเดอร์รุ่นต่างๆ ของเขา บางรุ่นมีทั่วไปที่พินกลางบางรุ่นไม่มี ฉันได้ใส่เครือข่ายตัวกรองเล็ก ๆ (ตัวต้านทาน 470 โอห์มพร้อมฝา 100nF) เพื่อกรองสัญญาณเอาต์พุต A และ B ของตัวเข้ารหัส ฉันต้องการตัวกรองนี้เนื่องจากเอาต์พุตมีเสียงรบกวนมาก ฉันยังใส่ตัวจับเวลาดีบาวซ์ในโปรแกรมของฉันเพื่อตัดเสียงรบกวน สำหรับส่วนที่เหลือฉันคิดว่าวงจรนั้นชัดเจน สามารถสั่งซื้อ LCD ได้ทาง Adafruit

ขั้นตอนที่ 5: โปรแกรม

สำหรับการใช้งานบัสแบบ 2 สาย ฉันได้รวมไลบรารี Wire.h ไว้ด้วย ในการใช้ LCD ฉันได้รวมไลบรารี Adafruit ซึ่งคุณสามารถดาวน์โหลดได้จาก https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library นอกจากนี้ ห้องสมุด Adafruit_GFX.h ก็มีให้ที่นี่ https://github com/adafruit/Adafruit-GFX-Library.

#รวม

#รวม

#รวม

Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);

คุณสามารถดูตัวแปรทั้งหมดได้ที่นี่ ควบคุมไบต์และคำสั่งไบต์ตามที่อธิบายไว้ก่อนหน้านี้ deBounceTime สามารถปรับได้ขึ้นอยู่กับเสียงรบกวนของตัวเข้ารหัสของคุณ

หม้อไบต์[2] = {1, 1};ไบต์ controlByte = B0101000; // 7 บิต, ไบต์ commandByte = B10101001; // 2 บิตสุดท้ายคือการเลือก potmeter ไบต์ potValue[2]; int ผม = 0; int deBounceTime = 10; // ปรับค่านี้ขึ้นอยู่กับสัญญาณรบกวน const int encoder_A = 8; const int encoder_B = 9; const int buttonPin = 2; newDebounceTime แบบยาวที่ไม่ได้ลงชื่อ = 0; oldTime ยาวที่ไม่ได้ลงชื่อ; บูลีนกด = 0; จำนวนบูลีน = 1;

ในการตั้งค่า ฉันกำหนดพินที่ถูกต้องและใส่ข้อความคงที่บน LCD

การตั้งค่าเป็นโมฆะ () { Wire.begin (); Serial.begin(9600); pinMode(encoder_A, INPUT); pinMode(encoder_B, INPUT); pinMode (ปุ่มพิน, อินพุต); newDebounceTime = มิลลิวินาที ();

display.begin();

display.setContrast(50); display.clearDisplay(); display.setTextSize(1); display.setTextColor (สีดำ); display.setCursor(0, 10); display.println("POT 1="); display.setCursor(0, 22); display.println("หม้อ 2="); display.display();

}

ในลูปฉันตรวจสอบก่อนว่าช่วงเวลานั้นมากกว่า 500ms หรือไม่ ถ้าใช่ LCD จะได้รับการอัปเดต ถ้าไม่ใช่ปุ่มบนตัวเข้ารหัสจะถูกตรวจสอบ หากกด toggleBuffer จะถูกเรียก หลังจากนี้ ตัวเข้ารหัสจะถูกตรวจสอบ หากอินพุต 0 ต่ำ (ตรวจพบการหมุน) ฉันจะตรวจสอบอินพุต B หากอินพุต B เป็น 0 ฉันเพิ่มหม้อ ส่วนอื่นๆ ฉันจะลดค่าลง หลังจากนี้ค่าจะถูกส่งไปยัง DS1803 ผ่าน wire.write

วงเป็นโมฆะ () {

ช่วงเวลา ();

if(digitalRead(buttonPin)== 1 && (กด == 0)){toggleBuffer();} if(digitalRead(buttonPin)== 0){pressed = 0;}

if (digitalRead(encoder_A) == 0 && count == 0 && (millis() - newDebounceTime > deBounceTime)){ if (digitalRead(encoder_B) == 0){ pot++; if(pot > 25){pot = 25;} }อื่น{ pot--; if(pot < 1){pot = 1;} } จำนวน = 1; newDebounceTime = มิลลิวินาที ();

Wire.beginการส่ง(controlByte); // เริ่มส่งสัญญาณ

Wire.write (คำสั่งไบต์); // การเลือก potmeters Wire.write(pot[0] * 10); // ส่งข้อมูล potmeter ไบต์ที่ 1 Wire.write(pot[1] * 10); // ส่งข้อมูลพอตมิเตอร์ไบต์ที่ 2 Wire.endTransmission(); // หยุดส่ง }else if (digitalRead(encoder_A) == 1 && digitalRead(encoder_B) == 1 && count == 1 && (millis() - newDebounceTime > deBounceTime)){ count = 0; newDebounceTime = มิลลิวินาที (); } }

ถือเป็นโมฆะ toggleBuffer(){ กด = 1; ถ้า (i == 0){i = 1;}อื่น{i = 0;} }

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

เป็นโมฆะ writeToLCD () { Wire.requestFrom (controlByte, 2); potValue[0] = Wire.read(); // อ่าน potValue ไบต์แรก potValue[1] = Wire.read(); // อ่าน potmeter ไบต์ที่สอง display.fillRect(40, 0, 40, 45, WHITE); // ล้างหน้าจอตัวแปรบน LCD display.setCursor(40, 10); display.print(potValue[0]); // เขียนค่า potmeter ที่ 1 ไปที่ LCD display.setCursor(40, 22); display.print(potValue [1]); // เขียนค่า potmeter ที่ 2 ไปที่ LCD display.setCursor(60, (10 + i * 12)); display.print("<"); display.display(); }

ช่วงเวลาเป็นโมฆะ () {// ตัวจับเวลาช่วงเวลาในการเขียนข้อมูลไปยัง LCD ถ้า ((มิลลิวินาที () - oldTime)> 500) {writeToLCD (); oldTime = มิลลิวินาที (); } }

แนะนำ: