B18 – Sử dụng vòng lặp While

Đối với If..Else hoặc Switch..Case, khi điều kiện đúng thì hành động được thực hiện 1 lần. Trong khi đó, nếu dùng vòng lặp While, khi điều kiện đúng thì hành động mong muốn sẽ lặp lại mãi cho đến khi điều kiện của While không còn đúng nữa. Cần chú ý điều kiện của While để tránh chương trình rơi vào vòng lặp mà không thể thoát ra, hay còn gọi là treo.

Trong bài này, ta đọc giá trị từ quang trở và dùng nó để thay đổi độ sáng của LED. Trong khi đó, nếu công tắc được bật thì chương trình sẽ nhảy vào một đoạn chương trình căn chỉnh lại giá trị cảm biến. Khi công tắc được nhả, chương trình hoạt động bình thường.

Sử dụng 2 trở 10k (cho công tắc và quang trở) và 1 trở 220 Ohm cho LED.

  • Chương trình có sử dụng hàm. Việc sử dụng hàm nhằm tận dụng lại các đoạn mã ở nhiều chỗ khác nhau trong chương trình mà không phải viết lại.
/*
  Conditionals - while statement

 This example code is in the public domain.

 */


// hằng số
const int sensorPin = A0;       // chân nối cảm biến
const int ledPin = 9;           // chân nối LED có PWM
const int indicatorLedPin = 13; // chân LED báo hiệu
const int buttonPin = 2;        // chân nối công tắc


// biến số
int sensorMin = 1023;     // giá trị cảm biến nhỏ nhất
int sensorMax = 0;        // lớn nhất vì dải nhị phân 10bit
int sensorValue = 0;      // giá trị thực sẽ đọc được


void setup() {
  // đặt chân kết nối
  pinMode(indicatorLedPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
}

void loop() {
  // trong khi nhấn công tắc, gọi hàm căn chỉnh cảm biến
  while (digitalRead(buttonPin) == HIGH) {
    calibrate();
  }
  // báo hiệu kết thúc căn chỉnh
  digitalWrite(indicatorLedPin, LOW);

  // đọc cảm biến
  sensorValue = analogRead(sensorPin);

  // gán lại giá trị dựa vào kết quả căn chỉnh
  sensorValue = map(sensorValue, sensorMin, sensorMax, 0, 255);

  // giới hạn vùng giá trị từ 0 đến 255
  sensorValue = constrain(sensorValue, 0, 255);

  // thay đổi độ sáng đèn LED tương ứng
  analogWrite(ledPin, sensorValue);
}

//hàm căn chỉnh được viết rời
void calibrate() {
  // bật đèn báo hiệu
  digitalWrite(indicatorLedPin, HIGH);
  // đọc cảm biến
  sensorValue = analogRead(sensorPin);

  // ghi lại giá trị lớn nhất
  if (sensorValue > sensorMax) {
    sensorMax = sensorValue;
  }

  // ghi lại giá trị nhỏ nhất
  if (sensorValue < sensorMin) {
    sensorMin = sensorValue;
  }
}

Leave a Reply

Your email address will not be published. Required fields are marked *