정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

스마트홈을 제작하고 있습니다.
ges | 2018-12-27
 

1. 프로젝트 사용한 보드 

  : 오렌지보드

 

 

2. 사용한 개발 프로그램명

  : 스크래치

 

 

3. 사용한 센서 모델명

  :   장애물 감지 아두이노 적외선(IR) 송수신 센서 모듈.  아두이노 LCD 1602, 아두이노  조도 센서 모듈, 아두이노 TOWERPRO 서보모터 , 온습도 센서 모듈 KY-015, 아두이노 5mm RGB LED 핀아웃 모듈 저항내장형 3.3~5V, 피에조 부저

 

4. 연결한 회로 설명 (또는 이미지)

 

 

5. 소스코드 (주석 필수)

  

#include

#include

#include // 서보모터를 사용하기 위한 라이브러리 호출하기

#include // DHT11를 사용하기 위한 라이브러리 호출하기

 

SimpleDHT11 dht11; // 온습도센서를 dht11이라는 이름으로 선언

LiquidCrystal_I2C TV(0x3f,16,2);

 

int servo = 6; // 서보모터를 오렌지보드 A0번에 연결

int airCon = 9; // RGB LED의 파란색 핀을 디지털 9번 연결

int DHTPin = 3; // 온습도센서를 오렌지보드 3번핀에 연결

int notes3[] = {4186, 4698, 5274, 5587, 6271};

// 가까울 시 울릴 경보의 멜로디 작성

boolean flag = 0;

int piezoPin = 2;

int irPin = 9;

int notes4[] = {4186, 6271};

int tempo = 200; // 멜로디의 음 길이 설정

int flag1 = 1; // 블라인드의 상태를 저장하는 변수

Servo blind; // 서보모터를 blind라는 이름으로 선언

 

int Flag;

int notes2[] = {6900,4906,6900,4906,6900};

 

int C = 1047; // 도

int D = 1175; // 레

int E = 1319; // 미

int F = 1397; // 파

int G = 1568; // 솔

int A = 1760; // 라

int B =1976; // 시

int cdsPin = A0; // 조도센서를 오렌지보드 A0번에 연결

 

int notes[25] = { G, G, A, A, G, G, E, G, G, E, E, D, G, G, A, A, G, G, E, G, E, D, E, C };

// 학교종이 땡땡땡 멜로디 작성

 

void setup() {

// 시리얼 통신을 위해 통신속도(Baudrate)를 9600으로 설정

Serial.begin(9600);

pinMode(piezoPin, OUTPUT); // 피에조 핀을 출력핀으로 설정

pinMode(irPin, INPUT);

pinMode(airCon, OUTPUT); // 3색 LED중 파란색 핀을 출력핀으로 설정

blind.attach(servo); // 서보모터를 6번핀에 연결

blind.write(80); // 서보모토의 기본값을 80도로 설정

 

TV.init();

TV.backlight();

TV.setCursor(0,0);

TV.print("Looking TV....");

}

 

void loop() {

byte temperature = 0;

byte humidity = 0;

// 조도 센서 값 측정 후 시리얼 모니터에 출력

int cdsVal = analogRead(A0);

Serial.println(cdsVal);

 

// 날이 밝으면(빛이 밝아지면)

if (cdsVal < 400) {

// 현재 블라인드가 올라가있으면

if (flag1 == 0) {

// 멜로디를 출력하고

for (int i = 0; i < 2; i++) {

tone(piezoPin, notes4[i], tempo);

delay(100);

}

// 블라인드를 내림

blind.write(180);

// 블라인드가 내려가 있는 상태로 설정

flag1 = 1;

}

}

 

// 날이 어두우면(빛이 어두워지면)

else {

// 블라인드가 내려가 있으면

if (flag1== 1) {

// 블라인드를 올림

blind.write(80);

// 블라인드가 올라가 있는 상태로 설정

flag1 = 0;

}

}

 

delay(100);

 

 

// 온습도센서로 온도와 습도값 측정

if (dht11.read(DHTPin, &temperature, &humidity, NULL)) {

Serial.print("Read DHT11 failed.");

return;

 

// 측정된 온도, 습도값으로 불쾌지수 값 계산 후 시리얼 모니터에 출력

float discomfortIndex = (1.8 * temperature) - (0.55 * (1 - humidity / 100.0) * (1.8 * temperature - 26)) + 32;

Serial.println(discomfortIndex);

 

// 불쾌지수값이 70보다 높을 경우

if (discomfortIndex > 70) {

// 에어콘(파란색 LED)를 켜주면서 멜로디를 재생

digitalWrite(airCon, HIGH);

if (flag == 0) {

for (int i = 0; i < 5; i++) {

tone(piezoPin, notes3[i], 300);

delay(150);

}

flag = 1;

}

}

 

else {

// 에어콘(파란색 LED)를 끔

digitalWrite(airCon, LOW);

flag = 0;

}

delay(1500);

 

// 조도센서 값 측정 후 시리얼 모니터에 출력

int cdsValue = analogRead(cdsPin);

Serial.println(cdsValue);

 

// 조도센서로 측정되는 빛의 밝기가 어두울 경우

if (cdsValue > 700) {

// 멜로디 재생

for (int i = 0; i < 12; i++) {

tone (piezoPin, notes[ i ], tempo);

delay (300);

}

delay(100); // 멜로디 중간에 짧게 멈추는 용도

}

for (int i = 12; i < 25; i++) {

tone (piezoPin, notes[ i ], tempo);

delay(300);

}

int IRVal=digitalRead(irPin);

Serial.println(IRVal);

 

if(IRVal==0){

if(Flag==0){

for(int i=0;i<5;i++){

tone(piezoPin, notes2[i],150);

delay(150);

}

Flag=1;

}

 

TV.noBacklight();

}

 

else{

TV.backlight();

Flag=0;

}

delay(100);

}

}

 

 

6. 문제점 및 에러 내용

  : 보드에 업로드는 되는데 동작이 되지 않습니다. 

 1. 피에조 부저가 조도센서에 반응하긴 하나, 학교종이 땡땡땡 멜로디로 나오지 않고, 한 번 삑 소리가 나고 멈춥니다.

 2. LED 모듈이 가끔 깜빡이긴 하나, 온습도 센서와 반응하지 않고 혼자서 깜빡입니다.

 3. LCD가 적외선 장애물 감지센서와 반응하지 않습니다.

 

 
프로필사진

kocoafab 2018-12-27 14:07:08

안녕하세요. 코코아팹입니다.

 

1.  현재 코드에 조도센서로 피에조 부저를 제어하는 부분이 2개가 있습니다. 맨 처음 나오는 조도센서 코드가 조도센서 반응이 되면 삐빅 소리만 내고 끝내는 코드라서 현재 학교종이 땡떙땡 멜로디가 나오지 않고 삐빅 소리만 나오고 있습니다.

 

 loop함수 안에 있는 아래 코드를 지우시고 2, 3번 문제 답변대로 코드를 수정하시면 모두 정상적으로 동작하실겁니다.

  // 날이 밝으면(빛이 밝아지면)
  if (cdsVal < 400) {

    // 현재 블라인드가 올라가있으면
    if (flag1 == 0) {

      // 멜로디를 출력하고
      for (int i = 0; i < 2; i++) {
        tone(piezoPin, notes4[i], tempo);
        delay(100);
      }

      // 블라인드를 내림
      blind.write(180);

      // 블라인드가 내려가 있는 상태로 설정
      flag1 = 1;
    }
  }

  // 날이 어두우면(빛이 어두워지면)
  else {

    // 블라인드가 내려가 있으면
    if (flag1 == 1) {
      // 블라인드를 올림
      blind.write(80);
      // 블라인드가 올라가 있는 상태로 설정
      flag1 = 0;
    }
  }
  delay(100);

 

 

2, 3 코드 중간에 아래와 같은 부분이 있는데 이 부분이 return 다음에 바로 닫힌 괄호가 나와야 하는데 이 괄호가 코드 맨 마지막까지 가는 바랍에 이 코드 밑에 있는 코드들이 전부 동작하지 않고 있습니다.

코드 전체 맨 마지막줄에 있는 괄호를 하나 지우시고 아래 보이시는 코드 return 다음에 넣어주시면 밑에 있는 온습도, 조도, 적외선 센서 모두 정상적으로 동작하실 겁니다.

 

  if (dht11.read(DHTPin, &temperature, &humidity, NULL)) {
    Serial.print("Read DHT11 failed.");
    return;

 

프로필사진

ges 2018-12-27 16:08:09

답변 감사합니다. 말씀해주신대로 아래와 같이 코드를 작성하면, 지워버린 부분에 의해 동작되었던 서보모터는 어떻게 동작 시킬 수 있나요??? 어떤 코드를 추가해야할까요?

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

#include <Servo.h> // 서보모터를 사용하기 위한 라이브러리 호출하기

#include <SimpleDHT.h> // DHT11를 사용하기 위한 라이브러리 호출하기

 

SimpleDHT11 dht11; // 온습도센서를 dht11이라는 이름으로 선언

LiquidCrystal_I2C TV(0x27,16,2);

 

int servo = 6; // 서보모터를 오렌지보드 A0번에 연결

int airCon = 9; // RGB LED의 파란색 핀을 디지털 9번 연결

int DHTPin = 3; // 온습도센서를 오렌지보드 3번핀에 연결

int notes3[] = {4186, 4698, 5274, 5587, 6271};

// 가까울 시 울릴 경보의 멜로디 작성

boolean flag = 0;

int piezoPin = 2;

int irPin = 9;

int notes4[] = {4186, 6271};

int tempo = 200; // 멜로디의 음 길이 설정

int flag1 = 1; // 블라인드의 상태를 저장하는 변수

Servo blind; // 서보모터를 blind라는 이름으로 선언

 

int Flag;

int notes2[] = {6900,4906,6900,4906,6900};

 

int C = 1047; // 도

int D = 1175; // 레

int E = 1319; // 미

int F = 1397; // 파

int G = 1568; // 솔

int A = 1760; // 라

int B =1976; // 시

int cdsPin = A0; // 조도센서를 오렌지보드 A0번에 연결

 

int notes[25] = { G, G, A, A, G, G, E, G, G, E, E, D, G, G, A, A, G, G, E, G, E, D, E, C };

// 학교종이 땡땡땡 멜로디 작성

 

void setup() {

// 시리얼 통신을 위해 통신속도(Baudrate)를 9600으로 설정

Serial.begin(9600);

pinMode(piezoPin, OUTPUT); // 피에조 핀을 출력핀으로 설정

pinMode(irPin, INPUT);

pinMode(airCon, OUTPUT); // 3색 LED중 파란색 핀을 출력핀으로 설정

blind.attach(servo); // 서보모터를 6번핀에 연결

blind.write(80); // 서보모토의 기본값을 80도로 설정

 

TV.init();

TV.backlight();

TV.setCursor(0,0);

TV.print("Looking TV....");

}

 

void loop() {

byte temperature = 0;

byte humidity = 0;

// 조도 센서 값 측정 후 시리얼 모니터에 출력

int cdsVal = analogRead(A0);

Serial.println(cdsVal);

 

 

// 온습도센서로 온도와 습도값 측정

if (dht11.read(DHTPin, &temperature, &humidity, NULL)) {

Serial.print("Read DHT11 failed.");

return;

}

// 측정된 온도, 습도값으로 불쾌지수 값 계산 후 시리얼 모니터에 출력

float discomfortIndex = (1.8 * temperature) - (0.55 * (1 - humidity / 100.0) * (1.8 * temperature - 26)) + 32;

Serial.println(discomfortIndex);

 

// 불쾌지수값이 70보다 높을 경우

if (discomfortIndex > 70) {

// 에어콘(파란색 LED)를 켜주면서 멜로디를 재생

digitalWrite(airCon, HIGH);

if (flag == 0) {

for (int i = 0; i < 5; i++) {

tone(piezoPin, notes3[i], 300);

delay(150);

}

flag = 1;

}

}

 

else {

// 에어콘(파란색 LED)를 끔

digitalWrite(airCon, LOW);

flag = 0;

}

delay(1500);

 

// 조도센서 값 측정 후 시리얼 모니터에 출력

int cdsValue = analogRead(cdsPin);

Serial.println(cdsValue);

 

// 조도센서로 측정되는 빛의 밝기가 어두울 경우

if (cdsValue > 700) {

// 멜로디 재생

for (int i = 0; i < 12; i++) {

tone (piezoPin, notes[ i ], tempo);

delay (300);

}

delay(100); // 멜로디 중간에 짧게 멈추는 용도

}

for (int i = 12; i < 25; i++) {

tone (piezoPin, notes[ i ], tempo);

delay(300);

}

 

int IRVal=digitalRead(irPin);

Serial.println(IRVal);

 

if(IRVal==0){

if(Flag==0){

for(int i=0;i<5;i++){

tone(piezoPin, notes2[i],150);

delay(150);

}

Flag=1;

}

 

TV.noBacklight();

}

 

else{

TV.backlight();

Flag=0;

}

delay(100);

 

}

프로필사진

kocoafab 2018-12-27 17:01:57

위 코드에서 조도센서로 멜로디 재생하는 부분을 아래와 고치시면 됩니다.

 

flag1을 이용해서 현재 블라인드 상태가 어떤 상태인지 조건문으로 확인 후 멜로디 재생 및 블라인드 제어를 넣어주시면 됩니다.

 

우선 아래 코드를 확인해보시고 코드에 대해 궁금하신게 있으시면 언제든지 질문남겨주세요.

 

// 날이 밝으면(빛이 밝아지면)

if (cdsVal < 400) {
  // 현재 블라인드가 올라가있으면
  if (flag1 == 0) {

    // 블라인드를 내림
    blind.write(180);

    // 멜로디 재생
    for (int i = 0; i < 12; i++) {
      tone (piezoPin, notes[ i ], tempo);
      delay (300);
    }
    delay(100); // 멜로디 중간에 짧게 멈추는 용도

    for (int i = 12; i < 25; i++) {
      tone (piezoPin, notes[ i ], tempo);
      delay(300);
    }

    // 블라인드가 내려가 있는 상태로 설정
    flag1 = 1;
  }
}

// 날이 어두우면(빛이 어두워지면)
else {
  // 블라인드가 내려가 있으면
  if (flag1 == 1) {
    // 블라인드를 올림
    blind.write(80);

    // 블라인드가 올라가 있는 상태로 설정
    flag1 = 0;
  }
}

 

프로필사진

ges 2018-12-28 09:09:56

답변 정말 감사합니다. 그런데 그렇게 바꿨더니 저희가 조도센서를 이용해서 서보모터를 돌리는데 조도센서와 서보모터가 동작을 안하고 또 온습도센서가 동작을 안합니다. 그리고 부저도 안울려요. 어떤식으로 코드를 바꿔야 할까요?

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>  // 서보모터를 사용하기 위한 라이브러리 호출하기
#include <SimpleDHT.h> // DHT11를 사용하기 위한 라이브러리 호출하기

SimpleDHT11 dht11; // 온습도센서를 dht11이라는 이름으로 선언
LiquidCrystal_I2C TV(0x27,16,2);

int servo = 6;  // 서보모터를 오렌지보드 A0번에 연결
int airCon = 9;  // RGB LED의 파란색 핀을 디지털 9번 연결
int DHTPin = 3;  // 온습도센서를 오렌지보드 3번핀에 연결
int notes3[] = {4186, 4698, 5274, 5587, 6271};
// 가까울 시 울릴 경보의 멜로디 작성
boolean flag = 0;
int piezoPin = 2;
int irPin = 9;
 int notes4[] = {4186, 6271};
  int tempo = 200; // 멜로디의 음 길이 설정
  int flag1 = 1;  // 블라인드의 상태를 저장하는 변수
  Servo blind;  // 서보모터를 blind라는 이름으로 선언

int Flag;
int notes2[] = {6900,4906,6900,4906,6900};

int C = 1047; // 도
int D = 1175; // 레
int E = 1319; // 미
int F = 1397; // 파
int G = 1568; // 솔
int A = 1760; // 라
int B =1976; // 시
int cdsPin = A0; // 조도센서를 오렌지보드 A0번에 연결

int notes[25] = { G, G, A, A, G, G, E, G, G, E, E, D, G, G, A, A, G, G, E, G, E, D, E, C };
// 학교종이 땡땡땡 멜로디 작성

void setup() {
  // 시리얼 통신을 위해 통신속도(Baudrate)를 9600으로 설정
  Serial.begin(9600);
  pinMode(piezoPin, OUTPUT); // 피에조 핀을 출력핀으로 설정
  pinMode(irPin, INPUT);
   pinMode(airCon, OUTPUT);  // 3색 LED중 파란색 핀을 출력핀으로 설정
 blind.attach(servo);  // 서보모터를 6번핀에 연결
    blind.write(80); // 서보모토의 기본값을 80도로 설정

  TV.init();
  TV.backlight();
  TV.setCursor(0,0);
  TV.print("Looking TV....");
}

void loop() {
  byte temperature = 0;
  byte humidity = 0;
   // 조도 센서 값 측정 후 시리얼 모니터에 출력
    int cdsVal = analogRead(A0);
    Serial.println(cdsVal);
 
 
  // 온습도센서로 온도와 습도값 측정
if (dht11.read(DHTPin, &temperature, &humidity, NULL)) {
    Serial.print("Read DHT11 failed.");
    return;
}
    // 측정된 온도, 습도값으로 불쾌지수 값 계산 후 시리얼 모니터에 출력
  float discomfortIndex = (1.8 * temperature) - (0.55 * (1 - humidity / 100.0) * (1.8 * temperature - 26)) + 32;
  Serial.println(discomfortIndex);

  // 불쾌지수값이 70보다 높을 경우
  if (discomfortIndex > 70) {
    // 에어콘(파란색 LED)를 켜주면서 멜로디를 재생
    digitalWrite(airCon, HIGH);
    if (flag == 0) {
      for (int i = 0; i < 5; i++) {
        tone(piezoPin, notes3[i], 300);
        delay(150);
      }
      flag = 1;
    }
  }

  else {
    // 에어콘(파란색 LED)를 끔
    digitalWrite(airCon, LOW);
    flag = 0;
  }
  delay(1500);
 
  // 조도센서 값 측정 후 시리얼 모니터에 출력
  int cdsValue = analogRead(cdsPin);
  Serial.println(cdsValue);

  // 날이 밝으면(빛이 밝아지면)

if (cdsVal < 400) {
  // 현재 블라인드가 올라가있으면
  if (flag1 == 0) {

    // 블라인드를 내림
    blind.write(180);

    // 멜로디 재생
    for (int i = 0; i < 12; i++) {
      tone (piezoPin, notes[ i ], tempo);
      delay (300);
    }
    delay(100); // 멜로디 중간에 짧게 멈추는 용도

    for (int i = 12; i < 25; i++) {
      tone (piezoPin, notes[ i ], tempo);
      delay(300);
    }

    // 블라인드가 내려가 있는 상태로 설정
    flag1 = 1;
  }
}

// 날이 어두우면(빛이 어두워지면)
else {
  // 블라인드가 내려가 있으면
  if (flag1 == 1) {
    // 블라인드를 올림
    blind.write(80);

    // 블라인드가 올라가 있는 상태로 설정
    flag1 = 0;
  }
}
    int IRVal=digitalRead(irPin);
  Serial.println(IRVal);

   if(IRVal==0){
    if(Flag==0){
      for(int i=0;i<5;i++){
        tone(piezoPin, notes2[i],150);
        delay(150);
      }
      Flag=1;
    }

    TV.noBacklight();
   }

   else{
    TV.backlight();
    Flag=0;
   }
   delay(100);
  
}

프로필사진

최공규 2018-12-30 09:46:09

질문이 활발하게 진행되고 있군요..

Good 입니다.

전, 모르는게 너무 많아 질문도 못하네요..

프로필사진

수박쨈 2018-12-31 11:50:30

제가 봤을 땐 올려주신 코드에서 9번핀이 irpin과 aircon핀으로 겹치는거 빼고는 크게 문제되는 점이 없어 보입니다.

 

한꺼번에 연결해서 전체 코드를 돌리려고 하는것보다는 각 모듈 하나하나만 테스트해서 제대로 연결되고 작동되는지 테스트를 먼저 해보는게 좋습니다.

 

현재로써는 회로부분을 다시 한번 살펴보시는게 좋을거 같습니다.

이전글   |    아두이노 테트리스 LCD관련 질문 2018-12-26
다음글   |    스마트홈 성공하신분 전체코딩자료 공유 부탁드려요... 2018-12-30