요약 : 물 펌프 모터가 돌기 시작하면 적외선 리모컨이 먹통이 됩니다.
여기까지가 온도 센서와 연동된 선풍기를 리모컨으로 제어하는 부분입니다.
반응이 매우 느려진 상태로 리모컨이 작동하고요.
무엇보다 자동화 기능들도 모터가 돌기 시작하면 전부 안 먹네요.
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // LCD 라이브러리
#include <DHT.h> // 온습도 센서 라이브러리
#include <Emotion_Farm.h> // 특수 문자 및 이모티콘 라이브러리
#include <IRremote.h>
// 센서 핀 설정
#define relayPin 3 // 생장 led 릴레이 모듈 핀
#define cdsPin A1 // 조도센서 모듈 핀
#define DHTPIN 4 // 온습도센서 모듈 핀
#define DHTTYPE DHT11 // 온습도 센서타입 설정
#define Waterlevel A0 // 토양수분센서 핀
// 객체 생성
LiquidCrystal_I2C lcd(0x27, 16, 2); //LCD 초기화 (LCD 주소값, x축, y축)
DHT dht(DHTPIN, DHTTYPE); //온습도 센서 모듈
// 문자열을 출력하기 위한 변수
char str_M[10];
char str_T[10];
char str_H[10];
int A=8;
int MA = 7;
int MB = 6;
int RE = 13;
IRrecv irrecv(RE);
decode_results results;
void setup() {
Serial.begin(9600);
irrecv.enableIRIn();
pinMode(relayPin, OUTPUT);
pinMode(cdsPin, INPUT);
pinMode(Waterlevel, INPUT);
pinMode(A,OUTPUT);
pinMode(MA,OUTPUT);
pinMode(MB,OUTPUT);
//LCD에 인트로 출력
lcd.begin();
lcd.clear();
lcd.noBacklight();
delay(500);
lcd.backlight();
delay(500);
lcd.setCursor(0,0);
lcd.print("Capstone design");
delay(2000);
lcd.setCursor(0,1);
lcd.print("SMART hydroponics");
delay(2000);
lcd.clear();
// 라이브러리로 추가한 특수 문자 및 이모티콘
lcd.createChar(0, temp);
lcd.createChar(1, C);
lcd.createChar(2, humi);
lcd.createChar(3, Qmark);
lcd.createChar(4, water);
lcd.createChar(5, good);
lcd.createChar(6, wind);
}
void loop() {
//센서값 측정
int cdsValue = analogRead(cdsPin); // 조도센서 값 측정: 0 ~ 1023
int soilmoistureValue = analogRead(Waterlevel); // 수위 측정: 0 ~ 1023
int Waterlevel_per = map(soilmoistureValue, 170, 1023, 100, 0); // 센서 값을 퍼센트로 변경
unsigned char h_Value = dht.readHumidity(); // 습도 값 측정
unsigned char t_Value = dht.readTemperature(); // 온도 값 측정
if(irrecv.decode(&results))
{Serial.println(results.value, HEX);
irrecv.resume();}
if(results.value == 0xFF30CF) {
digitalWrite(relayPin,HIGH);
}
else if(results.value == 0xFF18E7){
digitalWrite(relayPin,LOW);
}
else if(results.value == 0xff7A85){
if(cdsValue < 400){
digitalWrite(relayPin, LOW);
}
else if(cdsValue >= 400){
digitalWrite(relayPin, HIGH);
}
}
if(results.value == 0xFF10EF){
digitalWrite(A,LOW);
}
else if(results.value == 0xFF38c7){
digitalWrite(A,HIGH);
}
else if(results.value == 0xFF5AA5){
if(t_Value >= 29){
digitalWrite(A,LOW);
}
else if(t_Value < 29){
digitalWrite(A,HIGH);
}
}
if(Waterlevel_per < 50){
digitalWrite(MA ,HIGH);
digitalWrite(MB ,LOW);
delay(3000);
digitalWrite(MA,LOW);
digitalWrite(MB,LOW);
delay(3000);
}
else{
digitalWrite(MA,LOW);
digitalWrite(MB,LOW);
}
//LCD에 수위 값 출력
lcd.setCursor(1,0);
lcd.print("Water Lv:");
sprintf(str_M, "%03d", Waterlevel_per);
lcd.print(str_M);
lcd.setCursor(10,0);
lcd.print("%");
//LCD에 온도값 출력
lcd.setCursor(1,1);
lcd.write(0);
sprintf(str_T, "%02d", t_Value);
lcd.setCursor(3,1);
lcd.print(str_T);
lcd.write(1);
//LCD에 습도값 출력
lcd.setCursor(7,1);
lcd.write(2);
sprintf(str_H, "%02d", h_Value);
lcd.setCursor(9,1);
lcd.print(str_H);
lcd.print("%");
//토양습도 값에 따른 LCD에 이모티콘 띄우기
if(Waterlevel_per >= 0 && Waterlevel_per < 30){
lcd.setCursor(13,0);
lcd.write(3);
lcd.setCursor(14,0);
lcd.write(4);
}
else if(Waterlevel_per >= 30 && Waterlevel_per < 70){
lcd.setCursor(13,0);
lcd.print(" ");
lcd.setCursor(14,0);
lcd.write(5);
}
else if(Waterlevel_per >= 70){
lcd.setCursor(13,0);
lcd.write(3);
lcd.setCursor(14,0);
lcd.write(6);
}
delay(500);
}