정보나눔

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

스마트커튼
이형섭 | 2016-11-06

아두이노 소스를 짜고 있는데요. 블루투스 모듈, 온습도센서, 조도센서 를 가지고 모터를 구동시키는 커튼을 만들려고 합니다. 다름이 아니라 지금 가지고 있는 코드로는 작동이 되질 않아서요.

전송값은 1,2,U,D를 쓰려고하는데요  1= 자동모드(1한번더입력시취소) 2=수동모드(2한번더입력시취소)  U= UP =D= DOWN 입니다. 자동모드상태에선 온습도, 조도를 기준으로 자동으로 커튼이 올라가거나 내려가야하고 수동모드상태에선 U D 로 위아래로 동작이 되어야 합니다.

#include <SoftwareSerial.h> //시리얼 통신 라이브러리 호출
#include <DHT11.h>    //라이브러리 불러옴
DHT11 dht11(6);
int BT;
int flag = 0;
int light; 
int blueTx=2;   //Tx (보내는핀 설정)
int blueRx=3;   //Rx (받는핀 설정)
SoftwareSerial mySerial(blueTx, blueRx);  //시리얼 통신을 위한 객체선언
String myString=""; //받는 문자열
 
void setup() {
  Serial.begin(9600);   //시리얼모니터
  mySerial.begin(9600); //블루투스 시리얼 개방
  pinMode(12,OUTPUT);
  // 9번핀을 출력으로 설정합니다. 강제 정지 기능을 담당합니다.
  pinMode(9,OUTPUT);
}
 
void Sensing()
{
  int err;
  float temp, humi;
  Serial.println("inner");
  if((err=dht11.read(humi, temp)) == 0) //온도, 습도 읽어와서 표시
  {
    Serial.print("temperature:");
    Serial.print(temp);
    Serial.print(" humidity:");
    Serial.print(humi);
    Serial.println();
  }
else //에러일 경우 처리
  {
    Serial.println();
    Serial.print("Error No :");
    Serial.print(err);
    Serial.println();   
  }
  delay(1000);                        //1초마다 측정
}
void Cutton_On()
{
  Serial.println("motor start");
  digitalWrite(12,HIGH);
  // 강제 정지 기능은 LOW 상태로 두며
  digitalWrite(9,LOW);
  // 100의 값으로 PWM을 제어합니다.
  analogWrite(3,100);
  //3초간 대기합니다.
  delay(3000);
  Serial.println("stop!");
  // 강제 정지 기능을 실행합니다.
  digitalWrite(9,HIGH);
  // 1초간 대기합니다.
  delay(1000); 
}
void Cutton_Off()
{
  Serial.println("motor stop");
  digitalWrite(12,LOW);
  // 강제 정지 기능을 LOW상태로 둡니다.
  digitalWrite(9,LOW);
  // 50의 값으로 PWM (속도)를 조절합니다.
  analogWrite(3,100);
  // 3초간 대기합니다.
  delay(3000);
  Serial.println("stop!");
  // 강제 정지 기능을 실행합니다.
  digitalWrite(9,HIGH);
  // 1초간 대기합니다.
  delay(1000);  
}
void loop() {
  while(mySerial.available())  //mySerial 값이 있으면
  {
    char myChar = (char)mySerial.read();  //mySerial int형식의 값을 char형식으로 변환
    myString+=myChar;   //수신되는 문자열을 myString에 모두 붙임 (1바이트씩 전송되는 것을 모두 붙임)
    delay(5);           //수신 문자열 끊김 방지
  }
 
  if(!myString.equals(""))  //myString 값이 있다면
  {
    Serial.println("input value: "+myString); //시리얼모니터에 myString값 출력
 
      if(myString=="on")  //myString 값이 'on' 이라면
     
      {
        Serial.println("on!!");
      Sensing();
     // Auto_Mode();
      Cutton_On();
      }
      if(myString=="off")  //myString 값이 'on' 이라면
      {
        Serial.println("off!!");
      Sensing();
      //Hand_Mode(); 
      Cutton_Off();
      }
    myString="";  //myString 변수값 초기화
  }
}

void Auto_Mode()
{
  light = analogRead(A4);
  //brightness control
  if(light < 500 && flag == 0)
  {
    Cutton_On();
    flag = 1;
    Serial.println(flag);
  }
  else if(light >= 500 && flag == 1)
  {
    Cutton_Off();
    flag = 0;
    Serial.println(flag);
  }
}

void Hand_Mode()                // 라이트 어플리케이션 수동모드
{
  while(!mySerial.available())  // 블루투스 데이터 값이 들어올 때까지 동작 대기
  if(mySerial.available())      // 블루투스 데이터가 수신 될 경우
  {
    BT = mySerial.read();       // 블루투스로 수신된 데이터를 BT 변수에 저장
    if(BT == 'd'&& flag == 0)   // BT에 저장된 값이 d이며, 플래그가 0일 경우
    {
      Cutton_On();              // 커튼 동작 함수
      flag = 1;                 // 플래그 SET
    }
    else if(BT == 'u'&& flag == 1) // BT에 저장된 값이 u이며, 플래그가 1일 경우
    {
      Cutton_Off();                // 커튼 동작 함수
      flag = 0;                    // 플래그 RESET
    }
    else
    {
    }
  }
   
}
지금 이 코드에서 무엇을 수정하고 추가해야 할까요 ? 제발 부탁드립니다 ㅠ

이전글   |    금고만들기 2016-11-06
다음글   |    피에조 부저 소리 증폭 2016-11-06