萌新的Arduino大作业

2023-10-27

**

全自动收/晾衣服机

备注:本人因学校社团假期作业要求,用Arduino IDE编写并模拟实现了一个全自动
收/凉衣服的机器(由于硬件条件不足只能模拟),本人也是萌新一枚,希望观看的
大佬们不喜勿喷,有发现做错的话欢迎在评论区讨论,如果对你有帮助,本人也会
非常开心哒

实现功能:

1.下雨时报警,如果没有人反应,则自动收衣服
2.晴天时自动晒衣服

功能细节:

1.用流水灯不同的方向显示电机运转的不同方向
2.检测晴天和下雨时蜂鸣器发出的声音不一样
3.本人采用了开始时令数据稳定,三次取两次等方法防止数据波动出现异常

硬软件准备:

1.减速电机
2.蜂鸣器
3.HC-SR04超声波测距(可不用)
4.DHT11温湿度传感器
5.LED
6.Arduino单片机
7.杜邦线若干根
8.在电脑上安装IDE
软件截图

涉及知识:

串口通信协议,c/c++编程语言,各种传感器的数据手册等

代码及注释:

伪代码:

  • 定义函数:
    • 自定义的蜂鸣器报警旋律:void ring();
    • 温湿度信号读取:byte readData();
    • 开始检测温湿度:void start_test();
    • 检测为下雨:boolean test_rain();
    • 检测为晴天:boolean test_sun();
    • 控制流水灯的函数,用于显示电机正向运作:void liushui1();
    • 控制流水灯的函数,用于显示电机反向运作:void liushui2();
  • 开始准备(void setup()):
    • 定义8,4,7脚为输出脚
    • 串口初始化
  • 循环开始(void loop()):
    • 设置一个判断变量(judge),初始值为0,为初始化阶段,当检测到下雨,则赋值为1,当检测到晴天,则赋值为2
    • if(judge == 0)(初始化,开始默认晾衣杆正在外面晾晒):
      • 先检测6次数据让传感器保持稳定
      • 在没检测到下雨时,保持原状
      • 当检测到下雨时,开始报警,judge赋值为1
      • 如果没有人收衣服,则开始自动收,同时开启流水灯以显示电机工作状态。(这里就需要测距仪了,但是由于硬件条件不允许,本人就没加)
    • else if(judge == 1)(如果为下雨)
      • 打印:现在正在下雨!
      • 检测温湿度,在没检测到晴天之前保持输出温湿度
      • 当检测到晴天,蜂鸣器发声,开始晾衣服,judge赋值为2
    • else if(judge == 1)(如果为晴天)
      • 打印:现在是晴天!
      • 检测温湿度,在没检测到下雨之前保持输出温湿度
      • 当检测到晴天,蜂鸣器报警,开始收衣服,judge赋值为1

代码:

void ring();//自定义的蜂鸣器报警旋律
byte readData();// 温湿度信号接脚连入 Arduino 的 Pin 2
void start_test();// 每次要与 DHT11 沟通并开始检测温湿度
boolean test_rain();//检测为下雨(湿度超标),返回True,否则返回False
boolean test_sun();//检测为晴天(湿度和温度都合适),返回True,否则返回False
void liushui1();//控制流水灯的函数,用于显示电机正向运作(持续时间大约18s)
void liushui2();//控制流水灯的函数,用于显示电机反向运作(持续时间大约18s)
int judge = 0;//设置一个变量判断现在的情况,0为初始化阶段,1为下雨,2为晴天
int val;//流水灯中电平变量
//float range;设置HC-SR04的距离
//float time1;设置HC-SR04返回信号的时间

void ring(){
  for(int i=0;i<3;i++){
    digitalWrite(8,HIGH);
    delay(233);
    digitalWrite(8,LOW);
    delay(33);
    digitalWrite(8,HIGH);
    delay(132);
    digitalWrite(8,LOW);
    delay(33);
    digitalWrite(8,HIGH);
    delay(200);
    digitalWrite(8,LOW);
    delay(33);
    digitalWrite(8,HIGH);
    delay(266);
    digitalWrite(8,LOW);
    delay(66);
    digitalWrite(8,HIGH);
    delay(233);
    digitalWrite(8,LOW);
    delay(33);
    digitalWrite(8,HIGH);
    delay(132);
    digitalWrite(8,LOW);
    delay(33);
    digitalWrite(8,HIGH);
    delay(200);
    digitalWrite(8,LOW);
    delay(33);
    digitalWrite(8,HIGH);
    delay(266);
    digitalWrite(8,LOW);
    delay(2400);
  } 
}
int dhPin = 2;  
byte dat[5];   // 存放湿度2byte, 温度 2 byte, checksum 1 byte
byte readData() {  // 每次读取 8 bits  ( one byte)
  byte data = 0 ; // 初始化数据,不然可能出错
  for (int i = 0; i < 8; i++) {
    if (digitalRead(dhPin) == LOW) {  // 一开始要 LOW 才表示要传过来
      while (digitalRead(dhPin) == LOW); //等待 50us;
      // 现在已经变成 HIGH 了
      delayMicroseconds(30); //判断高电平持续时间,以判定资料是‘0’还是‘1’;
      if (digitalRead(dhPin) == HIGH) // 持续了 30 us 以上就是 1
        data |= (1 << (7 - i)); //高位在前,低位元在后;
      //如果这时已经是 LOW, 表示这 bit 是 0, 不必塞入 data
      //..而且以下的 while 也会立即结束(因为 LOW), 准备接收下一个 bit
      while (digitalRead(dhPin) == HIGH); // 等待下一bit的接收;
      //这时一定已经变成 LOW 了
    }
  }
  return data;   // 收完 8 bit = one byte = one char
}
void start_test() {  
  digitalWrite(dhPin, LOW); //拉低到 LOW,发送表示要开始沟通的信号;
  delay(30); //延时要大于 18ms,以便 DHT11 能检测到开始信号;我们用30ms
  digitalWrite(dhPin, HIGH);  // 拉高HIGH, 让 DHT11 拉低到 LOW 告诉我们要传送
  delayMicroseconds(40);  // 给40us等待 DHT11 响应;
  pinMode(dhPin, INPUT); // 改为输入 mode 准备 digitalRead( )
  while (digitalRead(dhPin) == HIGH);  // 必须等到 LOW
  delayMicroseconds(80); //DHT11 发出响应,会拉低 80us;所以至少等80us
  while (digitalRead(dhPin) == LOW); // 继续等到变 HIGH
  delayMicroseconds(80); //DHT11 会拉高到HIGH 80us 后开始发送数据;
  /// 以下连续读入 5 bytes (40 bits), 最后的 byte 是 checksum 校验值
  for (int i = 0; i < 5; i++) dat[i] = readData(); //接收温湿度资料,校验位元;
  pinMode(dhPin, OUTPUT); // 改为 Output mode, 准备拉高HIGH
  digitalWrite(dhPin, HIGH); //发送完一次资料后释放bus,等待下一次开始信号;
}
boolean test_rain(){
  int count = 0;
  for(int i=0;i<3;i++){//防止数据波动
      start_test( );
      if (dat[0] > 70)
        count++;
      delay(1985);
  }
  if(count >=2)//三次测试如果有两次超标,则返回True,表示雨天
    return true;
  else
    return false;
}
boolean test_sun(){
  int count = 0;
  for(int i=0;i<3;i++){//防止数据波动
      start_test( );
      if ((dat[0] < 40)&&(dat[2] > 30))
        count++;
        delay(1985);
  }
  if(count >=2)//三次测试如果有两次达到标准,则返回True,表示晴天
    return true;
  else
    return false;
}
void liushui1(){//控制流水灯的函数,用于显示电机正向运作(持续时间大约18s)
  for(int i=0;i < 2;i++){
    for(val=0;val<=255;val++){
      analogWrite(9,val);
      delay(6);
    }
    for(val=255;val>=0;val--){
      analogWrite(9,val);
      delay(6);
    }
    for(val=0;val<=255;val++){
      analogWrite(10,val);
      delay(6);
    }
    for(val=255;val>=0;val--){
      analogWrite(10,val);
      delay(6);
    }
    for(val=0;val<=255;val++){
      analogWrite(11,val);
      delay(6);
    }
    for(val=255;val>=0;val--){
      analogWrite(11,val);
      delay(6);
    }
  }
}
void liushui2(){//控制流水灯的函数,用于显示电机反向运作(持续时间大约18s)
  for(int i=0;i < 2;i++){
    for(val=0;val<=255;val++){
      analogWrite(11,val);
      delay(6);
    }
    for(val=255;val>=0;val--){
      analogWrite(11,val);
      delay(6);
    }
    for(val=0;val<=255;val++){
      analogWrite(10,val);
      delay(6);
    }
    for(val=255;val>=0;val--){
      analogWrite(10,val);
      delay(6);
    }
    for(val=0;val<=255;val++){
      analogWrite(9,val);
      delay(6);
    }
    for(val=255;val>=0;val--){
      analogWrite(9,val);
      delay(6);
    }
  }
}
/*float distance(){//返回超声波测距的距离
  digitalWrite(12, LOW);
  delayMicroseconds(2); 
  digitalWrite(12,HIGH); 
  delayMicroseconds(10);
  digitalWrite(12, LOW); 
  time1=float(pulseIn(3,HIGH));
  range=time1*17/1000;
  delay(100);
  return range;
}*/
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(8,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(7,OUTPUT);
  Serial.println("begin!");
  pinMode(dhPin, OUTPUT);
  //pinMode(3,INPUT_PULLUP);
  //pinMode(12,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  int i;
  boolean rain = test_rain(),sun = test_sun();
  if(judge == 0){//如果处于初始化阶段(晾衣杆在外面)
    for(i=0;i<6;i++){//先检测6次让数据稳定
      start_test();
      Serial.print("检测到湿度为 = ");
      Serial.print(dat[0], DEC); //显示湿度的整数部分;
      Serial.print('.');
      Serial.print(dat[1], DEC); //显示湿度的小数位;(其实是 0)
      Serial.println(" %");  // 注意有空格要用 " %"  不可用 ' %'
      Serial.print("检测到温度为 = ");
      Serial.print(dat[2], DEC); //显示温度的整数部分;
      Serial.print('.');
      Serial.print(dat[3], DEC); //显示温度的小数位;
      Serial.println(" C");
      delay(1985);
    }
    Serial.println("数据已稳定!");
    
    while((rain||sun) == false){//两个测试都为假的话,保持初始化阶段,直到检测出有变化
      Serial.println("当前未检测到有变化");
      rain = test_rain();
      sun = test_sun();
    }
    if(rain){//如果检测到下雨
      judge = 1;//将判断条件设为1
      ring();//发出警报
      Serial.println("检测到下雨!开始警报并且收衣服!");
      digitalWrite(4,HIGH);
      digitalWrite(7,LOW);
      liushui1();//电机开始工作,同时流水灯显示电机正转
      //当然有些情况下电机转动后距离依然不够,于是我添加了HC-SR04超声波测距,但是由于硬件条件不足,我无法将
      //其在现实中实现,这里只提供代码。。(使用时要把上面一行代码删除)
      /*float distance1 = distance();
      while(distance1 >= 10){//当距离超过10cm时,持续收回晾衣杆
        distance1 = distance();
        Serial.print("当前距离");
        Serial.println(range);
      }*/
      digitalWrite(4,LOW);
      Serial.println("已成功收回晾衣杆!");
    }
  }
  else if (judge == 1){//如果是处于下雨的情况
    Serial.println("现在在下雨!");
    while(!sun){
      sun = test_sun();
      Serial.print("检测到湿度为 = ");
      Serial.print(dat[0], DEC); //显示湿度的整数部分;
      Serial.print('.');
      Serial.print(dat[1], DEC); //显示湿度的小数位;(其实是 0)
      Serial.println(" %");  // 注意有空格要用 " %"  不可用 ' %'
      Serial.print("检测到温度为 = ");
      Serial.print(dat[2], DEC); //显示温度的整数部分;
      Serial.print('.');
      Serial.print(dat[3], DEC); //显示温度的小数位;
      Serial.println(" C");
    }
    Serial.println("检测到已经晴天!");
    digitalWrite(8,HIGH);
    delay(1200);
    digitalWrite(8,LOW);
    judge = 2;
    digitalWrite(4,LOW);
    digitalWrite(7,HIGH);
    liushui2();//电机开始工作,同时流水灯显示电机反转
    digitalWrite(7,LOW);
    Serial.println("已成功伸出晾衣杆!");
    //这里关于使用HC-SR04的代码和上面初始化时的情况类似,就不赘述了
  }
  else if(judge == 2){//如果是处于晴天的情况
    Serial.println("现在是晴天!");
    while(!rain){
      rain = test_rain();
      Serial.print("检测到湿度为 = ");
      Serial.print(dat[0], DEC); //显示湿度的整数部分;
      Serial.print('.');
      Serial.print(dat[1], DEC); //显示湿度的小数位;(其实是 0)
      Serial.println(" %");  // 注意有空格要用 " %"  不可用 ' %'
      Serial.print("检测到温度为 = ");
      Serial.print(dat[2], DEC); //显示温度的整数部分;
      Serial.print('.');
      Serial.print(dat[3], DEC); //显示温度的小数位;
      Serial.println(" C");
    }
    Serial.println("检测到下雨了!");
    ring();
    judge = 1;
    digitalWrite(7,LOW);
    digitalWrite(4,HIGH);
    liushui1();//电机开始工作,同时流水灯显示电机正转
    digitalWrite(4,LOW);
    Serial.println("已成功收回晾衣杆!");
    //这里关于使用HC-SR04的代码和上面初始化时的情况类似,就不赘述了
  }
}

最终效果视频

注:由于本人囊中羞涩+时间不足,无法购买一些曲轴、齿轮等零件,所以只能将
晾衣架模拟为竖直方向的运动,在这里深感抱歉(不过改成水平运动的代码和原理
是差不多的啦)

萌新的Arduino大作业(自动收\晾衣服)

最后,我的有部分代码转载自某些大佬之手,如果侵权请与本人联系,本人会尽快
删除!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

萌新的Arduino大作业 的相关文章

  • SuperSet 最新 Docker 部署文档(含元数据库切换、汉化、镜像导出)

    网上大部分文档还是 Python2 的部署方式 尤其是汉化 坑还有不少 使用最新docker镜像重新整理了一下 一 安装开源标准版 能够访问互联网 1 安装 docker 2 下载官方 docker 镜像 docker pull apach
  • Ajax和jQuery

    Ajax和jQuery 一 Ajax 1 Ajax概述 ajax Asynchronous JavaScript and XML Asynchronous 异步的 JavaScript 和 XML Asynchronous 异步的意思 Ja
  • vue2 webpack3 升级 webpack5 全过程,内附详细配置文件

    由于 webpack5 需要 node 版本 gt 10 13 0 请先将 node版本 升级 npm版本 用node自带的就可以了 官方最新的node版本好像不兼容下面的webpack5配置 建议升级成 LTS版本 这里我升级的是v14
  • uni-app中onLoad不起作用

    最近开始使用uni app 坑还是很多的 今天在使用onLoad是发现 页面上的onLoad方法是可以起作用的 但是组件中的onLoad方法并没有起作用 后来经过一番尝试后还是不行 看文档发现uni app 支持的页面生命周期函数是包含on
  • 《质量全面管控-从项目管理到容灾测试》读书笔记

    介绍 该书是葛长芝老师 结合案例讲解测试实践技术 主要内容有 项目管理 项目需求管理 代码质量控制 自动化部署 软件测试 安全测试与安全管理 自动化测试基础 自动化测试框架 性能测试 性能分析 监控平台与故障排查 灾难恢复与容灾测试等 这本
  • 怎样才能提升广告投放效果?牢记这5点!

    在我们的日常生活中 广告可以说一个随处可见 无所不在的一个事物 各行各业的组织 企业等都会进行广告宣传 以达到推广产品或建立企业形象等商业目的 广告虽然非常常见 覆盖率比较高 广告的代言人和展现形式也不尽相同 但并不是所有的广告都能达到预期

随机推荐

  • UE4C++ 如何在静态函数中SpawnActor

    最近在学习用C 复刻YouTube上的一个蓝图库存系统 其中在从背包中丢弃枪械 然后在世界中生成一个枪械Actor的时候遇到了问题 由于这个生成函数是在几个不同的类中复用的 YouTube原版的做法是把这个函数写在了GameState类里面
  • Java基础面试题附带答案

    091内部类可以引用它的包含类 外部类 的成员吗 有没有什么限制 一个内部类对象可以访问创建它的外部类对象的成员 包括私有成员 092Anonymous Inner Class 匿名内部类 是否可以继承其它类 是否可以 实现接口 可以继承其
  • 黑苹果睡眠唤醒usb失灵_(已解决)睡眠唤醒重启的问题

    Time stamp Domain Message Duration Delay UUID 0C11AC44 B57D 4895 8067 C95A
  • Intent详细用法介绍

    文章目录 Intent介绍 Intent属性 intent种类 intent过滤器 Intent介绍 Activity Service Broadcast通信 可传递Bundle Intent属性 Component name属性 通过se
  • 2020年网络系统管理改革试点评分标准四

    考核点11 在D盘查看备份文件 分数 5分 考点答案 考点解析 本题考查点 组策略备份 配置案例 依次选择 服务器管理器 工具 组策略管理 在 组策略管理 窗口中依次选择 林 域 ChinaSkills cn 右键单击 组策略对象 在弹出的
  • 2D Alpha Shape:基于二维Delaunay(德洛内)三角网的边缘点查找

    文章目录 0 效果 1 Delaunay三角网基本内容 2 Bowyer Watson算法 3 基于Delanay方法的Alpha Shape确定散乱点的边缘点 4 代码实现 C Opencv 5 参考 0 效果 点间距10 1 Delau
  • Arduino智能小车——超声波避障

    Arduino智能小车 超声波避障 Arduino智能小车系列教程时空门 Arduino智能小车 拼装篇 点击跳转 Arduino智能小车 测试篇 点击跳转 Arduino智能小车 调速篇 点击跳转 Arduino智能小车 超声波避障 点击
  • Linux自带的RHCS集群套件简单认识及kvm,qemu,libvirt的简单认识

    一 简介 RHCS即 RedHat Cluster Suite 中文意思即红帽集群套件 红帽集群套件 RedHat Cluter Suite RHCS 是一套综合的软件组件 可以通过在部署时采用不同的配置 以满足你的对高可用性 负载均衡 可
  • CoreData(数据库升级 )版本迁移-iOS App升级安装

    如果IOS App 使用到CoreData 并且在上一个版本上有数据库更新 新增表 字段等操作 那在覆盖安装程序时就要进行CoreData数据库的迁移 具体操作如下 1 选中你的mydata xcdatamodeld文件 选择菜单edito
  • MySQL多版本并发控制分析 事务

    2 行的更新过程 下面演示下事务对某行记录的更新过程 1 初始数据行 F1 F6是某行列的名字 1 6是其对应的数据 后面三个隐含字段分别对应该行的事务号和回滚指针 假如这条数据是刚INSERT的 可以认为ID为1 其他两个字段为空 2 事
  • Javascript中最常用的30个经典技巧

    这个是我从网上找到的 整理了一下 1 nc ntextmenu window event returnValue false 将彻底屏蔽鼠标右键 table border border td no td table 可用于Table 2 取
  • Unity3d离散仿真引擎基础

    1 解释对象与资源的区别与联系 对象 对象直接出现在游戏场景中 是资源整合的具体表现 对象一般有玩家 敌人 游戏场景 摄像机等虚拟父类 这些父类没有实例化 而他们的子类实例化并包含了这些游戏对象 我们可以对这些对象进行操作 资源 资源可以是
  • [2023.8.28]Chapter1 ARM Embedded Systems

    ARM处理器内核是许多成功的32位嵌入式系统的关键组件 您可能自己就拥有其中之一 甚至可能没有意识到 ARM内核广泛应用于手机 手持组织器和其他许多日常便携消费设备中 从1985年的第一款ARM1原型机起 ARM的设计师们已经取得了长足的进
  • demo程序是什么_纯小白干货:第一个Java程序示例——Hello World!

    跟随世界潮流 第一个Java程序输出 Hell World 通过Eclipse运行程序 启动Eclipse 在菜单中选择 文件 gt 新建 gt Java项目 弹出对话框 填入项目名称 点击 完成 创建项目成功 可以看到在 E javawo
  • AsyncTask的实用-中断请求实现

    平时的app网络操作一般有几种方式 new Thread handler new AsyncTask 我常用的方式是new AsyncTask 可能比较方便吧 弊端 就是一旦请求 没有焦点 只能等待黑圈转完 new Thread 好处是好控
  • 【实践2】Python openpyxl获取Excel所有表名,删除Excel内指定工作表(判断是否存在某个sheet,存在即删除)

    简单介绍 定时爬虫任务会有每天使用pandas将数据写入Excel表中的动作 但每天写入的行数会有不同 例如第一天写入5000行而第二天只写入3000行 会导致该表中前3000行是最新数据 后2000是前一天的数据 因此最好的方法是在将数据
  • Magento关于添加Robots.txt文件

    在 Magento和其他电子商务平台的SEO话题中 有一个很常见的问题 怎样写robots txt文件 里面到底应该包含哪些内容 为了很好滴回答这个问题 我将根据我所有的知识和经验尝试找出一个最佳的robots txt文件写法 下面部分ro
  • 时间SQL查询大全

    查询15天之前得数据 modifydate 是数据库得时间字段格式yyyy MM dd hh mm ss SELECT FROM 表名 where DATE SUB CURDATE INTERVAL 15 DAY gt date modif
  • mysql数据库升级-MySQL 5.7.25主备架构小版本In-Place升级思路

    一 描述 漏扫发现MySQL有低风险漏洞 自己写方案 自己做测试 自己升级 版本 MySQL 5 7 25 升级到MySQL 5 7 28最新版本 架构 主从架构 二 升级流程 1 下载最新版数据库软件MySQL 5 7 28 2 上传到指
  • 萌新的Arduino大作业

    全自动收 晾衣服机 备注 本人因学校社团假期作业要求 用Arduino IDE编写并模拟实现了一个全自动 收 凉衣服的机器 由于硬件条件不足只能模拟 本人也是萌新一枚 希望观看的 大佬们不喜勿喷 有发现做错的话欢迎在评论区讨论 如果对你有帮