//导入库文件
//导入到1602液晶库
#include <LiquidCrystal.h>
//导入DHT温湿度库
#include <DHT.h>
//导入红外接收模块
#include <IRremote.h>
//导入舵机控制库
#include <Servo.h>
//icd液晶工作模式启动
LiquidCrystal lcd(12,11,10,9,8,7);
//红外接收模块工作使能
#define IRrecv_PIN 13
IRrecv receiver(IRrecv_PIN);
//温湿度传感器使能
#define DHT_PIN 2
#define DHT_TYPE DHT22
DHT dht(DHT_PIN,DHT_TYPE);
int tem,hum;
//舵机机能
Servo servo_Tem,servo_Hum;
//采用步进电动机模拟无刷电机
const int dirPin = 3;//方向引脚
const int stepPin = 4;//步进引脚
//电机每圈步数
const int STEPS_PER_REV = 800;
void setup(){
lcd.begin(16,2);
//设置初始坐标
lcd.print("<Button Presser>");
//红外开始接受信号
receiver.enableIRIn();
//设置DHT温湿度传感器
dht.begin();
//舵机shineng
servo_Tem.attach(6);
servo_Hum.attach(5);
}
void loop(){
//红外接收模块监测,监测是否收到信号,并根据不同的信号做出不同反应
if(receiver.decode())
{
translateIR();
}
receiver.resume();//接收下一个信号
}
//显示内容
void lcdPrint(char* text)
{
lcd.clear();//清屏
lcd.setCursor(0,0);//设置坐标
lcd.print("Button Pressed:");
lcd.setCursor(0,1);
lcd.print(text);
lcd.print(" code:");
lcd.print(receiver.decodedIRData.command);
}
void Display_temhum()
{
hum = dht.readHumidity();
tem = dht.readTemperature();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("H");
lcd.print(hum);
lcd.print("% ");
lcd.print("T:");
lcd.print(tem);
lcd.print("*C ");
}
//温度通风口控制函数
void servoTem_control()
{
if(tem>50)
{
servo_Tem.write(90);
}
else if(tem > 20)
{
servo_Tem.write(0);
}
else{
int val = map(tem,20,50,0,90);
servo_Tem.write(val);
}
}
//湿度通风口控制函数
void servoHum_control()
{
if(hum>80)
{
servo_Hum.write(90);
}
else if(hum < 40)
{
servo_Hum.write(0);
}
else{
int val = map(hum,40,80,0,90);
servo_Hum.write(val);
}
}
//获取不同的按键信息,并根据不同的按键做出不同的动作
void translateIR()
{
//基于IR控制信号,做出不同命令:
switch(receiver.decodedIRData.command)
{
case 168:
Display_temhum();
servoTem_control();
servoHum_control();
break;
case 104:
Display_danwei("STOP");
digitalWrite(stepPin, LOW);
delayMicroseconds(1000);
break;
case 48:
Display_danwei("1");
digitalWrite(dirPin, HIGH);
//电机慢速旋转
for(int x = 0;x< STEPS_PER_REV; x++)
{
digitalWrite(stepPin, HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin, LOW);
delayMicroseconds(20000);
}
break;
case 24:
Display_danwei("2");
digitalWrite(dirPin, HIGH);
//电机慢速旋转
for(int x = 0;x< STEPS_PER_REV; x++)
{
digitalWrite(stepPin, HIGH);
delayMicroseconds(1500);
digitalWrite(stepPin, LOW);
delayMicroseconds(1500);
}
break;
case 122:
Display_danwei("3");
digitalWrite(dirPin,HIGH);
//电机慢速旋转
for(int x = 0;x< STEPS_PER_REV; x++)
{
digitalWrite(stepPin, HIGH);
delayMicroseconds(1000);
digitalWrite(stepPin, LOW);
delayMicroseconds(1000);
}
break;
default:
lcd.clear();
lcd.print(receiver.decodedIRData.command);
lcd.print((" other button "));
}
}
void Display_danwei(char* text)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" DANWEI: ");
lcd.print(text);
}