Đố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; } }