因为ArduinUno支持很多开源库以及传感器,所以编写程序起来也是十分简单,易于操作,相比较其他单片机需要了解各种复杂的寄存器起来,ArduinoUno只需要简单的语句即可实现很多功能。单片机性能方面,ArduinoUno所搭载的Atmega328单片机的资源也足够使用,并且有RISC精简指令集的加持,ArduinoUno足够胜任本项目。
选择好单片机之后,其他元件的选择就简单了许多,温度测量方面使用了DHT11温湿度传感器,它可以测量环境的温湿度,单总线传输数据的方式更加节省端口资源,得益于Arduino的开源环境,使用它也是十分容易,只需要一个函数即可获取温湿度信息,是制作温度计的不二之选。
步进电机的驱动模块使用ULN2003大功率达林顿晶体管阵列模块,此模块很易于找到并且价格低廉,搭配我选择的步进电机是不二之选。板载4路led指示灯可以清楚的观察到各相的工作状态。
这里再次感谢Arduino的开源环境,各路大神早已为我们写好了此驱动模块的函数库,我们只需要调用即可。这里是设计好的电路图:
完成的结构设计以及元件之后,接下来就是设计木板的图纸了,经过一小会忙活,设计好图纸,发送给厂家切割,几天后,收到了切好的木板:
接下来就是安装了,将各个元件悉数安装到对应位置,并将线路接好:
因为温度传感器以及步进电机驱动都是使用的数字信号,所以我只使用了ArduinoUno的数字端口。线路与元件都安装好之后,接下俩就是对ArduinoUno编程了。
程序:
- //首先我们需要引入头文件,没有这些头文件,在编程中一些函数就无法调用。
- #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中,打开串口监视器,根据屏幕上显示的温度数值。
来调整回形针指针的位置以及张紧弹簧的位置。调整好之后,一件富有科技与艺术的温度计就做成了,有问题的朋友请在下面留言,这款温度计我已经做成了套材,想了解的请访问链接
务必记住,如果有需要的朋友请发送我们的暗号“51黑电子”给我,我会给你们优惠!