智能小风扇
本帖最后由 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);}}
六、实验总结与心得此次综合实验,需要小组内成员密切协作,分工明确,相互探讨,互相鼓励,还要有勇于吃苦,不怕困难的韧劲。基础知识要扎实,思维要发散,实验热情要高,才能取得最后的胜利!
楼主有没有联系方式,我想问几个问问题
页:
[1]