Contents
前情提示
还记得我的初心吗?想做一个自动浇水的系统。到手的arduino uno r3开发板套装里有好几个传感器,温度传感器,声音传感器,显示屏,还有4位数码管等。
我要的土壤湿度传感器,继电器没有,就在某宝上再买了。
先搞些事情
等这些东西的过程中,不防试一着再玩一下,用4位数码管显示一下温度?哈哈。
第一步,先玩转传感器DS18B20
如果不想仔细了解该传感器,可以直接跳到第二步。
耗材
温度传感器DS18B20 * 1;
10k Ω 电阻 * 1;
连接线 若干;
连接细节
1. 温度传感器DS18B20引脚:三个引脚,平面面对我们的时候,最左侧接地;最右侧接+5v;中间是数据引脚;
2. 数据引脚需要一个10k Ω的上拉电阻;
程序
1. 依赖OneWire类库
#include <OneWire.h>
2. 依赖DallasTemperature类库
#include <DallasTemperature.h>
这个类库将封装了几个温度传感器的使用程序,支持DS18S20,DS18B20,DS1822,我们可以很简单的使用其api调用该模块的功能;
如果还没有安装OneWire类库,可以根据以下步骤安装,如果没有安装DallasTemperature类库,可以使用[github上的](https://github.com/milesburton/Arduino-Temperature-Control-Library)
代码
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS A0
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
void setup(void)
{
// start serial port
Serial.begin(9600);
Serial.println("Dallas Temperature IC Control Library Demo");
// Start up the library
sensors.begin();
}
void loop(void)
{
// call sensors.requestTemperatures() to issue a global temperature
// request to all devices on the bus
Serial.print("Requesting temperatures...");
sensors.requestTemperatures(); // Send the command to get temperatures
Serial.println("DONE");
Serial.print("Temperature for the device 1 (index 0) is: ");
Serial.println(sensors.getTempCByIndex(0));
delay(3000);
}
第二步,玩转4位管让温度显示在4位管上
耗材
线:若干;
1k Ω 电阻 * 4;
10k Ω 电阻 * 1;
4位管 * 1(3641AS);
温度传感器 * 1 (DS18B20);
细节
代码
/*
Unit1 A1
Unit2 A2
Unit3 A3
Unit4 A4
A-G,DP 3-10
A0 18B20's data pin
*/
#include <OneWire.h>
#include <DallasTemperature.h>
#define TempSensor A0
OneWire oneWire(TempSensor);
DallasTemperature sensors(&oneWire);
#define EyesDelay 1
void SelectUnit(int ID)
{
switch (ID)
{
case 1:
digitalWrite(A1, LOW);
digitalWrite(A2, HIGH);
digitalWrite(A3, HIGH);
digitalWrite(A4, HIGH);
break;
case 2:
digitalWrite(A1, HIGH);
digitalWrite(A2, LOW);
digitalWrite(A3, HIGH);
digitalWrite(A4, HIGH);
break;
case 3:
digitalWrite(A1, HIGH);
digitalWrite(A2, HIGH);
digitalWrite(A3, LOW);
digitalWrite(A4, HIGH);
break;
case 4:
digitalWrite(A1, HIGH);
digitalWrite(A2, HIGH);
digitalWrite(A3, HIGH);
digitalWrite(A4, LOW);
break;
default:
digitalWrite(A1, HIGH);
digitalWrite(A2, HIGH);
digitalWrite(A3, HIGH);
digitalWrite(A4, HIGH);
break;
}
}
void ShowData(int UnitID, char * data)
{
SelectUnit(UnitID);
for (int i = 0; i < 8; i++)
{
if (data[i] == '0')
{
digitalWrite(i + 3, LOW);
}
else
{
digitalWrite(i + 3, HIGH);
}
}
}
void ShowNone()
{
digitalWrite(A1, HIGH);
digitalWrite(A2, HIGH);
digitalWrite(A3, HIGH);
digitalWrite(A4, HIGH);
for (int i = 3; i <= 10 ; i++)
{
digitalWrite(i, LOW);
}
}
void Show(int UnitID, char a)
{
ShowNone();
switch (a)
{
case '0':
ShowData(UnitID, "11111100");
break;
case '1':
ShowData(UnitID, "01100000");
break;
case '2':
ShowData(UnitID, "11011010");
break;
case '3':
ShowData(UnitID, "11110010");
break;
case '4':
ShowData(UnitID, "01100110");
break;
case '5':
ShowData(UnitID, "10110110");
break;
case '6':
ShowData(UnitID, "10111110");
break;
case '7':
ShowData(UnitID, "11100000");
break;
case '8':
ShowData(UnitID, "11111110");
break;
case '9':
ShowData(UnitID, "11110110");
break;
case '.':
ShowData(UnitID, "00000001");
break;
case '-':
ShowData(UnitID, "00000010");
break;
default:
ShowNone();
break;
}
delay(EyesDelay);
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
for (int i = 3; i <= 10; i++)
{
pinMode(i, OUTPUT);
}
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT);
pinMode(A4, OUTPUT);
sensors.begin();
}
void ShowTemp(float val)
{
char buf[8];
for (int i = 0; i < 8; i++)
{
buf[i] = '\0';
}
dtostrf(val, 1, 3, buf);
if (buf[1] == '.') //0.123
{
Show(1, buf[0]);
Show(1, '.');
Show(2, buf[2]);
Show(3, buf[3]);
Show(4, buf[4]);
}
if (buf[2] == '.') //11.12
{
Show(1, buf[0]);
Show(2, buf[1]);
Show(2, '.');
Show(3, buf[3]);
Show(4, buf[4]);
}
if (buf[3] == '.') //111.12
{
Show(1, buf[0]);
Show(2, buf[1]);
Show(3, buf[2]);
Show(3, '.');
Show(4, buf[4]);
}
if (buf[4] == '.') //1112.12
{
Show(1, buf[0]);
Show(2, buf[1]);
Show(3, buf[2]);
Show(4, buf[3]);
Show(4, '.');
}
}
void loop() {
// Get 18B20 Data
sensors.requestTemperatures();
float t = sensors.getTempCByIndex(0);
Serial.print("Temperature is: ");
Serial.println(t);
delay(1000);
for (int i = 0; i < 600; i++)
{
ShowTemp(t);
}
ShowNone();
}
4位管的操作也可以搞成一个类库,有兴趣的同学可以试一试哈。
学到
上拉电阻:上拉就是将不确定的信号通过一个电阻钳位在高电平,电阻同时起限流作用。下拉同理,也是将不确定的信号通过一个电阻钳位在低电平。
上拉是对器件输入电流,下拉是输出电流;强弱只是上拉电阻的阻值不同,没有什么严格区分;对于非集电极(或漏极)开路输出型电路(如普通门电路)提供电流和电压的能力是有限的,上拉电阻的功能主要是为集电极开路输出型电路输出电流通道。
上拉电阻图示:
下拉电阻(R1)图示(意思是将电路节点的电平向低方向(地)拉):
2018.06.02