Đổ xí ngầu bằng Arduino Leave a comment

Trong ứng dụng này, chúng ta sẽ làm ra một công cụ đổ xí ngầu sử dụng Arduino. Ý tưởng như sau: Khi nhấn nút, Arduino sẽ ngẫu nhiên bật/tắt 6 đèn LED, số đèn LED được bật sáng chính là số điểm của lượt “lắc” xí ngầu đó. Nào, chúng ta hãy bắt đầu thôi!

Linh kiện cần thiết

STTTên linh kiệnSLHình ảnh
1Board Arduino Uno R31
2Dây nguồn USB1
3Breadboard mini1
4Dây căm breadboard1
5LED6
6Điện trở 220Ω6
7Nút nhấn1

Sơ đồ đấu dây

Thực hiện đấu dây như hình, chú ý về chân của LED (phân biệt chân âm và dương), mỗi LED đều phải được nối với điện trở hạn dòng để đảm bảo LED không bị hỏng trong khi hoạt động.

Code Arduino

Hãy nạp đoạn code sau vào Arduino

const int button = 9; // Ngõ vào tín hiệu nút nhấn
//Ngõ ra điều khiển LED từ 2-7</pre>
// Các biến đọc trạng thái của nút nhấn
int buttonState; // trạng thái hiện tại của nút nhấn
int lastButtonState = LOW; // trạng thái trước đó của nút nhấn

// Các biến lưu lại thời điểm đọc trạng thái nút nhấn
unsigned long lastDebounceTime = 0; // thời điểm đọc tín hiệu lần gần nhất
unsigned long debounceDelay = 50; // thời gian trì hoãn việc đọc tín hiệu

void setup()
{
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(button, INPUT_PULLUP);

Serial.begin (9600);
Serial.println("Chosangtao.com");
Serial.println("Chuong trinh do xi ngau tu dong");
Serial.println("Nhan nut de do xi ngau");
randomSeed(analogRead(A0));
}

void loop() {
int reading = digitalRead(button);
if (reading != lastButtonState) {
lastDebounceTime = millis();
}

if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != buttonState) {
buttonState = reading;

if (buttonState == LOW) {
doXiNgau();
delay(1000);
}
}
}
lastButtonState = reading;
}

void doXiNgau() {
Serial.println("Bat dau thay xi ngau");
HieuUngLed();
int ketqua = random(6) + 1; // Kết quả random sẽ trả về từ 0 đến 5
Serial.print("Ket qua cua ban la: ");
Serial.println(ketqua);
// do đó ta cộng thêm 1 để có kết quả từ 1 đến 6 nút
if (ketqua == 1) {
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
} else if (ketqua == 2) {
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
} else if (ketqua == 3) {
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
} else if (ketqua == 4) {
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
} else if (ketqua == 5) {
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
} else if (ketqua == 6) {
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
}
}

void HieuUngLed() {
Serial.println(3);
tatLed();
delay(500);
batLed();
delay(500);
Serial.println(2);
tatLed();
delay(500);
batLed();
delay(500);
Serial.println(1);
tatLed();
delay(500);
batLed();
delay(500);
}

void tatLed() {
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
}

void batLed() {
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
}

Code đổ xí ngầu

Trong đoạn code trên có sử dụng lệnh ‘random(6)’ để tạo ra một số ngẫu nhiên từ 0 đến 6. Tuy nhiên, bạn sẽ có thể nhận ra thứ tự ngẫu nhiên mỗi khi khởi động lại mạch được lặp lại. Điều này làm cho tính ‘may rủi’ của chương trình không cao. Do đó, trong ‘setup’ ta thêm vào câu lệnh randomSeed(analog(A0)), hàm này có tác dụng làm xáo trộn trật tự của hàm random bằng một tham số ngẫu nhiên, đọc từ chân A0 (chân này không được kết nối với bất kì thiết bị nào).

Hãy thử nạp code này vào Arduino và chơi một trò chơi với nó, cờ cá ngựa chẳng hạn.

Mở Serial Monitor và đối chiếu kết quả thực tế với kết quả hiển thị trên màn hình. Nếu không trùng khớp, hãy kiểm tra lại kết nối mạch của bạn.

Mở rộng

Hãy thử thay đổi hiệu ứng LED trong khi chờ đợi đổ xí ngầu.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Website này sử dụng Akismet để hạn chế spam. Tìm hiểu bình luận của bạn được duyệt như thế nào.