Arduino với nút bấm (cảm biến âm thanh) sử dụng ba chế độ nhấn nút (vỗ tay)

Mô tả dự án: 

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

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

+

  1. buttonState = digitalRead(buttonPin);
  2. // 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:

http://arduino.vn/bai-viet/566-gia-lap-arduino-tren-may-mien-phi-tu-hoc-arduino-ma-khong-can-co-day-du-thiet-bi

 

Phần cứng (cho một đèn led)

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ị)

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

lên
13 thành viên đã đánh giá bài viết này hữu ích.
Chuyên mục: 
Các dự án được truyền cảm hứng

Select any filter and click on Apply to see results