wqkzplt 发表于 2016-1-12 20:08:31

智能小风扇

本帖最后由 wqkzplt 于 2016-1-12 20:08 编辑

多功能风扇                                                                                              姓名:吴乾坤、赵鹏、刘通                                                   实验对象:智能家居-多功能风扇                         时间:2015年1月12日                                     一、应用与概述 在解决了基础物质生活需求的今天,随着科技的不断进步,人们的生活受到了潜移默化的影响,生活质量也不断得到提高。促使人们开始追求家庭生活现代化、居住环境舒适化、安全化等,为此智能家居也随之而生。它改变的不仅仅是家电产品的功能,而是生活方式,给消费者带来的便捷令人神往。二、实验目的    通过试验研究出智能家居多功能小风扇,使其能够实现远程红外遥控风速、转动方式等,还可以通过温度的变化而改变风速。并通过液晶显示器显示出时间、气温,并带有智能健康提醒功能。 三、实验器材1.主控板Arduino主板1个面包板1个按键开关2个红外传感器1个滑动变阻器1个温度传感器1个小风扇1个倾斜开关1个液晶显示屏1个220欧姆电阻2个导线若干2.风扇摆动板Arduino主板1个面包板1个舵机1个红色LED灯1个220欧姆电阻1个导线若干3.水位板Arduino主板1个面包板1个七彩LED灯1个蜂鸣器1个滑动变阻器1个光敏电阻1个水位传感器一个导线若干 四、总体结构与原理1主控模块通过时间函数让液晶屏显示时间及温度,通过摁动按键可调节时间,小风扇受滑动变阻器、温度传感器、倾斜开关控制,红外可遥控风扇转速的调节方式(人为滑动变阻器调控、温度自动调控)。倾斜开关起到安全作用,当风扇倾倒,电路自动断电。连接图如下:



程序设计如下:#include <IRremote.h>////////红外线定义#include <LiquidCrystal.h>#include <TimerOne.h>#define LM35 A0#define KEY_Min 6#define KEY_Hour 7LiquidCrystal lcd(12,11,5,4,3,2);                                                 //构造一个LiquidCrystal的类成员。使用数字IO 12,11,5,4,3,2int RECV_PIN = 10;int LED1 = 9;int LED2 = 2;int LED3 = 3;int LED4 = 4;int LED5 = 5;int LED6 = 6;long on1= 0x00FFA25D;long off1 = 0x00FFE01F;long on2 = 0x00FF629D;long off2 = 0x00FFA857;long on3 = 0x00FFE21D;long off3 = 0x00FF906F;long on4 = 0x00FF22DD;long f0 = 0x00FF6897;long on5 = 0x00FF02FD;long f100 = 0x00FF9867;long on6 = 0x00FFC23D;long f200 = 0x00FFB04F;long f1 = 0x00FF30CF;long f2 = 0x00FF18E7;long f3 = 0x00FF7A85;long f4 = 0x00FF10EF;long f5 = 0x00FF38C7;long f6 = 0x00FF5AA5;long f7 = 0x00FF42BD;long f8 = 0x00FF4AB5;long f9 = 0x00FF52AD;int val = 0;                                                                                                //存放AD变量值float temp = 0;                                                                         int potpin=1;//定义模拟接口0                                                      //存放温度值的10倍int ledpin=9;//定义数字接口9(PWM 输出)int hero=0;// 暂存来自传感器的变量数值char timeBuf = {0 ,0 ,0};IRrecv irrecv(RECV_PIN);decode_results results;// Dumps out the decode_results structure.// Call this after IRrecv::decode()// void * to work around compiler issue//void dump(void *v) {//decode_results *results = (decode_results *)vvoid dump(decode_results *results) {int count = results->rawlen;if (results->decode_type == UNKNOWN){    Serial.println("Could not decode message");}else{    if (results->decode_type == NEC)    {      Serial.print("Decoded NEC: ");    }    else if (results->decode_type == SONY)    {      Serial.print("Decoded SONY: ");    }    else if (results->decode_type == RC5)    {      Serial.print("Decoded RC5: ");    }    else if (results->decode_type == RC6)    {      Serial.print("Decoded RC6: ");    }    Serial.print(results->value, HEX);    Serial.print(" (");    Serial.print(results->bits, DEC);    Serial.println(" bits)");}Serial.print("Raw (");Serial.print(count, DEC);Serial.print("): "); for (int i = 0; i < count; i++){    if ((i % 2) == 1) {      Serial.print(results->rawbuf*USECPERTICK, DEC);    }    else     {      Serial.print(-(int)results->rawbuf*USECPERTICK, DEC);    }    Serial.print(" ");}Serial.println("");}int on = 0;                                                                                       unsigned long last = millis();////////红外线定义完 void setup()///////////////////////////////////////////////////////////////////////////////////{ lcd.begin(16,2);                                                                        //初始化LCD1602lcd.print("Welcome to use!");                                                   //液晶显示Welcome to use!delay(1000);                                                                                           //延时1000mslcd.clear();                                                                                             //液晶清屏Serial.begin(9600);pinMode(KEY_Min,INPUT_PULLUP);                                    //定义KEY为带上拉输入引脚pinMode(KEY_Hour,INPUT_PULLUP);                                     //定义KEY为带上拉输入引脚pinMode(ledpin,OUTPUT);//定义数字接口11 为输出//init timer, 1sec interrupt pinMode(RECV_PIN, INPUT);////////红外线初始化pinMode(LED1, OUTPUT);pinMode(LED2, OUTPUT);pinMode(LED3, OUTPUT);pinMode(LED4, OUTPUT);pinMode(LED5, OUTPUT);pinMode(LED6, OUTPUT); pinMode(13, OUTPUT);Serial.begin(9600);irrecv.enableIRIn(); // Start the receiver////////红外线初始化完}void timeDisplay(){lcd.setCursor(0,0);            //设置液晶开始显示的指针位置lcd.print("time: ");                                                                           //液晶显示timeBuf++;if (timeBuf == 60){    timeBuf = 0;    timeBuf++;    if ( timeBuf == 60)    {      timeBuf = 0;      timeBuf ++;      if(timeBuf == 24)      {      timeBuf = 0;      }     }} lcd.print(timeBuf/10);lcd.print(timeBuf%10);lcd.print(":");lcd.print(timeBuf/10);lcd.print(timeBuf%10);lcd.print(":");lcd.print(timeBuf/10);lcd.print(timeBuf%10);lcd.print("");} void ScanKey()                                                                                                      //按键扫描程序{if(digitalRead(KEY_Min) == LOW)                                                //有按键按下2w{    delay(20);                                                                                                         //延时去抖动    if(digitalRead(KEY_Min) == LOW)                                       //有按键按下    {      timeBuf++;      if ( timeBuf == 60)      {      timeBuf = 0;      timeBuf ++;      if(timeBuf == 24)      {          timeBuf = 0;      }       }    }}if(digitalRead(KEY_Hour) == LOW)                                                //有按键按下{    delay(20);                                                                                                         //延时去抖动    if(digitalRead(KEY_Hour) == LOW)                                              //有按键按下    {      timeBuf ++;      if(timeBuf == 24)      {      timeBuf = 0;      }          }} } void (*resetFunc)(void)=0;int n;void loop()/////////////////////////////////////////////////////////////////////////////////////// { // Timer1.initialize(1000000); // initialize timer1 and set interrupt periodtimeDisplay();val = analogRead(LM35);                                                          //读取AD值temp = val * 4.8876;                                                                        //转换为温度值的10倍,有利于液晶显示 Serial.print("LM35 = ");                                                         Serial.println(temp/10);                                                                           //串口输出温度值//timeDisplay();ScanKey();//lcd.setCursor(0,0);                                                                              //设置液晶开始显示的指针位置//lcd.print("time: 22:43:43");                                                lcd.setCursor(0,1);                                                                                  //设置液晶开始显示的指针位置lcd.print("temp: ");                                                                           //液晶显示温度整数值lcd.print((int)temp/10);                                                             //液晶显示温度整数值lcd.print(".");                                                                                                       //液晶显示小数点lcd.print((int)temp%10);                                                         //液晶显示温度小数值 lcd.print((char)223);                                                                        //液晶显示“°”lcd.print("C    ");                                                                                             //液晶显示“C”delay(1000);if (results.value == on4 ){    n=15;    while(1)    {      hero=analogRead(potpin );// 读取传感器的模拟值并赋值给val      Serial.println(hero);//显示val 变量                                       analogWrite(ledpin,hero/4);// 打开LED 并设置亮度(PWM 输      delay(10);//延时0.01 秒       timeDisplay();       delay(1000);      if (irrecv.decode(&results)) ////////红外线功能      {      // If it's been at least 1/4 second since the last      // IR received, toggle the relay      if (millis() - last > 250)      {          on = !on;          //   digitalWrite(8, on ? HIGH : LOW);          digitalWrite(13, on ? HIGH : LOW);          dump(&results);      }      if (results.value == f0 )      {          digitalWrite(9,LOW);          break;      }      }     }}if (results.value == on5 ){//n=5;    while(1)    {      val = analogRead(LM35);                                                   //读取AD值      temp = val * 4.8876;                                                               //转换为温度值的10倍,有利于液晶显示       Serial.print("LM35 = ");                                                          Serial.println(temp/10);                                                                  //串口输出温度值      ScanKey();      //lcd.setCursor(0,0);                                                                         //设置液晶开始显示的指针位置      //lcd.print("time: 22:43:43");                                                 lcd.setCursor(0,1);                                                                           //设置液晶开始显示的指针位置      lcd.print("temp: ");                                                                  //液晶显示温度整数值      lcd.print((int)temp/10);                                                      //液晶显示温度整数值      lcd.print(".");                                                                                                //液晶显示小数点      lcd.print((int)temp%10);                                                    //液晶显示温度小数值       lcd.print((char)223);                                                               //液晶显示“°”      lcd.print("C    ");                                                                                        //液晶显示“C”      delay(500);      analogWrite(ledpin,(temp/10-18)*255/9);// 打开LED 并设置亮度(PWM 输      delay(10);//延时0.01 秒timeDisplay();      if (irrecv.decode(&results)) ////////红外线功能      {      // If it's been at least 1/4 second since the last      // IR received, toggle the relay      if (millis() - last > 250)      {          on = !on;          //   digitalWrite(8, on ? HIGH : LOW);          digitalWrite(13, on ? HIGH : LOW);          dump(&results);      }      if (results.value == f100 )      {          digitalWrite(9,LOW);          break;      }      }     }}/*if (results.value == on3 )   {   n=5;   while(1)   {   digitalWrite(2,HIGH);   for (pos=0;pos<180;pos+=1)//舵机功能3 急回摇头   {   myservo.write(pos);//   delay(n);//逆   }   for (pos=180;pos>=1;pos-=1)//   {   myservo.write(pos);//   delay(n+15);//顺   }   if (irrecv.decode(&results)) ////////红外线功能   {   // If it's been at least 1/4 second since the last   // IR received, toggle the relay   if (millis() - last > 250)   {   on = !on;   //   digitalWrite(8, on ? HIGH : LOW);   digitalWrite(13, on ? HIGH : LOW);   dump(&results);   }   if (results.value == off3 )   {   while(1)   {digitalWrite(2,LOW);   resetFunc();   }   }   }   ////////舵机3功能完   }   }*/ if (irrecv.decode(&results)) ////////红外线功能{    // If it's been at least 1/4 second since the last    // IR received, toggle the relay    if (millis() - last > 250)    {      on = !on;      //   digitalWrite(8, on ? HIGH : LOW);      digitalWrite(13, on ? HIGH : LOW);      dump(&results);    }    // if (results.value == off1 )    //digitalWrite(LED1, LOW);     last = millis();       irrecv.resume(); // Receive the next value}//////////////////////////红外线功能完}2.舵机模块通过红外遥控,可控制舵机的摆动状态,由此控制小风扇的摆动。电路连接如下:





程序设计如下:#include <IRremote.h>////////红外线定义int RECV_PIN = 11;int LED1 = 9;int LED2 = 2;int LED3 = 3;int LED4 = 4;int LED5 = 5;int LED6 = 6;long on1= 0x00FFA25D;long off1 = 0x00FFE01F;long on2 = 0x00FF629D;long off2 = 0x00FFA857;long on3 = 0x00FFE21D;long off3 = 0x00FF906F;long on4 = 0x00FF22DD;long f0 = 0x00FF6897;long on5 = 0x00FF02FD;long f100 = 0x00FF9867;long on6 = 0x00FFC23D;long f200 = 0x00FFB04F;long f1 = 0x00FF30CF;long f2 = 0x00FF18E7;long f3 = 0x00FF7A85;long f4 = 0x00FF10EF;long f5 = 0x00FF38C7;long f6 = 0x00FF5AA5;long f7 = 0x00FF42BD;long f8 = 0x00FF4AB5;long f9 = 0x00FF52AD;IRrecv irrecv(RECV_PIN);decode_results results;// Dumps out the decode_results structure.// Call this after IRrecv::decode()// void * to work around compiler issue//void dump(void *v) {//decode_results *results = (decode_results *)vvoid dump(decode_results *results) {int count = results->rawlen;if (results->decode_type == UNKNOWN){    Serial.println("Could not decode message");}else{    if (results->decode_type == NEC)    {      Serial.print("Decoded NEC: ");    }    else if (results->decode_type == SONY)    {      Serial.print("Decoded SONY: ");    }    else if (results->decode_type == RC5)    {      Serial.print("Decoded RC5: ");    }    else if (results->decode_type == RC6)    {      Serial.print("Decoded RC6: ");    }    Serial.print(results->value, HEX);    Serial.print(" (");    Serial.print(results->bits, DEC);    Serial.println(" bits)");}Serial.print("Raw (");Serial.print(count, DEC);Serial.print("): "); for (int i = 0; i < count; i++){    if ((i % 2) == 1) {      Serial.print(results->rawbuf*USECPERTICK, DEC);    }    else     {      Serial.print(-(int)results->rawbuf*USECPERTICK, DEC);    }    Serial.print(" ");}Serial.println("");}int on = 0;                                                                                       unsigned long last = millis();////////红外线定义完 #include <Servo.h>////////舵机定义Servo myservo;                                                                        int pos = 0;                                                                               ////////舵机定义完 void setup()///////////////////////////////////////////////////////////////////////////////////{ myservo.attach(9);//舵机初始化9     pinMode(RECV_PIN, INPUT);////////红外线初始化pinMode(LED1, OUTPUT);pinMode(LED2, OUTPUT);pinMode(LED3, OUTPUT);pinMode(LED4, OUTPUT);pinMode(LED5, OUTPUT);pinMode(LED6, OUTPUT); pinMode(13, OUTPUT);Serial.begin(9600);irrecv.enableIRIn(); // Start the receiver////////红外线初始化完} void (*resetFunc)(void)=0;int n;void loop()/////////////////////////////////////////////////////////////////////////////////////// {if (results.value == on1 ){    n=15;    while(1)    {      digitalWrite(2,HIGH);      for (pos=0;pos<180;pos+=1)//舵机功能1 缓和摇头      {      myservo.write(pos);//      delay(n);//逆      }      for (pos=180;pos>=1;pos-=1)//      {      myservo.write(pos);//      delay(n);//顺       }      if (irrecv.decode(&results)) ////////红外线功能      {      // If it's been at least 1/4 second since the last      // IR received, toggle the relay      if (millis() - last > 250)      {          on = !on;          //   digitalWrite(8, on ? HIGH : LOW);          digitalWrite(13, on ? HIGH : LOW);          dump(&results);      }      if (results.value == off1 )      {          while(1)          {digitalWrite(2,LOW);            resetFunc();          }      }      }      ////////舵机功能1完    }}if (results.value == on2 ){    n=5;    while(1)    {      digitalWrite(2,HIGH);      for (pos=0;pos<180;pos+=1)//舵机功能2 快速摇头      {      myservo.write(pos);//      delay(n);//逆      }      for (pos=180;pos>=1;pos-=1)//      {      myservo.write(pos);//      delay(n);//顺       }      if (irrecv.decode(&results)) ////////红外线功能      {      // If it's been at least 1/4 second since the last      // IR received, toggle the relay      if (millis() - last > 250)      {          on = !on;          //   digitalWrite(8, on ? HIGH : LOW);          digitalWrite(13, on ? HIGH : LOW);          dump(&results);      }      if (results.value == off2 )      {          while(1)          {digitalWrite(2,LOW);          resetFunc();          }      }      }      ////////舵机功能2完    }}if (results.value == on3 ){    n=5;    while(1)    {      digitalWrite(2,HIGH);      for (pos=0;pos<180;pos+=1)//舵机功能3 急回摇头      {      myservo.write(pos);//      delay(n);//逆      }      for (pos=180;pos>=1;pos-=1)//      {      myservo.write(pos);//      delay(n+15);//顺       }      if (irrecv.decode(&results)) ////////红外线功能      {      // If it's been at least 1/4 second since the last      // IR received, toggle the relay      if (millis() - last > 250)      {          on = !on;          //   digitalWrite(8, on ? HIGH : LOW);          digitalWrite(13, on ? HIGH : LOW);          dump(&results);      }      if (results.value == off3 )      {          while(1)          {digitalWrite(2,LOW);            resetFunc();          }      }      }      ////////舵机3功能完    }} if (irrecv.decode(&results)) ////////红外线功能{    // If it's been at least 1/4 second since the last    // IR received, toggle the relay    if (millis() - last > 250)    {      on = !on;      //   digitalWrite(8, on ? HIGH : LOW);      digitalWrite(13, on ? HIGH : LOW);      dump(&results);    }    // if (results.value == off1 )    //digitalWrite(LED1, LOW);          last = millis();       irrecv.resume(); // Receive the next value}//////////////////////////红外线功能完}3.水位模块通过光敏电阻感光,若天黑,则不发出任何报警;当天亮时,如杯子中有水,则蜂鸣器发出音乐、七彩灯闪烁报警,提醒喝水(音量可通过滑动变阻器控制);当水被喝光时,通过水位传感器关掉报警装置。电路连接如下:
程序设计如下:int potpin=0;//����ģ��ӿ�0 ���ӹ�������int ledpin=12;//�������ֽӿ�11 ���PWM ����LED ����int val;//�������valint buzzer=10;int pin=1;int vall;void setup(){pinMode(ledpin,OUTPUT);//�������ֽӿ�11 Ϊ���Serial.begin(9600);//���ò�����Ϊ9600}void loop(){val=analogRead(potpin);vall=analogRead(pin); if(val<950){    digitalWrite(ledpin, HIGH);#define NTD0 -1#define NTD1 294#define NTD2 330#define NTD3 375#define NTD4 393#define NTD5 441#define NTD6 495#define NTD7 556 #define NTDL1 147#define NTDL2 165#define NTDL3 175#define NTDL4 196#define NTDL5 221#define NTDL6 248#define NTDL7 278 #define NTDH1 589#define NTDH2 661#define NTDH3 700#define NTDH4 786#define NTDH5 882#define NTDH6 990#define NTDH7 112    //列出全部D调的频率#define WHOLE 1#define HALF 0.5#define QUARTER 0.25#define EIGHTH 0.25#define SIXTEENTH 0.625    //列出所有节拍    int tune[]=               //根据简谱列出各频率    {      NTD3,NTD3,NTD4,NTD5,      NTD5,NTD4,NTD3,NTD2,      NTD1,NTD1,NTD2,NTD3,      NTD3,NTD2,NTD2,      NTD3,NTD3,NTD4,NTD5,      NTD5,NTD4,NTD3,NTD2,      NTD1,NTD1,NTD2,NTD3,      NTD2,NTD1,NTD1,      NTD2,NTD2,NTD3,NTD1,      NTD2,NTD3,NTD4,NTD3,NTD1,      NTD2,NTD3,NTD4,NTD3,NTD2,      NTD1,NTD2,NTDL5,NTD0,      NTD3,NTD3,NTD4,NTD5,      NTD5,NTD4,NTD3,NTD4,NTD2,      NTD1,NTD1,NTD2,NTD3,      NTD2,NTD1,NTD1    };    float durt[]=                   //根据简谱列出各节拍    {      1,1,1,1,      1,1,1,1,      1,1,1,1,      1+0.5,0.5,1+1,      1,1,1,1,      1,1,1,1,      1,1,1,1,      1+0.5,0.5,1+1,      1,1,1,1,      1,0.5,0.5,1,1,      1,0.5,0.5,1,1,      1,1,1,1,      1,1,1,1,      1,1,1,0.5,0.5,      1,1,1,1,      1+0.5,0.5,1+1,    };    int length;    //得用6号接口     length=sizeof(tune)/sizeof(tune);   //计算长度     for(int x=0;x<length;x++)    {      tone(buzzer,tune);      delay(250*durt);   //这里用来根据节拍调节延时,500这个指数可以自己调整,在该音乐中,我发现用500比较合适。      noTone(buzzer);      val=analogRead(potpin);//��ȡ��������ģ��ֵ����ֵ��val      vall=analogRead(pin);      Serial.println(val);//��ʾval ������ֵ      Serial.println(vall);       if(vall<=650)      {      while(1)      {          delay(1000);          digitalWrite(ledpin,LOW);      }      }    }    delay(1000);}}
六、实验总结与心得此次综合实验,需要小组内成员密切协作,分工明确,相互探讨,互相鼓励,还要有勇于吃苦,不怕困难的韧劲。基础知识要扎实,思维要发散,实验热情要高,才能取得最后的胜利!

18bangzi 发表于 2016-4-24 11:47:12

楼主有没有联系方式,我想问几个问问题
页: [1]
查看完整版本: 智能小风扇