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


    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("
    ");       
    
        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("
    ");
    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

  • 相关阅读:
    Debian安装autoconf
    Linux 解决 bash ./ 没有那个文件或目录 的方法
    C语言strtok()函数:字符串分割
    java.util.logging.Logger使用详解 (转)
    java中Logger.getLogger(Test.class)
    jquery ajax中success与complete的执行顺序 (转)
    navicat如何导入sql文件和导出sql文件
    MySQL修改root密码的多种方法(转)
    查看三种MySQL字符集的方法(转)
    mysql 5.7.13 安装配置方法图文教程(linux) (转)
  • 原文地址:https://www.cnblogs.com/boxker/p/10820328.html
Copyright © 2020-2023  润新知