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