智能蓝牙控制、温湿度控制时间风扇
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 蓝牙控制事件
用户通过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();
}