一、使用的器件

	1、红外遥控器、红外接收器
	2、ULN2003A和直流电机
	3、dht11温湿度传感器
	4、蜂鸣器
	5、舵机
	6、LCD1603显示屏

二、流程图

在这里插入图片描述

三、连线图

在这里插入图片描述
        可能有的同学画图的时候找不到四根引脚的lcd
下载地址:四根引脚lcd.

然后在点这里导入fzpz文件就能用了
在这里插入图片描述

四、实际图

(emmm 有点丑 大概就这个样)
在这里插入图片描述

五、代码实现

/**
  @description  Arduino应用工程1
  @author weilin
  @date  2021/04/24
*/
#include <IRremote.h>
#include <Servo.h>
#include <Wire.h>
#include "dht11.h"
#include "LiquidCrystal_I2C.h"
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define DHT11PIN A0
#define MAX 22
Servo myservo;//舵机对象
int Bee_PIN = 7 ; //蜂鸣器
int pos = 0; //舵机角度
int motor = 6; //步进电机引脚
int RECV_PIN = 11;      //定义红外接收模块输出口接arduino数字引脚11
char pwd[8];   //10位密码
char real_pwd[6] = "123456"; //密码
int  IF_logon_flag = 0; //登录flag
int  pwd_num = 0 ; //密码数组下标

dht11 DHT11; //温湿度对象
IRrecv irrecv(RECV_PIN);
decode_results results;
//Car mp3编码
unsigned long rremote_code[MAX] = {
  0xFFA25D, 0xFF629D, 0xFFE21D, //CH- CH CH+
  0xFF22DD, 0xFF02FD, 0xFFC23D, //PREV NEXT PLAY
  0xFFE01F, 0xFFA857, 0xFF906F, //VOL- VOL+ EQ
  0xFF6897, 0xFF9867, 0xFFB04F, // 0 100+ 200+
  0xFF30CF, 0xFF18E7, 0xFF7A85, // 1  2  3
  0xFF10EF, 0xFF38C7, 0xFF5AA5, // 4  5  6
  0xFF42BD, 0xFF4AB5, 0xFF52AD, // 7  8  9
  0xFFFFFFFF//长按
};

//Car mp3对应的字符串
String rremote_string[MAX] = {
  "CH-", "CH", "CH+",
  "PREV", "NEXT", "PLAY/PAUSE",
  "VOL-", "VOL+", "EQ",
  "0", "100+", "200+",
  "1", "2", "3",
  "4", "5", "6",
  "7", "8", "9",
  "longPress"
};

// 解析红外编码并返回对应的字符串

String get_RremoteString(unsigned long code) {
  String rremotestring = "";
  int i = 0;
  for (i = 0; i < MAX - 1; i++) {
    if (code == rremote_code[i]) {
      break;
    }
  }
  //过滤掉长按
  if (i == MAX - 1) return "";
  else return rremote_string[i];
}


// 舵机是否开门
int if_opendoor()
{}

void Bee_function(bool i)
{
  if (i)
  {
    digitalWrite(Bee_PIN, HIGH); //sound production
    delay(1000);
    digitalWrite(Bee_PIN, LOW);
    delay(1000);
  }
  else
  {
    digitalWrite(Bee_PIN, HIGH); //sound production
    delay(500);
    digitalWrite(Bee_PIN, LOW);
    delay(100);
    digitalWrite(Bee_PIN, HIGH); //sound production
    delay(500);
    digitalWrite(Bee_PIN, LOW);
  }
}

void servo_function()  //舵机转向功能
{
  for (pos = 0; pos < 90; pos += 1)
  {
    myservo.write(pos);
    delay(15);
  }
  // 180 到 0 旋转舵机,每次延时 15 毫秒
  for (pos = 90; pos >= 1; pos -= 1)
  {
    myservo.write(pos);
    delay(15);
  }
}

void show_init_lcd() //初始化lcd
{
  lcd.clear();  //清空
  lcd.setCursor(0, 0); // go to start of 2nd line
  lcd.print("Please input!");
  lcd.setCursor(0, 1); // go to start of 2nd line
  lcd.print("keyword:");
}

void show_humi_lcd() //显示温湿度的lcd
{}

void setup()
{
  pinMode(motor, OUTPUT);  //步进电机
  pinMode(Bee_PIN, OUTPUT); //蜂鸣器为输出
  myservo.attach(8); //舵机
  Serial.begin(9600);
  irrecv.enableIRIn(); //初始化红外遥控

  //显示屏
  lcd.init();
  lcd.backlight();
  show_init_lcd();

}
void loop() {

  if (irrecv.decode(&results)) {
    //打印字符串
    String codeString = get_RremoteString(results.value);
    if (codeString.length() != 0)
    {
      if (codeString != "VOL-") //当做ok键
      {
        if (pwd_num < 8) //密码位数不能超过10
        {
          pwd[pwd_num++] = (char) codeString[0];
          Serial.println(pwd);
          lcd.setCursor(8, 1); // go to start of 2nd line
          lcd.print(pwd);
        }
      }
      else
      {
        //进行检验
        if (strcmp(pwd, real_pwd) == 0) //密码验证成功
        {
          Serial.println("登录成功");
          pwd_num = 0;  //密码位数清零
          memset(pwd, 0, 10); //清空密码
          Bee_function(1); //蜂鸣器
          IF_logon_flag = 1; //登录成功
          lcd.clear();  //清空
          lcd.setCursor(4, 0);
          lcd.print("SUCCESS!");
          servo_function(); //舵机
          show_init_lcd();
        }
        else   //失败
        {
          //蜂鸣器叫两声
          Serial.println("登录失败");
          pwd_num = 0;  //密码位数清零
          memset(pwd, 0, 8); //清空密码
          Bee_function(0); //蜂鸣器
          IF_logon_flag = 0;  //登录失败
          lcd.clear();  //清空
          lcd.setCursor(6, 0);
          lcd.print("ERROR!");
          delay(1000);
          show_init_lcd();
        }
      }
    }
    irrecv.resume(); // 接收下一个值
  }

  if (IF_logon_flag == 1) //登录成功就获取温湿度
  {
    int chk = DHT11.read(DHT11PIN);
    lcd.clear();
    lcd.setCursor(0, 0);  //温度
    lcd.print("Tep: ");
    lcd.print((float)DHT11.temperature);
    lcd.print("'C");
    lcd.setCursor(0, 1);

    lcd.print("Hum: "); //湿度
    lcd.print((float)DHT11.humidity, 2);
    lcd.print("%");

    if ((float)DHT11.temperature > 25.0) //到达温度的阈值开启步进电机风扇
    {
      digitalWrite(motor, HIGH); //电机转
    }
    else
    {
      digitalWrite(motor, LOW); //不转
    }
    delay(1000);
  }
}

六、dht11 和 LiquidCrtstal_l2c 的库

    这两个库文件可以自行下载的,它们要和ino文件放在一个文件夹下,如下:
在这里插入图片描述

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐