# 第3周：Arduino基础语法与编程 - 讲义

## 教学目标

| 目标 | 内容 |
|-----|------|
| 知识目标 | 掌握Arduino语法、数据类型、条件判断、循环、数组、函数 |
| 能力目标 | 能够编写循迹小车控制程序 |
| 情感目标 | 建立"编程不难，我可以写出来"的信心 |

---

## 课程导入（10分钟）

### 3.1 开场Demo设计

**Demo名称：循迹小车走迷宫**

**演示流程：**
1. 播放视频：Arduino循迹小车在黑线轨道上自动行走
2. 讲解：小车是怎么"看见"黑线的
3. 引导：这节课学完，你们也能写出来

**引导语：**
> "同学们，刚才看到的小车会自动沿着黑线走，不会跑偏。它是怎么知道黑线在哪里的？今天学完Arduino语法，你们就能理解了。"

---

## 原理讲解（40分钟）

### 3.2 循迹原理

#### 3.2.1 红外传感器

```
发射器发出红外光：
- 照到白纸：光被反射 → 接收器收到 → 输出LOW
- 照到黑线：光被吸收 → 接收器没收到 → 输出HIGH
```

#### 3.2.2 循迹逻辑

| 左传感器 | 右传感器 | 小车动作 |
|---------|---------|---------|
| 白 | 白 | 直行 |
| 黑 | 白 | 右转（修正偏左） |
| 白 | 黑 | 左转（修正偏右） |
| 黑 | 黑 | 停止（终点） |

---

### 3.3 Arduino程序结构

#### 3.3.1 两个核心函数

```cpp
void setup() {
  // 只执行一次
  // 放初始化代码：引脚模式、串口通信等
}

void loop() {
  // 无限循环
  // 放主要逻辑：读取输入、处理、控制输出
}
```

**类比：**
- setup() = 起床穿衣
- loop() = 一天的活动（重复）

---

### 3.4 数据类型

| 类型 | 说明 | 示例 |
|-----|------|------|
| int | 整数 | `int count = 0;` |
| float | 浮点数 | `float temp = 25.5;` |
| bool | 布尔值 | `bool flag = true;` |
| char | 字符 | `char grade = 'A';` |
| String | 字符串 | `String name = "Li";` |

**ESP32常用：**
- 整数用 `int` 或 `long`
- 小数用 `float`（精度足够）

---

### 3.5 运算符

#### 3.5.1 算术运算符
| 符号 | 说明 |
|-----|------|
| + | 加 |
| - | 减 |
| * | 乘 |
| / | 除 |
| % | 取余 |

#### 3.5.2 比较运算符
| 符号 | 说明 |
|-----|------|
| == | 等于 |
| != | 不等于 |
| > | 大于 |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |

#### 3.5.3 逻辑运算符
| 符号 | 说明 |
|-----|------|
| && | 逻辑与 |
| \|\| | 逻辑或 |
| ! | 逻辑非 |

---

### 3.6 条件判断

#### 3.6.1 if语句

```cpp
if (条件) {
  // 条件成立时执行
}

if (条件) {
  // A
} else {
  // B
}

if (条件1) {
  // A
} else if (条件2) {
  // B
} else {
  // C
}
```

#### 3.6.2 循迹小车应用

```cpp
int leftSensor = digitalRead(LEFT_PIN);
int rightSensor = digitalRead(RIGHT_PIN);

if (leftSensor == LOW && rightSensor == LOW) {
  // 两边都在黑线上，停止
  motorStop();
} else if (leftSensor == HIGH) {
  // 左边在黑线上，右转
  motorRight();
} else if (rightSensor == HIGH) {
  // 右边在黑线上，左转
  motorLeft();
} else {
  // 其他，直行
  motorForward();
}
```

---

### 3.7 循环语句

#### 3.7.1 for循环

```cpp
// 格式：for(初始化; 条件; 更新)
for (int i = 0; i < 10; i++) {
  // 重复10次
}

// 示例：LED闪烁10次
for (int i = 0; i < 10; i++) {
  digitalWrite(LED, HIGH);
  delay(500);
  digitalWrite(LED, LOW);
  delay(500);
}
```

#### 3.7.2 while循环

```cpp
// 条件满足时循环
while (条件) {
  // 重复执行
}

// 示例：等待按键按下
while (digitalRead(BUTTON) == HIGH) {
  delay(10);  // 等待
}
// 按下后继续执行
```

#### 3.7.3 do-while循环

```cpp
// 先执行一次，再判断条件
do {
  // 执行一次
} while (条件);
```

---

### 3.8 数组

#### 3.8.1 声明和使用

```cpp
// 声明并赋值
int leds[3] = {2, 3, 4};

// 访问元素
leds[0] = 2;  // 第1个元素
leds[1] = 3;  // 第2个元素
leds[2] = 4;  // 第3个元素
```

#### 3.8.2 流水灯应用

```cpp
int leds[3] = {2, 3, 4};

void setup() {
  for (int i = 0; i < 3; i++) {
    pinMode(leds[i], OUTPUT);
  }
}

void loop() {
  for (int i = 0; i < 3; i++) {
    digitalWrite(leds[i], HIGH);
    delay(200);
    digitalWrite(leds[i], LOW);
  }
}
```

---

### 3.9 函数

#### 3.9.1 定义格式

```cpp
返回类型 函数名(参数1, 参数2, ...) {
  // 函数体
  return 结果;
}

// 示例
int add(int a, int b) {
  return a + b;
}

// 调用
int sum = add(3, 5);  // sum = 8
```

#### 3.9.2 void类型函数

```cpp
void 函数名(参数) {
  // 无返回值
}

// 示例
void blinkLED(int pin) {
  digitalWrite(pin, HIGH);
  delay(500);
  digitalWrite(pin, LOW);
  delay(500);
}

// 调用
blinkLED(2);   // LED闪烁
blinkLED(3);   // 另一个LED闪烁
```

#### 3.9.3 循迹小车函数封装

```cpp
void motorForward() {
  digitalWrite(M1_IN1, HIGH);
  digitalWrite(M1_IN2, LOW);
  digitalWrite(M2_IN1, HIGH);
  digitalWrite(M2_IN2, LOW);
}

void motorBack() {
  digitalWrite(M1_IN1, LOW);
  digitalWrite(M1_IN2, HIGH);
  digitalWrite(M2_IN1, LOW);
  digitalWrite(M2_IN2, HIGH);
}

void motorLeft() {
  digitalWrite(M1_IN1, LOW);
  digitalWrite(M1_IN2, LOW);
  digitalWrite(M2_IN1, HIGH);
  digitalWrite(M2_IN2, LOW);
}

void motorRight() {
  digitalWrite(M1_IN1, HIGH);
  digitalWrite(M1_IN2, LOW);
  digitalWrite(M2_IN1, LOW);
  digitalWrite(M2_IN2, LOW);
}

void motorStop() {
  digitalWrite(M1_IN1, LOW);
  digitalWrite(M1_IN2, LOW);
  digitalWrite(M2_IN1, LOW);
  digitalWrite(M2_IN2, LOW);
}
```

---

## 实验操作（30分钟）

### 3.10 实验3 - Arduino编程实践

#### 任务1：SOS求救信号

```cpp
const int LED = 2;

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

void shortFlash() {
  digitalWrite(LED, HIGH);
  delay(200);
  digitalWrite(LED, LOW);
  delay(200);
}

void longFlash() {
  digitalWrite(LED, HIGH);
  delay(600);
  digitalWrite(LED, LOW);
  delay(200);
}

void loop() {
  // S: 三短
  for (int i = 0; i < 3; i++) shortFlash();
  delay(500);
  // O: 三长
  for (int i = 0; i < 3; i++) longFlash();
  delay(500);
  // S: 三短
  for (int i = 0; i < 3; i++) shortFlash();
  delay(2000);  // 2秒后重复
}
```

#### 任务2：按键控制LED（带消抖）

```cpp
const int LED = 2;
const int BUTTON = 0;
bool ledState = false;

void setup() {
  pinMode(LED, OUTPUT);
  pinMode(BUTTON, INPUT_PULLUP);
}

void loop() {
  if (digitalRead(BUTTON) == LOW) {
    delay(10);  // 消抖
    if (digitalRead(BUTTON) == LOW) {
      ledState = !ledState;
      digitalWrite(LED, ledState ? HIGH : LOW);
      while (digitalRead(BUTTON) == LOW);  // 等待松开
    }
  }
}
```

---

## 课堂总结

```
┌─────────────────────────────────────────────────────────┐
│                   第3周要点速记                          │
├─────────────────────────────────────────────────────────┤
│                                                         │
│   📌 Arduino程序结构：                                 │
│       setup() = 初始化（只执行一次）                   │
│       loop() = 主循环（无限执行）                       │
│                                                         │
│   📌 数据类型：int, float, bool, String               │
│                                                         │
│   📌 条件判断：if / else if / else                    │
│                                                         │
│   📌 循环语句：for(已知次数) / while(条件循环)       │
│                                                         │
│   📌 数组：存储多个同类型数据                          │
│                                                         │
│   📌 函数：代码复用，提高可读性                        │
│                                                         │
└─────────────────────────────────────────────────────────┘
```

---

## 下周预告

**第4周：通信接口 - UART与I2C**

**开场Demo：传感器数据上云**

---

**讲义版本**: v1.0  
**更新日期**: 2026-04-10  
**授课教师**: 李茂奎老师
