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