Làm thế nào để lặp qua các chân tương tự?


8

Tôi muốn làm một cái gì đó dọc theo dòng

for (int i = 0; i < 4; i++) {
  analogRead(i);
}

Mà xuất hiện để làm việc, nhưng sau đây không:

for (int i = 0; i < 4; i++) {
  pinMode(i, INPUT);
  pinMode(i + 4, OUTPUT); // should make Analog Pin (i + 4) into an output
  digitalWrite(i + 4, LOW);
  analogRead(i);
}

Thay vào đó, nó xuất hiện để coi chân được xử lý bằng digitalWrite(i + 4, LOW);một trong các chân kỹ thuật số.

Tôi có thực sự phải chỉ định rõ ràng A0, A1, A2, ... bất cứ khi nào tôi muốn lặp qua các chân tương tự không?


Đồng hồ Thụy Sĩ của BrettAM có vẻ rất hợp lý với tôi bởi vì nó chỉ thất bại trong trường hợp ánh xạ không liên tục, theo hiểu biết tốt nhất của tôi, vẫn là một mối quan tâm giả định hoàn toàn. Điều mà câu trả lời của BrettAM làm tốt nhất là làm rõ điểm nổi bật rằng A0 chỉ là hằng số được xác định trước cùng loại (số nguyên không dấu 8 bit) như bất kỳ nghĩa đen nào bạn có thể sử dụng một cách hợp lý trong vòng lặp đó. A0 chỉ là một con số. Số chính xác là bao nhiêu? Chà, điều đó phụ thuộc, và hơn nữa, không quan trọng lắm. Nhưng những gì bạn có thể tin tưởng là nó một con số và bạn có thể tự do sử dụng nó như vậy.

Xin lỗi để phục hồi chủ đề này nhưng tôi muốn lưu ý những ưu và nhược điểm của các câu trả lời được cung cấp ở trên .. hầm ngầm hạt nhân của Craig là chống đạn nhiều nhất; nó sẽ hoạt động ngay cả khi có các ánh xạ không liên tục. Máy bay giấy của Geometrikal là loại chống đạn ít nhất vì số ma thuật của anh ta / cô ta sẽ thất bại ngay khi bạn chuyển sang một bảng khác (vì không có giả thuyết nào về việc ánh xạ khác nhau giữa các bảng). Bây giờ, công bằng mà nói, họ nói rõ rằng họ đang đưa ra "một cách viết khác cho câu trả lời của BrettAM" và do đó có lẽ họ không đưa ra một khuyến nghị nghiêm túc nào cả.

Tôi thích mô tả thơ của bạn về các câu trả lời khác nhau! Các phép ẩn dụ là thích hợp - nhưng bạn có thể muốn đặt chúng trong ngoặc kép cho những người đọc tiếng Anh không phải là người bản xứ của chúng tôi, để làm nổi bật bạn là một kẻ cường điệu nhỏ: "hầm ngầm hạt nhân", "máy bay giấy", v.v.
John Burger

Câu trả lời:


11

Có, các chân tương tự phải được xử lý bằng A0, A1, ... khi sử dụng chúng cho I / O kỹ thuật số.

Tùy thuộc vào bảng bạn đang sử dụng A0, A1, v.v. được ánh xạ tới các giá trị khác nhau (ví dụ, có vẻ như A0 là 18 trên một số bảng nhưng 14 trên các bảng khác.

Một giải pháp cho việc lặp qua các chân tương tự sẽ là:

static const uint8_t analog_pins[] = {A0,A1,A2,A3,A4};
// Setup pins for input
for (int i = 0; i < 5; i++) { //or i <= 4
  digitalRead(analog_pins[i]);
}

Nếu bạn chỉ sử dụng các chân tương tự với analogRead()cuộc gọi, bạn có thể sử dụng 0,1, ... thay vì A0, A1, ...


4
Theo arduino.cc/en/Reference/analogRead bạn có thể đọc từ các chân tương tự chỉ bằng số (ví dụ 0, 1, 2, 3, v.v.); "A" trong "A0" là tùy chọn. Tất nhiên, có thể rõ ràng hơn nếu bạn phân biệt chúng với tiền tố "A" nhưng nó không bắt buộc đối với analogRead. Mặt khác, digitalWrite(i)giả định iđề cập đến một pin kỹ thuật số; để sử dụng digitalWrite với chân tương tự, người ta cần bao gồm tiền tố "A".
heypete

Nắm bắt tốt. Tôi cập nhật câu trả lời.
Craig

Đây là giải pháp di động nhất mà tôi đã thấy cho đến nay và đó là giải pháp tôi đang sử dụng, cảm ơn.
hoosierEE

4

Ít nhất là một Uno / Megas / leonardos, tất cả các giá trị được ánh xạ tới số pin tương tự là liên tiếp, vì vậy

for (int i = A0; i < A4; i++) {
  pinMode(i, OUTPUT); 
  digitalWrite(i, LOW);
}

sẽ đặt A0, A1, A2 và A3 thành OUTPUT và sau đó THẤP.


1

Các chân 14 đến 19 là các chân tương tự A0 đến A5. A0chỉ là một bí danh cho 14và như vậy.

Vì vậy, một cách khác để viết câu trả lời của BrettM:

for (int i = 14; i < 18 i++) {
  pinMode(i, OUTPUT); 
  digitalWrite(i, LOW);
}

Điều này không hoạt động trên tất cả các bảng Arduino. Không phải tất cả các bảng sử dụng 14-19.
Craig

0

Vòng lặp đầu tiên của bạn sẽ thực sự hoạt động tốt, tuy nhiên, bạn có thể muốn thêm delay(1);sau bạn analogRead(i);, để cho ADC một chút thời gian để giải quyết.

Bạn có thể giải thích những gì bạn đang cố gắng làm với đoạn mã thứ hai của mình không? Vì có vẻ như bây giờ, nó không thực sự có ý nghĩa khi sử dụng đầu vào analog làm đầu ra kỹ thuật số .

Ngoài ra, bạn đang cố gắng đọc đầu vào của một pin chỉ một vài dòng sau khi bạn chỉ định pin là đầu ra.

Vui lòng giải thích những gì bạn đang cố gắng đạt được, vì vậy những người tốt bụng ở đây có thể giúp bạn tốt hơn.


0

Tôi biết điều này đã cũ, nhưng nếu bạn di chuột qua A0 đến A7 trong micro trực quan, nó sẽ hiển thị cho bạn giá trị thực, chúng chỉ là một biến (nó thực sự hiển thị là 14U nhưng trong khi giải quyết bạn không cần phải bao gồm U) . Những gì Craig nói là sai, họ KHÔNG phải giải quyết bằng A0, A1 ect ..

A0 = 14 A1 = 15. . A7 = 21

//Will set all pins, digital and analog to LOW (0)
for (int i = 1; i < 22; i++) {
    digitalWrite(i, LOW);
}

//Will set all analog pins to LOW (0)
for (int i = 14; i < 22; i++) {
    digitalWrite(i, LOW);
}

//Will set all analog pins to LOW (0)
for (int i = A0; i < A7 + 1; i++) {
    digitalWrite(i, LOW);
}

Vòng lặp for cuối cùng về cơ bản là nói i = 1 (A0) và dừng trên 21 (A7).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.