智能蓝牙控制、温湿度控制时间风扇

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.效果图

1.jpg
2.jpg
4.jpg
3.jpg
5.jpg
6.jpg

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

posted @ 2019-05-06 16:17  波士地盘  阅读(1034)  评论(0编辑  收藏  举报