智能藍牙控制、溫濕度控制時間風扇
1.理論知識
裝置意義
人的一生中有 80%以上的時間是在室內度過,室內環境品質如聲、光、熱環境及室 內空氣品質對人的身心健康、舒適感和工作效率都會產生顯著的影響。在炎熱的夏 天,基於全球溫室效應下,空調與風扇的利用率將飛速提升,然而風扇與空調相比, 在省電、實惠的前提下適用人群也極為廣泛,例如有一部分身體較弱的老人和小孩群 體度,一就旦更上加升偏或愛下風降扇,的就自又然需風要。重但新傳手統動風調扇檔智,能這化就程導度致不人高們,在風夜速晚檔熟位睡較之少後,會並因且忘溫記 關風扇而感冒,又或者因為室內溫、濕度的升高而感到不適。本選題設計一個多功能 智能電風扇,可檢測人體的溫度,以及外界環境的溫度和濕度,根據三者數據之間差 值的關系與人體舒適度所需大致風力對比,模擬自然風,給人們創造一個舒適的睡眠 環境,防止感冒,又可在節能模式下實現在風扇搖頭的過程中紅外檢測到無人的情況 下化、智能化、環保化和人性化等方向發展,具有一定的市場前景。 風速降低或者停止。既響應了國家節約型社會的號召,又可推動電風扇行業自動。
裝置功能
- 通過藍牙控制風扇開關
- 自動感知溫度濕度開關風扇
- 時鐘報時
前期準備
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 藍牙控制事件
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);
}
}
void scan()
{
for (int i = 0; i < 10; i ++)
{ delay(100);
ly();
}
}
#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);
}
#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);
}
#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);
}
void setup()
{
Serial.begin(9600);
}
void loop()
{
while(Serial.available())
{
char c=Serial.read();
if(c==‘A‘)
{
Serial.println("Hello I am amarino");
}
}
}
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);
if (flag == 0) {
if (hic > 30) {
digitalWrite(FANPIN, HIGH);
} else {
digitalWrite(FANPIN, LOW);
}
}
用戶通過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();
}
參考鏈接:
#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
智能藍牙控制、溫濕度控制時間風扇