티스토리 뷰

아두이노 초음파센서(HC-SR04) LED 켜기


HC-SR04 센서의 측정 거리는 2cm~400cm 이고 정확도는 3mm 이다.

아두이노에 초음파센서를 연결하여 특정거리 만큼 접근하면 LED를 켜는 예제를 만들어 보자.

어렵지 않으니 차근차근 따라해 보자.



준비물 : 아두이노 , 브레드보드, 초음파센서, 점퍼선 8개, 저항(200~300옴), LED



#define TRIG_PIN 2 #define ECHO_PIN 3 #define LED_PIN 4 void setup() { pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); pinMode(LED_PIN, OUTPUT); } void loop() { int distance = 0; digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); distance = pulseIn(ECHO_PIN, HIGH)/58.2; /* 센치미터(cm) */

 

/* 10cm 이내로 접근 시 LED를 켠다 */ if (distance <= 10) { digitalWrite(LED_PIN, HIGH); } else { digitalWrite(LED_PIN, LOW); } }


센티미터 계산공식 : 펄스폭(Echo핀 출력시간(us))/58=거리(cm)


전체적으로 연결된 모습니다.



VCC는 5V , GND는 GND,  Trig은 2번핀, Echo는 3번핀에 연결한다.




LED 다리가 긴쪽은 저항에 연결하며 저항은 4번핀에 연결한다.

짧은 다리는 GND에 연결하다.





물체가 10센치미터 이내로 접근하면 LED가 켜지는 모습을 볼 수 있다.





댓글
  • 프로필사진 박지훈 질문좀 해도 될까요 ㅠㅠㅠㅠㅠ
    그대로 따라했는데 아두이노 L에 계속 불이들어오고 램프도 계속 켜져있네요 ㅠㅠㅠㅠ
    뭐가 문제인지...
    2016.07.02 19:27
  • 프로필사진 젠트 보지 않고서는 쉽게 알수는 없을꺼 같아요. 차근차근 처음부터 다시 연결해 보세요^^ 2016.07.05 17:30 신고
  • 프로필사진 비밀댓글입니다 2016.12.11 06:29
  • 프로필사진 비밀댓글입니다 2016.12.11 07:02
  • 프로필사진 젠트 LED를 깜빡이게 할려면 delay() 함수를 사용하며 됩니다.

    /* 10cm 이내로 접근 시 LED를 켠다 */
    if (distance <= 10) {
    digitalWrite(LED_PIN, HIGH);
    delay(500);
    digitalWrite(LED_PIN, LOW);
    delay(500);
    } else {
    digitalWrite(LED_PIN, LOW);
    }

    그리고 저항을 연결하는 이유는 LED에 너무 많은 전류가 흐르면 타버리거나 아두이노에 무리가 갈수가 있어서 적절한 저항을 연결해 줘야합니다
    2016.12.11 14:55 신고
  • 프로필사진 아두이노. led를 초음파센서 가 감지후에 10초정도 딜레이시켜서 키고싶은데 방법좀 알려주세요..
    void loop()
    {
    int distance = 0;

    digitalWrite(TRIG_PIN, HIGH);
    delayMicroseconds(10); <이게 시간조절하는건가요???
    digitalWrite(TRIG_PIN, LOW);
    distance = pulseIn(ECHO_PIN, HIGH)/58.2; /* 센치미터(cm) */

    /* 10cm 이내로 접근 시 LED를 켠다 */
    if (distance <= 10) {
    digitalWrite(LED_PIN, HIGH);

    2017.09.24 13:41
  • 프로필사진 젠트 감지후 delay(10000); 함수를 이용하면 됩니다~ 2017.09.24 16:47 신고
  • 프로필사진 비밀댓글입니다 2017.10.30 20:55
  • 프로필사진 젠트 초음파센서 하나는 성공 하셨나요?
    어떻게 도와 드려야 할지요....
    2017.10.31 00:36 신고
  • 프로필사진 이경제 저 궁금한게 있는데요!!!(초음파 센서에서 측정되는 거리, LED 켜질때 1 꺼질때 0) 이렇게 시리얼 모니터에 나타내고 싶으면 어떻게 하면되나요?? ㅠㅠ
    EX) (98mm , 1) , (130mm , 0)
    2017.11.24 11:57
  • 프로필사진 젠트 void setup() {
    pinMode(TRIG_PIN, OUTPUT);
    pinMode(ECHO_PIN, INPUT);
    pinMode(LED_PIN, OUTPUT);

    Serial.begin(9600); //추가
    }

    void loop()
    {
    int distance = 0;

    digitalWrite(TRIG_PIN, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG_PIN, LOW);
    distance = pulseIn(ECHO_PIN, HIGH)/58.2; /* 센치미터(cm) */

    /* 10cm 이내로 접근 시 LED를 켠다 */
    if (distance <= 10) {
    digitalWrite(LED_PIN, HIGH);
    Serial.print(distance); //추가
    Serial.println("cm : 1"); //추가
    } else {
    digitalWrite(LED_PIN, LOW);
    Serial.print(distance); //추가
    Serial.println("cm : 0"); //추가
    }
    }

    이렇게 하면 될꺼같은데 테스트는 못해봤어요~
    2017.11.24 15:08 신고
  • 프로필사진 박진규 혹시 !!! 초음파센서 감지 후에 거리재기 까지 코딩을 완료했는데요!!
    일정범위 안에 들어올 때 LED가 켜지는게 아니라 진동모터로 진동을 울리게 하는 코딩을 어떻게 하면되는지 ㅠㅠ
    LED코딩에서 진동모터로 수정만 하면 되는건가요1!!!? 도움이필요합니다!! 막혀버렷어요 ㅠㅠ
    2017.11.26 02:21
  • 프로필사진 젠트 LED 로직을 모터로 수정하면 됩니다. 모터의
    회전 시간만큼 해당 구간을 딜레이주면 될꺼 같아요. 모터 종류에 따라 로직이 달라져서 어떤 모터를 사용 하시나요?
    2017.11.27 08:17 신고
  • 프로필사진 안녕하세요 혹시 초록색, 빨간색 LED 2개 연결해서
    센서 거리가 15cm 이하로 측정되면 초록색 LED는 불 안들어오고 빨간색 LED에만 불 들어오게 하고
    또 센서 거리가 20cm 이상으로 측정되면 빨간색 LED는 불 안들어오고 초록색 LED에만 불 들어오게 하는건 어떻게 하는건가요??
    알려주시면 감사하겠습니다.. 아두이노 왕초보라 공부중인데 잘 모르겠어요 ㅠㅠ

    2018.05.25 15:42
  • 프로필사진 젠트 위의 예제와 답글에 제시된코드를 참조하여 아래 조건을 사용하시면 될꺼 같습니다.

    //LED 모두 끄고
    digitalWrite(RED_LED_PIN, LOW);
    digitalWrite(GREEN_LED_PIN, LOW);

    if (distance <= 15) {
    //15센티 이하면 빨간 LED ON
    digitalWrite(RED_LED_PIN, HIGH);
    } else if (distance >= 20) {
    //20센티 이상면 초록색 LED ON
    digitalWrite(GREEN_LED_PIN, HIGH);
    }
    2018.05.25 22:23 신고
  • 프로필사진 누구 계산공식을 펄스폭(Echo핀 출력시간(us))/58.4=거리(cm)로 했을 때 가장 정확하네요 2018.08.04 09:50
  • 프로필사진 젠트 우와~ 감사합니다^^ 2018.08.04 13:06 신고
  • 프로필사진 리태 혹시 저런 작은 LED 말구 큰 전구나 한 공간을 비출수 있는 것들을 킬때는 저걸 어떻게 활용해야 할까요? 제가 아두이노 초보라서.. 2018.11.21 09:37
  • 프로필사진 젠트 코딩은 위와 비슷하게 사용가능하지만 큰 전구를 사용할 경우 전력소비량이 많기 때문에 외부 전력(220v)이 추가로 필요할 수 있습니다. 아래 예제의 장비 같은걸로 추가 전력을 공급할수 있습니다.

    http://deneb21.tistory.com/222
    2018.11.21 10:40 신고
  • 프로필사진 아아두우 SRF 05로도 가능할까요? 2018.12.01 21:17
  • 프로필사진 젠트 SRF05도 비슷하게 제어가 가능하다고 합니다. 아래 주소를 참고하세요.

    http://bitly.kr/DDu5
    2018.12.03 13:08 신고
  • 프로필사진 아두이놈 거리감지센서 1개에 led 4개를 부착하고 손을 가까이 대면 불이켜지는데 int val;
    int togle=0;
    int check=0;
    void setup(){
    pinMode(11,OUTPUT);
    Serial.begin(9600);
    }

    void loop(){
    val = analogRead(0);
    Serial.println(val);
    delay(300);

    if(val<80)
    {
    togle = 1;
    }else{
    togle = 0;
    }
    if(togle == 1){
    for(int i=0; i <255; i++)
    {
    analogWrite(11,i);
    delay(5);
    }
    delay(3000);
    check = 1;
    }
    if(togle == 0 && check == 1){
    for(int i=255; i >=0; i--)
    {
    analogWrite(11,i);
    delay(5);
    }
    delay(3000);
    check = 0;
    }
    }

    이 코드가 한개만 했을 때는 되는데
    12개의 거리감지센서를 사용하게 되면 어떻게 해야되까요?
    2018.12.12 19:09
  • 프로필사진 젠트 12개의 센서중 하나라도 근처에 물체가 다가가면 켜지도록하는건 어렵지 않을꺼같습니다.

    아두이노 Uno 의 보드의 경우 아날로그 핀이 6개 밖에 없어서 아두이노 Due 또는 아두이노 Mega 보드를 사용하셔야 할듯합니다. 아두이노 Uno를 꼭 사용하셔야 한다면 확장 쉴드를 찾아봐야 할듯 하구요.

    아두이노 Due 또는 아두이노 Mega 보드 이용시 아래와 같이 하면 되지 않을까 합니다.

    ~~~~~~~~~~~~~~~~
    동일
    ~~~~~~~~~~~~~~~~
    val = analogRead(0);
    val1 = analogRead(1);
    val2 = analogRead(2);
    val3 = analogRead(3);
    val4 = analogRead(4);
    val5 = analogRead(5);
    val6 = analogRead(6);
    val7 = analogRead(7);
    val8 = analogRead(8);
    val9 = analogRead(9);
    val10 = analogRead(10);
    val11 = analogRead(11);

    Serial.println(val);
    delay(300);

    if(val < 80
    || val1 < 80
    || val2 < 80
    || val3 < 80
    || val4 < 80
    || val5 < 80
    || val6 < 80
    || val7 < 80
    || val8 < 80
    || val9 < 80
    || val10 < 80
    || val11 < 80)
    {
    togle = 1;
    }else{
    togle = 0;
    }
    ~~~~~~~~~~~~~~~~
    동일
    ~~~~~~~~~~~~~~~~

    배열을 사용하셔서 코드 줄수를 줄이셔도 됩니다.
    2018.12.12 20:28 신고
  • 프로필사진 ㅇㅇㅇ led가 깜빡거리는 이유가 뭘까요 2019.05.14 15:25
  • 프로필사진 젠트 로직은 단순해서.... 초음파센서가 거리 측정이 제대로 동작하지 않는것 아닐까요? 2019.05.15 08:07 신고
  • 프로필사진 아두이
    #include <MsTimer2.h> //Timer interrupt function library
    int pbIn = 0; // Define interrupt 0 that is digital pin 2
    int ledOut = 3; // Define the indicator LED pin digital pin 13
    int number=0; //Interrupt times
    volatile int state = LOW; // Defines the indicator LED state, the default is not bright

    void setup()
    {
    Serial.begin(9600);
    pinMode(ledOut, OUTPUT);//
    attachInterrupt(pbIn, stateChange, FALLING); // Set the interrupt function, interrupt pin is digital pin D2, interrupt service function is stateChange (), when the D2 power change from high to low , the trigger interrupt.
    MsTimer2::set(1000, Handle); // Set the timer interrupt function, running once Handle() function per 1000ms
    MsTimer2::start();//Start timer interrupt function

    }

    void loop()
    {
    Serial.println(number); // Printing the number of times of interruption, which is convenient for debugging.
    delay(1);
    if(state == HIGH) //When a moving object is detected, the ledout is automatically closed after the light 2S, the next trigger can be carried out, and No need to reset. Convenient debugging.
    {
    delay(2000);
    state = LOW;
    digitalWrite(ledOut, state); //turn off led
    }

    }


    void stateChange() //Interrupt service function
    {
    number++; //Interrupted once, the number + 1

    }

    void Handle() //Timer service function
    {
    if(number>1) //If in the set of the interrupt time the number more than 1 times, then means have detect moving objects,This value can be adjusted according to the actual situation, which is equivalent to adjust the threshold of detection speed of moving objects.
    {
    state = HIGH;
    digitalWrite(ledOut, state); //light led

    number=0; //Cleare the number, so that it does not affect the next trigger
    }
    else
    number=0; //If in the setting of the interrupt time, the number of the interrupt is not reached the threshold value, it is not detected the moving objects, Cleare the number.
    }



    마이크로 웨이브 센서인데요 여기에 있는 led는 내장된건데 작성자님이 올리신것 같이 바깥에 다른 엘이디에 불을 켤 수 없나요?
    있다면 간단히 코딩 부탁드려요 ㅠ
    2019.05.30 01:03
  • 프로필사진 젠트 현재 올려주신 소스는 내장 LED는 아니고 3번 PIN에 연결되어 있습니다.

    int ledOut = 3; // Define the indicator LED pin digital pin 13

    내장 LED는 주석 처럼 13번 PIN 입니다.

    위에 예제처럼 LED를 연결하시고 4번으로 초기값을 변경하시면 외부 LED가 작동 할것 같습니다.

    위에 회로도 처럼 LED 연결후 LED핀 초기값 변경

    int ledOut = 4; // Define the indicator LED pin digital pin 13 (사용할 LED 핀)
    2019.05.30 22:17 신고
댓글쓰기 폼