Bảo Mai Sỹ gửi vào
- 15474 lượt xem
Arduino với cảm biến âm thanh sử dụng ba chế độ vỗ tay. Chắc hẳn các bạn làm nhà thông minh sẽ thích bài viết này!
Sự tham khảo
Mã code có tham khảo qua nguồn:
http://arduino.vn/bai-viet/157-bai-10-dem-so-lan-nhan-mot-button-buttonstatechange
Các định nghĩa
Ở đây ta định nghĩa một lần nhấn button là một lần vỗ tay.
Do chưa mua đồ và không tìm thấy cảm biến âm thanh trên trình mô phỏng nên mình tay bằng nút bấm
(nên ai test trên module cảm biến âm thanh thì chia sẻ mình với nhé :D)
Khi có cảm biến âm thanh mắc mạch các bạn:
- Đổi chân buttonPin thành A0
+if (buttonState != lastButtonState) { // khi (BS>125&&LBS<125)||(BS<125&&BS>125) +if (buttonState == HIGH) { //khi BS>125
+
- buttonState = digitalRead(buttonPin);
- // chuyển digitalRead thành analogRead
Cách lắp mạch
Nếu chưa biết sử dụng 123d.circuit.io, bạn xem tại đây:
Phần cứng (cho một đèn led)
- Arduino UNO R3
- Điện trở trên 10k
- Điện trở dưới 330 Ohm
- 1 cảm biến âm thanh (trong trường hợp test, các bạn có thể dùng nút nhấn - button)
- 1 led màu đỏ (tượng trưng cho đèn)
- dây đỏ(+)
- dây đen (GND)
- dây xanh(dây trạng thái)
Mã(cho một đèn led)
// dùng const đặt trước khi khai báo biến sẽ coi biến này là một hằng số // Bạn có thể đọc được giá trị biến hoặc thực hiện các phép toán // Nhưng không thay đổi được giá trị của hằng số này. const int buttonPin = 11; // hằng số buttonPin mang giá trị là chân digital được nối với button // đổi chân buttonPin thành A0(khi thay button bằng cảm biến âm thanh const int ledPin = 2; // hằng số ledPin mang giá trị là chân digital đươc nối với led // Các biến này có thể thay đổi giá trị được unsigned long b = 0; unsigned long l = 0; int d = 0; int f = 0; int g = 0; int h = 0; int e = 1; // d,f,g,h,e là biến trạng thái int buttonPushCounter = 0; // số lần button được nhấn int buttonState = 0; // trạng thái hiện tại của button int lastButtonState = 0; // trạng thái trước đó của button void setup() { pinMode(buttonPin, INPUT); // Cài đặt button là INPUT pinMode(ledPin, OUTPUT); // Cài đặt đèn LED là OUTPUT l = millis(); // hàm đo thời gian b = millis(); // hàm đo thời gian Serial.begin(9600); // Bật cổng Serial ở baudrate 9600 } void loop() { // đọc giá trị hiện tại của button buttonState = digitalRead(buttonPin); // so sánh với giá trị trước đó if (buttonState != lastButtonState) { // khi // (BS>125&&LBS<125)||(BS<125&&BS>125) // (đối với cảm biến âm thanh) if (buttonState == HIGH) { // khi BS>125 (đối với cảm biến âm thanh) // Nếu trạng thái bây giờ là button đang được nhấn // thì hiển nhiên trước đó là button chưa được nhấn (điều kiện trên) // chúng ta sẽ tăng số lần nhấn button lên 1 buttonPushCounter++; b = millis(); // thời gian khi nhấn nút Serial.println("Dang nhan"); Serial.print("So lan nhan button la: "); Serial.println(buttonPushCounter); delay(50); // chống vỗ tay quá nhanh hay nhấn nút quá nhanh và chống // nhiễu } /* else { // Nếu trạng thái bây giờ là button đang được THẢ // thì hiển nhiên trước đó là button đang được nhấn (điều kiện trên) // Chúng ta sẽ thông báo là button đang được thả và không làm gì cả Serial.println("off"); //hàm thông báo mình đã loại ra. } */ } // lưu lại trạng thái button cho lần kiểm tra tiếp theo lastButtonState = buttonState; // biến lastButtonState là mấu chốt trong việc // đếm số lần nhấn nút(hay số lần vỗ tay if ((millis() - b) < 995) // hàm thực hiện lệnh trong khi chờ nhấn nút { digitalWrite(ledPin, HIGH); //đèn sáng trong thời gian chờ } if ((millis() - b) < 1000 && (millis() - b) > 995) // hàm này để tắt, hai hàm // này mang tính chất cho // đẹp trong khi chờ bạn // vỗ tay hoặc nhấn nút :D { digitalWrite(ledPin, LOW); } // biến f dùng cho vỗ tay một lần, biến g dùng cho vỗ tay hai lần, biến h dùng // cho vỗ tay ba lần, biến e dùng để xem hai lần vỗ tay trước và sau có trùng // nhau không e=1 là trùng nhau if (buttonPushCounter == 1 && (millis() - b) > 1000) { // sau khi đợi nhấn nút quá 1s mới thực hiện hay // khoảng cách hai lần vỗ tay không được lớn hơn // 1s buttonPushCounter = 0; // đưa biến BPC về 0 if (g != 0 || h != 0) { f = 1; g = 0; h = 0; } else { if (e == 1) { f = 1; } else { f = 2; } } } if (buttonPushCounter == 2 && (millis() - b) > 1000) { buttonPushCounter = 0; if (h != 0 || f != 0) { g = 1; h = 0; f = 0; } else { if (e == 1) { g = 1; } else { g = 2; } } } if (buttonPushCounter == 3 && (millis() - b) > 1000) { buttonPushCounter = 0; if (g != 0 || f != 0) { h = 1; g = 0; f = 0; } else { if (e == 1) { h = 1; } else { h = 2; } } } if (buttonPushCounter == 0 &&(millis() - b) > 1000) // sau khi vỗ tay ta thực hiện lệnh { if (f == 1) { // biến f xác định là vỗ tay 1 lần g = 0; h = 0; e = 0; if ((unsigned long)(millis() - l) > 100) //đèn chớp tắt trong 0.1s khi vỗ tay một lần { digitalWrite(ledPin, !d); d = !d; l = millis(); } } if (f == 2) { g = 0; h = 0; e = 1; digitalWrite(ledPin, LOW); // vỗ tay một lần đèn từ trạng thái nhấp nháy // sang trạng thái tắt } if (g == 1) { // biến g dùng để xác định vỗ tay hai lần f = 0; h = 0; e = 0; if ((unsigned long)(millis() - l) > 1000) // vỗ tay hai lần đèn chớp tắt trong 1s { digitalWrite(ledPin, !d); d = !d; l = millis(); } } if (g == 2) { f = 0; h = 0; e = 1; digitalWrite(ledPin, LOW); // vỗ tay hai lần lần nữa đèn sẽ tắt } if (h == 1) { // biến h là để xác định vỗ tay ba lần g = 0; f = 0; e = 0; digitalWrite(ledPin, HIGH); // vỗ tay ba lần đèn sẽ sáng } if (h == 2) { g = 0; f = 0; e = 1; digitalWrite(ledPin, LOW); // vỗ tay ba lần nữa đèn sẽ tắt } } }
CODE:Cho ba đèn led(tương ứng với ba cổng ra rơ le điều khiển ba thiết bị) phần cứng mục 7
https://circuits.io/circuits/3084926-c-m-bi-n-am-thanh-cho-ba-den-led
vỗ tay một lần đèn 3 sáng
vỗ tay hai lần đèn 2 sáng
vỗ tay ba lần đèn 1 sáng
vỗ tay một lần lần nữa đèn 3 tắt....
// dùng const đặt trước khi khai báo biến sẽ coi biến này là một hằng số // Bạn có thể đọc được giá trị biến hoặc thực hiện các phép toán // Nhưng không thay đổi được giá trị của hằng số này. const int buttonPin = 11;// hằng số buttonPin mang giá trị là chân digital được nối với button // đổi chân buttonPin thành A0 const int ledPin1 = 2; const int ledPin2 = 3; const int ledPin3 = 4; // hằng số ledPin mang giá trị là chân digital đươc nối với led // đổi chân buttonPin thành A0 unsigned long b=0; unsigned long l=0; int f=0; int g=0; int h=0; int e=1; int a=1; int d=1; int c=1; // Các biến này có thể thay đổi giá trị được int buttonPushCounter = 0; // số lần button được nhấn int buttonState = 0; // trạng thái hiện tại của button int lastButtonState = 0; // trạng thái trước đó của button void setup() { pinMode(buttonPin, INPUT); // Cài đặt button là INPUT pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); pinMode(ledPin3, OUTPUT); // Cài đặt đèn LED là OUTPUT l=millis(); b=millis(); Serial.begin(9600); //Bật cổng Serial ở baudrate 9600 } void loop() { // đọc giá trị hiện tại của button buttonState = digitalRead(buttonPin); /*i */ // so sánh với giá trị trước đó if (buttonState != lastButtonState) { // khi (BS>125&&LBS<125)||(BS<125&&BS>125) if (buttonState == HIGH) { //khi BS>125 // Nếu trạng thái bây giờ là button đang được nhấn // thì hiển nhiên trước đó là button chưa được nhấn (điều kiện trên) // chúng ta sẽ tăng số lần nhấn button lên 1 buttonPushCounter++; b=millis(); //thời gian khi nhấn nút Serial.println("Dang nhan"); Serial.print("So lan nhan button la: "); Serial.println(buttonPushCounter); delay(50);//chống nhiễu } /* else { // Nếu trạng thái bây giờ là button đang được THẢ // thì hiển nhiên trước đó là button đang được nhấn (điều kiện trên) // Chúng ta sẽ thông báo là button đang được thả và không làm gì cả Serial.println("off"); } */ } // lưu lại trạng thái button cho lần kiểm tra tiếp theo lastButtonState = buttonState; Serial.println(millis()-b); /* if ((millis()-b)<995) { digitalWrite(ledPin, HIGH); //đèn sáng trong thời gian chờ } if((millis()-b)<1000&&(millis()-b)>995) { digitalWrite(ledPin, LOW); } */ /* if (buttonPushCounter % 4 == 0) { digitalWrite(ledPin, HIGH); Serial.println("Da bat den"); } else { digitalWrite(ledPin, LOW); } */ //f(1)g(2)h(3) Serial.println(buttonPushCounter); if(buttonPushCounter == 1&&(millis()-b)>1000){ buttonPushCounter=0; if(a==1){ f=1; } else{ f=2; } } if(buttonPushCounter == 2&&(millis()-b)>1000){ buttonPushCounter=0; if(d==1){ g=1; } else{ g=2; } } if(buttonPushCounter == 3&&(millis()-b)>1000){ buttonPushCounter=0; if(c==1){ h=1; } else{ h=2; } } if(buttonPushCounter == 0&&(millis()-b)>1000) { if(f==1){ a=0; digitalWrite(ledPin1, HIGH); } if(f==2){ a=1; digitalWrite(ledPin1, LOW); } if(g==1){ d=0; digitalWrite(ledPin2, HIGH); } if(g==2){ d=1; digitalWrite(ledPin2, LOW); } if(h==1){ c=0; digitalWrite(ledPin3, HIGH); } if(h==2){ c=1; digitalWrite(ledPin3, LOW); } } }
Phần cứng:Cho ba đèn led(tương ứng với ba cổng ra rơ le điều khiển ba thiết bị)
Mô phỏng(với ba đèn led)
Video cho một đèn led
Code: Cảm biến âm thanh ba cổng ra
lưu ý hai tham số k và i. ở đây dùng cổng AO của cảm biến âm thanh. (đối với cảm biến âm thanh dùng một cổng DO(OUT) dùng code này không được.
https://circuits.io/circuits/3143755-c-m-bi-n-am-thanh-ba-c-ng-ra
Code: Cảm biến âm thanh một cổng ra
lưu ý hai tham số k và i. ở đây dùng cổng AO của cảm biến âm thanh. (đối với cảm biến âm thanh dùng một cổng DO(OUT) dùng code này không được.
https://circuits.io/circuits/3130017-ko-m-ch-c-m-bi-n-am-thanh-v-i-m-t-c-ng-ra