1101 智慧生活第四組 期末專題

主題:溫暖的家 完成日期:20220114 作者:邱逸庭
 avatar
YTC
c_cpp
2 years ago
4.8 kB
6
Indexable
Never
//***lcd***//
#include<Wire.h>
#include<LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);

//***DHT***//
#include <DHT.h> 
#define DHTPIN 9
#define DHTTYPE DHT11
DHT dht(DHTPIN,DHTTYPE);

//***control***//
int ledpin = 13;
int buttonpin = 2;
int buttonstate = 0;
int klick = 0;
int motor = 8;

//***Declare UltraSonic&&Buzzer***//
int trigPin = 11;    // 超音波感測器 Trig腳接 Arduino pin 11
int echoPin = 12;    //超音波感測器 Echo 腳接 Arduino pin 12
int speakerpin = 7;  //蜂鳴器 + 腳接 Arduino pin 7
float duration, cm ;  //宣告計算距離時,需要用到的兩個實數

//***declare LDR***//
#define LDR 0 //A0腳位
int readLDR = 0; //用以儲存光敏電阻之數值

//////////////////////以上為初始化區域//////////////////
void setup() 
{
  Serial.begin(9600);
  dht.begin();  //初始化DHT
  pinMode(motor,OUTPUT);   //馬達為輸出訊號
  pinMode(buttonpin,INPUT_PULLUP); //設定按鈕為上拉電阻
  pinMode(ledpin,OUTPUT);        //led輸出
  pinMode(trigPin, OUTPUT);      //Arduino 對外啟動距離感測器Trig腳,射出超音波 
  pinMode(echoPin, INPUT);       //超音波被障礙物反射後,Arduino讀取感測器Echo腳的時間差
  pinMode(speakerpin, OUTPUT);   //Arduino對蜂鳴器送出電壓,使其鳴叫
  lcd.init();
  lcd.begin(16, 2); // 初始化LCD
  lcd.setBacklight(255);//背光設置為255
  lcd.clear();
  lcd.setCursor(0, 0);  //設定游標位置 (字,行)
  lcd.print("*Welcome to "); //lcd顯示:“歡迎來到”
  lcd.setCursor(0, 1);
  lcd.print("Sweet H0me!!"); //lcd顯示:“溫暖的家!!”
}

void loop() 
{
   //****************************風扇=可變電阻+直流馬達************************//
   int vr = analogRead(2); //讀取可變電阻之類比訊號
   if(vr > 512){  //如果訊號大於512,則啟動直流馬達
    digitalWrite(motor,HIGH);
    }
   else {
    digitalWrite(motor,LOW);
   }
   delay(390);

//**************************************溫濕度************************//
   float h = dht.readHumidity(); //讀取濕度
   float t = dht.readTemperature(); //讀取溫度
   Serial.println(h);
   Serial.print(t);
//************************************防盜器=超音波加光敏加蜂鳴器*********************************//
   digitalWrite(trigPin, LOW);
   delayMicroseconds(5);
   digitalWrite(trigPin, HIGH);
   delayMicroseconds(10);
   digitalWrite(trigPin, LOW);
   pinMode(echoPin, INPUT);
    
   duration = pulseIn(echoPin, HIGH);   //來回時間長 
    
   cm = (duration/2) / 29.1;           //計算距離
    
   Serial.println(cm);
    
  if (20< cm&&cm <1500 ||h >80){                        // 當超音波偵測到窗戶開啟或者濕度過高,則蜂鳴器會斷斷續續的叫,每次叫0.1秒 
    digitalWrite(speakerpin, HIGH);
    delay (100);
    digitalWrite(speakerpin, LOW);
    delay (100);
    
  }
   //***************************光敏*********************************//
   readLDR = analogRead(LDR);  
   Serial.print(readLDR);
  if(readLDR < 4){   //判斷光敏電阻偵測到的值有沒有小於基準值。
    digitalWrite(ledpin,HIGH);  // 光線暗時讓ledpin第13接腳的LED輸出高電位,LED點亮
    }
  else{
    digitalWrite(ledpin,LOW);   // 光線亮時讓ledpin第13接腳的LED輸出低電位,LED熄滅
  }
  delay(10);                   // 暫停10毫秒=0.01秒
  //***************************按鈕切換lcd顯示**********************//
   buttonstate = digitalRead(buttonpin); //讀取按鈕電位
   Serial.print(buttonstate);
   //***當按鈕未被按下***//
  if(buttonstate ==LOW){    
    delay(100);
    //***display***//
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("humid:"); 
    lcd.setCursor(7,0);
    lcd.print(h);
    lcd.setCursor(14,0);
    lcd.print("%");
  
    lcd.setCursor(0,1);
    lcd.print("Temp:"); //Temp = abbrevitation for Temperature
    lcd.setCursor(7,1);
    lcd.print(t);
    lcd.setCursor(13, 1);
    lcd.print((char)223); //用特殊字元顯示符號的"度"
    lcd.setCursor(14,1);
    lcd.print("C");
    delay(1000);
  }
  //***當按鈕已被按下***//
  if(buttonstate == HIGH){  
   delay(100);  //to prevent from debouncing, we set a time interval of 100 millisecond as an precautionary measure.
  //***Display :distance +illuminance***//
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("dis:");  //超音波所測得之距離distance
   lcd.setCursor(7,0);
   lcd.print(cm);
   lcd.setCursor(14,0);
   lcd.print("cm");
  
   lcd.setCursor(0,1);
   lcd.print("E:");   //照度
   lcd.setCursor(6,1);
   lcd.print(readLDR);  // 光敏電阻所讀取之數值
   lcd.setCursor(12,1);
   lcd.print("lux");  //lux為每單位面積之光通量的SI單位
   delay(1000); 
    }
  
 
}