정보나눔

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

아두이노 스마트홈 서보모터
현섭 | 2019-05-30

스마트홈 서보모터가 작동이 제대로 돌아가질 않습니다.

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

 

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

 

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

 

 

 

 

 

LiquidCrystal_I2C TV(0x27, 16, 2);  // I2C LCD를 TV라는 이름으로 선언

 

 

 

// 온습도 센서를 디지털 3번 핀에 연결합니다.

 

#define DHTPIN 3

 

#define DHTTYPE DHT11

 

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

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

 

int C = 1047; // 도

 

int D = 1175; // 레 

 

int E = 1319; // 미 

 

int F = 1397; // 파 

 

int G = 1568; // 솔 

 

int A = 1760; // 라 

 

int B = 1976; // 시 

 

int piezoPin = 2; // 피에조 부저의 +극을 오렌지보드 2번에 연결

 

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

 

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

 

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

 

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 };

 

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

 

 int notea[] = {4186, 6271};   //서보모터 멜로디

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

 

int irPin = 5;  // 적외선 장애물 센서를 오렌지보드 6번에 연결

 

 

 

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

 

 

 

boolean flag = 0;

 

int Flag;

 

 

 

DHT dht(DHTPIN, DHTTYPE);

 

 

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

 

 

 

void setup() {

 

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

 

  Serial.begin(9600);

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

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

 

 

  dht.begin(); 

 

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

 

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

 

  pinMode(irPin, INPUT);  // 적외선 장애물 센서 핀을 입력핀으로 설정

 

  TV.init(); // I2C LCD의 기본 설정

 

  TV.backlight();  // I2C LCD의 백라이트를 켜줌

 

  TV.setCursor(0, 0); // I2C LCD의 커서위치를 0, 0으로 설정(첫번째 줄, 첫번째 칸)

 

  TV.print("Looking TV...."); // I2C LCD에 "Looking TV...." 메세지 출력

 

}

 


void loop() {

 

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

  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature(); 

  if (isnan(humidity) || isnan(temperature) ) {

 

    Serial.println("Failed to read from DHT sensor!");


    return;


  }

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

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


  Serial.println(discomfortIndex);

 
 

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

  if (discomfortIndex >=  83) {

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


    digitalWrite(airCon, HIGH);

 
    if (flag == 0) {

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

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

        delay(150); 

      } 

      flag = 1;


    }

 
  }

  else {

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

 

    digitalWrite(airCon, LOW);

 

    flag = 0;

 

  }


  delay(1500);

 

int cdsVal = analogRead(A0);

    Serial.println(cdsVal);

  

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

    if (cdsVal < 300) {

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

      if (flag1 == 0) {

        // 멜로디를 출력하고

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

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

          delay(500);

        }

        // 블라인드를 내림

        blind.write(180);

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

        flag1 = 1;

      }

    }

    

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

    else {

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

      if (flag1 == 1) {

        // 블라인드를 올림

        blind.write(80);

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

        flag1 = 0;

      }

    }

 

    delay(100);

 

 

  

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

 

   int IRVal = digitalRead(irPin);

 

    Serial.println(IRVal);

 

 

 

  // 거리가 가까울 경우

 

  if (IRVal == 0) {

 

    if (Flag == 0) {

 

      // 경보 멜로디를 출력

 

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

 

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

 

        delay(150);

 

      }

 

      Flag = 1;

 

    }

 

 

 

    // TV를 끔

 

    TV.noBacklight();

 

  }

 

 

 

  // 거리가 멀 경우

 

  else {

 

    // TV를 킴

 

    TV.backlight();

 

    Flag = 0;

 

  }

 

 

 

  delay(100);

 

}

이전글   |    서브모터와 Interrupt코드 2019-05-29
다음글   |    오렌지보드 BLE 2대 간 통신 질문드립니다. 2019-05-30