정보나눔

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

블루투스를 이용한 자동, 수동모드를 위해 반복문 사용시 에러
아우너무어렵 | 2020-11-26

1. 프로젝트 사용한 보드 종류

아두이노 UNO

 

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

아두이노 IDE

회로와 센서 작동에는 문제가없습니다.

 

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

 

#include
#include
#include
#include
#include
#include

#define DHTPIN 7     // 온습도 7번핀 사용
#define DHTTYPE DHT11   // DHT 11 모델사용
#define BT_RXD 4
#define BT_TXD 5
#define PIN            12                              // 제어 신호핀
#define NUMPIXELS      6                             // 제어하고 싶은 LED 개수
#define BRIGHTNESS 180

SoftwareSerial bluetooth(BT_RXD, BT_TXD); // 블루투스 설정 BTSerial(Tx, Rx) 
LiquidCrystal_I2C lcd(0x27,16,2);
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

int WIN1 = 2; //토양습도 모터
int WIN2 = 3;
int a = 1;
int b = 0;
int c = 0;
DHT dht(DHTPIN, DHTTYPE);
const int stepsPerRevolution = 64;
Stepper stepper(stepsPerRevolution, 8, 10, 9, 11);

void setup() 
{
  stepper.setSpeed(220); // 속도 설정
  lcd.init();
  Serial.begin(9600);
  dht.begin();
  pinMode(WIN1,OUTPUT); // 빗방울모터 2개핀 출력
  pinMode(WIN2,OUTPUT);
  pinMode(A0,INPUT); // 토양습도 값 입력으로
  bluetooth.begin(9600);
  pixels.begin();
}

void loop() 

  float h = dht.readHumidity(); // 습도 측정
  float t = dht.readTemperature(); // 섭씨 온도 측정
  int ground = analogRead(A1); // A1 아날로그 값 ground에 저장
  int Raindrops = analogRead(A0); // A0 아날로그 값 raindrops에 저장
  int light = analogRead(A2); // A2 아날로그 값 raindrops에 저장

  lcd.backlight();
  lcd.display();
  lcd.print("TEMP:  ");
  lcd.print(t,1);
  lcd.print(" C");
  lcd.setCursor(0,1);
  lcd.print("HUMI:  ");
  lcd.print(h,1);
  lcd.print(" %");
  

  Serial.print("습도: ");
  Serial.print(h);
  Serial.print(" 온도: ");
  Serial.print(t);
  Serial.println();
  
  Serial.print("토양습도 : "); // 확인하려고 만든 코드
  Serial.println(ground);
  Serial.print("빗방울 감지 : ");
  Serial.println(Raindrops);
  Serial.print("조도센서 값 : ");
  Serial.println(light);
 
  bluetooth.print("습도: ");
  bluetooth.print(h);
  bluetooth.println(" %");
  bluetooth.print("온도: ");
  bluetooth.print(t);
  bluetooth.println(" C");
  
  if(Raindrops>300 && t>26){ // 만약에 빗방울감지되지않고 온도가 27도 보다 높으면 문이 열림
  if(a==1){
  a++;
  stepper.step(map(180,0,360,0,2037));
  delay(100);
  }
  }

  else{ // 비가감지되거나 온도가 26도 이하면 문이닫힘
    if(a>1){
    a=1;
    stepper.step(map(-180,0,-360,0,-2037));
    delay(100);
    }
  }
    
    if(light>300){
    pixels.setPixelColor(0, pixels.Color(255,0,0));
    pixels.setPixelColor(1, pixels.Color(0,255,0));
    pixels.setPixelColor(2, pixels.Color(0,0,255));
    pixels.setPixelColor(3, pixels.Color(0,255,0));
    pixels.setPixelColor(4, pixels.Color(255,0,0));
    pixels.setPixelColor(5, pixels.Color(0,255,0));
    pixels.show();
  }
  
  else {
    pixels.setPixelColor(0, pixels.Color(0,0,0));
    pixels.setPixelColor(1, pixels.Color(0,0,0));
    pixels.setPixelColor(2, pixels.Color(0,0,0));
    pixels.setPixelColor(3, pixels.Color(0,0,0));
    pixels.setPixelColor(4, pixels.Color(0,0,0));
    pixels.setPixelColor(5, pixels.Color(0,0,0));
    pixels.show();
  }
  
    if(ground>400 && c == 0)// 토양습도 값이 400이상(토양이 건조한상태)이면 모터 작동 그 외에는 멈춤
  {
    digitalWrite(WIN1,HIGH); // 모터작동
    digitalWrite(WIN2,LOW);
  }
  else
  {
  digitalWrite(WIN1,LOW); // 모터정지
  digitalWrite(WIN2,LOW);
  }
  
       while(bluetooth.available() > 0){ //블루투스 수신하면 while문 시작
       b = bluetooth.read(); // 블루투스값 b에 저장
       Serial.print(b);
       if(b == 1) {      // b의 값이 1이면
        digitalWrite(WIN1,HIGH); // 모터작동
        digitalWrite(WIN2,LOW);
        Serial.print(b);
       }
       else if(b == 2) {
        digitalWrite(WIN1,LOW); // 모터정지
        digitalWrite(WIN2,LOW);
        Serial.print(b);
       }
       else if(b == 3) {
        pixels.setPixelColor(0, pixels.Color(255,0,0)); // led on
        pixels.setPixelColor(1, pixels.Color(0,255,0));
        pixels.setPixelColor(2, pixels.Color(0,0,255));
        pixels.setPixelColor(3, pixels.Color(0,255,0));
        pixels.setPixelColor(4, pixels.Color(255,0,0));
        pixels.setPixelColor(5, pixels.Color(0,255,0));
        pixels.show();
        Serial.print(b);
       }
       else if(b == 4) {
        pixels.setPixelColor(0, pixels.Color(0,0,0)); // led off
        pixels.setPixelColor(1, pixels.Color(0,0,0));
        pixels.setPixelColor(2, pixels.Color(0,0,0));
        pixels.setPixelColor(3, pixels.Color(0,0,0));
        pixels.setPixelColor(4, pixels.Color(0,0,0));
        pixels.setPixelColor(5, pixels.Color(0,0,0));
        pixels.show();
        Serial.print(b);
       }
       else if(b == 5) // 반복문 나가기
       break;
       }
       Serial.print(b);

  delay(2000); 
  lcd.clear();

}

4. 문제점 및 에러 내용

while문에서 블루투스값을 예를 들어 1을 수신하면 워터펌프가 계속 작동해야하는데 맨 밑의 딜레이 시간만큼만 작동하고 멈춥니다. 확인해 본 결과 블루투스값이 계속 초기화되는데 어떻게 해결해야할지 모르겠습니다. 제가 하고싶은 것은 앱의 버튼을 눌러 블루투스값을 수신하면 반복문 안의 내용이 계속되고 반복문을 나가면 위의 다른 센서들을 동작시키고 싶습니다. 즉 자동수동 모드를 하고싶은데 어떻게 해야할지모르겠네요 ㅠㅠ

이전글   |    PMS값 LCD표시가 안되요. 2020-11-26
다음글   |    오렌지보드BLE를 사용중인데 와이파이를 이용하고싶습니다... 2020-11-27