Raspberry Pi Pico 2 If-Else 条件语句
在编程中,控制流是决定程序执行顺序的关键。if-else 语句是控制流中最基础且最重要的结构之一。它允许程序根据条件的不同执行不同的代码块。在 Raspberry Pi Pico 2 编程中,if-else 语句常用于根据传感器数据、按钮状态或用户输入做出决策。
本文将分别使用 Arduino 风格(基于 Arduino-Pico 核心)和 C/C++ 风格(基于官方 Pico SDK)来介绍 if-else 语句的用法,并提供实际案例。
1. 什么是 if-else 语句?
if-else 语句是一种条件判断结构。它的工作原理如下:
if 条件:如果条件为真(true),则执行 if 代码块中的语句。
else 条件:如果 if 条件为假(false),则执行 else 代码块中的语句。
1.1 基本语法(Arduino 风格)
1 2 3 4 5
| if (condition) { } else { }
|
condition 是一个布尔表达式(结果为 true 或 false)。
- 如果
condition 为 true,则执行 if 代码块中的语句。
- 如果
condition 为 false,则执行 else 代码块中的语句。
提示:else 部分是可选的。如果不需要处理条件为假的情况,可以省略 else 代码块。
1.2 基本语法(C/C++ 风格)
C/C++ 风格的语法与 Arduino 风格完全一致,因为 Arduino 的语法本身就是基于 C/C++ 的。
1 2 3 4 5
| if (condition) { } else { }
|
2. 代码示例:按钮控制 LED
以下是一个完整的示例,展示如何使用 if-else 语句根据按钮的按下状态控制板载 LED(GP25)的开关。
硬件连接
- 按钮:连接到 GP0 和 GND(使用内部上拉或外部下拉电阻)。
- LED:使用板载 LED(GP25),无需额外接线。
2.1 Arduino 风格
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| const int LED_PIN = 25; const int BUTTON_PIN = 0;
void setup() { pinMode(LED_PIN, OUTPUT); pinMode(BUTTON_PIN, INPUT_PULLUP); }
void loop() { int buttonState = digitalRead(BUTTON_PIN);
if (buttonState == LOW) { digitalWrite(LED_PIN, HIGH); } else { digitalWrite(LED_PIN, LOW); } }
|
2.2 C/C++ 风格
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| #include "pico/stdlib.h"
#define LED_PIN 25 #define BUTTON_PIN 0
int main() { stdio_init_all(); gpio_init(LED_PIN); gpio_set_dir(LED_PIN, GPIO_OUT); gpio_init(BUTTON_PIN); gpio_set_dir(BUTTON_PIN, GPIO_IN); gpio_pull_up(BUTTON_PIN);
while (true) { bool buttonState = gpio_get(BUTTON_PIN);
if (buttonState == 0) { gpio_put(LED_PIN, 1); } else { gpio_put(LED_PIN, 0); } sleep_ms(10); } return 0; }
|
代码解释
- 硬件连接:按钮一端连接 GP0,另一端连接 GND。启用内部上拉电阻后,未按下时引脚为高电平(3.3V),按下时为低电平(0V)。
setup() / main():设置 LED 引脚为输出模式,按钮引脚为输入模式并启用上拉电阻。
loop() / while:持续读取按钮状态。如果按钮按下(LOW 或 0),点亮 LED;否则关闭 LED。
备注:digitalRead()(Arduino)和 gpio_get()(SDK)用于读取数字引脚的状态,返回 HIGH/LOW 或 1/0。
3. 实际应用场景
if-else 语句在 Pico 2 项目中有广泛的应用。以下是一些常见的场景:
- 按钮控制:根据按钮的按下状态控制 LED、电机或其他设备。
- 传感器数据判断:根据温度传感器、光线传感器等的数据做出决策。
- 状态机:在复杂的项目中,
if-else 语句可以用于实现状态机的逻辑。
3.1 案例:根据光线强度控制 LED
以下代码展示了如何使用 if-else 语句根据光线传感器的值控制 LED 的开关。
硬件连接
- 光线传感器(如光敏电阻分压电路)连接到 GP26(ADC0)。
- LED 连接到 GP25(板载 LED)。
Arduino 风格
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| const int LIGHT_SENSOR_PIN = 26; const int LED_PIN = 25;
void setup() { pinMode(LED_PIN, OUTPUT); Serial.begin(115200); }
void loop() { int lightValue = analogRead(LIGHT_SENSOR_PIN);
if (lightValue < 500) { digitalWrite(LED_PIN, HIGH); Serial.println("Dark, LED ON"); } else { digitalWrite(LED_PIN, LOW); Serial.println("Bright, LED OFF"); } delay(200); }
|
C/C++ 风格
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #include "pico/stdlib.h" #include "hardware/adc.h"
#define LIGHT_SENSOR_PIN 26 #define LED_PIN 25
int main() { stdio_init_all(); gpio_init(LED_PIN); gpio_set_dir(LED_PIN, GPIO_OUT); adc_init(); adc_gpio_init(LIGHT_SENSOR_PIN); adc_select_input(0);
while (true) { uint16_t lightValue = adc_read();
if (lightValue < 500) { gpio_put(LED_PIN, 1); printf("Dark, LED ON\n"); } else { gpio_put(LED_PIN, 0); printf("Bright, LED OFF\n"); } sleep_ms(200); } return 0; }
|
警告:在实际项目中,可能需要根据具体传感器和光照环境调整条件判断的阈值(例如示例中的 500)。
3.2 案例:温度控制风扇
假设你有一个模拟温度传感器(如 LM35)连接到 GP27(ADC1),当温度超过 30℃ 时打开风扇(连接到 GP0),否则关闭风扇。
Arduino 风格
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| const int TEMP_SENSOR_PIN = 27; const int FAN_PIN = 0;
void setup() { pinMode(FAN_PIN, OUTPUT); Serial.begin(115200); }
void loop() { int raw = analogRead(TEMP_SENSOR_PIN); float voltage = raw * 3.3 / 4095.0; float temperature = voltage * 100.0;
if (temperature > 30.0) { digitalWrite(FAN_PIN, HIGH); Serial.print("Temperature: "); Serial.print(temperature); Serial.println(" ℃, Fan ON"); } else { digitalWrite(FAN_PIN, LOW); Serial.print("Temperature: "); Serial.print(temperature); Serial.println(" ℃, Fan OFF"); } delay(1000); }
|
C/C++ 风格
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| #include "pico/stdlib.h" #include "hardware/adc.h"
#define TEMP_SENSOR_PIN 27 #define FAN_PIN 0
int main() { stdio_init_all(); gpio_init(FAN_PIN); gpio_set_dir(FAN_PIN, GPIO_OUT); adc_init(); adc_gpio_init(TEMP_SENSOR_PIN); adc_select_input(1);
while (true) { uint16_t raw = adc_read(); float voltage = raw * 3.3f / 4095.0f; float temperature = voltage * 100.0f;
if (temperature > 30.0f) { gpio_put(FAN_PIN, 1); printf("Temperature: %.2f ℃, Fan ON\n", temperature); } else { gpio_put(FAN_PIN, 0); printf("Temperature: %.2f ℃, Fan OFF\n", temperature); } sleep_ms(1000); } return 0; }
|
4. 总结
if-else 语句是 Raspberry Pi Pico 2 编程中不可或缺的工具。它允许程序根据条件执行不同的代码块,从而实现灵活的控制逻辑。通过本教程,您已经掌握了:
if-else 的基本语法(两种编程风格)。
- 按钮控制 LED 的完整示例。
- 光线控制和温度控制 等实际应用场景。
| 语句类型 |
作用 |
if |
条件为真时执行代码块 |
else |
条件为假时执行代码块 |
提示:编写 if-else 时注意区分赋值运算符 = 和比较运算符 ==,这是初学者常见的错误。对于 Pico 2 的 GPIO,所有逻辑电平均为 3.3V,输入不可承受 5V。
5. 附加资源与练习
为了巩固所学知识,建议尝试以下练习:
- 练习 1:修改按钮控制 LED 的代码,使其在按钮按下时 LED 闪烁(例如亮 0.5 秒、灭 0.5 秒),松开时熄灭。
- 练习 2:使用多个
if-else 语句实现更复杂的逻辑,例如根据光线强度分三档控制 LED 亮度(使用 PWM)。
- 练习 3:结合温度和湿度传感器(如 DHT11),当温度高于 30℃ 且湿度高于 70% 时,启动风扇和除湿设备。
通过不断实践和探索,您将能够熟练运用 if-else 语句,并将其应用到更复杂的 Pico 2 项目中。