2.1 课程说明

今天制作一期人机互动的例子带给大家:用按钮控制LED。将开关作为延时开关来使用,按下开关后1秒钟,灯才会亮,灯亮5秒后才熄灭,这样大家就能依据这个例子,自己延伸出很多好玩的玩法出来。通过案例学习变量、运算符、条件语句三种语法知识。

2.2. 器材:

名称 数量 规格
Arduino uno控制板 1 R3
按钮开关 1
蓝色LED 1

2.3. 重点器材介绍

开关:有按键式、滑动式、微动型,除了尺寸和外型不同,开关可分成:

  • 常开(normal open,简称N.O):接点平常是不相连的,按下去之后才导通。
  • 常闭(normal close):接点平常是导通的
    开关也是传感器,微动开关(鼠标);极限开关(光驱的托盘);磁簧开关;水银开关。

2.3. 电路:

2.4 条件语句

形式1

Arduino课程:02.数据类型及条件语句_第1张图片
if (expression)
statement;
如果你有一个语句,你可以使用没有大括号{}的if语句。

形式2

if (expression) {
Block of statements;
}

形式3

Arduino课程:02.数据类型及条件语句_第2张图片
if ... else语句语法
if (expression) { Block of statements; }
else { Block of statements; }

2.5 改变程序流程的if条件式

-比较运算符

比较运算符 说明
== 如果两者相等则成立,请注意,这要写成两个连续等号,中间不能有空格
!= 如果不相等则成立
< 如果左边小于右边则成立
> 如果左边大于右边则成立
<= 如果左边小于或等于右边则成立
>= 如果左边大于或等于右边则成立

比较运算符参与运算后,会返回一个布尔值(true或false)。

-逻辑运算符

名称 运算符号 表达式 说明
与(and) && A && B 只有A和B两个值都成立时,整个条件才算成立。
或(OR) || A || B 只要A或B任何一方成立,整个条件就算成立
非(NOT) ! !A 把成立的变为不成立;不成立的变为成立

-指定运算符

运算符 意义 说明
++ 递增 将变量值增加1
-- 递减 将变量值减1
+= 指定增加 将变量加上某数
-= 指定减少 将变量减去某数
*= 指定相乘 将变量乘上某数
/= 指定相除 将变量除以某数

2.6 使用端口操作指令、位移运算符

处理器有D、B两个数位输出/输入接口,以及一个类比接口C。
DDRB = B00110100; //DDRB包含8、13接口,DDRD包含07接口
PORTB= B00100100;

2.7 任务一

利用按钮控制LED

/* 
    作用:当你按下按钮后1秒钟,灯会亮,然后维持5秒钟,熄灭 
*/  
void setup () {
    pinMode(4,INPUT);   //将4号数字口设置为输入状态,13号数字口设置为输出状态  
    pinMode(13,OUTPUT);  
}
void loop(){
    int n =digitalRead(4);      //创建一个变量n,将4号数字口的状态采集出来赋值给他。  
    if (n==HIGH)            //判断n是否为高电平,如果是执行下面的语句,不是则跳过。  
    {
        delay(1000);  
        digitalWrite(13,HIGH);  
        delay(5000);  
        digitalWrite(13,LOW);  
    }
}

结果:

编译并上传代码之后,按着、放开几次微动开关试试,理论上,LED将在按着开关时被点亮,放开开关时熄灭。但实际上,LED可能在你放开开光之后,仍然点亮着,这是机械式开关的弹跳(bouncing)现象。

2.8 流水灯

在arduino控制板上的3、4、5引脚上连接3个LED,通过程序依次控制3个LED灯的亮灭

const byte LED1 = 3;  
const byte LED2 = 4;  
const byte LED3 = 5;  
void setup() {  
    // put your setup code here, to run once:  
    pinMode(LED1, OUTPUT);  
    pinMode(LED2, OUTPUT);  
    pinMode(LED3, OUTPUT);  
}  

void loop() {  
    // put your main code here, to run repeatedly:  
    digitalWrite(LED1,HIGH);  
    digitalWrite(LED2,LOW);  
    digitalWrite(LED3,LOW);  
    delay(1000);  

    digitalWrite(LED1,LOW);  
    digitalWrite(LED2,HIGH);  
    digitalWrite(LED3,LOW);  
    delay(1000);  

    digitalWrite(LED1,LOW);  
    digitalWrite(LED2,LOW);  
    digitalWrite(LED3,HIGH);  
    delay(1000);  
}

2.9 用变量来管理代码

上例中连接在13引脚的led闪烁,如果把led接在10脚,代码需要修改2次,利用变量可简化代码的修改。

byte led = 13;
void setup(){
    pinMode(led, OUTPUT);
}
void loop(){
    digitalWrite(led, HIGH);
}

声明变量的语法:

数据类型 变量名

例如:
int age = 18; //预留16位的存储空间,并存入数字18;
int older = age +10; //先取出age的值,加上10之后,再赋值给older。

变量命名规定

• 变量名称只能包含英文字母、数字和底线(_)。
• 第一个字符不能是数字。
• 变量的名称大小写有别,因此LED和led是两个不同的变量!
• 变量名称应该使用有意义的文字,如LED和pin,。让代码变得容易理解。
• 若要用两个单字来命名变量,可以用“驼峰式”记法,
• 避免用特殊意义的保留字来命名。

2.10 数据类型

数据类型用于设置“数据容器”的格式和容量。在声明变量的同时,必须设置该变量所能保存的数据类型。

基础类型

类型 中文名 占用内存大小 数值范围
boolean 布尔 8位 1或0 true或false)
byte 字节 8位 0~255
char 字符 8位 -127~127
int 整型 16位 -32768~32767
long 长整数 32位 -2147483648~2147483647
float 浮点数 32位 ±3.4028235E+38
double 双精度浮点数 ±3.4028235E+38

表:不带正负号的数据类型

类型 中文名称 数值范围
unsigned char 正字符 0~255
unsigned int 正整数 0~65535
unsigned long 正长整数 0~4294967295

数据类型说明

  1. 设置数据类型时,需要留意该类型所能保存的最大值。如果保存值超过变量的容量,该值将从0开始计算。
    • byte类型最大只能保存十进制的255,若存入256,则实际的保存值将是0; 数学表达式也要留意数据类型的上限,
    • long ans = 4000 100; //计算结果:6784; 这是因为程序编译程序用整数型态计算4000100,正确写法:其中一个计算数字后面加上设置数值类型的格式字符, long ans = 4000L * 100L; //计算结果:400000

      表: 转换数值数据类型的格式字符

      格式字符 说明 示例
      L或l 强制转换成长整数 4000L
      U或u 转化成无正负号(unsigned)整数 32800U
      UL或ul 强制转换成无正负号的长整数(unsigned long) 7295UL

      tips

      ATmega微处理器内部没有浮点运算处理单元,因此,执行浮点数值运算,不仅耗时且精确度不高,请避免在程序中执行大量的浮点数运算。附带一提,浮点数值可以用科学记号E或e表示,例如:
      1.8E3 = 1800
      在数字系统中,用四个二进制数来代表十进制的编码,又称为BCD码(Binary Coded Decimal, 二进编码十进数)

      2.11 不变的“常量”

      常量: 存放固定、不变量值的容器。

    • 使用const指令(constant,常量)定义常量
    • 常量名称中的字母通常写成大写。
    • 变量设置后,就不能再更改其值。

      常量与“程序内存”

  2. ATmega微处理器的代码保存在内存,其内容无法在程序运行时间更改。而保存变量的容器,将在运行时间被建立在内容可随意更换的SRAM中
  3. 常见的预设常量 INPUT、OUTPUT、HIGH、LOW、true、false
    常量定义补充说明

    若要让常量仅仅保存在程序内存,需要在常量声明代码中加入PROGMEM关键字。

    2.13 内存类型说明

    计算机内存分为RAM和ROM两大类型

    RAM:

    • DRAM(Dynamic)→需搭配DRAM控制器持续刷新,存取慢,价格低廉
    • SRAM(Static)→ 不需要持续刷新,存取速度快,价格高 #### #### ROM:
    • mask ROM → 相当于DVD和CD
    • PROM → Programmable,可编程
    • EPROM → EP 代表Erasable and Programmalbe(可擦除编程)

2.14. 补充阅读材料:

Arduino 数据类型

C中的数据类型是指用于声明不同类型的变量或函数的扩展系统。变量的类型确定它在存储器中占用多少空间以及如何解释存储的位模式。
下表提供了你将在Arduino编程期间使用的所有数据类型。
void Boolean char Unsigned char
byte int Unsigned int word
long Unsigned long short float
double array String-chararray String-object

关键字 说明

  1. void void关键字仅用于函数声明。它表示该函数预计不会向调用它的函数返回任何信息。 例子
    Void Loop ( ) {
    // rest of the code
    }
  2. Boolean 布尔值保存两个值之一,true或false。每个布尔变量占用一个字节的内存。
    例子
    boolean val = false ; // declaration of variable with type boolean and initialize it with false
    boolean state = true ; // declaration of variable with type boolean and initialize it with false
  3. Char
    一种数据类型,占用一个字节的内存,存储一个字符值。字符文字用单引号写成:'A',对于多个字符,字符串使用双引号:"ABC"。
    但是,字符是存储为数字。你可以在ASCII图表中查看特定编码。这意味着可以对使用ASCII值的字符进行算术运算。例如,'A'+1的值为66,因为大写字母A的ASCII值为65。
    例子
    Char chr_a = ‘a’ ;//declaration of variable with type char and initialize it with character a
    Char chr_c = 97 ;//declaration of variable with type char and initialize it with character 97 ASCII Char Table
  4. unsigned char
    unsigned char是一种无符号数据类型,占用一个字节的内存。unsigned char数据类型编码数字为0到255。
    例子
    Unsigned Char chr_y = 121 ; // declaration of variable with type Unsigned char and initialize it with character y
  5. byte 一个字节存储一个8位无符号数,从0到255。
    例子
    byte m = 25 ;//declaration of variable with type byte and initialize it with 25
  6. int
    整数(int)是数字存储的主要数据类型。int存储16位(2字节)值。这产生-32768至32767的范围(最小值为-215 ,最大值为(215 )-1)。
    int的大小因板而异。例如,在Arduino Due中,int存储32位(4字节)值。这产生-2147483648至2147483647的范围(最小值-231 和最大值(231 )-1)。
    例子
    int counter = 32 ;// declaration of variable with type int and initialize it with 32
  7. Unsigned int
    unsigned int(无符号整数)与int相同,存储2字节。然而,它们只存储正值,产生0到65535(216)-1的有效范围。Due存储4字节(32位)值,范围从0到4294967295(232-1)。
    例子
    Unsigned int counter = 60 ; // declaration of variable with type unsigned int and initialize it with 60
  8. Word
    在Uno和其他基于ATMEGA的板上,一个word存储一个16位无符号数。在Due和Zero上,它存储一个32位无符号数。
    例子
    word w = 1000 ;//declaration of variable with type word and initialize it with 1000
  9. Long
    Long变量是用于数字存储的扩展大小变量,存储32位(4字节),从-2147483648到2147483647。
    例子
    Long velocity = 102346 ;//declaration of variable with type Long and initialize it with 102346
  10. unsigned long
    unsigned long变量是用于数字存储的扩展大小变量,并存储32位(4字节)。与标准的long不同,unsigned long不会存储负数,它们的范围为0到4294967295(232-1)。
    例子
    Unsigned Long velocity = 101006 ;// declaration of variable with type Unsigned Long and initialize it with 101006
  11. short
    short是16位数据类型。在所有Arduinos(基于ATMega和ARM)上,一个short存储一个16位(2字节)值。这产生-32768至32767的范围(最小值为-215,最大值为(215)-1)。
    例子
    short val = 13 ;//declaration of variable with type short and initialize it with 13
  12. float
    浮点数的数据类型是具有小数点的数字。浮点数通常用于近似模拟值和连续值,因为它们的分辨率高于整数。
    浮点数可以大到3.4028235E+38,也可以低到-3.4028235E+38。它们被存储为32位(4字节)信息。
    例子
    float num = 1.352;//declaration of variable with type float and initialize it with 1.352
  13. double
    在Uno和其他基于ATMEGA的板上,双精度浮点数占用四个字节。也就是说,double实现与float完全相同,精度没有增益。在Arduino Due上,double具有8字节(64位)精度。
    例子
    double num = 45.352 ;// declaration of variable with type double and initialize it with 45.352