1. 程式人生 > >智能藍牙控制、溫濕度控制時間風扇

智能藍牙控制、溫濕度控制時間風扇

idc n! 自定義 反饋 line net 設定 read 頻率

1.理論知識

裝置意義

人的一生中有 80%以上的時間是在室內度過,室內環境品質如聲、光、熱環境及室 內空氣品質對人的身心健康、舒適感和工作效率都會產生顯著的影響。在炎熱的夏 天,基於全球溫室效應下,空調與風扇的利用率將飛速提升,然而風扇與空調相比, 在省電、實惠的前提下適用人群也極為廣泛,例如有一部分身體較弱的老人和小孩群 體度,一就旦更上加升偏或愛下風降扇,的就自又然需風要。重但新傳手統動風調扇檔智,能這化就程導度致不人高們,在風夜速晚檔熟位睡較之少後,會並因且忘溫記 關風扇而感冒,又或者因為室內溫、濕度的升高而感到不適。本選題設計一個多功能 智能電風扇,可檢測人體的溫度,以及外界環境的溫度和濕度,根據三者數據之間差 值的關系與人體舒適度所需大致風力對比,模擬自然風,給人們創造一個舒適的睡眠 環境,防止感冒,又可在節能模式下實現在風扇搖頭的過程中紅外檢測到無人的情況 下化、智能化、環保化和人性化等方向發展,具有一定的市場前景。 風速降低或者停止。既響應了國家節約型社會的號召,又可推動電風扇行業自動。

裝置功能

  1. 通過藍牙控制風扇開關
  2. 自動感知溫度濕度開關風扇
  3. 時鐘報時

前期準備

arduino 算是c/c++的一個實現,很多都是用類寫的,而類是cpp的一大特征。

Arduino是一款便捷靈活、方便上手的開源硬件產品,具有豐富的接口,有數字I/O口,模擬I/O口,能通過各種各樣的傳感器來感知環境,通過控制燈光、馬達和其他裝置來反饋、影響環境。有簡便的編程環境IDE,極大的自由度,可拓展性能也很高。

Arduino,是一個基於開放原始碼的軟硬體平臺,構建於開放原始碼simple I/O介面版,並且具有使用類似Java,C語言的Processing/Wiring開發環境。

Arduino的編程是利用 Arduino編程語言 (基於 Wiring)和Arduino開發環境(based on Processing)來實現 的。基於Arduino的項目,可以只包含Arduino,也可以包含Arduino和其他一些在PC上運行的軟件,他們之間進行通信 (比如 Flash, Processing, MaxMSP)來實現。

C語言是一種計算機程序設計語言,它既具有高級語言的特點,又具有匯編語言的特點, 它可以作為工作系統設計語言,編寫系統應用程序,也可以作為應用程序設計語言,編寫不依賴計算機硬件的應用程序。

2.程序實現與設計

2.1 裝置中的類對象

2.1.1 信號控制類

void ly()

{

  if (Serial.available() > 0)

  {

    Incoming_value = Serial.read();     

    Serial.print(Incoming_value);       

    Serial.print("\n");       

    if (Incoming_value == ‘1‘) flag = 1;

    else if (Incoming_value == ‘0‘) flag = 0 ;

    if (flag != 0)

      if (Incoming_value == ‘y‘)          

        digitalWrite(FANPIN, HIGH);

      else if (Incoming_value == ‘n‘)    

        digitalWrite(FANPIN, LOW); 

  }

}

2.1.2 信號掃描類

void scan()

{

  for (int i = 0; i < 10; i ++)

  { delay(100);

    ly();

  }

}

2.2 裝置中的函數

2.2.1 液晶顯示函數

#include <LiquidCrystal.h>

const int rs = 3, en = 5, d4 = 10, d5 = 11, d6 = 12 d7 = 13;

LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {

    lcd.begin(16, 2);

    //輸出Hello World

    lcd.print("hello, world!");

}

void loop() {

    lcd.setCursor(0, 1);

    lcd.print( millis() / 1000);

}

2.2.2 溫濕度感應函數

#include <dht11.h>

dht11 DHT11;

#define PIN_DHT11 2

void setup()

{

  Serial.begin(9600);

}

void loop()

{

  DHT11.read(PIN_DHT11);

  Serial.print("Humidity (%): ");

  Serial.println((float)DHT11.humidity, 2);

  Serial.print("Temperature (oC): ");

  Serial.println((float)DHT11.temperature, 2);

  delay(500);

}

2.2.3 時鐘函數

#include <RTClib.h>

RTC_DS1307 RTC;

void setup () {

Serial.begin(9600);

RTC.begin();

if (! RTC.isrunning()) {

Serial.println("RTC is NOT running!");

RTC.adjust(DateTime(__DATE__, __TIME__));//采用當前日期和時間初始化芯片中的時間

}

}

void loop () {

DateTime now = RTC.now();

Serial.print(now.year(), DEC);

Serial.print(‘/‘);

Serial.print(now.month(), DEC);

Serial.print(‘/‘);

Serial.print(now.day(), DEC);

Serial.print(‘ ‘);

Serial.print(now.hour(), DEC);

Serial.print(‘:‘);

Serial.print(now.minute(), DEC);

Serial.print(‘:‘);

Serial.print(now.second(), DEC);

Serial.println();

delay(1000);

}

2.2.4 藍牙控制函數

void setup()

{

 Serial.begin(9600);

}

void loop()

{

  while(Serial.available())

   {

     char c=Serial.read();

      if(c==‘A‘)

        {

          Serial.println("Hello I am amarino");

        }

   }

}

2.2.5 風扇控制函數

    if (flag != 0)

      if (Incoming_value == ‘1‘)         

        analogWrite(FANPIN,80);

      else if(Incoming_value == ‘2‘)

        analogWrite(FANPIN,150);

      else if(Incoming_value == ‘3‘)

        analogWrite(FANPIN,255);

      else if (Incoming_value == ‘n‘)     

        digitalWrite(FANPIN, LOW); 

2.3 裝置中的事件

2.3.1 溫度感應觸發事件

  if (flag == 0) {

    if (hic > 30) {

      digitalWrite(FANPIN, HIGH);

    } else {

      digitalWrite(FANPIN, LOW);

    }

  }

2.3.2 藍牙控制事件

用戶通過app藍牙控制輸入y或者n控制風扇開關

2.4 主函數部分

2.4.1 初始化對象

void setup()

{

  // 設定LCD 的行列數目(2 x 16)

  pinMode(FANPIN, OUTPUT);

  digitalWrite(FANPIN, LOW);

  lcd.begin(16, 2);

  Serial.begin(9600);

  Wire.begin();

  RTC.begin();

  RTC.adjust(DateTime(__DATE__, __TIME__));

  lcd.createChar(1, flash1);

  lcd.createChar(2, flash2);

  lcd.createChar(3, flash3);

  lcd.write(1);

  lcd.write(2);

  lcd.write(3);

  dht.begin();

}

2.4.2 全局變量

RTC_DS1307 RTC;

DHT dht(DHTPIN, DHTTYPE);

byte flash1[8] = {0b00100, 0b01000, 0b11000, 0b11111, 0b00011, 0b00010, 0b00100, 0b00000};

byte flash2[8] = {0b00000, 0b00100, 0b01110, 0b11111, 0b11111, 0b11111, 0b01110, 0b00000};

byte flash3[8] = {0b00111, 0b00101, 0b00111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000};

// 初始化針腳

const int rs = 3, en = 5, d4 = 10, d5 = 11, d6 = 12 , d7 = 13;

LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

char Incoming_value = 0;

int flag = 0;

3.效果圖

技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片

4.附錄

#include  <LiquidCrystal.h>
#include  <DHT.h>
#include  <DHT_U.h>
#include  <Arduino.h>
#include  <Wire.h>
#include  <RTClib.h>

#define  DHTPIN A3
#define  FANPIN  6
#define  DHTTYPE DHT11
RTC_DS1307 RTC;
DHT dht(DHTPIN, DHTTYPE);

byte flash1[8] = {0b00100, 0b01000, 0b11000, 0b11111, 0b00011, 0b00010, 0b00100, 0b00000};
byte flash2[8] = {0b00000, 0b00100, 0b01110, 0b11111, 0b11111, 0b11111, 0b01110, 0b00000};
byte flash3[8] = {0b00111, 0b00101, 0b00111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000};

// 初始化針腳
const  int rs =  3, en =  5, d4 =  10, d5 =  11, d6 =  12 , d7 =  13;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
char Incoming_value =  0;
int flag =  0;

void setup()
{
// 設定LCD 的行列數目(2 x 16)
pinMode(FANPIN, OUTPUT);
digitalWrite(FANPIN, LOW);
lcd.begin(16, 2);
Serial.begin(9600);
Wire.begin();
RTC.begin();
RTC.adjust(DateTime(__DATE__, __TIME__));
lcd.createChar(1, flash1);
lcd.createChar(2, flash2);
lcd.createChar(3, flash3);
lcd.write(1);
lcd.write(2);
lcd.write(3);
dht.begin();
}

void  ly()
{
if (Serial.available() >  0)
{
Incoming_value =  Serial.read();
Serial.print(Incoming_value);
Serial.print("\n");
if (Incoming_value ==  ‘l‘) flag =  1;
else  if (Incoming_value ==  ‘w‘) flag =  0 ;
if (flag !=  0)
if (Incoming_value ==  ‘1‘)
analogWrite(FANPIN,80);
else  if(Incoming_value ==  ‘2‘)
analogWrite(FANPIN,150);
else  if(Incoming_value ==  ‘3‘)
analogWrite(FANPIN,255);
else  if (Incoming_value ==  ‘n‘)
digitalWrite(FANPIN, LOW);
}
}

void  scan()
{
for (int i =  0; i <  10; i ++)
{ delay(100);
ly();
}
}

void loop()
{
ly();
// 將光標設到第5列,第2行(第一列第一行為0,0),設置顯示到屏幕第二行中間
float h = dht.readHumidity();
float t = dht.readTemperature();
float hic = dht.computeHeatIndex(t, h, false);
if (flag ==  0) {
if (hic >  30) {
digitalWrite(FANPIN, HIGH);
} else {
digitalWrite(FANPIN, LOW);
}
}
lcd.setCursor(1, 0);
lcd.write(1);
lcd.print("AMAZING FAN!");
lcd.write(2);
scan();
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("H:");
lcd.print(h);
lcd.print("%");
lcd.print(" ");
lcd.setCursor(4, 1);
lcd.print("T:");
lcd.print(hic);
lcd.write(3);
lcd.print("C");
lcd.setCursor(1, 1);
scan();
lcd.clear();
lcd.setCursor(1, 0);
DateTime now = RTC.now();
lcd.print("DATE:");
lcd.print(now.year());
lcd.print(‘/‘);
lcd.print(now.month());
lcd.print(‘/‘);
lcd.print(now.day());
lcd.print(‘ ‘);
lcd.setCursor(1, 1);
lcd.print("TIME:");
lcd.print(now.hour());
lcd.print(‘:‘);
lcd.print(now.minute());
lcd.print(‘:‘);
lcd.print(now.second());
scan();
lcd.clear();
}

參考鏈接:

【1】Arduino連接LCD1602顯示屏

【2】Arduino使用藍牙通信模塊

【3】使用Arduino Uno輸出自定義頻率的PWM

智能藍牙控制、溫濕度控制時間風扇