找回密码
 注册SCIFIFANS!
首页 科技专区 嵌入式开发 Arduino入门-基本函数介绍

Arduino入门-基本函数介绍

15
回复
10254
查看
[ 复制链接 ]

该用户从未签到

10

主题

51

回帖

404

积分

Judgement

积分
404
<

用邮箱/用户名来登录sci-fifans!

您需要 登录 才可以下载或查看,没有账号?注册SCIFIFANS!

x
本帖最后由 skyone 于 2021-7-5 15:31 编辑

主要内容
这个帖子主要包含:Arduino核心库常用函数的用法以及示例。

主要包含以下分类:
  • 必备函数
  • 引脚控制
  • 时间相关
  • 串口通信

STM32还不太会,先水水Arduino吧(笑)

注意: 本文档由作者纯手打,请勿转载,但可以部分引用,请注明出处。

一人血书求支持MarkDown
一人血书求支持MarkDown
一人血书求支持MarkDown


你们看Markdown多漂亮:

Arduino入门-基本函数介绍

Arduino入门-基本函数介绍

使用道具 举报

该用户从未签到

10

主题

51

回帖

404

积分

Judgement

积分
404
本帖最后由 skyone 于 2021-7-5 15:19 编辑

setup()
函数原型

void setup();
作用
Arduino通电或复位后,即会开始执行 setup() 函数中的程序,该函数只会执行一次

loop()
函数原型

void loop();
作用

在setup() 函数中的程序执行完后,Arduino会接着会无限循环 loop() 函数。

main() 函数呢?

我们知道,不管是C语言还是C++,程序的入口都是 main() 函数,那么为什么 Arduino 程序没有 main() 函数呢?
实际上,main() 函数并没有消失,它依然是 Arduino 程序的入口,只是 Arduino 设计人员将它移到了核心库里,让我们翻看一下 Arduino 核心库的 main.cpp 文件,它在 Arduino安装目录/hardware/arduino/avr/cores/arduino 里

// main.cpp

#include <Arduino.h>

int atexit(void (* /*func*/ )()) { return 0; }

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();
    }
        
    return 0;
}
注意: 一个程序不能有两个 main() 函数,Arduino 核心库已经定义了 main() 函数,因此我们的程序里不能包含 main() 函数。

示例

这个例子可以使 LED 闪烁
将 LED 的正极接电阻,再接 3 号引脚,负极接 GND 引脚

/*
* Author:  Skyone
* Date:    2020/02/28
*/

#define 3 LED

void setup() {
    // Put your setup code here, to run once.
    // 将你用于初始化的代码放在这里,这些代码只会执行一次。
   
    pinMode(LED, OUTPUT);   // 将 `LED` 引脚初始化为输出模式
}

void loop() {
    // Put your main code here, to run repeatedly.
    // 将你的业务函数放在这里,这些代码会一直循环的运行。
   
    digitalWrite(LED, HIGH);    // 将 `LED` 引脚设为 高电平
    sleep(1000);                // 停止 1 秒
    digitalWrite(LED, LOW);     // 将 `LED` 引脚设为 低电平
    sleep(1000);                // 停止 1 秒
}

使用道具 举报

该用户从未签到

10

主题

51

回帖

404

积分

Judgement

积分
404
本帖最后由 skyone 于 2021-7-5 15:24 编辑

引脚控制

简介

实现引脚控制的第一步是定义引脚,这一步使用 pinMode() 函数,这一步决定了该引脚是输入还是输出。
然后我们使用例如 digitalWrite() 的函数控制引脚的具体电位。
目录

  • digitalWrite
  • digitalRead
  • analogWrite
  • ananlogRead


函数原型

void pinMode(uint8_t pin, uint8_t mode);作用

在使用引脚前,需要先使用 pinMode() 定义引脚的模式。
参数

  • pin
    指定引脚的编号,如: 10 , A0 等。
  • mode
    指定引脚的模式。

其中,mode 可以是以下值:


模式
名称
介绍
INPUT输入模式可以读取该引脚的电位
OUTPUT输出模式可以控制该引脚的输出
INPUT_PULLUP输入上拉模式启动板载电阻,使该引脚可以直接连接 5V 电压而不需要在之间另加电阻,但不能接负电位,不能接大于 5V 的电压。
示例

pinMode(3, INPUT);          // 设置 3 号引脚为 输入模式
pinMode(4, OUTPUT);         // 设置 4 号引脚为 输出模式
pinMode(5, INPUT_PULLUP);   // 设置 5 号引脚为 输入上拉模式





函数原型

int analogRead(uint8_t pin);作用

读取指定引脚的电位,只有支持模拟输入的引脚才能调用此函数。
注意: 在调用此函数之前要保证该引脚已经 pinMode 过,且为输入模式。
参数

  • pin
    指定引脚的编号,如: 10 , A0 等。

返回值

  • int 整型
    指定的引脚的电位

返回值的范围为 0~1023
示例

// 假设 4 号引脚连接的是 3V
int state = digitalWrite(4);
// state = 3 * 1023 / 5;

使用道具 举报

该用户从未签到

10

主题

51

回帖

404

积分

Judgement

积分
404
函数原型

void analogWrite(uint8_t pin, int val);
作用
设置指定引脚的电压,而且只有支持模拟输出的引脚才能使用此函数。
判断是否支持模拟输出的标志是引脚编号旁有一个小波浪线,但 Arduino Uno 中 A 开头的引脚除外,它们既支持模拟输出,又支持模拟输入。
注意: 在调用此函数之前要保证该引脚已经 pinMode 过,且为输出模式。

参数

  • pin
    指定引脚的编号,如: 10 , A0 等。
  • val
    引脚的电平。

其中,val 的值的范围是 0~255,也就是电压位 0 对应 0, 电压为 5V 对应 255,成比例对应

示例

digitalWrite(3, 0);   // 设置 3 号引脚为 0V
digitalWrite(3, 255); // 设置 3 号引脚为 5V
digitalWrite(3, 233); // 设置 3 号引脚为 (5 * 233 / 255)V

使用道具 举报

该用户从未签到

10

主题

51

回帖

404

积分

Judgement

积分
404
函数原型

int digitalRead(uint8_t pin);
作用

读取指定引脚的电位

注意: 在调用此函数之前要保证该引脚已经 pinMode 过,且为输入模式。

参数

  • pin
    指定引脚的编号,如: 10 , A0 等。

返回值

  • int 整型
    指定的引脚的电位

返回值有以下两种可能:

名称
介绍
HIGH高电平引脚电压为 5V
LOW低电平引脚电压为 0V
示例

// 假设 4 号引脚连接的是 高电平
int state = digitalWrite(4);
// state = HIGH; 也就是 stats = 1;

使用道具 举报

该用户从未签到

10

主题

51

回帖

404

积分

Judgement

积分
404
函数原型

void digitalWrite(uint8_t pin, uint8_t val);
作用

设置指定引脚的电位
注意: 在调用此函数之前要保证该引脚已经 pinMode 过,且为输出模式。

参数

  • pin
    指定引脚的编号,如: 10 , A0 等。
  • val
    引脚的电平。

其中,val 可以是以下值:

名称
介绍

HIGH高电平使引脚输出5V电压
LOW低电平使引脚变为0V
示例

digitalWrite(3, HIGH);  // 设置 3 号引脚为 高电平
digitalWrite(3, HIGH);  // 设置 3 号引脚为 低电平

使用道具 举报

该用户从未签到

10

主题

51

回帖

404

积分

Judgement

积分
404
时间相关


简介
控制时间分为两类:
  • 延时
  • 获取时间

目录
  • delay
  • delayMicrosecond
  • millis
  • micros


使用道具 举报

该用户从未签到

10

主题

51

回帖

404

积分

Judgement

积分
404
函数原型

void delay(unsigned long ms);
作用

是程序停止执行一段时间,就像 Windows 下 C 中的 sleep()

参数

  • ms
    如你所加,程序暂停的时间,单位毫秒


示例

delay(1000);    // 延时 1 秒
delay(333);     // 延时 333 毫秒

使用道具 举报

该用户从未签到

10

主题

51

回帖

404

积分

Judgement

积分
404
函数原型

void delayMicroseconds(unsigned int us);
作用

是程序停止执行一段时间,就像 Linux 下 C 中的 usleep()

参数

  • us
    如你所加,程序暂停的时间,单位微秒


示例

delayMicroseconds(1314);    // 延时 1314 微秒
delayMicroseconds(521);     // 延时 521 微秒

使用道具 举报

该用户从未签到

10

主题

51

回帖

404

积分

Judgement

积分
404
函数原型

unsigned long millis(void);
作用

获取 Arduino 通电后或复位后到现在的时间,单位毫秒
就类似于 Python 里的 time.time() ,只不过单片机不知道现在的时间,所以不是 1970 年 1 月 1 日 0 时 0 分 0 秒起至现在的总秒数,而是Arduino 通电后或复位后到现在的时间。

返回值

  • unsigned long 无符号整型
    Arduino 通电后或复位后到现在的时间,单位毫秒


示例

void setup() {
    return;
}

coid loop() {
    delay(500);
   
    int time = millis();
    // time 约等于 500
}



函数原型

unsigned long micros(void);
作用

获取 Arduino 通电后或复位后到现在的时间,单位微秒

返回值

  • unsigned long 无符号整型
    Arduino 通电后或复位后到现在的时间,单位微秒


示例

void setup() {
    return;
}

coid loop() {
    delay(500);
   
    int time = micros();
    // time 约等于 500,000
}

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 注册SCIFIFANS!

本版积分规则