# 一步步搭建物联网系统(教你设计物联网系统)

# 1 Arduino 极客的玩具

## 1.1 极客的玩具

Arduino，是一个开放源代码的单芯片微电脑，它使用了Atmel AVR单片机，采用了基于开放源代码的软硬件平台，构建于开放源代码 simple I/O 接口板，并且具有使用类似Java，C 语言的Processing/Wiring开发环境。

Arduino开发板封装了常用的库到开发环境中，可以让用户在开发产品时，将主要注意力放置于所需要实现的功能上，而不是开发的过程中。在为Arduino写串口程序时，我们只需要用Serial.begin(9600)以9600的速率初始化串口，而在往串口发送数据时，可以用Serial.write(‘1’)的方式向串口发送字串’1’。

Arduino的出现很大程度上降低了电子制作的难度，初学者甚至不懂编程也可以上手Arduino,这也是它的魅力所在。

## 1.2 硬件熟悉

为了满足各种需求，Arduino团队设计了很多款开发板，如UNO、Pro mini、Mega2560、Due、Leonardo、Yún、Pro、Fio、Nano等十几种 开发板和扩展板。最适合初学者的一款是Arduino UNO 。下图是Arduino UNO 的外观图：

UNO

注：后面的程序也是基于Arduino UNO开发板来讲解。

## 1.3 开发环境

Arduino

开发环境如上图，十分简洁，编写代码需要知道两个基本的函数：

    void setup(){

    }

    void loop(){

    }

`setup()`函数用于初始化（如GPIO初始化，串口初始化，定时器初始化等）特点是只执行一次；`loop()`函数是一个死循环，可以看做C语言的`while(1)`函数。

## 1.4 点亮一个LED

对初学者来说，点亮led已成为入门必修课，使用Arduino控制led十分简单，并且很容易理解。 使用到的函数：

- pinMode(pin,mode)
- digitalWrite(pin,value)

上一段代码分析：

    int led=13;

    void setup()
    {
        pinMode(led,OUTPUT);
    }
    void loop()
    {
        digitalWrite(led,HIGH);
        delay(1000);
        digitalWrite(led,LOW);
        delay(1000);
    }

该程序实现Arduino单片机13号引脚以1S时间电平翻转，如果外接一个led，就可以看到led以1S的间隔闪烁；函数`pinMode()`有两个参数pin、value，pin参数用来指定引脚号,本程序中设置为13号引脚，mode用于设置引脚模式，有三个值：

- `INPUT`
- `OUTPUT`
- `INPUT_PULLUP`

表示让某一个IO引脚作输入，反之，

- `OUTPUT`则使一个IO引脚做输出
- `INPUT_PULLUP`则配置一个IO引脚具有上拉输入功能(上拉电阻的目的是为了保证在无信号输入时输入端的电平为高电平)，从英文意思也能很直观的看出来。

理解了`pinMode()`函数,`digitalWrite()`就很容易理解啦，value的取值有两个`HIGH`、`LOW`,`HIGH`表示让某一个引脚输出高电平，反之，`LOW`则使某一个引脚输出低电平。 程序中还是用到`delay(ms)`函数，它表示延时多少毫秒，例如延时500 ms ,直接调用`delay(500)；`就可以了。

如果你仔细查看我的描述，你会发现我没有讲13号引脚怎么来的，是这样的：Arduino团队为了简化对引脚描述，对每个引脚都进行了编号，以UNO开发板为例，可以发现开发板排座的附近有对应的白颜色的数字，那便是所有的引脚编号，A0~A5是6路ADC输入引脚，0-13表示13路基本IO，数字前面的`~`表示该引脚具有PWM功能。如果要使用某一引脚，只需要知道引脚编号就可编写相应代码进行操作。

例如`digitalWrite(2,LOW)`表示向2号引脚输出低电平。其他操作类似，是不是so easy - !

## 1.5 串口通信

使用到的基本函数：

- Serial.begin()
- Serial.write()
- Serial.read()
- Serial.available()

在此项目中需要使用串口，Arduino串口初始化使用`Serial.begin(9600);`,其传输波特率为9600，其他波特率也行，函数位于`setup()`中，之后可以使用`Serial.read()`、`Serial.write()`读入一个字符，输出一个字符，使用`Serial.print()`输出字符串.代码如下:

    char ch='1';
    void setup()
    {
        Serial.begin(9600);
    }
    void loop()
    {
        Serial.write(ch);
        while(1)
        {
            if(Serial.available())
            {
                ch = Serial.read();
                Serial.print(ch);
            }
        }
    }

以上程序实现字符的输出(Serial.write(),Serial.print())和读入(Serial.read())。如果需要了解更多，可以参考：Arduino官网

### 1.5.1 关于Arduino Setup()

如果你对Arduino的Setup很疑惑的话，可以看看这里。下面Arduino源码目录中的main函数:

    #include <Arduino.h>

    int main(void)
    {
        init();
        setup();
        for (;;) {
            loop();
            if (serialEventRun) serialEventRun();
        }
        return 0;
    }

hwcnt