Vì vậy, tôi đang viết chức năng nhỏ này cho một số chiếc kim nồi. Cái nồi chỉ gửi một giá trị khi nó quay, khi nó ở trạng thái nghỉ, nó không gửi gì cả. Đó là cách tôi muốn nó hoạt động.
Nó hoạt động tốt chỉ với một kim.
Tôi đang đi được một nửa chặng đường mà nó hoạt động với nhiều chân. Vì vậy, nếu tôi gọi nó hai lần với hai chân trong vòng lặp, tôi sẽ nhận được giá trị chính xác trên cả hai chân. Nhưng tôi đã mất chức năng của câu lệnh if. Về cơ bản tôi không thể tìm ra nửa sau. Ai đó đã đề xuất sử dụng một mảng, tôi chỉ không biết phải tiếp tục như thế nào.
gợi ý? Cảm ơn.
chậu byte[2] = {A0, A2};
int LastPotVal = 0;
thiết lập vô hiệu () {
Serial.begin(9600);
}
vòng lặp trống () {
// lấy mã pin ra khỏi mảng
rePot(chậu[0]);
rePot(chậu[1]);
độ trễ(10);
}
void rePot(const int potPin){
// có thể có vấn đề ở đâu đó quanh đây...
int potThresh = 2;
int potFinal = 0;
int potVal = 0;
// thiết lập và ánh xạ potVal
potVal = (analogRead(potPin));
potVal = map(potVal, 0, 664, 0, 200);
if(abs(potVal - LastPotVal) >= potThresh){
potFinal = (potVal/2);
Serial.println(potFinal);
LastPotVal = potVal;
} // kết thúc câu lệnh if
} // kết thúc rePot
Điều này sử dụng struct
để quản lý một chiết áp và dữ liệu liên quan đến nó (chân cắm của nó, lần đọc cuối cùng, ngưỡng, v.v.). Sau đó,rePot()
Hàm đã được thay đổi để lấy một trong các cấu trúc này làm đầu vào, thay vì chỉ số pin.
cấu trúc nồi {
chân byte;
ngưỡng int;
int LastRead;
int hiện tạiĐọc;
};
// xác định một mảng gồm 2 Pot, một có chân A0 và ngưỡng 2,
// khác với chân A2 và ngưỡng 3. Mọi thứ khác đều tự động
// khởi tạo là 0 (tức là LastReading, currentReading).
// các trường được nhập sẽ xác định biến nào chúng khởi tạo, vì vậy
// {A1, 4, 5} sẽ là pin = A1, ngưỡng = 4 và LastReading = 5
struct Chậu chậu[] = { {A0, 2}, {A2, 3} };
void rePot(struct Pot * pot) {
đọc int = map(analogRead(pot->pin), 0, 664, 0, 200);
if(abs(đọc - pot->lastReading) >= pot->threshold) {
pot->currentReading = (đọc/2);
Serial.println(pot->currentReading);
pot->lastReading = đọc;
}
}
thiết lập vô hiệu () {
Serial.begin(9600);
}
vòng lặp trống () {
rePot(&pots[0]);
rePot(&pots[1]);
độ trễ(10);
}
Một cách tiếp cận hơi khác một chút đối với vấn đề này là rePot()
Thay đổi thành một hàm lấy toàn bộ mảng làm đầu vào, sau đó chỉ cập nhật toàn bộ mảng. Như thế này:
void readAllThePots(struct Pot * pot, int potCount) {
for(int i = 0; i < potCount; i++) {
đọc int = map(analogRead(pot[i].pin), 0, 664, 0, 200);
if(abs(reading - pot[i].lastReading) >= pot[i].threshold) {
pot[i].currentReading = (đọc/2);
Serial.println(pot[i].currentReading);
pot[i].lastReading = đọc;
}
}
}
vòng lặp trống () {
readAllThePots(chậu, 2);
độ trễ(10);
}
Tôi là một lập trình viên xuất sắc, rất giỏi!