Arduino学习笔记

前言

1. 本文章的基本知识框架体系是基于哔哩哔哩网站的UP主“太极创客”关于Arduino开发板的相关教学视频。

2. 本文章的性质属于网课学习笔记,供个人的知识梳理和学习使用。

3. 本文章的有关代码和截图来自“太极创客”的官方网站和相关教学视频。

4. 本文章的实物模拟电路图(包括视频示例中的电路)均来自“Thinkercad”的官网

5. 本文章仅作为学习Arduino相关知识的参考。

6. 本文章随着本人学习的不断深入会进行不定时的更新。 

7. 欢迎Arduino开发板爱好者和专业人士的批评指正。

太极创客的个人空间-太极创客个人主页-哔哩哔哩视频 (bilibili.com)icon-default.png?t=N7T8https://space.bilibili.com/103589285
太极创客 – Arduino, ESP8266物联网的应用、开发和学习资料 (taichi-maker.com)icon-default.png?t=N7T8http://www.taichi-maker.com/

Tinkercad | From mind to design in minutesTinkercad is a free, easy-to-use app for 3D design, electronics, and coding.icon-default.png?t=N7T8https://www.tinkercad.com/ 

基础知识篇

一、Arduino开发板简要介绍:

Arduino UNO是一款流行的开源单板微控制器,是Arduino开发板系列中最经典和常用的型号之一。它由Arduino公司设计,基于Atmel(现在是Microchip Technology)的AVR微控制器ATmega328P。以下是Arduino UNO开发板的主要特点和功能:

  1. 微控制器:Arduino UNO使用ATmega328P微控制器,是一款8位AVR微控制器,具有32KB的Flash存储器、2KB的SRAM和1KB的EEPROM。
  2. 时钟频率:主时钟频率为16MHz。
  3. 数字引脚:有14个数字引脚(Digital Pins),标记为D0到D13。其中,D0和D1用于串口通信(Rx和Tx)。
  4. 模拟引脚:有6个模拟引脚(Analog Pins),标记为A0到A5。它们可以用于读取模拟信号,如从传感器获取模拟数据。
  5. PWM引脚:有6个支持PWM(脉宽调制)的引脚,标记为D3、D5、D6、D9、D10和D11。这些引脚可以用于产生模拟信号,如控制电机的速度或调节LED的亮度。
  6. 串口通信:支持串口通信,其中D0和D1引脚用于与计算机或其他设备进行串口通信。
  7. USB接口:具有一个USB接口,可以用于上传代码和与计算机通信。
  8. 电源接口:可以通过USB接口或外部电源供电。外部电源的输入电压范围为7V至12V,或使用VIN引脚进行供电。
  9. 复位按钮:板上有一个复位按钮,用于重新启动程序。
  10. Arduino IDE兼容:可以使用Arduino IDE进行代码编写、编译和上传。
  11. 开源:Arduino UNO是开源的,意味着其硬件和软件规格都是开放的,任何人都可以参与和改进。
Arduino UNO R3 实体模拟图

二、Arduino程序 - 程序结构

/*
  Blink

  Turns an LED on for one second, then off for one second, repeatedly.

  Most Arduinos have an on-board LED you can control. On the UNO, MEGA and ZERO
  it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN is set to
  the correct LED pin independent of which board is used.
  If you want to know what pin the on-board LED is connected to on your Arduino
  model, check the Technical Specs of your board at:
  https://www.arduino.cc/en/Main/Products

  modified 8 May 2014
  by Scott Fitzgerald
  modified 2 Sep 2016
  by Arturo Guadalupi
  modified 8 Sep 2016
  by Colby Newman

  This example code is in the public domain.

  https://www.arduino.cc/en/Tutorial/BuiltInExamples/Blink
*/

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);  // turn the LED on (HIGH is the voltage level)
  delay(1000);                      // wait for a second
  digitalWrite(LED_BUILTIN, LOW);   // turn the LED off by making the voltage LOW
  delay(1000);                      // wait for a second
}

这段代码是一个Arduino的简单示例,用于控制板载LED的闪烁。

  1. 这段代码主要用于使Arduino上的LED灯以一秒钟的频率闪烁。注释中还提到了不同Arduino板上的LED引脚可能会有所不同,并给出了一个链接,用户可以查询他们使用的Arduino板的规格。
  2. setup() 函数:这个函数在Arduino启动或重置时运行一次。在这里,它被用来设置LED_BUILTIN引脚为输出模式,这样我们就可以控制它来打开或关闭LED灯。
  3. loop() 函数:这个函数会不断地运行,只要Arduino没有被关闭或重置。在这个函数中,首先将LED_BUILTIN引脚设置为高电平(HIGH),这将打开LED灯。然后,程序会等待一秒钟(1000毫秒)再执行下一行代码。下一行代码将LED_BUILTIN引脚设置为低电平(LOW),这将关闭LED灯。然后,程序再次等待一秒钟。这个过程会不断地重复,所以LED灯会不断地闪烁。

视频示例: 

Arduino程序 - 结构程序

三、数字输出 - Arduino控制LED

(1)LED的简要介绍

1. 不同的LED会有不同的特性,这里给出的发光二极管的简单电路原理仅作为参考。

2. 图片源自视频截图:1-10 数字输出1 - 学用LED_哔哩哔哩_bilibili 

 (2)包含LED的电路与程序

 要根据LED的基础参数选择合适阻值的电阻。

int ledPin = 5;

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  digitalWrite(ledPin, HIGH);
  delay(1000);
  digitalWrite(ledPin, LOW);
  delay(1000);
}

视频示例: 

数字输出 - Arduino控制LED

四、数字输入- 按键开关控制电路与程序

(1)按键开关

 

 (2)上拉电阻

上拉电阻是一个电阻器,它连接到一个电路中的两个节点之间,并将其中一个节点上的电压上拉至某个特定的值。具体来说,上拉电阻可以将不确定的信号通过一个电阻嵌位在高电平,同时起到限流的作用。在数字电路中,上拉电阻通常用于将某个引脚或节点上的电平状态上拉至高电平。当一个引脚或节点没有被外部电路驱动时,如果没有上拉电阻,该引脚或节点的电平状态可能是不确定的,这可能会导致电路出现不可预测的行为。通过加上上拉电阻,可以将该引脚或节点的电平状态稳定在高电平。此外,上拉电阻还可以提供电流的额外分量,以增强电路的驱动能力。当输出电流较大时,如果只有一个电阻来驱动电路,输出的电平可能会降低。此时,可以使用上拉电阻提供额外的电流分量,将电平“拉高”。总之,上拉电阻在数字电路中起着重要的作用,它可以提供稳定的电平状态、增强电路的驱动能力以及提高总线的抗电磁干扰能力。

(3)按键开关控制电路 

 Arduino的引脚设置为数字输入(INPUT)状态时可以识别两种状态:HIGH(高电平)、LOW(低电平)。

开关没有被按下
开关被按下

1. 开关张开状态下Arduino引脚2:HIGH (高电平)。

2. 开关闭合状态下Arduino引脚2:LOW (低电平)。

3. 实物模拟图中的蓝色虚线描绘的是电流流经的路径。

4. 当Arduino引脚设置为INPUT模式并且没有外接任何电路时,该引脚处于"悬空"(Floating)状态。在悬空状态下,该引脚的电压是不确定的,取决于其他因素,如电源的噪音、其他电路的影响等。这种状态可能会导致不可预测的行为,因此在编程时需要特别注意。为了避免不可预测的行为,可以为引脚提供一个默认值,例如将引脚设置为HIGH或LOW状态,或者使用外部上拉电阻或下拉电阻来提供一个明确的默认电压值。这样可以使程序更加稳定和可靠。

/*
 DigitalReadSerial
 Reads a digital input on pin 2, prints the result to the serial monitor
 读取引脚2的数字输入,将结果显示在串口监视器中
 
 This example code is in the public domain.
 */
 
// digital pin 2 has a pushbutton attached to it. Give it a name:
//引脚2连接有按键开关,给它一个名字:
int pushButton = 2;
 
// the setup routine runs once when you press reset:
//当你按下复位按钮后,setup流程运行一次:
void setup() {
  // initialize serial communication at 9600 bits per second:
  //串口通讯初始化,每秒9600位
  Serial.begin(9600);
  // make the pushbutton's pin an input:
  //设置按键引脚为输入
  pinMode(pushButton, INPUT);
}
 
// the loop routine runs over and over again forever:
// loop 流程会永远的反复运行
void loop() {
  // read the input pin:
  //读取输入引脚:
  int buttonState = digitalRead(pushButton);
  // print out the state of the button:
  // 显示按键状态
  Serial.println(buttonState);
  delay(1);        // delay in between reads for stability 为确保程序稳定运行进行短暂停止
}

这段代码用于读取连接到数字引脚2的按钮的状态,并通过串行端口输出该状态:当按钮被按下时,输出为“0”,当按钮没有被按下时,输出为“1”。

  1. int pushButton = 2;

    定义一个整数变量pushButton并将其初始化为2。这表示我们计划使用数字引脚2来读取按钮的状态。
  2. Serial.begin(9600);

    初始化串行通信,设置波特率为9600。这允许Arduino通过串行端口与其他设备(如计算机)进行通信。
  3. pinMode(pushButton, INPUT);

    将数字引脚2设置为输入模式。这样,我们就可以读取连接到该引脚的按钮的状态。
  4. int buttonState = digitalRead(pushButton);

    使用digitalRead()函数读取数字引脚2的状态,并将其存储在变量buttonState中。如果按钮被按下,则该引脚的电平为低(0);如果按钮没有被按下,则电平为高(1)。
  5. Serial.println(buttonState);

    通过串行端口输出按钮的状态。当按钮被按下时,您将在串行监视器中看到“0”,当按钮没有被按下时,您将看到“1”。
  6. delay(1);

    等待1毫秒。这可以用于减少CPU的负载并使程序运行得更顺畅。然而,对于这个简单的例子来说,实际上并不需要这个延迟,因为它只是读取一个数字引脚的状态并立即输出它。

视频示例: 

按键开关控制电路与程序

五、逻辑控制

(1)Arduino中的“输入上拉模式”:INPUT_PULLUP

在Arduino中,当您设置一个引脚为“输入上拉模式”(INPUT_PULLUP)时,该引脚会配置为内部上拉电阻。这意味着Arduino的内部电阻将连接到该引脚,以保持该引脚为高电平状态,除非外部电路将该引脚拉低。

使用INPUT_PULLUP模式的好处是,您不需要外部上拉电阻,因为Arduino已经内置了上拉电阻。此外,使用内置上拉电阻还可以减少外部元件的数量,简化电路设计。

要使用INPUT_PULLUP模式,您可以使用pinMode()函数将引脚设置为该模式。例如:

pinMode(2, INPUT_PULLUP);

代码中将数字引脚2配置为输入上拉模式。此后,您可以使用digitalRead()函数读取该引脚的电平状态。如果该引脚被外部电路拉低,则digitalRead()将返回LOW;否则,它将返回HIGH

需要注意的是,当使用INPUT_PULLUP模式时,应确保不要将外部电路与该引脚直接连接在一起,否则可能会发生冲突,导致不可预测的行为。 

(2)按键开关控制LED的电路与程序 

/*
 Input Pullup Serial
 
 本示例展示如何使用pinMode(INPUT_PULLUP)。通过本程序,Arduino将读取引脚2
 的数字输入并将结果显示在串口监视器中。
 
 电路:
 * 引脚2连接轻触开关,开关另一端接地
 * 引脚13上安装有开发板内置LED
 
与使用pinMode(INPUT)不同,我们在使用pinMode(INPUT_PULLUP)时不需要外接上拉或下拉电阻。
开发板内置一个20K欧姆电阻,该电阻将引脚上拉到5V。开关在打开时,引脚读取到高电平。开关闭合后,引脚读取到低电平。
 
 created 14 March 2012
 by Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/InputPullupSerial
 This example code is in the public domain
 
 本示例程序的注释文字中文翻译由太极创客提供
 
www.taichi-maker.com
 */
 
void setup() {
  //开始串口通讯
  Serial.begin(9600);
  //将引脚2设置为输入上拉模式
  pinMode(2, INPUT_PULLUP);
  pinMode(13, OUTPUT);
}
 
void loop() {
  //将开关状态数值读取到变量中
  int sensorVal = digitalRead(2);
  //输出开关状态数值
  Serial.println(sensorVal);
 
  //请留意在上拉模式下,按钮的逻辑状态是反的。
  //即:开关断开时引脚读取到高电平。开关被按下后引脚读取到低电平。
  //按钮被按下后,引脚13连接的LED将被点亮。按钮没有按下时,LED熄灭。
  
  //如果按钮没有按下,熄灭LED。否则,点亮LED
    
  if (sensorVal == HIGH) {  //按钮没有按下
    digitalWrite(13, LOW);  //熄灭LED
  } else {                  //否则
    digitalWrite(13, HIGH); //点亮LED
  }
}
视频示例: 

逻辑控制 - 按键开关控制LED

(3)布尔值变量与逻辑运算符

只有当两个按键开关同时按下时Arduino引脚13附近的LED灯才会亮起;两个按键都是打开状态和只按下一个按键开关时LED灯都不会亮起。

// 定义两个布尔变量,用于存储两个按钮的状态
boolean pushButton1;
boolean pushButton2;

void setup() {
  // 设置数字引脚2和8为输入模式(使用内部上拉电阻),数字引脚13为输出模式
  pinMode(2, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(13, OUTPUT);
}

void loop() {
  // 使用digitalRead函数读取数字引脚2和8的状态,并将结果存储在pushButton1和pushButton2变量中
  pushButton1 = digitalRead(2);
  pushButton2 = digitalRead(8);

  //判断两个按钮是否都没有被按下。如果都没有被按下,则将数字引脚13设置为高电平(使LED灯亮起);
  //否则,将数字引脚13设置为低电平(使LED灯熄灭)。
  if(!pushButton1 && !pushButton2){
    digitalWrite(13, HIGH);
  }else{
    digitalWrite(13, LOW);
  }
}

六、MC猜数字  

(1)1位共阴极8段数码管 

1位共阴极8段数码管是一种常见的显示器件,它由7个LED段(标记为A至G)和一个公共阴极组成。公共阴极是数码管的负极,所有LED段都连接在这个公共阴极上。

每个LED段都有一个阳极,用于控制该段的亮灭。当给某个阳极施加高电平时,相应的段会发光。要显示特定的数字或字母,只需控制相应的阳极使相应的LED段亮起,而其他LED段熄灭。

使用1位共阴极8段数码管需要相应的驱动电路来控制其显示内容。驱动电路通常由一个微控制器或数字信号处理器(DSP)组成,用于生成适当的信号来驱动数码管。这些信号通过控制每个阳极的电平来控制每个LED段的亮灭,从而显示所需的数字或字母。

需要注意的是,由于共阴极数码管的公共阴极是负极,所以在连接数码管时,应将公共阴极连接到地线(GND),而每个阳极则连接到相应的控制线。同时,为了正确驱动数码管,驱动电路中的电源应为正电压。

 (2) 使用1位共阴极8段数码管显示0-F的16位数字的电路与程序

void setup() {
  int pinNumber = 3;
  for(; pinNumber <= 9;pinNumber++){
    pinMode(pinNumber,OUTPUT);
  }
}

void loop() {
  //显示0-F的16位数字
  //显示0
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  delay(1000);
  //清理数码管上的显示内容
  displayContent_clear();

  //显示1
  digitalWrite(4, HIGH);
  digitalWrite(7, HIGH);
  delay(1000);
  //清理数码管上的显示内容
  displayContent_clear();

  //显示2
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  delay(1000);
  //清理数码管上的显示内容
  displayContent_clear();
  
  //显示3
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  delay(1000);
  //清理数码管上的显示内容
  displayContent_clear();
  
  //显示4
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  delay(1000);
  //清理数码管上的显示内容
  displayContent_clear();
  
  //显示5
  digitalWrite(3, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  delay(1000);
  //清理数码管上的显示内容
  displayContent_clear();
  
  //显示6
  digitalWrite(3, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  delay(1000);
  //清理数码管上的显示内容
  displayContent_clear();
  
  //显示7
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(7, HIGH);
  delay(1000);
  //清理数码管上的显示内容
  displayContent_clear();
  
  //显示8
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  delay(1000);
  //清理数码管上的显示内容
  displayContent_clear();
  
  //显示9
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  delay(1000);
  //清理数码管上的显示内容
  displayContent_clear();
  
  //显示A
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(9, HIGH);
  delay(1000);
  //清理数码管上的显示内容
  displayContent_clear();
  
  //显示b
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  delay(1000);
  //清理数码管上的显示内容
  displayContent_clear();
  
  //显示c
  digitalWrite(5, HIGH);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  delay(1000);
  //清理数码管上的显示内容
  displayContent_clear();
  
  //显示d
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  delay(1000);
  //清理数码管上的显示内容
  displayContent_clear();
  
  //显示E
  digitalWrite(3, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  delay(1000);
  //清理数码管上的显示内容
  displayContent_clear();
  
  //显示F
  digitalWrite(3, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(9, HIGH);
  delay(1000);
  //清理数码管上的显示内容
  displayContent_clear();
}

//清理数码管上的显示内容
void displayContent_clear(){
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  delay(500);
}
视频示例: 

使用1位共阴极8段数码管显示0-F的16位数字

(3)Arduino程序中的函数"random()"和函数"randomSeed()"

详细解释参见“太极创客”网站:
random() – 太极创客 (taichi-maker.com)icon-default.png?t=N7T8http://www.taichi-maker.com/homepage/reference-index/arduino-code-reference/random/

randomSeed() – 太极创客 (taichi-maker.com)icon-default.png?t=N7T8http://www.taichi-maker.com/homepage/reference-index/arduino-code-reference/randomseed/

(4)MC猜数字

/* MC猜数字 (Ver. 1.0)
 * 
 * 本程序用于太极创客制作的《零基础入门学用Arduino教程》中
 * MC猜数字小制作。通过学习和搭建这个小装置,我们希望您能够
 * 学会以下内容:
 * 
 *  - LED数码管的原理和使用
 *  - if...else if的概念和应用
 *  - while循环的概念和应用
 *  - switch case控制语句
 *  - random函数的使用
 *  - 建立和使用自定义函数(三种形式:无参数无返回值,有参数无返回值,有参数有返回值)
 *  - 通过串口监视器观察调试程序运行状况
 *  
 *  电路连接:
 *  有关本制作的详细电路连接资料,请参阅太极创客网站的《零基础入门学用Arduino教程》相关网页。
 *  
 *  太极创客网站地址:
 *  www.taichi-maker.com
 *  
 *  如您对我们有任何建议或意见,请发邮件至:
 *  taichimaker@163.com
 *  
 *  同时您也可以通过我们的微信公众号以及微博获得更多太极创客的最新信息。
 *  
 *  This example code is in the public domain.
 *  
 *  2017-04-23
 *
 *  注:
 *  目前科学技术尚无法实现意念控制。
 *  科技可以改变世界,但也有心怀不轨的人会利用科技制作
 *  我们不宜察觉的装置。而这些装置会被用于赌博或诈骗。
 *  我们一定要远离赌博,相信科学。:)
*/


int thisResult;  //存储按键按下以后显示在数码管的数字。
int nextResult;  //存储作弊数字,也就是下一次按键按下后即将显示的数字。

void setup() {
  pinMode(2, INPUT_PULLUP); //2号引脚上连接有按键开关,将2号引脚设置为输入上拉模式
  int pinNumber = 3;        //设置3-9号引脚为输出模式
  while(pinNumber <= 9){
    pinMode(pinNumber, OUTPUT);
    pinNumber = pinNumber + 1;
  }
  randomSeed(analogRead(A0)); //为了每一次复位或断电后产生不同顺序的随机数字
}

// the loop function runs over and over again forever
void loop() {
  if (!digitalRead(2)){      //读取2号引脚电平状态
    getRandomNumber(0,10);   //用户按下按键后,开始新一次猜数字游戏
  }
  displayNumber(thisResult); //将猜数字游戏"结果"显示在数码管中
}

/*
用户在每一次按下按键后,随机产生的数字将存储于nextResult变量中。
而实际显示在数码管上的数字是thisResult变量。
当thisResult即将显示在数码管前,程序会将下一次显示的数字通过
图形暗示的形式显示在数码管上。具体程序如何显示暗示图形,
请参阅displayCheat()函数说明。
*/
void getRandomNumber(int minNumber, int maxNumber){
  thisResult = nextResult; 
  int i; 
  while(i < 15){
    i = i + 1;
    nextResult = random(0, 10);
    displayRandom();         //显示随机图案,混淆注意力
    delay(50 + i * 10);      //让随机图案显示时间由快到慢,增加混淆
    displayClear();
  }
  displayCheat(nextResult);  //显示作弊图案,用户可通过此函数所显示的图案
                             //获知下次按键后将要出现在LED数码管上的数字。  
                             //此图案是在用户每次按下按键后显示新的数字
                             //前的最后一次图案显示
  delay(500);
  displayClear();
}

//根据参数数值在LED数码管上显示数字
void displayNumber(int ledNumber){     
  switch(ledNumber){
    case 1:  //显示1
      digitalWrite(4, HIGH);
      digitalWrite(7, HIGH); 
      break;   
    case 2:  //显示2
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH); 
      digitalWrite(5, HIGH); 
      digitalWrite(8, HIGH); 
      digitalWrite(9, HIGH); 
      break;   
    case 3:   //显示3
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH); 
      digitalWrite(5, HIGH); 
      digitalWrite(7, HIGH); 
      digitalWrite(8, HIGH); 
      break;   
    case 4:  //显示4
      digitalWrite(4, HIGH); 
      digitalWrite(5, HIGH); 
      digitalWrite(6, HIGH); 
      digitalWrite(7, HIGH); 
      break;  
    case 5:  //显示5
      digitalWrite(3, HIGH);
      digitalWrite(5, HIGH); 
      digitalWrite(6, HIGH); 
      digitalWrite(7, HIGH); 
      digitalWrite(8, HIGH); 
      break;
    case 6:  //显示6
      digitalWrite(3, HIGH);
      digitalWrite(5, HIGH); 
      digitalWrite(6, HIGH); 
      digitalWrite(7, HIGH); 
      digitalWrite(8, HIGH); 
      digitalWrite(9, HIGH); 
      break;    
    case 7:  //显示7
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH); 
      digitalWrite(7, HIGH);  
      break;
    case 8:  //显示8
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      digitalWrite(5, HIGH); 
      digitalWrite(6, HIGH); 
      digitalWrite(7, HIGH); 
      digitalWrite(8, HIGH); 
      digitalWrite(9, HIGH); 
      break;
    case 9:  //显示9
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      digitalWrite(5, HIGH); 
      digitalWrite(6, HIGH); 
      digitalWrite(7, HIGH); 
      digitalWrite(8, HIGH); 
      break;
    case 0:  //显示默认
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      digitalWrite(6, HIGH); 
      digitalWrite(7, HIGH); 
      digitalWrite(8, HIGH); 
      digitalWrite(9, HIGH); 
      break;
    default:
        digitalWrite(4, HIGH); 
        digitalWrite(5, HIGH); 
        digitalWrite(7, HIGH); 
        digitalWrite(8, HIGH);  
        digitalWrite(9, HIGH);   
    }
}

//清理显示内容
void displayClear(){
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW); 
  digitalWrite(6, LOW); 
  digitalWrite(7, LOW); 
  digitalWrite(8, LOW); 
  digitalWrite(9, LOW); 
}

//显示随机图案以混淆注意力
//使作弊图案显示时不易察觉。
void displayRandom(){
  int randomPin = random(3,9);
  digitalWrite(randomPin, HIGH);  
}

//显示作弊图案。
void displayCheat(int number){
  switch(number){
    case 1:  // 显示数字1作弊图案
      digitalWrite(3, HIGH);
      break;   
    case 2:  // 显示数字2作弊图案
      digitalWrite(6, HIGH); 
      break;   
    case 3:  // 显示数字3作弊图案
      digitalWrite(4, HIGH); ;
      break;   
    case 4:  // 显示数字4作弊图案
      digitalWrite(5, HIGH); 
      break;  
    case 5:  // 显示数字5作弊图案
      digitalWrite(9, HIGH); 
      break;
    case 6:  // 显示数字6作弊图案
      digitalWrite(7, HIGH);   
      break;    
    case 7: // 显示数字7作弊图案
      digitalWrite(8, HIGH);
      break;
    case 8: // 显示数字8作弊图案
      digitalWrite(6, HIGH);
      digitalWrite(4, HIGH);
      break;
    case 9: // 显示数字9作弊图案
      digitalWrite(9, HIGH);
      digitalWrite(7, HIGH);
      break;
    case 0: // 显示数字0作弊图案
      digitalWrite(3, HIGH);
      digitalWrite(8, HIGH); 
      break;
    }
}

七、模拟输出

(1)Arduino程序中的函数"analogWrite()"

详细解释参见“太极创客”网站:analogWrite – 太极创客 (taichi-maker.com)icon-default.png?t=N7T8http://www.taichi-maker.com/homepage/reference-index/arduino-code-reference/analogwrite/

(2)使用按键开关控制LED灯光明暗变化 

/*
25 模拟输出1 - analogWrite
太极创客
www.taichi-maker.com

此程序用于太极创客<<零基础入门学用Arduino教程>> 
25 模拟输出1 - analogWrite

演示如何通过两个按键开关通过analogWrite指令
进行模拟输出操作。具体电路和其它信息请参考
太极创客网站本教程相关页面。

2017-04-28
*/
boolean pushButton1;   // 创建布尔型变量用来存储按键开关1的电平状态
boolean pushButton2;   // 创建布尔型变量用来存储按键开关2的电平状态
int ledPin = 9;        //LED引脚号
int brightness = 128;  //LED亮度参数

void setup() {
  // put your setup code here, to run once:
  pinMode(2, INPUT_PULLUP); //将引脚2设置为输入上拉模式
  pinMode(8, INPUT_PULLUP); //将引脚8设置为输入上拉模式
  pinMode(ledPin, OUTPUT);  //将LED引脚设置为输出模式
  Serial.begin(9600);      //启动串口通讯
}

void loop() {
  // put your main code here, to run repeatedly:
  pushButton1 = digitalRead(2); //读取引脚2电平状态并将其赋值给布尔变量
  pushButton2 = digitalRead(8); //读取引脚8电平状态并将其赋值给布尔变量
  
  if (!pushButton1 && brightness > 0){   // 当按下按键开关1并且LED亮度参数大于0
    brightness--;   // 减低LED亮度参数
                    //(brightness-- 相当于  brightness = brightness - 1;)
  } else if (!pushButton2 && brightness < 255) {  //当按下按键开关2并且LED亮度参数小于255
    brightness++;   //增加LED亮度参数
                    //(brightness++ 相当于  brightness = brightness + 1;)
  }
  analogWrite(ledPin, brightness);   //模拟输出控制LED亮度
  Serial.println(brightness);   //将LED亮度参数显示在串口监视器上
  delay(10);
}
视频示例: 

(3)Arduino中PWM的原理

PWM,即脉宽调制,是一种通过调节信号的占空比来控制电路的技术。在Arduino中,PWM信号通常是数字信号,即在给定的任意时刻,PWM信号要么是高电平(5V),要么是低电平(0V)。

具体来说,PWM信号的周期保持不变,但信号的占空比可以随时间变化。当信号的占空比为0%时,表示信号一直处于低电平状态;当占空比为100%时,表示信号一直处于高电平状态;而在占空比为中间值时,信号将在高低电平之间切换。

在Arduino中,PWM信号通常用于控制电机的转速、LED的亮度和颜色等。例如,在控制LED亮度时,可以通过调节PWM信号的占空比来控制LED的亮度。占空比越大,LED灯亮度越高;反之,占空比越小,LED灯亮度越低。

实现PWM的方法是使用Arduino板上的特定引脚。例如,Arduino Uno板上的3、5、6、9、10和11号引脚都支持PWM输出。通过编写程序,可以控制这些引脚的PWM信号的占空比,从而实现各种控制功能。

(4)LED灯明暗交替变化

/*
27 模拟输出3 - for
太极创客
www.taichi-maker.com

此程序用于太极创客<<零基础入门学用Arduino教程>> 
27 模拟输出3 - for

演示如何通过for循环语句实现LED明暗交替(呼吸灯)效果。

2017-04-28
*/
void setup() {
  pinMode(9, OUTPUT);      //设置9号引脚为输出模式
  Serial.begin(9600);     //启动串口通讯
}

void loop() {
  // LED由暗到明
  for (int brightness = 0; brightness <= 255; brightness++){
    analogWrite(9, brightness);   
    Serial.println(brightness);
    delay(10);
  }
  
  // LED由明到暗  
  for (int brightness = 255; brightness >=0 ; brightness--){
    analogWrite(9, brightness);
    Serial.println(brightness);
    delay(10);
  }
}
视频示例: 

 八、模拟输入

(1)学用电位器

1. 简要介绍

电位器是一种可调的电子元件,通常由一个电阻体和一个可移动的电刷组成。电位器的电阻体上通常有两个固定的端子,电刷沿电阻体移动时,在输出端即获得与位移量成一定关系的电阻值或电压。

电位器既可作三端元件使用也可作二端元件使用。作为三端元件使用时,可视作一可变电阻器,由于它在电路中的作用是获得与输入电压(外加电压)成一定关系的输出电压,因此称之为电位器。

此外,电位器的电阻体上有三个引出端,其中两个固定端和动触点与任一个固定端之间的电阻值是可变的。当动触点在电阻体上移动时,输出端的电压或电阻值就会发生变化。电位器的结构特点是在电阻体上由两个固定端之间外加一个电压时,通过转动或滑动系统改变触点在电阻体上的位置,在动触点与固定触点之间便可得到一个与动触点位置成一定关系的电压。

电位器有几种样式,如线绕电位器、实芯式电位器、炭膜电位器等。它们各有不同的特点和应用领域,如用于分压的可变电阻器、音箱音量开关和激光头功率大小调节等。

电位器可以看做是两个电阻串联在一起的等效电路。 

2. 电位器工作原理

 下面以阻值为1000Ω的电位器示例其工作原理:

①旋转旋钮到中央位置

②左旋旋钮 

③向左旋转旋钮到不能旋转

④右旋旋钮

⑤向右旋转旋钮到不能旋转

旋转旋钮与电阻阻值变化规律口诀:

1. 旋钮在旋转过程中,三个引出端之间的两个电阻的阻值增大与减小是同时进行的

2. 无论三个引出端之间的两个电阻的阻值如何变化,电位器的总阻值不变

3. 电位器分压电路

电位器的常用工作场景是在分压电路中。

电位器分压电路电流计算:

电位器分压电路电压计算: 

① R1-2 = 500Ω,R2-3 = 500Ω .

② R1-2 = 800Ω,R2-3 = 200Ω.

4. 电位器应用 

/*
  模拟输入
 
  本程序旨在演示如何使用analogRead()读取Arduino的引脚电平。
  通过调节电位器, A0引脚的输入电压将在0V-5V之间。
  该输入电压将被映射到数值0-1023之间,并显示在串口监视器中。
  
 电路连接:
   电位器中间引脚连接到模拟输入A0引脚
   电位器两端引脚分别连接在Arduino +5V和接地引脚
 
 太极创客 www.taichi-maker.com
 2017-01-08
 
 This example code is in the public domain.
 
 */
 
void setup() {
  // 串口通讯初始化(9600 bps):
  Serial.begin(9600);
}
 
void loop() {
  // 读取模拟输入值:
  int analogInputVal = analogRead(A0);
 
  // 将结果通过串口监视器显示:
  Serial.println(analogInputVal);
}
视频示例: 

模拟输入 - 电位器应用

(2)Arduino程序中的函数"analogRead()" 

 详细解释参见“太极创客”网站:

analogRead() – 太极创客 (taichi-maker.com)icon-default.png?t=N7T8http://www.taichi-maker.com/homepage/reference-index/arduino-code-reference/analogread/

(3)Arduino程序中的函数“map()”

 详细解释参见“太极创客”网站:

map() - 等比映射 – 太极创客 (taichi-maker.com)icon-default.png?t=N7T8http://www.taichi-maker.com/homepage/reference-index/arduino-code-reference/map/

(4)使用电位器控制LED灯亮度

/*
  电位器模拟输出
 
 读取模拟输入引脚,并将读取到的数值映射到0 - 255之间。然后用该映射结果设置
 引脚9的LED亮度,同时通过串口监视器显示这一映射结果。
 
 电路连接:
     电位器中间引脚连接到模拟输入A0引脚
     电位器两端引脚分别连接在Arduino +5V和接地引脚
   * LED正极通过 限流电阻连接在Arduino的9号引脚
     LED负极接地
 
 太极创客
 2017-01-08
 http://www.taichi-maker.com
 
 This example code is in the public domain.
 
 */
 
void setup() {
  
  Serial.begin(9600);  // 串口通讯初始化(9600 bps)
  pinMode(9, OUTPUT);  // 设置9号引脚为输出模式
}
 
void loop() {
  int analogInputVal = analogRead(A0);  // 读取模拟输入值
 
  int brightness = map(analogInputVal, 0, 1023, 0, 255); //将模拟输入数值(0 - 1023)等比映射到模拟输出数值区间(0-255)内
  
  analogWrite(9, brightness);  //根据模拟输入值调节LED亮度
 
  // 将结果通过串口监视器显示:
  Serial.print("analogInputVal = ");
  Serial.println(analogInputVal);
  
  Serial.print("brightness = ");
  Serial.println(brightness);
  
  Serial.println("");
}
 视频示例:

模拟输入 - 电位器控制LED灯亮度

九、模拟输入/输出 

  • 49
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值