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