进阶之路(中级篇) - 018 基于arduino的简易版智能衣架

一.    设备及要求

目的:制作一个可以自动根据事实的天气的状况进行对衣架上的衣服进行晾晒。

基础装置:可伸缩的晾衣架。

开发环境:Arduino1. 8.1

主控板:Arduino UNO

动力装置:二相四线步进电机、电机控制板

供电设备:5V/500mA电源、12V/2A电机供电电源

传感器:雨滴传感器、接触传感器

其它:双面胶若干(固定传接触感器)

二.    布线:

三.代码:

  1 // I/O引脚定义
  2 #define PUL 2         //电机时钟
  3 #define L_ENA 3     //A电机使能
  4 #define L_DIR 4     //A电机转向
  5 #define L_key 5        //A电机复位按键(0)
  6 #define R_ENA 6        //B电机使能
  7 #define R_DIR 7        //B电机转向
  8 #define R_key 8        //B电机复位按键(1)
  9 #define Rain A0        //雨水
 10
 11 //宏定义
 12 bool Clock_status = 0;
 13
 14 void set_init_pinMode(){
 15     pinMode(PUL,OUTPUT);        //时钟
 16     pinMode(L_ENA,OUTPUT);        //L
 17     pinMode(L_DIR,OUTPUT);
 18     pinMode(L_key,INPUT);
 19     pinMode(R_ENA,OUTPUT);        //R
 20     pinMode(R_DIR,OUTPUT);
 21     pinMode(R_key,INPUT);
 22     pinMode(Rain,INPUT);        //雨水
 23 }
 24 /*************************************/
 25 //时钟函数
 26 void Clock_function(void){
 27     delayMicroseconds(10000);                 //时钟
 28     digitalWrite(PUL,Clock_status);
 29     Clock_status = !Clock_status;
 30 }
 31 /***********************************/
 32 //电机使能关闭
 33 void Close_motor(void){
 34     digitalWrite(L_ENA,1);
 35     digitalWrite(R_ENA,1);
 36 }
 37 //电机使能开启
 38 void start_motor(void){
 39     digitalWrite(L_ENA,0);
 40     digitalWrite(R_ENA,0);
 41 }
 42 /**********************************/
 43 //拉回方向
 44 void Pull_direction(){
 45     digitalWrite(L_DIR,0);
 46     digitalWrite(R_DIR,0);
 47 }
 48 //推出方向
 49 void Push_direction(){
 50     digitalWrite(L_DIR,1);
 51     digitalWrite(R_DIR,1);
 52 }
 53 /********************************/
 54 //拉回电机
 55 void Pull_motor(){
 56     start_motor();            //开启电机
 57     Pull_direction();        //拉回电机凤方向设置
 58 }
 59 //推出电机
 60 void Push_motor(){
 61     start_motor();            //开启电机
 62     Push_direction();        //拉回电机凤方向设置
 63 }
 64 //无检验停止
 65 void No_test_stop_motor(){
 66     Close_motor();            //关闭使能
 67 }
 68 //检验停止
 69 void test_stop_motor(int key1,int key2){
 70     if(key1)digitalWrite(L_ENA,1);
 71     else digitalWrite(L_ENA,0);
 72     if(key2)digitalWrite(R_ENA,1);
 73     else digitalWrite(L_ENA,0);
 74 }
 75 /********************************/
 76 void printf_all(int mode,unsigned int step1){
 77     Serial.print("mode =");
 78     Serial.print(mode);
 79     Serial.print("  ");
 80     Serial.print("PUL =");
 81     Serial.print(digitalRead(PUL));
 82     Serial.print("  ");
 83     Serial.print("L_DIR =");
 84     Serial.print(digitalRead(L_DIR));
 85     Serial.print("  ");
 86     Serial.print("L_ENA =");
 87     Serial.print(digitalRead(L_ENA));
 88     Serial.print("  ");
 89     Serial.print("L_key =");
 90     Serial.print(digitalRead(L_key));
 91     Serial.print("  ");
 92     Serial.print("R_DIR =");
 93     Serial.print(digitalRead(R_DIR));
 94     Serial.print("  ");
 95     Serial.print("R_ENA =");
 96     Serial.print(digitalRead(R_ENA));
 97     Serial.print("  ");
 98     Serial.print("R_key =");
 99     Serial.print(digitalRead(R_key));
100     Serial.print("  ");
101     Serial.print("Rain =");
102     Serial.print(analogRead(Rain));
103     Serial.print("  ");
104     Serial.print("step1 =");
105     Serial.println(step1);
106 }
107 //初始化
108 void setup(){
109     set_init_pinMode();
110     Serial.begin(19200);
111     Serial.println("DHTxx test!");
112 }
113 void loop(){
114     int mode = 0;        //模式
115     int a,b;
116     unsigned int step1 = 0;
117     while(1){
118         switch(mode){
119         case 0:{        //拉回电机
120             Pull_motor();
121             mode = 1;
122             }break;
123         case 1:{        //检测状态
124             a = digitalRead(L_key);
125             b = digitalRead(R_key);
126             digitalWrite(L_ENA,a);
127             digitalWrite(R_ENA,b-1);
128             step1--;
129             if((1==a)&&(0==b)&&(analogRead(Rain) > 850)){
130                 mode = 2;
131                 step1 = 0;
132                 Push_motor();
133                 }
134             }break;
135         case 2:{        //雨板检测
136             if(analogRead(Rain) < 850)mode = 0;
137             else if(7000 < step1++){
138                 Close_motor();
139                 step1 = 65000;
140                 }
141             }break;
142         }
143     //printf_all(mode,step1);
144     Clock_function();
145     }
146 }

四.    缺陷与不足:

  1. 雨板模拟量干扰没有处理
  2. 按键干扰没有处理
  3. 没有电源检测
  4. 没有光线检测
  5. 没有衣物干燥度检测
  6. 没有备用电源
  7. 没有电源停电检
时间: 2024-08-19 13:10:30

进阶之路(中级篇) - 018 基于arduino的简易版智能衣架的相关文章

第八篇:基于物联网/WIFI/单片机的智能插排控制系统论文、开题报告、原理图(全套毕业设计资料,绝对干货,内附下载链接)

首先打个广告:如果需要做毕设以及嵌入式项目合作,欢迎进入我们工作室:创想嵌入式设计工作室 以下时本人独立开发设计的毕设项目课题:<基于物联网/WIFI/单片机的智能插排>,现在共享出来供大家参阅,可用于做项目时借鉴,博尾附有下载链接.(内附本人联系方式,可一起交流探讨,交朋友). 针对本课题,本次共享的资料包几乎涵盖毕业设计所需的全部资料:设计方案,开题报告,程序源码,原理图,模块资料,论文,答辩PPT,模块学习资料,等等.本资料包不仅仅适用于"基于物联网/WIFI/单片机的智能插排

前端小白进阶之路-技巧篇(垂直水平居中)

在前端布局中居中方式可以说是家常便饭,几乎所有地方都需要用到他,我们常见的就是水平居中和垂直居中.今天小编带大家就看看常用到的这些居中方式都有哪些实现方式. 水平居中:水平居中就是为了让子元素在父元素中排列在水平中心位置,实现方式很多,我们看几种常用的. 使用display:inline-block和text-align:center 原理就是将子容器设置为行内块元素,然后给父容器设置让文字居中的属性以达到目的. 缺点就是里面文字都会居中,可单独设置样式来解决. 使用display:table和

第一篇文章 基于单片机的简易计算器

首先我们要定义两个数组来存储要计算的数字,然后设计算法从数组中将数字提取出来 例如: 125 + 567 5*1 2*10 1*100 好了 到此为止 你或许知道如何提取数字了 下一步就是让单片机帮我们计算了(假如计算的结果是235) 235%10=5: 235/10=23: 23%10=3: 23/10=2: 将数字 2 3 5放到sum数组中将这些数字在数码管上显示出来就行了:

【SSH进阶之路】Hibernate系列——总结篇(九)

这篇博文是Hibernate系列的最后一篇,既然是最后一篇,我们就应该进行一下从头到尾,整体上的总结,将这个系列的内容融会贯通. 概念 Hibernate是一个对象关系映射框架,当然从分层的角度看,我们也说它是数据持久层的框架. 我们从上一句话可以看出Hibernate的核心:面向对象.关系映射以及数据持久化.前面两个概念很容易理解,而对于"数据持久化",就是将数据或者某物体,永久的保存起来.现实生活中的例子有很多,例如:鲜肉冷藏,水果做成罐头,而对于编程而言就是将数据保存在文件或磁盘

Sass进阶之路,之一(基础篇)

Sass 学习Sass之前,应该要知道css预处理器这个东西,css预处理器是什么呢? Css预处理器定义了一种新的语言将Css作为目标生成文件,然后开发者就只要使用这种语言进行编码工作了.预处理器通常可以实现浏览器兼容,变量,结构体等功能,代码更加简洁易于维护. 那么css预处理器与Sass有什么关系呢,Sass就是属于css预处理器中的一种,还有两款他们分别是Less和 Stylus,这里就不做过多的介绍了. 什么是Sass sass是一种css的开发工具,提供了很多便利的写法,不但使css

零基础学习openstack【完整中级篇】及openstack资源汇总

1.你是如何学习openstack的?2.你对openstack的组件了解多少?3.你认为openstack该如何学习? 一直想写关于openstack的方面的内容,今天终于整理完成.算是完成一桩心事,内容整合来自: 零基础学习openstack(上)[中级篇] 零基础学习openstack(下)[中级篇] 是在 零基础学习openstack[初级篇]基础上的一个继续: 初级篇,我们主要是有这么一个概念,openstack的组成openstack由哪些部分来组成: Identity(代号为“Ke

GO语言的进阶之路-面向对象编程

GO语言的进阶之路-面向对象编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 当你看完这篇文章之时,我可以说你的Golang算是入门了,何为入门?就是你去看Docker 源码能看懂60%的语法结构,因为涉及一些unix的代码可能没有Linux运维基础的同学在学习的时候会很吃力,看起来也会带来一定的难度,如果有时间的话我会给大家解析Docker部门精辟的源码.好了,回归正题吧,我们今天要学习的内容是什么呢?即面向对象编程.当然,不要用屌丝的心态来说:"那要是没对象的还咋编程呢

【SSH进阶之路】深入源码,详解Struts基本实现流程

通过一步步的封装我们实现了Struts的基本雏形,我们解决了Struts怎么实现MVC的问题,我们现在仅仅有了Struts的基础,对Struts的学习才刚刚开始,这篇我们要通过对比MVC来理解Struts的执行流程,最后深入Struts的源码,一看究竟. MVC M:业务逻辑,业务数据可以重复使用,我们经常说的javabean(其实struts没有实现业务层,也无法实现) V:显示逻辑,同一份数据,对应多中显示方法,JSP代码实现 C:控制流程器,Servlet代码实现. 我们通过时序图看一下M

【SSH进阶之路】Spring的AOP逐层深入——采用注解完成AOP(七)

上篇博文[SSH进阶之路]Spring的AOP逐层深入--AOP的基本原理(六),我们介绍了AOP的基本原理,以及5种通知的类型, AOP的两种配置方式:XML配置和Aspectj注解方式. 这篇我们使用注解方式来实现一个AOP,我们先看一下项目的目录. 我们采用的是JDK代理,所以首先将接口和实现类代码附上: package com.tgb.spring; public interface UserManager { public void addUser(String userName,St