封装好的API,使得程序中的语句更容易被理解,我们不用理会单片机中繁杂的寄存器配置,就能直观的控制Arduino,增强程序可读性的同时,也提高了开发效率。

本篇主要介绍:

一,项目结构

1.setup

2.loop

3.main

二,数字输入输出

1.pinMode ( pin , mode )

2.digitalWrite ( pin , value )

3.digitalRead ( pin )

三,模拟输入输出

1.analogRead

2.analogWrite

四,模拟输入输出

1.tone

2.pulisein

3.外部中断

-----------------------------------------------------------------------------------------------------------

一,项目结构

1.setup

2.loop

3.main

1.setup():

Arduino控制器通电或复位后,即会开始执行setup() 函数中的程序,该部分只会执行一次。
通常我们会在setup() 函数中完成Arduino的初始化设置,如配置I/O口状态,初始化串口等操作。 

  eg.示例程序

// 给13号引脚连接的设备设置一个别名“led”
;

// 在板子启动或者复位重启后, setup部分的程序只会运行一次
void setup(){
  // 将“led”引脚设置为输出状态
  pinMode(led, OUTPUT);
}

// setup部分程序运行完后,loop部分的程序会不断重复运行
void loop()
{
  digitalWrite(led, HIGH);   // 点亮LED
  delay();           // 等待一秒钟
  digitalWrite(led, LOW);   // 通过将引脚电平拉低,关闭LED
  delay();           // 等待一秒钟
}

2.loop():

在setup() 函数中的程序执行完后,Arduino会接着执行loop() 函数中的程序。而loop()函数是一个死循环,其中的程序会不断的重复运行。
通常我们会在loop() 函数中完成程序的主要功能,如驱动各种模块,采集数据等。 

  eg.示例程序

// 给13号引脚连接的设备设置一个别名“led”
;

// 在板子启动或者复位重启后, setup部分的程序只会运行一次
void setup(){
  // 将“led”引脚设置为输出状态
  pinMode(led, OUTPUT);
}

// setup部分程序运行完后,loop部分的程序会不断重复运行
void loop()
{
  digitalWrite(led, HIGH);   // 点亮LED
  delay();           // 等待一秒钟
  digitalWrite(led, LOW);   // 通过将引脚电平拉低,关闭LED
  delay();           // 等待一秒钟
}

3.main():

在进行Arduino开发时,没有像传统C/C++程序使用入口函数main。实际上main函数存在于Arduino核心库中,且仍然是程序的入口。
在Arduino核心库中可见main.cpp文件,其内容如下: 
#include <Arduino.h>

// Declared weak in Arduino.h to allow user redefinitions.
; }

// Weak empty variant initialization function.
// May be redefined by variant files.
void initVariant() __attribute__((weak));
void initVariant() { }

void setupUSB() __attribute__((weak));
void setupUSB() { }

int main(void)
{
    init();

    initVariant();

#if defined(USBCON)
    USBDevice.attach();
#endif

    setup();

    for (;;) {
        loop();
        if (serialEventRun) serialEventRun();
    }

    ;
}
通过以上程序可见,Arduino程序中编写的setup和loop函数,都在main函数中调用了。
loop的循环执行,是通过for循环实现的,且每次loop结束后,都会进行串口事件判断,也正是因为这种设计,串口事件不能实时响应。

二,数字输入输出

1.pinMode ( pin , mode )

2.digitalWrite ( pin , value )

3.digitalRead ( pin )

1.pinMode ( pin , mode ) :

在使用输入或输出功能前,你需要先通过pinMode() 函数配置引脚的模式为输入模式或输出模式。 

参数:  

参数pin为指定配置的引脚编号
参数mode为指定的配置模式
通常可用模式有三种:
INPUT 输入模式
OUTPUT 输出模式
INPUT_PULLUP 输入上拉模式 

  eg.示例程序

/*
  Blink
等待一秒钟,点亮LED,再等待一秒钟,熄灭LED,如此循环
*/

// 在大多数Arduino控制板上 13号引脚都连接了一个标有“L”的LED灯
// 给13号引脚连接的设备设置一个别名“led”
int led = 13;

// 在板子启动或者复位重启后, setup部分的程序只会运行一次
void setup(){
  // 将“led”引脚设置为输出状态
  pinMode(led, OUTPUT);
}

// setup部分程序运行完后,loop部分的程序会不断重复运行
void loop()
{
  digitalWrite(led, HIGH);   // 点亮LED
  delay(1000);           // 等待一秒钟
  digitalWrite(led, LOW);   // 通过将引脚电平拉低,关闭LED
  delay(1000);           // 等待一秒钟
}

2.digitalWrite ( pin , value ) :

之前我们在Blink程序中使用到了pinMode(, OUTPUT),即是把13号引脚配置为输出模式。
配置成输出模式后,你还需要使用digitalWrite() 让其输出高电平或者是低电平。 

参数: 

参数pin为指定输出的引脚编号;
参数value为你要指定输出的电平
使用HIGH指定输出高电平,或是使用LOW指定输出低电平。 

  eg.示例程序

/*
  Blink
等待一秒钟,点亮LED,再等待一秒钟,熄灭LED,如此循环
*/

// 在大多数Arduino控制板上 13号引脚都连接了一个标有“L”的LED灯
// 给13号引脚连接的设备设置一个别名“led”
int led = 13;

// 在板子启动或者复位重启后, setup部分的程序只会运行一次
void setup(){
  // 将“led”引脚设置为输出状态
  pinMode(led, OUTPUT);
}

// setup部分程序运行完后,loop部分的程序会不断重复运行
void loop()
{
  digitalWrite(led, HIGH);   // 点亮LED
  delay(1000);           // 等待一秒钟
  digitalWrite(led, LOW);   // 通过将引脚电平拉低,关闭LED
  delay(1000);           // 等待一秒钟
}
Arduino中输出的低电平为0V,输出的高电平为当前Arduino的工作电压。
例如Arduino UNO的工作电压为5V,其高电平输出也是5V;Arduino Uno工作电压为3.3V,所以高电平输出也就是3.3V。 

3.digitalRead ( pin ) :

在使用输入或输出功能前,你需要先通过pinMode() 函数配置引脚的模式为输入模式或输出模式。 

参数: 

参数pin为指定读取状态的引脚编号。 

返回值: 

返回值为获取到的信号状态,1为高电平,0为低电平。 

 eg.示例程序

 /*
 通过2号引脚连接的按键,控制13号引脚连接的LED
 */

 // 设置各引脚别名
 ;     // 连接按键的引脚
 ;      // 连接LED的引脚

 // 变量定义
 ;         // 存储按键状态的变量

 void setup() {
   // 初始化LED引脚为输出状态
   pinMode(ledPin, OUTPUT);
   // 初始化按键引脚为输入状态
   pinMode(buttonPin, INPUT);
 }

 void loop(){
   // 读取按键状态并存储在变量中
   buttonState = digitalRead(buttonPin);

   // 检查按键是否被按下
   // 如果按键按下,那buttonState应该为高电平
   if (buttonState == HIGH) {
     // 点亮LED
     digitalWrite(ledPin, HIGH);
   }
   else {
     // 熄灭LED
     digitalWrite(ledPin, LOW);
   }
 }

三,模拟输入输出

1.analogRead

2.analogWrite

1.analogRead ( pin ) :

模拟输入引脚是带有ADC(Analog-to-Digital Converter,模数转换器)功能的引脚。
它可以将外部输入的模拟信号转换为芯片运算时可以识别的数字信号,从而实现读入模拟值的功能。
模拟输入功能需要使用analogRead() 函数。 

参数: 

参数pin是指定要读取模拟值的引脚,被指定的引脚必须是模拟输入引脚。如analogRead(A0),即是读取A0引脚上的模拟值。

返回值: 

Arduino Uno模拟输入功能有10位精度,即可以将0~5V的电压信号转换为0~1023的整数形式表示。

 eg.示例程序

/*
光敏电阻检测环境光
http://www.arduino.cn/
*/

void setup()
{
  // 初始化串口
  Serial.begin();
}
void loop()
{
// 读出当前光线强度,并输出到串口显示
  int sensorValue = analogRead(A0);
  Serial.println(sensorValue);
  delay();
}

2.analogWrite ( pin , value ) :


使用analogWrite() 函数实现PWM输出功能。
在Arduino Uno中,提供PWM功能的引脚为3、5、6、9、10、11。


在analogWrite() 和analogRead() 函数内部,已经完成了引脚的初始化,因此不用在Setup() 函数中进行初始化操作。

 

参数: 

参数pin是指定要输出PWM波的引脚;参数value指定是PWM的脉冲宽度,范围为0~255。

返回值: 

Arduino Uno模拟输入功能有10位精度,即可以将0~5V的电压信号转换为0~1023的整数形式表示。

 eg.示例程序

/*
Fading
通过analogWrite() 函数实现呼吸灯效果
*/

;    // LED连接在9号引脚上

void setup()  {
  // Setup部分不进行任何处理
} 

void loop()  {
  // 从暗到亮,以每次加5的形式逐渐亮起来
   ; fadeValue <= ; fadeValue +=) {
    // 输出PWM
    analogWrite(ledPin, fadeValue);
    // 等待30ms,以便观察到渐变效果
    delay();
  } 

  // 从亮到暗,以每次减5的形式逐渐暗下来
   ; fadeValue >= ; fadeValue -=) {
    // 输出PWM
    analogWrite(ledPin, fadeValue);
    // 等待30ms,以便观察到渐变效果
    delay();
  }
}

四,模拟输入输出

1.tone

2.pulisein

3.外部中断

1.调声函数

  1)tone ( ) :

    可以让指定引脚产生一个占空比为50%的指定频率的方波。

  语法: 

  tone(pin, frequency) tone(pin, frequency, duration)

返回值: 

  Arduino Uno模拟输入功能有10位精度,即可以将0~5V的电压信号转换为0~1023的整数形式表示。

  2)no Tone ( pin ):

  停止指定引脚上的方波输出。

  语法:

  noTone(pin)

  参数:

  pin : 余姚停止方波输出的引脚

   eg.示例程序


/*
Melody

Plays a melody
This example code is in the public domain.
http://arduino.cc/en/Tutorial/Tone
*/

#include "pitches.h"

// 记录曲子的音符
int melody[] = {
  NOTE_C4, NOTE_G3,NOTE_G3, NOTE_A3, NOTE_G3,, NOTE_B3, NOTE_C4};

// 音符持续时间  4为四分音符, 8为八分音符
int noteDurations[] = {
  , , , ,,,, };

void setup() {
  // 遍历整个曲子的音符
  ; thisNote < ; thisNote++) {

// noteDurations[]数组中存储的是音符的类型
// 我们需要将其换算为音符持续时间,方法如下:
    // 音符持续时间=1000ms / 音符类型
    // 例如,四分音符=1000 / 4,8分音符 = 1000/8
    /noteDurations[thisNote];
    tone(, melody[thisNote],noteDuration);

    // 为了能辨别出不同的音调,你需要在两个音调间设置一定的延时
    // 增加30%延时时间是比较合适的
    int pauseBetweenNotes = noteDuration * 1.30;
    delay(pauseBetweenNotes);
    // 停止发声
    noTone();
  }
}

void loop() {
  // 程序并不重复,因此这里为空
}

2.pulisein() :

  检测指定引脚上的脉冲信号宽度。

  例如当要检查高电平脉冲时,pulseln()会等待指定引脚输入的电平变高,当变高后开始记时,知道输入电平变低,停止计时。

  pulseln()函数会返回这个脉冲信号的持续时间,即这个脉冲的宽度。

  函数还可以设定超时时间,如果超时设定时间,仍未检测到脉冲,则会退出pulseln()函数并返回0.

  当没有设定超时时间时,pulseln()会默认1秒钟的超时时间。

  语法:

  1)pulseln ( pin , value )

   2)pulsein ( pin , value , timeout )

  参数:

  pin : 需要读取脉冲的引脚

   value :需要读取的脉冲类型, HIGH OR LOW

  timeout :超时时间 ,单位微秒 ,数据类型为无符号长整型。

  返回值:

  返回脉冲宽度 , 单位微秒 ,数据类型为无符号长整型 。 如果在指定时间内没有检测到脉冲,则返回0 .

  eg.示例程序

/*
SR04超声波传感器驱动
串口显示检测距离
*/

// 设定SR04连接的Arduino引脚
;
;
float distance; 

void setup()
{   // 初始化串口通信及连接SR04的引脚
    Serial.begin();
    pinMode(TrigPin, OUTPUT);
    // 要检测引脚上输入的脉冲宽度,需要先设置为输入状态
    pinMode(EchoPin, INPUT);
    Serial.println("Ultrasonic sensor:");
} 

void loop()
{
    // 产生一个10us的高脉冲去触发TrigPin
    digitalWrite(TrigPin, LOW);
    delayMicroseconds();
    digitalWrite(TrigPin, HIGH);
    delayMicroseconds();
    digitalWrite(TrigPin, LOW);
    // 检测脉冲宽度,并计算出距离
    distance = pulseIn(EchoPin, HIGH)/ 58.00;
    Serial.print(distance);
    Serial.print("cm");
    Serial.println();
    delay();
}

3.外部中断

  影响中断的处理程序——中断函数,当中断触发后,Arduino便会进行这个函数。

   该函数不能带任何参数,且返回类型为空。如:

void Hello () {
    flag = ture ;
}

  1)attachlneterrupt ( pin , ISR , mode )

     对中断引脚进行初始化设置,以开启Arduino的外部中断功能

    示例:

      attachinterrupt ( 2 , Hello , LOW ) ;该语句会开启Arduino Uno 的 2 号引脚(中断编号0)的外部中断功能,并指定下降沿时触发该中断。

      当2号引脚上电平由高变低后,该中断会被触发,Arduino即会运行Hello ()函数中的语句。

  2) detachlnterrupt ( pin )

    如果你不需要使用外部中断了,你可以用中断分离函数detachlnterrupt()来关闭中断功能。

    参数:
      pin : 需要禁用中断的引脚。

    示例:

      detachlnterrupt( 2 )

   

  eg.示例程序

/*
Arduino外部中断的使用
外部中断触发警报声
*/

// 默认无遮挡,蜂鸣器发声
volatile boolean RunBuzzer = true;

void setup()
{
  Serial.begin();
  // 初始化外部中断
  // 当2号引脚输入的电平由高变低时,触发中断函数warning
  attachInterrupt(, warning, CHANGE);
}

void loop()
{
  if(RunBuzzer)
  {
    tone(,);
  }
  else
  {
    noTone();
  }
}

// 中断函数
void warning ()
{
  RunBuzzer=!RunBuzzer;
}

Arduino 常用函数参考文档的更多相关文章

  1. redis参考文档

    本文为之前整理的关于redis的文档,放到博客上一份,也方便我以后查阅. redis简介 Redis是一个开源的.高性能的.基于键值对的缓存与存储系统, 通过提供多种键值数据类型来适应不同场景下的缓存 ...

  2. 微信小程序 不在以下合法域名列表中,请参考文档:https://mp.weixin.qq.com/debug/wxadoc/dev/api/network-request.html

    微信小程序  不在以下合法域名列表中,请参考文档:https://mp.weixin.qq.com/debug/wxadoc/dev/api/network-request.html 友情提示: 大家 ...

  3. Web Api 在线参考文档

    参考文档: https://developer.mozilla.org/zh-CN/docs/Web/API

  4. 让IE8兼容问题,参考文档bootstrap

    问题:制作的页面基本没啥问题,只有IE8不好使 参考文档:bootstrap官网 方案一 方案二

  5. 教您怎么从spring 官网下载参考文档

    假如您使用spring,那么本经验可能帮助到您. 假如您使用spring的过程中,需要查询一些文档,那么本经验可能帮助到您. 假如您对下载spring的文档有疑惑,那么本经验可能帮助到您. 教您怎么从 ...

  6. nexus 参考文档

    参考文档: http://books.sonatype.com/nexus-book/reference/index.html E:\e\nexus\nexus-2.12.0-01\conf\nexu ...

  7. Oracle官网下载参考文档

    最近有人问我有没有Oracle11g数据库官方参考文档,我就想,这不是在官网可以下载到的吗,疑惑,问了之后才知道,他官网找过,但时没有找到.不要笑,其实有很多人一样是找不到的,下面就一步一步操作下: ...

  8. Qt5.11参考文档

    Qt5.11参考文档: http://www.bim-times.com/qt/Qt-5.11.1/qtdoc/index.html (来源于Qt官网)

  9. RxJava 参考文档

    /*************************************************************** * RxJava 参考文档 * 说明: * 最近无意中发现RxJava ...

随机推荐

  1. JVM的内存区域

    Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域, 包含程序计数器.虚拟机栈.本地方法栈.Java堆.方法区(运行时常量池).直接内存等,不同的版本会有所差异 各区 ...

  2. Excel催化剂开源第32波-VSTO开发的插件让WPS顺利调用的方法-注册表增加注册信息

    VSTO插件开发完成后,鉴于现在WPS用户也不少,很多时候用户没办法用OFFICE软件,只能在WPS环境下办公,VSTO开发的插件,只需增加一句注册表信息,即可让WPS识别到并调用VSTO开发的功能, ...

  3. Spring 自动生成getter和setter方法 tostring方法

    添加maven依赖 <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency& ...

  4. PHP中的$_POST变量

    定义 在 PHP 中,预定义的 $_POST 变量用于收集来自 method="post" 的表单中的值. $_POST 变量 预定义的 $_POST 变量用于收集来自method ...

  5. spring 事务隔离级别导致的bug

    事情是这样的,ios进货单有一个数量加一手,减一手的功能,每加减一次就会异步调用后台的接口,后台判断sku如果不存在就插入,存在就更新.   问题描述: 当ios发了多次请求后, 在第二次请求的时候, ...

  6. centos7主机间免密登录、复制文件

    下面实例为三个节点间 1.分别在三个节点设置域名映射 vi /etc/hosts  在文件末尾追加 192.168.10.121 node1 192.168.10.122 node2 192.168. ...

  7. Calico 网络通信原理揭秘

    Calico 是一个纯三层的数据中心网络方案,而且无缝集成像 OpenStack 这种 Iaas 云架构,能够提供可控的 VM.容器.裸机之间的 IP 通信.为什么说它是纯三层呢?因为所有的数据包都是 ...

  8. git远程服务器回滚

    1.git log查找commit hash 2.git reset --hard hash 回滚本地git库 3.git push -f origin(git仓库的url) branch名 强制提交

  9. TestNg中的断言你真的了解吗

    前言 在执行自动化测试脚本的时候,我们需要自动判断测试脚本执行完成后的实际结果是否与预期结果一致,这个时候就需要在程序运行之前写入断言,判断当前程序执行后是否正常. 关于TestNG断言分为两种: 软 ...

  10. 脱壳系列_2_IAT加密壳_详细版解法1(含脚本)

    1 查看壳程序信息 使用ExeInfoPe 分析: 发现这个壳的类型没有被识别出来,Vc 6.0倒是识别出来了,Vc 6.0的特征是 入口函数先调用GetVersion() 2 用OD找OEP 拖进O ...