Arduino状态机实战:用按钮控制LED实现SOS与摩斯电码

ArduinoGPIO状态机
于 2026-06-02 13:30:38 修改
·本内容遵循CC 4.0 BY-SA版权协议

1. 项目概述与核心价值

如果你刚开始接触Arduino或者嵌入式开发,可能会觉得那些闪烁的LED灯和按钮控制只是些简单的“玩具项目”。但我想告诉你,今天这个用按钮控制LED来发送SOS和摩斯电码“Vacation”的项目,恰恰是理解数字世界如何与物理世界对话的绝佳入口。这不仅仅是让几个灯闪一闪,它背后涉及的是微控制器GPIO(通用输入输出)引脚的底层操作、数字信号时序控制的逻辑,以及如何通过有限状态机的思想来管理复杂的交互流程。这些概念,是构建智能家居传感器、工业控制面板乃至任何物联网设备的基础。

我选择用Tinkercad这个在线仿真平台来演示,因为它能让你在没有实体硬件的情况下,零成本、零风险地验证你的电路设计和代码逻辑,这对于初学者快速建立信心和直觉至关重要。整个项目会围绕一个核心交互展开:一个物理按钮,作为用户输入,触发Arduino Uno运行三段不同的灯光程序。第一段是国际通用的SOS求救信号(三短三长三短),第二段是将英文单词“Vacation”编码成摩斯电码并用不同颜色的LED区分“点”和“划”,第三段则是一个简单的结束状态。通过这个实践,你将亲手实现从硬件连接到软件逻辑,再到调试测试的完整开发闭环,深刻理解“输入-处理-输出”这一嵌入式系统的核心范式。

2. 硬件设计与电路连接解析

在动手写代码之前,正确的硬件连接是项目成功的基石。这一步的每个细节都关系到电路能否正常工作,甚至关乎元件会不会被烧毁。我们使用的核心是Arduino Uno R3,它是一块基于ATmega328P微控制器的开发板,为我们提供了数字输入和输出的能力。

2.1 元件清单与功能角色

首先,我们明确一下每个元件的角色:

  • Arduino Uno R3:项目的大脑。负责读取按钮状态,并按照我们编写的逻辑程序,控制LED的亮灭。
  • 按钮(瞬时开关):项目的输入设备。它是一个常开型按钮,未按下时电路断开,按下时电路接通。
  • LED(发光二极管):项目的输出设备。我们用了红、绿、黄三个,用于视觉反馈。LED是极性元件,长脚为正极(阳极),短脚为负极(阴极),接反了不会亮。
  • 220欧姆电阻(用于LED)限流电阻。这是保护LED的关键。如果不加电阻,直接将LED接到Arduino的5V引脚和GND之间,过大的电流会瞬间烧毁LED。根据欧姆定律 R = (Vcc - Vf) / I,其中Vcc是5V,LED正向压降Vf约为1.8-2.2V(因颜色而异),安全电流I通常取10-20mA。计算可得电阻值在150-330欧姆之间,220欧姆是一个常用且安全的折中值。原资料提到的100欧姆略小,电流会稍大,虽可能更亮但长期使用对LED寿命稍有影响,220欧姆是更稳妥的选择。
  • 10k欧姆电阻(用于按钮)上拉电阻。这是解决按钮信号抖动和确保稳定逻辑电平的核心。当按钮未按下时,这个电阻将连接到按钮的Arduino引脚“拉”至高电平(5V);按下时,引脚被直接连接到GND(0V)。如果没有这个电阻,引脚在未连接时处于“悬空”状态,会读取到不确定的、跳变的电平值,导致误触发。

2.2 电路连接图与接线要点

你需要在一块面包板上搭建如下电路:

  1. 电源与地线:首先,用两根跳线将Arduino的 5V 引脚连接到面包板的正极电源轨,将 GND 引脚连接到面包板的负极电源轨。这为整个面包板上的元件建立了公共的电源和地参考。
  2. 红色LED连接
    • 将红色LED的阳极(长脚) 通过一个220欧姆电阻,连接到Arduino的数字引脚 8
    • 将红色LED的阴极(短脚) 直接连接到面包板的负极电源轨(GND)。
  3. 绿色LED与黄色LED连接:同理,将绿色LED连接到数字引脚 9,黄色LED连接到数字引脚 10。每个LED的阳极都需串联一个220欧姆电阻再接到对应引脚,阴极均接GND。
  4. 按钮连接:这是关键。
    • 按钮有四个引脚,通常两两内部连通。将其跨接在面包板的中缝上。
    • 按钮一侧的一个引脚用跳线连接到面包板的正极电源轨(5V)
    • 同一侧的另一个引脚,通过一个10k欧姆电阻,连接到面包板的负极电源轨(GND)。这个电阻就是上拉电阻。
    • 按钮另一侧的一个引脚,用跳线直接连接到Arduino的数字引脚 2(我们将用它作为中断引脚,后续详解)。
    • 按钮另一侧的剩余引脚悬空或也接GND(确保按下时是稳定接地)。

注意:在Tinkercad中拖放元件时,务必注意LED和电阻的方向。连接线尽量整洁,使用不同颜色的线区分信号和电源(如红色接5V,黑色接GND,其他颜色接信号),这样在排查故障时会轻松百倍。

这种连接方式构成了一个经典的“上拉电阻输入电路”。当按钮松开,引脚2通过10k电阻接到GND?不对,这里需要纠正:在我的描述中,当按钮松开时,引脚2通过10k电阻接到GND,这会导致它始终读取低电平。正确的接法是:10k电阻的一端接引脚2,另一端接5V(上拉)。按钮的一端接引脚2,另一端接GND。这样,未按下时,引脚2被电阻“拉高”到5V(读取为HIGH);按下时,引脚2直接连通GND(读取为LOW)。这是上拉输入模式。Arduino引脚也可以配置为内部上拉,但使用外部电阻是更基础、更通用的方法。

3. 核心编程逻辑与状态机设计

硬件准备就绪后,大脑(Arduino)需要指令。我们不仅要让LED闪烁,还要实现“按一下按钮换一个模式”的复杂交互。如果只用简单的delay和顺序逻辑,代码会变得难以维护且无法响应实时按钮动作。这里,我引入一个在嵌入式开发中极其重要的概念:状态机

3.1 理解状态机:项目运行的灵魂

你可以把状态机想象成一个智能灯开关。它有几种明确的“状态”:关灯、开灯、闪烁。触发它改变状态的是“事件”:比如按一下开关、长按开关。我们的项目有三个状态:

  • 状态0 (MODE_SOS):执行SOS闪烁序列。
  • 状态1 (MODE_MORSE):执行“VACATION”的摩斯电码闪烁序列。
  • 状态2 (MODE_OFF):所有LED关闭,等待重启。

触发状态改变的事件就是按钮被按下。但这里有个细节:我们不能在SOS或摩斯码正在播放的半途,一按按钮就立刻切换,那样会打断当前信号。因此,我们需要区分“短按”和“长按”,或者设计成“按下后,等待当前模式播放完毕,再检测到按钮按下才切换”。后者逻辑更清晰。我们可以用一个标志位modeFinished来记录当前模式是否已完成一次完整播放。

3.2 代码结构框架与关键函数

让我们先搭建程序的骨架。这里会用到几个关键的编程概念:

CPP
// 引脚定义
const int buttonPin = 2; // 按钮连接引脚
const int ledRed = 8;
const int ledGreen = 9;
const int ledYellow = 10;
 
// 状态与变量定义
enum ProgramMode { MODE_SOS, MODE_MORSE, MODE_OFF };
ProgramMode currentMode = MODE_OFF; // 初始状态
bool modeFinished = true; // 初始为true,允许第一次按键触发
unsigned long lastDebounceTime = 0; // 用于防抖计时
const unsigned long debounceDelay = 50; // 防抖延时50毫秒
 
void setup() {
pinMode(buttonPin, INPUT_PULLUP); // 启用Arduino内部上拉电阻,按钮另一端接地即可
pinMode(ledRed, OUTPUT);
pinMode(ledGreen, OUTPUT);
pinMode(ledYellow, OUTPUT);
Serial.begin(9600); // 用于调试,输出当前状态
}
 
void loop() {
// 1. 扫描按钮状态(带防抖)
bool buttonState = digitalRead(buttonPin);
if (buttonState == LOW) { // 按钮被按下(因为上拉,按下为LOW)
delay(debounceDelay); // 简单防抖,等待一段时间
if (digitalRead(buttonPin) == LOW) { // 确认仍然是按下状态
onButtonPressed(); // 处理按钮按下事件
while(digitalRead(buttonPin) == LOW) { // 等待按钮释放
// 空循环,避免连续触发
}
}
}
 
// 2. 根据当前状态执行对应的灯光程序
switch (currentMode) {
case MODE_SOS:
playSOS();
break;
case MODE_MORSE:
playMorseVacation();
break;
case MODE_OFF:
allLEDsOff();
// 在此状态下,可以做一些低功耗或等待的事情
break;
}
}
 
// 按钮按下事件处理函数
void onButtonPressed() {
if (modeFinished) { // 只有当前模式播放完毕,才允许切换
switch (currentMode) {
case MODE_OFF:
currentMode = MODE_SOS;
modeFinished = false; // 进入新模式,标记为未完成
Serial.println("切换到: SOS模式");
break;
case MODE_SOS:
currentMode = MODE_MORSE;
modeFinished = false;
Serial.println("切换到: 摩斯电码模式");
break;
case MODE_MORSE:
currentMode = MODE_OFF;
modeFinished = true; // 关闭模式本身就是完成状态
Serial.println("切换到: 关闭模式");
break;
}
} else {
Serial.println("当前模式未结束,忽略按键。");
}
}

这个框架清晰地分离了事件检测(按钮)、状态管理currentMode)和行为执行playSOS等函数)。modeFinished变量是关键,它防止了信号播放被中途打断。

4. 模式一:SOS信号精准实现

SOS求救信号(··· --- ···)在摩斯电码中,其节奏感至关重要。国际标准中,“点”的长度是基本时间单位,“划”的长度是三个“点”,字符内点划间隔是一个“点”,字符间间隔是三个“点”,单词间间隔是七个“点”。为了清晰可辨,我们需要在代码中定义这些时间单位。

4.1 时序定义与函数封装

CPP
// 摩斯电码时间常量 (单位:毫秒)
const int dotDuration = 200; // 点长
const int dashDuration = dotDuration * 3; // 划长是点长的3倍
const int elemPause = dotDuration; // 点划间停顿
const int letterPause = dotDuration * 3; // 字母间停顿
const int wordPause = dotDuration * 7; // 单词间停顿(本项目未用到)
 
void playDot() {
digitalWrite(ledRed, HIGH);
delay(dotDuration);
digitalWrite(ledRed, LOW);
delay(elemPause);
}
 
void playDash() {
digitalWrite(ledRed, HIGH);
delay(dashDuration);
digitalWrite(ledRed, LOW);
delay(elemPause);
}

通过函数封装,playSOS()函数的可读性会大大增强:

4.2 SOS播放函数与状态结束标记

CPP
void playSOS() {
// 播放第一个S (···)
playDot(); playDot(); playDot();
delay(letterPause - elemPause); // 减去最后一个elemPause,避免重复停顿
 
// 播放O (---)
playDash(); playDash(); playDash();
delay(letterPause - elemPause);
 
// 播放第二个S (···)
playDot(); playDot(); playDot();
delay(wordPause - elemPause); // 单词结束,使用更长停顿
 
// 关键:一次完整的SOS播放完毕,标记模式完成
modeFinished = true;
Serial.println("SOS播放完毕。");
}

实操心得delay()函数在简单项目中很方便,但它会阻塞程序运行。这意味着在delay期间,Arduino无法检测按钮是否被按下。这就是为什么我们需要modeFinished标志。在复杂的、需要实时响应的项目中,我们会使用非阻塞定时,比如millis()函数来管理时间,这样在等待LED闪烁的同时,还能持续扫描按钮。作为初学者,先用delay理解时序概念,后续一定要掌握millis()的用法。

5. 模式二:摩斯电码“VACATION”编码与播放

将单词“VACATION”转换为摩斯电码并播放,是本项目逻辑最复杂的部分。我们需要做两件事:一是建立字母到摩斯码的映射,二是用不同颜色的LED区分“点”和“划”。

5.1 数据结构设计:编码映射表

最直观的方法是用字符串数组来存储映射关系。我们可以利用字符的ASCII码值作为索引。

CPP
// 摩斯电码映射表 (A-Z, 0-9)。这里只定义我们需要的字母。
const char* morseCodes[] = {
".-", // A
"-...", // B
"-.-.", // C
"-..", // D
".", // E
"..-.", // F
"--.", // G
"....", // H
"..", // I
".---", // J
"-.-", // K
".-..", // L
"--", // M
"-.", // N
"---", // O
".--.", // P
"--.-", // Q
".-.", // R
"...", // S
"-", // T
"..-", // U
"...-", // V (我们需要)
".--", // W
"-..-", // X
"-.--", // Y
"--.." // Z
};

5.2 单词播放函数实现

有了映射表,我们就可以编写playMorseVacation()函数。思路是遍历单词中的每个字符,查找对应的摩斯码字符串,然后遍历这个字符串的每个字符(.-),控制相应的LED闪烁。

CPP
void playMorseForChar(char ch) {
if (ch >= 'a' && ch <= 'z') {
ch = ch - ('a' - 'A'); // 转换为大写
}
 
if (ch >= 'A' && ch <= 'Z') {
int index = ch - 'A'; // 计算索引,'A'对应0
const char* morse = morseCodes[index];
 
Serial.print("播放字母: ");
Serial.print(ch);
Serial.print(" 摩斯码: ");
Serial.println(morse);
 
// 播放该字母的每一个点划
for (int i = 0; morse[i] != '\0'; i++) {
if (morse[i] == '.') {
digitalWrite(ledRed, HIGH); // 短点用红灯
delay(dotDuration);
digitalWrite(ledRed, LOW);
} else if (morse[i] == '-') {
digitalWrite(ledGreen, HIGH); // 长划用绿灯
delay(dashDuration);
digitalWrite(ledGreen, LOW);
}
delay(elemPause); // 点划间停顿
}
delay(letterPause - elemPause); // 字母间停顿
} else if (ch == ' ') {
delay(wordPause - letterPause); // 单词间停顿(本例中无空格,预留)
}
}
 
void playMorseVacation() {
char word[] = "VACATION"; // 要编码的单词
Serial.println("开始播放摩斯电码: VACATION");
 
for (int i = 0; word[i] != '\0'; i++) {
playMorseForChar(word[i]);
}
 
Serial.println("摩斯电码播放完毕。");
modeFinished = true; // 标记模式完成
// 所有播放结束后,可以加一个黄灯闪烁提示
for(int i=0; i<3; i++){
digitalWrite(ledYellow, HIGH);
delay(300);
digitalWrite(ledYellow, LOW);
delay(300);
}
}

注意事项:原资料中提到用红灯代表“点”、绿灯代表“划”,这是一个很好的视觉区分设计。在实际编码中,V(...-)会呈现“红红红绿”的闪烁,A(.-)是“红绿”,非常直观。这种将数据(点划)映射到不同输出(颜色)的思想,在数据处理中非常常见。

6. 系统调试、优化与问题排查实录

即使代码逻辑清晰,第一次运行时也难免遇到问题。以下是基于我多年调试经验总结的常见问题清单和解决方法,你可以像查手册一样使用它。

6.1 硬件连接排查表

现象 可能原因 排查步骤
所有LED都不亮 电源未接通或共地错误 1. 检查Arduino的5VGND是否正确连接到面包板电源轨。
2. 用万用表或另一根线将LED阴极直接连接到Arduino的GND引脚,绕过面包板,测试是否亮起。
单个LED不亮 LED极性接反或电阻虚焊/损坏 1. 确认LED长脚(正极)接信号线(通过电阻),短脚(负极)接GND。
2. 将该LED与一个正常工作的LED交换引脚,判断是LED问题还是引脚问题。
3. 检查电阻是否焊牢或与插孔接触良好。
LED常亮不灭 程序未控制或引脚模式错误 1. 检查setup()中是否用pinMode(pin, OUTPUT)正确初始化了引脚。
2. 检查代码中是否有digitalWrite(pin, LOW)语句。
按钮按下无反应 上拉电阻接法错误或引脚模式错误 1. 最常见问题:确认按钮接线。正确接法:引脚2 -> 按钮一脚;按钮另一脚 -> GND。同时,在setup()中设置pinMode(buttonPin, INPUT_PULLUP)
2. 用Serial.println(digitalRead(buttonPin));打印引脚电平,按下按钮时应从1变为0
LED闪烁但亮度异常 限流电阻值不匹配 1. 太暗:电阻值可能太大(如用了1k欧姆),尝试减小电阻(不低于150欧姆)。
2. 太亮或发热:电阻值太小(如用了100欧姆或直接短路),立即更换为220欧姆以上,防止烧毁LED或Arduino引脚。

6.2 软件逻辑与调试技巧

  • 问题:按钮切换模式不灵敏或连跳

    • 原因:按钮抖动。物理按钮在按下和释放的瞬间,金属触点会产生多次快速的通断,导致单片机在几毫秒内读到多次变化。
    • 解决:实现软件防抖。我们在loop()中读取按钮状态后,不是立即行动,而是等待一小段时间(如50ms)再次读取,如果状态一致才确认。上文代码中的debounceDelaylastDebounceTime就是用于此目的。更进阶的方法是使用中断,将按钮引脚(如引脚2)配置为中断引脚,并设置中断服务函数,响应会非常及时。
  • 问题:SOS或摩斯码播放时,按按钮无法立即切换

    • 原因:代码中使用了阻塞式的delay()函数。
    • 解决:这是学习状态机和非阻塞编程的绝佳动力。你需要重构代码,用unsigned long previousMillis记录上一次动作的时间,用if (millis() - previousMillis >= interval)来判断是否该执行下一个动作(如点亮或熄灭LED)。这样,loop()函数就能一直快速循环,随时响应按钮事件。这是从初学者迈向进阶的必经之路。
  • 问题:摩斯码播放混乱,字母间节奏不对

    • 原因delay()的时间累加有误。注意在playDotplayDash函数内部已经包含了点划后的elemPause,所以在字母播放完后,只需补充letterPause - elemPause,否则停顿会过长。
    • 解决:仔细核算时间。使用串口打印每个步骤的日志,例如Serial.println("Playing dot...");,可以帮助你可视化程序的执行流程。

6.3 在Tinkercad中的仿真要点

  1. 启动仿真:点击“Start Simulation”后,电路才会通电。虚拟Arduino会自动上传并运行你左侧代码窗口中的程序。
  2. 观察信号:点击导线,可以查看该点的电压(模拟万用表)。观察按钮按下前后,连接到引脚2的导线电压是否从~5V变为0V。
  3. 调试输出:充分利用串口监视器。在代码中Serial.begin(9600),然后在Tinkercad中打开右下角的串口监视器,查看打印的调试信息(如当前模式、播放的字母),这是排查逻辑错误最强大的工具。
  4. 性能差异:Tinkercad仿真时间可能与现实略有差异,且仿真对复杂逻辑或精确时序的模拟可能存在微小偏差,但用于验证核心功能完全足够。

这个项目麻雀虽小,五脏俱全。它强迫你去思考硬件连接、电源与接地、信号防抖、状态管理、时序控制这些嵌入式开发中最核心的问题。当你成功看到LED按照你的指令,清晰地闪烁出“··· --- ···”和代表“VACATION”的复杂节奏时,那种对系统拥有完全控制权的成就感,是单纯看书无法比拟的。接下来,你可以尝试修改单词、改变闪烁节奏、加入蜂鸣器同时发声,甚至用红外接收头来解码真正的摩斯电码信号,探索的道路才刚刚开始。

MorseCode摩尔斯电码库arduino
初始化在`setup()`函数中,设置好与LED灯相连的引脚,并可能需要配置其他硬件设置。
721
Arduino实验01 LED闪烁控制
本文详细介绍Arduino UNO开发板的基础实验,包括Arduino IDE安装、第一个程序编写、LED控制及摩斯密码信号发射等内容。读者将学会如何利用Arduino进行简单的硬件编程。
张小花-Soleil
14261
Arduino】入门篇——SOS求救信号器
本文介绍了一项使用Arduino UNO控制器模拟SOS求救信号灯的实验。通过控制三个LED小灯泡的不同频闪,实现SOS信号灯的闪烁频率。文章详细描述了实验所需的材料、电路连接方式、代码编写及实验效果。
漠宸离若
10374
Arduino:入门案例之莫尔斯码表 SOS
本文介绍了如何利用Arduino实现莫尔斯码,特别是如何发送SOS信号。通过使用有源蜂鸣器,将莫尔斯码的滴滴滴、嗒嗒嗒转化为实际的声音信号。 Arduino代码示例中,滴用'.'表示,嗒用'-'表示,遵循特定的时间间隔规则。
醒不了的星期八
4197
Arduino】编程之控制LED灯以SOS信号闪烁(七)
本文介绍使用Arduino IDE平台编程控制LED灯明灭发出SOS信号。阐述了SOS信号在摩尔斯电码中的组成,给出代码思路,即控制LED灯按“三短三长三短”发出信号。还说明了代码实现,定义引脚、设置输出模式,用for循环控制灯的明灭及间隔时间。
哇啊_
858
Matlab编写摩斯代码,以摩斯电码为例为 Arduino 编写库
本文介绍了一个使用ArduinoLED实现SOS莫斯电码信号的简单项目。通过Pin13连接的LED,代码能够准确地发出SOS求救信号。文章详细展示了如何定义Morse类及其成员函数,并在主程序中调用这些函数来执行特定的莫斯电码。
weixin_39821605
1011
Mixly——SOS求救装置
本文详细解析了一个用于Arduino平台的SOS求救装置代码,该装置通过控制LED灯发出SOS信号。代码中使用了delay函数和digitalWrite函数来实现信号的精确控制,通过循环和条件语句实现SOS信号的连续发送。
漠宸离若
1496
Arduino)蓝牙和 APPinventor实现一键SOS求救(一)
本文介绍使用Arduino、蓝牙及APPinventor实现一键SOS求救功能,详细讲解硬件连接、Arduino代码及APP端设置,确保手机能自动拨打电话。
WJX+WT
4066
Arduino入门教程一|初识Arduino,从点亮LED开始
本文系统介绍Arduino入门核心知识,涵盖Arduino平台本质、UNO板卡接口功能、ATmega328微控制器原理及嵌入式系统概念;重点讲解Arduino IDE安装、程序基本结构(setup/loop)、数字I/O操作(pinMode/digitalWrite/delay);通过点亮板载LED实现SOS莫尔斯码两个实操项目,帮助零基础用户掌握硬件控制与C/C++嵌入式编程基础。
weixin_46718228
1070
Arduino入门实战:LED闪烁到摩斯码SOS信号实现
堂长老
329
Arduino 卡片1和2闪烁及SOS求救信号灯设计
本文介绍了如何使用Arduino设计一个SOS求救信号灯。通过连接电路,编程实现LED灯的闪烁,利用莫尔斯码将'SOS'转换为灯光信号。详细讲述了电路连接方法、基本代码实现,以及莫尔斯码的原理,帮助读者理解如何通过简单电路和编程实现通信功能。
Alexantao
8712
arduino 入门学习第一课——初识arduino
本文介绍如何使用Arduino开发板控制LED灯模拟SOS求救信号。文章详细解释了Arduino的基础概念,包括setup()和loop()函数的作用,以及如何利用库函数控制LED灯。并通过一个具体的例子演示了如何编写代码实现特定的灯光效果。
也问吾心
813
Arduino Uno零基础入门学习笔记——SOS摩斯密码LED+蜂鸣器
本文介绍了一个简单的Arduino程序,该程序通过LED灯和蜂鸣器模拟国际求救信号SOS。具体实现包括闪烁三次短信号、三次长信号和再次三次短信号,并在每个信号组之间暂停两秒。
Sol-itude
2118
Arduino中断编程实战:从attachInterrupt到按钮消抖优化
本文深入讲解Arduino中断机制原理及attachInterrupt函数用法,结合按钮控制LED实战项目,分析机械按钮抖动成因,并对比硬件RC滤波、施密特触发器基于millis()的软件消抖方案;进一步引入状态机实现稳健按键识别,最后总结volatile变量、ISR编写规范、中断优先级及低功耗唤醒等关键最佳实践。
香菜滚出地球
187
可编程led灯带原理_【第2课】一节闪烁LED灯实验课要讲90分钟???
本文介绍了如何通过Arduino控制LED灯的闪烁,从教学目标、控制原理、编程方法到实战练习,包括作品展示、电路接线、Mixly软件教学和SOS信号灯制作。学生将理解LED闪烁原理,学习编写并实践基本的程序,提升硬件编程技能。
羊男的迷宫
2240
Arduino+Proteus 模拟摩尔斯码求救信号
本文介绍了如何利用Arduino和Proteus模拟摩尔斯码中的求救信号SOS。通过控制LED的亮灭,模拟点和划的时序,实现SOS的显示。在Proteus中新建工程,设置硬件电路,编写程序,通过不同的延迟时间来区分点和划,最终形成SOS的摩尔斯码闪烁效果。
weixin_42258805
1388
Qt Creator 5.12.12 + Arduino实战:10分钟搞定串口控制LED灯(附完整源码)
本文详解如何使用Qt Creator 5.12.12开发跨平台桌面应用,通过串口通信控制Arduino LED。涵盖环境搭建(Qt/Arduino IDE)、Qt Designer界面设计(QComboBox/QPushButton)、QSerialPort编程实现串口打开/指令发送、Arduino固件解析串口命令并驱动LED,以及联调测试、错误处理、状态管理exe打包分发等关键技术环节。
716
Mixly06国际摩尔斯电码救难信号SOS
本文详细介绍了SOS求救信号的由来及其在摩尔斯电码中的表示方式,包括了声音、灯光等通用远程表达方式,并提供了一种使用Arduino Uno R3实现SOS灯光信号的硬件连接和代码示例。
漠宸离若
140441
如何用Elk JavaScript引擎打造Arduino智能LED闪烁控制
本文介绍如何基于Elk——一款超轻量(仅20KB Flash、100字节RAM)、零依赖、内存友好的嵌入式JavaScript引擎,在Arduino平台(如Nano、Uno、ESP32)上构建可编程LED闪烁控制器。内容涵盖硬件搭建、C/JS混合编程、GPIO函数导出、模式化多LED控制、内存优化技巧及Web实时编辑等关键技术,突出其在智能家居、教育原型和快速开发中的应用价值。
惠焰凡
880
Arduino基础项目二制作S.O.S求救信号
本文介绍如何使用Arduino UNO R3开发板制作SOS求救信号发射器。通过硬件连接和编程实现LED灯以莫尔斯电码的形式发出SOS信号。文章提供了完整的硬件连接图、代码示例及运行结果。
简时刻
4565
5、玩转Arduino:LED项目实战与代码解析
本文围绕ArduinoLED项目展开实战与代码解析,涵盖S.O.S.摩尔斯电码信号器、交通灯、交互式交通灯等项目。介绍了项目所需部件、电路连接和代码输入,分析了代码工作原理,还总结了数据类型内存优化、布尔运算符应用,最后提出项目拓展思路。
95