สถานะปุ่มเปลี่ยนแบบสุ่ม


14

ฉันมีปุ่มกดสายไปยัง Arduino ของฉัน แต่ดูเหมือนว่าจะเรียกแบบสุ่ม

ฉันมีหนึ่งปุ่มของพินที่เชื่อมต่อกับพิน 2 บนอาร์ดิโนและอีกอันหนึ่งเชื่อมต่อกับกราวด์

void setup() {
    Serial.begin(9600);

    pinMode(2, INPUT);
}

void loop() {
    Serial.println(digitalRead(2));
}

ฉันคาดว่ามันจะพิมพ์ 1 อย่างต่อเนื่องและไปที่ 0 เมื่อฉันกดปุ่มลง แต่บางครั้งมันก็แสดง 0 แม้ว่าฉันจะไม่ได้แตะก็ตาม

คำตอบ:


17

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

ตัวต้านทานดึงขึ้น

เราจำเป็นต้องรวมสิ่งที่เรียกว่าตัวต้านทาน "pull-up" เพื่อดึงสัญญาณขึ้นสู่ลอจิก 1 เมื่อไม่ได้กดปุ่ม

ดึงตัวต้านทานขึ้น

ภาพจาก Sparkfun

สิ่งนี้หมายความว่าเมื่อไม่กดปุ่ม Arduino จะอ่านลอจิก 1 เมื่อกดปุ่มกระแสจะไหลผ่านตัวต้านทานไปยังกราวด์และ Arduino จะอ่านลอจิก 0

ตัวต้านทานแบบดึงขึ้นภายใน

Arduino ยังมีตัวต้านทานแบบดึงขึ้นภายในดังนั้นคุณไม่จำเป็นต้องเพิ่มส่วนประกอบพิเศษในวงจรของคุณ มีสองวิธีในการใช้สิ่งนี้

คุณเคยต้องทำเช่นนี้:

pinMode(pin, INPUT);           // set pin to input
digitalWrite(pin, HIGH);       // turn on pullup resistors

ตอนนี้เราสามารถทำได้ง่ายๆในหนึ่งบรรทัด:

pinMode(pin, INPUT_PULLUP);

สิ่งนี้จะช่วยให้ตัวต้านทานดึงขึ้น 20k บนพินนั้น อินพุตจะไม่ลอยเมื่อไม่ได้กดปุ่ม

หมายเหตุ:ใช้งานได้เฉพาะเมื่อปลายอีกด้านเชื่อมต่อกับกราวด์


1
เป็นที่น่าสังเกตว่าแนวคิดแบบเดียวกันนี้ใช้ได้กับตัวต้านทานแบบดึงลงเช่นกัน เช่นตัวต้านทานปกติจะดึงพินต่ำ แต่การกดปุ่มจะทำให้มันสูง เห็นได้ชัดว่ามันต้องเป็นภายนอกเพราะไม่มีการดึงลงภายในสำหรับ Arduinos มาตรฐาน
Peter Bloomfield
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.