Arduino程序设计(一) 流水灯+呼吸灯

article/2025/10/27 22:39:28

LED灯程序设计

  • 前言
  • 一、LED灯的程序设计1 —— 频闪灯
  • 二、LED灯的程序设计2 —— 流水灯
  • 三、LED灯的程序设计3 —— 呼吸灯
  • 总结
  • 参考文献


前言

  • 本文主要介绍三种LED灯的程序设计,即频闪灯、流水灯和呼吸灯。
  • 本文使用的MCU芯片为ESP8266EX,程序编写使用Arduino IDE的版本号为Arduino 1.8.19。

一、LED灯的程序设计1 —— 频闪灯

数字信号

  • 数字信号是以0、1表示的电平不连续变化的信号,也就是以二进制的形式表示的信号。 在Arduino中数字信号通过高低电平来表示,高电平则为数字信号1,低电平则为数字信号0 。
    在这里插入图片描述
  • 使用输入或输出功能前,需要通过pinMode() 函数配置引脚的模式为输入模式或输出模式,调用形式:
pinMode(pin, mode);
  • 参数pin为指定配置的引脚编号;参数mode为指定的配置模式。
    可使用的三种模式:
    INPUT —— 输入模式
    OUTPUT—— 输出模式
    INPUT_PULLUP—— 输入上拉模式
  • 配置成输出模式后,你还需要使用digitalWrite() 让其输出高电平或者是低电平,调用形式:
digitalWrite(pin, value);
  • 参数pin为指定输出的引脚编号;参数value为你要指定输出的电平,使用HIGH指定输出高电平,或是使用LOW指定输出低电平。
  • 数字引脚除了用于输出信号外,还可以用digitalRead() 函数读取外部输入的数字信号,调用形式:
int value = digitalRead(pin);
  • 参数pin为指定读取状态的引脚编号;返回值value为获取到的信号状态,1为高电平,0为低电平。
  • 以宏定义的方式,来为设备设置一个名称。
#define MCU_LED 2
  • delay() 为毫秒延时函数,delay(1000) 即延时1秒(1000毫秒)。
  • 基于上述Arduino库函数基础,利用数字信号实现频闪灯。
  • 控制LED灯点亮或熄灭,实现500ms点亮,1000ms熄灭,循环点亮LED。

代码实现:

// 频闪灯,500ms点亮,1000ms熄灭,循环点亮LED。#define MCU_LED 2                //MCU_LED连接到GPIO2
void setup() {pinMode(MCU_LED, OUTPUT);      //MCU_LED定义为输出引脚
}void loop() {digitalWrite(MCU_LED, HIGH);   //点亮MCU_LEDdelay(500);                    //延时500ms digitalWrite(MCU_LED, LOW);    //熄灭MCU_LEDdelay(1000);                   //延时1000ms
}

二、LED灯的程序设计2 —— 流水灯

  • 硬件准备:将GPIO6、GPIO7、GPIO8、GPIO9分别串联一个3K电阻和一个LED灯到GND。
  • 利用数字信号控制4个GPIO口,即控制4个LED灯,实现逐个点亮流水灯效果。

代码实现:

// 逐个点亮4个LED,实现流水灯效果。void setup() {for(int i = 6; i < 10; i++)   //GPIO6、GPIO7、GPIO8、GPIO9定义为输出引脚pinMode(i, OUTPUT);
}void loop() {for(int i = 6; i < 10; i++)  //GPIO6 → GPIO9,LED流向从左往右{digitalWrite(i, HIGH);     //点亮 GPIOi 对应的LEDdelay(500);                //延时500msdigitalWrite(i, LOW);      //熄灭 GPIOi 对应的LED}for(int i = 9; i < 5; i--)   //GPIO9 → GPIO6,LED流向从右往左{digitalWrite(i, HIGH);    //点亮 GPIOi 对应的LEDdelay(500);               //延时500msdigitalWrite(i, LOW);     //熄灭 GPIOi 对应的LED}
}

三、LED灯的程序设计3 —— 呼吸灯

模拟信号

  • 生活中,接触到的大多数信号都是模拟信号,如声音、温度的变化等。模拟信号是用连续变化的物理量表示的信息,信号随时间作连续变化。

在这里插入图片描述

  • ESP8266EX芯片可以接受0~5V的模拟信号。
  • 模拟输入引脚是带有ADC(Analog-to-Digital Converter,模数转换器)功能的引脚。它可以将外部输入的模拟信号转换为芯片运算时可以识别的数字信号,从而实现读入模拟值的功能。
  • Arduino 模拟输入功能有10位精度,即可以将0~5V的电压信号转换为0~1023的整数形式表示。
  • 模拟输入功能需要使用analogRead() 函数,调用形式:
int value = analogRead(pin)
  • 参数pin是指定要读取模拟值的引脚,被指定的引脚必须是模拟输入引脚。
  • 使用analogWrite() 函数实现这个功能。但该函数并不是输出真正意义上的模拟值,而是以一种特殊的方式来达到输出近似模拟值的效果,这种方式叫做脉冲宽度调制(PWM,Pulse Width Modulation)。
  • 需要使用带PWM功能的引脚才能对GPIO口进行配置,配置PWM请参考ESP8266EX芯片手册。
  • 当使用analogWrite() 函数时,指定引脚会通过高低电平的不断转换输出一个周期固定的方波,通过改变高低电平在每个周期中所占的比例(占空比),而得到近似输出不同的电压的效果。
  • 需要注意的是,这里仅仅是得到了近似模拟值输出的效果,如果要输出真正的模拟值,还需要加上外围滤波电路。
  • 模拟输入调用形式:
analogWrite(pin,value)
  • 参数pin是指定要输出PWM波的引脚,参数value指定是PWM的脉冲宽度,ESP8266的PWM波value范围为0~1023。
  • 在analogWrite() 和analogRead() 函数内部,已经完成了引脚的初始化,因此不用在Setup() 函数中进行初始化操作。
  • 基于上述Arduino库函数基础,程序实现呼吸灯。

代码实现:

// analogWrite()函数输出PWM波控制LED,实现呼吸灯效果。#define MCU_LED 2                 //MCU_LED连接到GPIO2
void setup() {pinMode(MCU_LED, OUTPUT);       //MCU_LED定义为输出引脚
}void loop() {for(int i = 0; i < 255; i=i+5)  //LED从暗到亮{analogWrite(MCU_LED, i);      //输出PWM波delay(30);                    //延时30ms,以便观察渐变效果}  for(int i = 255; i >0; i=i-5)   //LED从暗到亮  {         analogWrite(MCU_LED, i);     //输出PWM波delay(30);                   //延时30ms,以便观察渐变效果}
}
  • 通过for循环,逐渐改变LED的亮度,达到呼吸的效果。
  • 在两个for循环中都有delay(30) 的延时语句,这是为了让我们肉眼能观察到亮度调节的效果。

总结

  • 本文通过三个LED灯实例介绍一些常用的Arduino库函数,调用库函数是学习Arduino编程的基础。
  • 学会控制GPIO口,便于后续Arduino程序设计的学习。

参考文献

参考文献1: 数字I/O的使用
参考文献2: 流水灯实验
参考文献3: 模拟I/O的使用
参考文献4: 呼吸灯实验
参考文献5: ESP8266芯片手册


http://chatgpt.dhexx.cn/article/X5HlKQGG.shtml

相关文章

51单片机呼吸灯的实现

1.PWM介绍 PWM&#xff08;Pulse Width Modulation&#xff09;即脉冲宽度调制&#xff08;如电机&#xff1a;转5ms停1ms还是转5ms停2ms&#xff09;&#xff0c;在具有惯性的系统中&#xff0c;可以通过对一系列脉冲的宽度进行调制&#xff0c;来等效地获得所需要的模拟参量…

呼吸灯——FPGA

文章目录 前言一、呼吸灯是什么&#xff1f;1、介绍2、占空比调节示意图 二、系统设计1、系统框图2、RTL视图 三、源码四、效果五、总结六、参考资料 前言 环境&#xff1a; 1、Quartus18.0 2、vscode 3、板子型号&#xff1a;EP4CE6F17C8 要求&#xff1a; 将四个LED灯实现循环…

51单片机——实现呼吸灯程序代码

实现效果如图&#xff1a; 注&#xff1a;该51单片机led灯引脚为P2^ 0 - P2^7,实际代码按照引脚图实现。 代码如下&#xff1a; #include<reg52.h> typedef unsigned int uint; typedef unsigned char uchar; //--------------Delay--------------------void Delay(uin…

单片机开发—呼吸灯的三种实现方法

目录 一、前言1、什么是呼吸灯2、如何实现呼吸灯 二、利用for循环实现呼吸灯三、利用定时器实现呼吸灯1.利用定时器中断实现2.利用定时器输出PWM波实现 四、总结 一、前言 提示&#xff1a;本文使用的芯片并非STM32系列&#xff0c;利用定时器实现呼吸灯是从寄存器层面讲解的&…

【STM32】8.简单呼吸灯的制作教程,附代码、效果视频

目的&#xff1a; 实现呼吸灯。逐渐亮&#xff0c;逐渐灭。 一&#xff0e;呼吸灯原理分析 外设工作靠电流&#xff0c;因此要改变电流大小&#xff0c;所以要动电阻或电压。 电阻&#xff1a;阻值固定&#xff0c;不可更改。 电压&#xff1a;怎么改变电压大小呢&#xff1…

自适应滤波C语言实现

这里写目录标题 原理代码结果 原理 自适应滤波是近年以来发展起来的一种最佳滤波方法。它是在维纳滤波,Kalman滤波等线性滤波基础上发展起来的一种最佳滤波方法。由于它具有更强的适应性和更优的滤波性能。从而在工程实际中,尤其在信息处理技术中得到了广泛的应用。自适应滤波…

c语言实现图像滤波处理

#include<stdio.h> #include<malloc.h> #include<stdlib.h> #include <math.h> /* 位图头结构 */ #pragma pack(1) typedef struct tagBITMAPFILEHEADER {unsigned char bfType[2];//文件格式unsigned long bfSize;//文件大小unsigned short bfReserve…

卡尔曼滤波一阶矩阵C语言实现

①估计时刻k的状态&#xff1a; ②误差相关矩阵P&#xff0c;度量估计值的精确程度 ③卡尔曼增益 ④更新误差相关矩阵 ⑤更新状态变量 ⑥最后输出 C语言代码&#xff1a; float X_pre,P_pre,X_kalman_last,P_kalman_last,X_kalman2500,P_kalman2; //赋初值 float H,Q…

卡尔曼滤波C语言实现

卡尔曼5条基本公式&#xff0c;参考https://wenku.baidu.com/view/8523cb6eaf1ffc4ffe47ac24.html #include "stdio.h" #include "stdlib.h" #include "math.h"#define kal_Q 0.001 /*过程噪声协方差,Q增大&#xff0c;动态响应变快&#xff0…

C语言实现简单卡尔曼滤波

https://www.bilibili.com/video/BV1ez4y1X7eR DR.CAN讲的真的很好 卡尔曼滤波的步骤 步骤说明Step 1计算卡尔曼增益Step 2更新本次迭代的估计值Step 3更新本次迭代的估计误差 具体请看上面DR.CAN的视频 代码 参数说明x_mea测量值x_est估计值e_mea固有的测量误差&#xf…

C语言实现双边滤波

参考博文 看不懂公式的先去看参考博文 一个3*3窗口的代码 /**双边法滤波 3*3窗口 *参数 data[][COL] 图像数据 *参数 row 图像数据行数 *参数 varD 空域核d的标准差 *参数 varR 值域核r的标准差 *需要引用头文件math.h *typedef unsi…

数字图像处理,读懂频域处理的“傅里叶变换”

转载自&#xff1a;https://blog.csdn.net/ebowtang/article/details/39004979 以下部分文字资料整合于网络&#xff0c;本文仅供自己学习用&#xff01; 这是一幅很绝的一维傅里叶变换动态图 一&#xff0c;读懂傅里叶变换 一个信号能表示成傅里叶级数的形式是有条件的&…

傅立叶变换和拉普拉斯变换

欧拉公式 证明过程如下 首先是泰勒展开 参考cosX和sinX的泰勒展开可以证明这个问题。 还有下面这个号称宇宙最美公式 “自然底数e&#xff0c;自然数1和0&#xff0c;虚数i还有圆周率pi&#xff0c;它是这么简洁&#xff0c;这么美丽啊&#xff01;” 傅立叶级数 傅立叶在…

Little’s Law 利特尔法则

1 A simple definition: Little’s Law states that the long-term average number of customers in a stable system L L L is equal to the long-term average effective arrival rate, λ \lambda λ, multiplied by the average time a customer spends in the system, …

勒让德符号的说明及作用

Legendre符号的用途 一、 二次剩余 勒让德符号的提出的意义是判断一个数是否是模n的二次剩余&#xff0c;所以研究勒让德符号之前应该了解一下二次剩余。 存在x使x的平方与a MOD (p)就称a为模p的二次剩余&#xff0c;其中p为素数&#xff0c;a>0且a<p。 通过勒让…

奈奎斯特准则的简洁证明

一般而言&#xff0c;发送滤波器和接收滤波器的冲激响应相同且关于原点对称&#xff0c;有用信号事实上经过了这两个滤波器&#xff0c;所以等效滤波器为&#xff1a; 为使无符号间干扰&#xff0c; 应满足&#xff1a; 奈奎斯特准则指出上式等价于&#xff1a; 其中 表示的傅里…

蒙蒂霍尔悖论

贝叶斯与频率主义对蒙蒂霍尔问题的解 在定义概率时&#xff0c;通常有两种思想流派&#xff1a;贝叶斯主义和频率主义。前者将概率视为我们对事件发生的信念程度&#xff0c;而后者则将其视为事件发生的相对频率。这篇文章介绍了使用贝叶斯和频率主义方法来解决著名的蒙蒂霍尔问…

信号 信号的线性放大

信号 1.信号 信号是信息的载体或表达形式 2. 信号的频谱 正弦信号 方波信号 满足狄里赫利条件&#xff0c;展开成傅里叶级数 附 狄里赫利条件: 1) 函数在任意有限区间内连续&#xff0c;或只有有限个第一类间断点&#xff08;当t从左或右趋于这个间断点时&#xff0c;函数有有限…

信号的频域描述

一、周期信号的频域描述 1. 狄里赫利条件 &#xff08;1&#xff09;函数在任意有限区间内连续&#xff0c;或只有有限个第一类间断点 &#xff08;2&#xff09;在一个周期内&#xff0c;函数有有限个 极大值或极小值 2. 傅里叶级数 &#xff08;1&#xff09;傅里叶级数…

【信号与系统】(十三)傅里叶变换与频域分析——周期信号的傅里叶级数

文章目录 周期信号的傅里叶级数1 周期信号三角形式的傅里叶级数1.1 三角形式的傅里叶级数1.2 狄里赫利(Dirichlet)条件1.3 .余弦形式的傅里叶级数1.4 吉布斯现象 2 周期信号波形对称性和谐波特性2.1 f ( t ) f(t) f(t)为偶函数2.2 f ( t ) f(t) f(t)为奇函数2.3 f ( t ) f(t…