본문 바로가기
임베디드/Arduino

아침 저녁 커텐 servo 알람중지 led 온도 습도 dht LCD cds

by sj0020 2020. 9. 10.

lcd없는코드

#include "DHT.h"
#include<Servo.h> //Servo 라이브러리를 추가

#define DHTPIN 8
#define DHTTYPE DHT11
#define BUTTON_PIN1 2 //인터럽트 
#define BUZZER 6

DHT dht(DHTPIN, DHTTYPE);
int ledRed = 11;
int cds = A0;
Servo servo;      //Servo 클래스로 servo객체 생성
int angle = 0;   //Servo 각도를 조절할 변수 angle
const int buttonPin1 = 2; // 인터럽트 0
volatile long preTime = 0;
volatile long curTime = 0;
const int deBounce = 200;
volatile int checkBtn;
volatile int flag = 0;
static bool b=0; // buzzer low=0 으로 설정



void setup() {
  Serial.begin(9600);
  pinMode(ledRed, OUTPUT);
  //Serial.println(F("DHTxx test!"));
  dht.begin();
  pinMode(BUZZER, OUTPUT);
  servo.attach(12);     //맴버함수인 attach : 핀 설정
  servo.write(0);
  attachInterrupt(digitalPinToInterrupt(buttonPin1), buttonInterrupt1, FALLING);
  flag = 0;
  digitalWrite(BUZZER, LOW);

}

void loop() {
  float h = dht.readHumidity(); //dht11
  float t = dht.readTemperature();
  delay(500);
  
  //cds 조도센서
  int cdsValue = analogRead(cds);  // 조도센서로 부터 측정된 밝기 값을 읽어 cdsValue라는 변수에 저장  
  //Serial.print("cds =  ");  // 측정된 밝기 값를 시리얼 모니터에 출력
  Serial.println(cdsValue);
  
  
  if (cdsValue > 500) { //밝을때
    servo.write(90);
    digitalWrite(ledRed, LOW);
    //Serial.println("LED OFF (cds > 500)");
    b=1; // buzzer high=1 으로 바꿈
    Serial.print("flag = ");
    Serial.println(flag);
    
    if (flag == 3){
      Serial.print("flag = ");
      Serial.println(flag);
      b=0; // buzzer low=0 으로 바꿈
      delay(500);
      Serial.print(F("Humidity: "));
      Serial.print(h);
      Serial.print("% \t" );
      Serial.print(F("Temperature: "));
      Serial.print(t);
      Serial.println(F("°C "));
    }
  }

  else { //어두울때
    digitalWrite(ledRed, HIGH);
    //Serial.println("LED ON (cds < 500)");
    servo.write(180);
    flag=0;
    b=0; // buzzer low=0 으로 바꿈. 어두우면 알람 꺼지게.
    Serial.print("flag = ");
    Serial.println(flag);    
  }
  
  Serial.print(F("Humidity: "));
  Serial.print(h);
  Serial.print("% \t" );
  Serial.print(F("Temperature: "));
  Serial.print(t);
  Serial.println(F("°C "));
  //delay(2000); //너무 많이 프린트 되서 딜레이 넣었는데 딜레이 넣으면 조도센서 반응속도 느림. 딜레이 위에 500넣어주면 괜찮음
  
  digitalWrite(BUZZER, b); //buzzer 출력. b에 0,1 값이 들어감
}

void buttonInterrupt1() {
  curTime = millis();
  if(curTime - preTime >= deBounce) {
    uint8_t oldSREG = SREG;
    cli();
    Serial.println("버튼눌림. 알람off");
    flag = 3; // loop 속의 if flag 3로 들어가서 부저 끔
    preTime = curTime;
    SREG = oldSREG;
  }
}

 

lcd 추가한 코드

더보기

3, yellow
4, white
5 grey
7 purple
10 blue
13 green

#include "DHT.h"
#include<Servo.h> //Servo 라이브러리를 추가
#include<LiquidCrystal.h> //LCD 라이브러리를 추가

#define DHTPIN 8
#define DHTTYPE DHT11
#define BUTTON_PIN1 2 //인터럽트 
#define BUZZER 6

DHT dht(DHTPIN, DHTTYPE);
int ledRed = 11;
int cds = A0;
Servo servo;      //Servo 클래스로 servo객체 생성
int angle = 0;   //Servo 각도를 조절할 변수 angle
const int buttonPin1 = 2; // 인터럽트 0
volatile long preTime = 0;
volatile long curTime = 0;
const int deBounce = 200;
volatile int checkBtn;
volatile int flag = 0;
static bool b=0; // buzzer low=0 으로 설정
LiquidCrystal lcd(3, 4, 5, 7, 10, 13);


void setup() {
  Serial.begin(9600);
  pinMode(ledRed, OUTPUT);
  //Serial.println(F("DHTxx test!"));
  dht.begin();
  pinMode(BUZZER, OUTPUT);
  servo.attach(12);     //맴버함수인 attach : 핀 설정
  servo.write(0);
  attachInterrupt(digitalPinToInterrupt(buttonPin1), buttonInterrupt1, FALLING);
  flag = 0;
  digitalWrite(BUZZER, LOW);
  lcd.begin(16, 2);//16열 2행짜리 LCD를 사용하겠다.

}

void loop() {
  float h = dht.readHumidity(); //dht11
  float t = dht.readTemperature();
  delay(500);
  
  //cds 조도센서
  int cdsValue = analogRead(cds);  // 조도센서로 부터 측정된 밝기 값을 읽어 cdsValue라는 변수에 저장  
  Serial.print("cds =  ");  // 측정된 밝기 값를 시리얼 모니터에 출력
  Serial.println(cdsValue);
  //static bool b=0; // buzzer low=0 으로 설정
  
  if (cdsValue > 500) { //밝을때
    servo.write(90);
    digitalWrite(ledRed, LOW);
    //Serial.println("LED OFF (cds > 500)");
    b=1; // buzzer high=1 으로 바꿈
    Serial.print("flag = ");
    Serial.println(flag);
    
    
    
    if (flag == 3){
      Serial.print("flag = ");
      Serial.println(flag);
      b=0; // buzzer low=0 으로 바꿈
      delay(500);
      Serial.print(F("Humidity: "));
      Serial.print(h);
      Serial.print("% \t" );
      Serial.print(F("Temperature: "));
      Serial.print(t);
      Serial.println(F("°C "));
      
         
    }
  }

  else { //어두울때
    digitalWrite(ledRed, HIGH);
    //Serial.println("LED ON (cds < 500)");
    servo.write(180);
    flag=0;
    b=0; // buzzer low=0 으로 바꿈. 어두우면 알람 꺼지게.
    Serial.print("flag = ");
    Serial.println(flag);
    
  }
  
  Serial.print(F("Humidity: "));
  Serial.print(h);
  Serial.print("% \t" );
  Serial.print(F("Temperature: "));
  Serial.print(t);
  Serial.println(F("°C "));
  //delay(2000); //너무 많이 프린트 되서 딜레이 넣었는데 딜레이 넣으면 조도센서 반응속도 느림. 딜레이 위에 500넣어주면 괜찮음
  lcd.setCursor(2, 0);  //커서를 (5, 0)으로 보내라
  lcd.print(h);
  
  lcd.setCursor(9, 0); 
  lcd.print(t);

  lcd.setCursor(2, 1); 
  lcd.print("flag=");
  lcd.setCursor(7, 1); 
  lcd.print(flag);
  
  lcd.setCursor(9, 1); 
  lcd.print(cdsValue);
  
  
    
  
  digitalWrite(BUZZER, b); //buzzer 출력. b에 0,1 값이 들어감
}

void buttonInterrupt1() {
  curTime = millis();
  if(curTime - preTime >= deBounce) {
    uint8_t oldSREG = SREG;
    cli();
    Serial.println("버튼눌림. 알람off");
    flag = 3; // loop 속의 if flag 3로 들어가서 부저 끔
    preTime = curTime;
    SREG = oldSREG;
  }
}

 

DigitalWrite(BUZZER, LOW);  low/high 가 아니라 static bool b=0;  0 /1 로 부저 끔 켬 조절하는 이유 :

밝을 때 digitalWrite를 쓰면 high 이든 low 이든 어쨌든 부저를 동작 시키는 것임. 그래서 digitalWrite를 쓰면 밝을 때 flag를 눌렀을 때 부저가 뚞뚝 거리는 소리 발생함 ... digitalWrite 땜에 부저가 계속 동작하고 있어서 ..

그래서 밝을때/ 어두울때/ 버튼 눌렸을 때 모두 b의 값만 바꿔주고

루프의 끝에 digitalWrite(BUZZER, b); 를 넣어주면 부저는 한번만 동작하는 것이 되어서 뚝뚝 거리는 현상 없어짐

 

static bool b=0; 은  위 코드처럼 가장 위에 넣어줘도 되고 루프 속에 선언해줘도 동일하게 동작함

 

 

'임베디드 > Arduino' 카테고리의 다른 글

arduino pin map  (0) 2020.09.15
CLCD16x2  (0) 2020.09.10
I2C LCD (아이스퀘어 LCD) , CLCD 2X16 16핀  (0) 2020.09.10
서보모터  (0) 2020.09.09
0909 신호등 동작 처리 선생님코드  (0) 2020.09.09