嘿!您似乎在 United States,您想使用我们的 English 网站吗?
Switch to English site
Skip to main content
shopping_basket 购物车 0
登录

【转载】用Arduino打造机械传动结构温度计

作者:2877137721

转载自:http://mc.dfrobot.com.cn/thread-269256-1-1.html

无意中观察到家里面使用的温度计,是那种最传统的,使用红色酒精来测量温度的温度计 162056x6qpl88dfdfq30kg_d3fdbd6e8a7f1ce4576668e259286720e1a30d64.jpg 
      这种外观的温度计是我传统意义上对温度计的理解。而现在的厂商设计的温度计未免太没新意,用一块LED显示屏就草草了事,方方正正外观也是十分古板,与家庭氛围不和。我于是想到用传统的温度计外观,结合一些机械结构来显示温度,用同步带齿轮来传达温度的变化,成为家中的一个亮点。
162206s4am4nurpyam2uhp_acdb4aa2752b3d8ecd83851b09d08255d317ea3c.jpg            162215m2mgqnqznffnnboo_c5fdedf3c807b46ae82f99822be9d630a6b9c66a.jpg 

 
结构:
   首先是选择材料,我之前在亚克力和椴木板上徘徊,不知道用那种材料好,但是观察过一些家庭的装修之后,发现木饰面占据了大多数,我还是觉得使用椴木层板比较好。

 

162254sc8c66o988q34hws_5d6119240eade28a8fedc5929bdeb67eb10f6eed.jpg
 
   更加吻合现代的风格,并且木板更易于加工,给后面的工序也带来了便利。
   对于温度的显示,我想用类似3D打印机的原理,使用步进电机驱动同步带,同步带带动指针在表盘上移动,这样做保证了指针的稳定和指示温度的精确。也曾想过使用丝杆加滑台来驱动,但是由于丝杆滑台价格高昂,最终放弃。
162328o0tjihanj45zkfho_73b86e59a8f5e92f82b86fab955b2a53d873655c.jpg
 
   接着就是对于电机以及驱动部件的选择,市面上常见的步进电机就是42步进电机,其常常被使用在各种机器人或者3D打印机上,稳定性非常有保障,但是缺点是体积过于庞大,不适合温度计使用,最后经过一番挑选,选用了28BYJ48这款减速步进电机。
162422woof5c6sot6iocmq_86ce0c81bd30206ed182526d37b9819622b2fb86.jpg
 
   这款步进电机体积小巧,工作电流小,使用ULN2003芯片即可驱动,价格也比42步进电机便宜,并且含有减速装置,在扭矩方面也有了保障。输出轴也是5MMD形轴,可以兼容市面上常见的同步轮。在传动系统的选择上,使用3D打印机常用的标准件即可,我使用了16齿的GT2同步轮作为驱动轮,驱动同步带转动,从动轮方面就比较简单了,用两颗轴承即可,这样做既简单也便宜,没必要花钱去购买惰轮。同步带的松紧决定了指针的指示是否精确,于是我增加了一个张紧弹簧来保证同步带时刻都是张紧状态。
162508gc4zbrpvfbubu33g_ef20e9418a29cf7d5f996477b29fca334444bd6e.jpg
 
   指针的做法就比较多变了,我使用了一个回形针来指示温度,回形针可以牢固的夹在同步带上,不易晃动。
 
电路:
   单片机选择方面,我选择的是ArduinoUno
162551fgw17g1y6764717w_6f09733ed7610175460856e007d382c93aa000c2.jpg
 
   因为ArduinUno支持很多开源库以及传感器,所以编写程序起来也是十分简单,易于操作,相比较其他单片机需要了解各种复杂的寄存器起来,ArduinoUno只需要简单的语句即可实现很多功能。单片机性能方面,ArduinoUno所搭载的Atmega328单片机的资源也足够使用,并且有RISC精简指令集的加持,ArduinoUno足够胜任本项目。
   选择好单片机之后,其他元件的选择就简单了许多,温度测量方面使用了DHT11温湿度传感器,它可以测量环境的温湿度,单总线传输数据的方式更加节省端口资源,得益于Arduino的开源环境,使用它也是十分容易,只需要一个函数即可获取温湿度信息,是制作温度计的不二之选。
   步进电机的驱动模块使用ULN2003大功率达林顿晶体管阵列模块,此模块很易于找到并且价格低廉,搭配我选择的步进电机是不二之选。板载4led指示灯可以清楚的观察到各相的工作状态。
162630v9tdk3lk3933lsll_d214c67d5557a4f2f53003d071b25fa9de5cb8ba.jpg
 
   这里再次感谢Arduino的开源环境,各路大神早已为我们写好了此驱动模块的函数库,我们只需要调用即可。这里是设计好的电路图:
162702m85rib9octc359ho_058e3acdeff231f3d89b4d4b70920e3981dbca93.jpg
   完成的结构设计以及元件之后,接下来就是设计木板的图纸了,经过一小会忙活,设计好图纸,发送给厂家切割,几天后,收到了切好的木板:
162751o5uzukbuuczga1h7_fd9b9716a5b097b699d735833c37634fe03c97c7.jpg
    接下来就是安装了,将各个元件悉数安装到对应位置,并将线路接好:
162829chku2gchhuih52yk_a9822e524b772ca4e8bfa1913fc0f3776229eb77.jpg162838bdqw9ttl9kq88x7k_f9200751f22af5e28f27b57a7cdd53fc179e45de.jpg162846n8yyox8py1yyg1p5_f8266d79984d4ae6914e5db4927bc640ca3f45f2.jpg162855xfpjqkqhtcw4zkut_459fe6b339154f21cd37347f626cf2b306e301e7.jpg162902njp3enwpnf0nw22j_38e2164e145185fc0ef5609579c8f56f65f42e02.jpg
   因为温度传感器以及步进电机驱动都是使用的数字信号,所以我只使用了ArduinoUno的数字端口。线路与元件都安装好之后,接下俩就是对ArduinoUno编程了。
 
程序:
[C++] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//首先我们需要引入头文件,没有这些头文件,在编程中一些函数就无法调用。
 
#include <dht11.h>   //引用dht11温湿度传感器库文件,使得下面可以调用相关参数
#include <Stepper.h>  ///引用步进电机驱动库文件,使得下面可以调用相关参数
 
//接着依据电路图,我们来定义元件的接口。
 
#define DHT11PIN 6     //dht11温湿度传感器的数据输出接在ArduinoUno的6号数字引脚
Stepper myStepper(stepsPerRevolution,2,3,4,5); //步进电机驱动的输入信号接在ArduinoUno的2,3,4,5号数字引脚
dht11 DHT11;  //实例化DHT11对象,便于后面读取温度使用
 
//接下来定义一些变量,来存储温度数据或者步进电机的位置信息
 
int stepsPerRevolution = 128;  //步进电机每次转动步数
int temlast=0;    //temlast代表上一次读取到的温度数据
int chk,tem;     //chk代表读取到的温湿度数据,tem代表读取到的温度数据
 
//接下来就是初始化程序,里面包含了初始化温度传感器以及各个变量的代码。
 
void setup() {                                                      
Serial.begin(9600);           //设置串口波特率
pinMode(DHT11PIN,OUTPUT);   //定义温湿度传感器的端口为输出
myStepper.setSpeed(50);      //设置步进电机速度为50r/min
 
delay(1000);
chk = DHT11.read(DHT11PIN); //读取温湿度的值赋给chk                                          
tem=DHT11.temperature;    //从DHT11对象中将温度数据分离出来
temlast=tem;          //将温度值赋给存储上一次测量温度值的变量,以便接下来的比较
}
 
//接下来就是主要循环程序,对于控制步进电机转动的方法,我使用了比较的方法,将上一次测量的温度存储起来,与当前测量的温度值比较,根据比较大小来控制步进电机转动方向,具体实现代码如下。
 
void loop() {                                                   
chk = DHT11.read(DHT11PIN);        //读取温湿度的值赋chk
tem=DHT11.temperature;         //从DHT11对象中将温度数据分离出来
 
delay(100);
Serial.print("Tempeature:");       //串口打印出Tempeature:
Serial.println(tem);              //打印温度结果
 
if(tem-temlast>=1)          //如果当前测量温度的结果大于等于上一次测量的温度值1度
{
myStepper.step(stepsPerRevolution); //步进电机正向转动
Serial.println("add");              //串口打印增加
temlast=tem;                    //更新上一次测量的温度值
}
 
else if(tem-temlast<=-1)      //如果当前测量温度的结果小于等于上一次测量的温度值1度         
{
myStepper.step(-stepsPerRevolution); //步进电机反向转动
Serial.println("less");            //串口打印减小
temlast = tem;                 //更新上一次测量的温度值
}
delay(500);                     //延时500ms
}

   连接电脑,烧写代码到ArduinoUno中,打开串口监视器,根据屏幕上显示的温度数值。
163128og6z5jucululgfjh_a5a3347e40326ebb57da924029e926f748f5bc3a.jpg
   来调整回形针指针的位置以及张紧弹簧的位置。调整好之后,一件富有科技与艺术的温度计就做成了,有问题的朋友请在下面留言,这款温度计我已经做成了套材,想了解的请访问链接温度计链接
163226x6nndz6b9s0y7d2s_8c96965389d360fae2ca2c8450ab7ea9e12b31ce.jpg 
PuaChengLin 还没写个人简介...
DesignSpark Electrical Logolinkedin