中断函数
除了设置中断模式外,还需要编写一个响应中断的处理程序——中断函数,当中断被触发后,便可以让Arduino运行该中断函数。中断函数就是当中断被触发后要去执行的函数,该函数不能带有任何参数,且返回类型为空
这些准备工作完成后,还需要在setup()中使用attachInterrrupt()函数对中断引脚进行初始化配置,以开启arduino的外部中断功能,其用法如下:
(1)attachInterrupt(interrupt, function,mode)。
功能:对中断引脚进行初始化配置
参数:
interrupt,中断编号,注意,这里的中断编号并不是引脚编号
function,中断函数名,当中断被触发后即会运行此函数所代表的中断函数。
mode,中断模式
detachInterrupt(interrupt)
功能:禁用外部中断
参数:
interrrupt,需要禁用的中断编号
实验:外部中断实现LED开关
将LED灯接到5号数字输出,2号引脚注册为外部中断引脚,接一个按键开关,当按下开关时改变LED的状态
bool state = true;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
attachInterrupt(0,StateChange,FALLING);
pinMode(5,OUTPUT);
pinMode(2,INPUT_PULLUP);
}
void loop() {
// put your main code here, to run repeatedly:
if(state){
digitalWrite(5,HIGH);
}
else
digitalWrite(5,LOW);
}
void StateChange(){
state= !state;
}
利用外部中断将BUTTON按钮做为选择器
设置两个BUTTON按钮分别连接两个LED,初始时两个LED都为熄灭状态,当按下按钮1时,LED1点燃,再次按下BUTTON1时,LED1熄灭,当按下BUTTON2时,LED2点燃,LED1熄灭,同样按下BUTTON1,LED2熄灭。
bool rstate = false;
bool bstate = false;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
attachInterrupt(0,RStateChange,FALLING);
attachInterrupt(1,BStateChange,FALLING);
pinMode(5,OUTPUT);
pinMode(7,OUTPUT);
pinMode(2,INPUT_PULLUP);
pinMode(3,INPUT_PULLUP);
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(5,rstate);
digitalWrite(7,bstate);
}
void RStateChange(){
rstate = !rstate;
bstate = false;
}
void BStateChange(){
bstate = !bstate;
rstate = false;
}
WS2812灯环
WS2812是一个集控制电路与发光电路于一体的智能外空LED光源。其外形与一个5050LED灯珠相同,每个元件即为一个像素点。像素点内部包含了智能数字接口数据锁存信号整形放大电路,还包括有高精度的内部振荡器和可编程电流控制部分,有效保证了像素点的颜色高度一致。
1) FastLED库
FastLED 是一款功能强大、简单易用的控制WS2812等LED光带的Arduino第三方库。 目前FastLED是公认的Arduino开发者应用最为广泛的LED控制库之一。
电路搭建:
说明:
当你要用arduino直接驱动一大堆led或别的外部器件时,各引脚电流很容易超标。arduino官方指标只是语焉不详地提到每个引脚电流不超过40mA,Vcc和地总电流不超过200mA。
LED控制电路直流电源要求:
WS2812LED灯带上每一个灯珠都需要60mA左右的电流强度,为了确保灯带正常工作,需要配备的直流电源要能提供充足的电流强度为灯带供电。
例:一条带有30个灯珠的灯带,如果要为它配备电源则需要直流电源的输出电流强度为1.5安培 ~ 2安培左右。(即如果需要驱动数量较多的灯,可以外接电源,注意要将WS2812灯带与Arduino共地)。
示例程序:
#include "FastLED.h" // 此示例程序需要使用FastLED库
#define NUM_LEDS 12 // LED灯珠数量
#define DATA_PIN 5 // Arduino输出控制信号引脚
#define LED_TYPE WS2812 // LED灯带型号
#define COLOR_ORDER GRB // RGB灯珠中红色、绿色、蓝色LED的排列顺序
uint8_t max_bright = 128; // LED亮度控制变量,可使用数值为 0 ~ 255, 数值越大则光带亮度越高
CRGB leds[NUM_LEDS]; // 建立灯带leds
void setup() {
LEDS.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); // 初始化灯带
FastLED.setBrightness(max_bright); // 设置灯带亮度
}
void loop() {
leds[0] = CRGB::Red; // 设置灯带中第一个灯珠颜色为红色,leds[0]为第一个灯珠,leds[1]为第二个灯珠
FastLED.show(); // 更新LED色彩
delay(500); // 等待500毫秒
leds[0] = CRGB::Black; // 设置灯带中第一个灯珠熄灭
FastLED.show(); // 更新LED色彩
delay(500); // 等待500毫秒
}
示例程序每三个依次闪烁红绿蓝FastLED其他函数介绍
① fillSolid()------将LED灯带设置为同一种颜色
fill_solid(leds, 12, CRGB::Blue)
上述代码将灯带前12个灯珠颜色设置成蓝色。
fill_solid(leds+3, 5, CRGB::Green);
上述代码将从头数的12颗灯珠设置为渐变色,起始颜色为HSV(255,0,255),终端颜色为HSV(255,255,0),过渡方式为短色调过渡。
fill_gradient(leds, 0, CHSV(255, 0,255) , 11, CHSV(255,255,0), LONGEST_HUES);
上述代码过渡方式为长色调过渡。
程序拓展(1)
程序会从第一个灯依次点亮直到最后一颗灯,然后又从第一颗灯熄灭:
void loop() {
// put your main code here, to run repeatedly:
for (int i=0;i<=29;i++){
myled[i]=CRGB::Green;
FastLED.show();
delay(25);
}
for (int i=0;i<=29;i++){
myled[i]=CRGB::Black;
FastLED.show();
delay(25);
}
}
程序拓展(2)
示例程序每三个依次闪烁红绿蓝:
void loop() {
// put your main code here, to run repeatedly:
fill_solid(myled,30,CRGB::Green);
FastLED.show();
delay(100);
fill_solid(myled,30,CRGB::Black);
FastLED.show();
delay(100);
fill_solid(myled,30,CRGB::Red);
FastLED.show();
delay(100);
fill_solid(myled,30,CRGB::Black);
FastLED.show();
delay(100);
fill_solid(myled,30,CRGB::Blue);
FastLED.show();
delay(100);
fill_solid(myled,30,CRGB::Black);
FastLED.show();
delay(100);
}
拓展程序(3)—fill_solid()函数
让所有灯珠以红绿蓝顺序同步点亮闪烁
void loop() {
// put your main code here, to run repeatedly:
fill_solid(myled,30,CRGB::Green);
FastLED.show();
delay(100);
fill_solid(myled,30,CRGB::Black);
FastLED.show();
delay(100);
fill_solid(myled,30,CRGB::Red);
FastLED.show();
delay(100);
fill_solid(myled,30,CRGB::Black);
FastLED.show();
delay(100);
fill_solid(myled,30,CRGB::Blue);
FastLED.show();
delay(100);
fill_solid(myled,30,CRGB::Black);
FastLED.show();
delay(100);
}
灯带颜色的设置
(1)CRGB RGBcolorName(rVal,gVal,bVal);
(2)HSV颜色表达方法、
HSV颜色简介
HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色表达方法。该方法中的三个参数分别是:色调(H),饱和度(S),明亮度(V)。
HSV参数
色调H
HSV颜色之色调(H)
HSV颜色之色调(H)
色调参数取值范围为0~255。如上图所示,从红色开始按逆时针方向计算。红色为0,绿色为85,蓝色为170。
饱和度S
饱和度S表示颜色接近光谱色的程度。取值范围为0~255,值越大,颜色越饱和(越接近本色)。值越小,颜色越接近白色。当数值为零时,颜色为白色。
明亮度V
明亮度V表示颜色明亮的程度,取值范围为0~255。对于FastLED库来说,该数值越大,则控制光带的亮度越亮。反之数值越小,则控制光带的亮度越低。当数值为零时,光带完全熄灭。
CHSV HSVcolorName(hVal, sVal, vVal)
参数
hVal – 色调数值
sVal – 饱和度数值
vVal – 明亮度数值
CHSV颜色设置示例
CHSV myHSVcolor(0,200,200);
void loop() {
// put your main code here, to run repeatedly:
myHSVcolor.h++;
fill_solid(myled,30,myHSVcolor);
FastLED.show();
delay(10);
}
将产生从0—255的渐变色
fill_rainbow()函数
fill_rainbow(leds, 30, beginHue, deltaHue)
以上语句将leds光带的从头数30个灯珠设置为渐变彩虹色。beginHue参数为起始色调数值。deltaHue为相邻LED灯珠色调差。
fill_rainbow(leds+5, 30, 0, 1)
以上语句将leds光带的从头数30个灯珠设置为渐变彩虹色。起始色调数值为0。相邻LED灯珠色调差为1
示例
uint8_t beginHue;
void loop() {
// put your main code here, to run repeatedly:
beginHue++;
fill_rainbow(myled,30,beginHue,9);
FastLED.show();
delay(25);
}
fill_gradient()函数
fill_gradient_RGB(leds, 0, CRGB::Red, 29, CRGB::Blue)
以上语句将leds光带的从头数30个灯珠设置为渐变色。灯带头部起始颜色为红色。灯带尾部结束颜色为蓝色。灯带中间为由红色到蓝色的渐变色。
fill_gradient(leds, 0, CHSV(50, 255,255) , 29, CHSV(150,255,255), SHORTEST_HUES)
以上语句将leds光带的从头数30个灯珠设置为渐变色。灯带头部起始颜色为HSV(50, 255,255)色彩。灯带尾部结束颜色为CHSV(150,255,255)色彩。灯带颜色过度采用短色调过渡方式。
fill_gradient(leds, 0, CHSV(50, 255,255) , 29, CHSV(150,255,255), LONGEST_HUES)
以上语句将leds光带的从头数30个灯珠设置为渐变色。灯带头部起始颜色为HSV(50, 255,255)色彩。灯带尾部结束颜色为CHSV(150,255,255)色彩。灯带颜色过度采用长色调过渡方式。
示例
void loop() {
// put your main code here, to run repeatedly:
fill_gradient(myled,0,CHSV(15,200,200),29,CHSV(100,200,200),LONGEST_HUES);
FastLED.show();
delay(25);
}
palette色板
(1)FastLED库函数fill_palette()函数
fill_palette (leds, 30, 0, 8, OceanColors_p, 255, LINEARBLEND )
以上语句将leds光带的从头数30个灯珠设置为渐变色。渐变色的色彩全部来自FastLED预设色板OceanColors_p。灯带头部第一个灯珠的色板色彩序号为0,相邻的两个灯珠见色板色彩序列号差8。色彩过渡为线性过渡效果。
fill_palette(leds+5, 15, 31, 5, ForestColors_p, 255, LINEARBLEND );
以上语句将leds光带从头数的第6个灯带开始15个灯珠设置为渐变色。渐变色的色彩全部来自FastLED预设色板ForestColors_p。起始色板色彩序号为31,相邻的两个灯珠见色板色彩序列号差5。色彩过渡为线性过渡效果。
系统预设色板列表
FastLED库配有8种预设色板。:
CloudColors_p
LavaColors_p
OceanColors_p
ForestColors_p
RainbowColors_p
RainbowStripeColors_p
PartyColors_p
HeatColors_p
示例
uint8_t startIndex;
void loop() {
// put your main code here, to run repeatedly:
startIndex++;
fill_palette(myled,NUM_LEDS,startIndex,8,ForestColors_p,255,LINEARBLEND);
FastLED.show();
delay(25);
}
产生一个流动灯效果
自定义色板
用户自定义色板
用户自定义RGB色板
CRGBPalette16 myColorPalette = CRGBPalette16(
CRGB::Green, CRGB::Green, CRGB::Black, CRGB::Black,
CRGB::Purple, CRGB::Purple, CRGB::Black, CRGB::Black,
CRGB::Green, CRGB::Green, CRGB::Black, CRGB::Black,
CRGB::Purple, CRGB::Purple, CRGB::Black, CRGB::Black );
用户自定义HSV色板
CHSVPalette16 myColorPalette = CHSVPalette16 myHSVColorPalette = CHSVPalette16 (
CHSV(0, 255, 200), CHSV(15, 255, 200), CHSV(31, 255, 200), CHSV(47, 255, 200),
CHSV(0, 255, 0), CHSV(15, 255, 0), CHSV(31, 255, 0), CHSV(47, 255, 0),
CHSV(0, 255, 200), CHSV(15, 255, 200), CHSV(31, 255, 200), CHSV(47, 255, 200),
CHSV(0, 0, 200), CHSV(15, 0, 200), CHSV(31, 0, 200), CHSV(47, 0, 200));
用户自定义PROGMEM色板
const TProgmemPalette16 myProgmemPalette PROGMEM = {
CRGB::Red, CRGB::Gray, CRGB::Blue, CRGB::Black,
CRGB::Red, CRGB::Gray, CRGB::Blue, CRGB::Black,
CRGB::Red, CRGB::Red, CRGB::Gray, CRGB::Gray,
CRGB::Blue, CRGB::Blue, CRGB::Black, CRGB::Black };
ColorFromPalette()函数
leds[0] = ColorFromPalette( RainbowColors_p, 0, 128, LINEARBLEND);
以上语句将leds光带的第一个灯珠设置为RainbowColors_p色板中颜色序号为0的颜色(红色)。LED亮度为128。色彩过渡为线性过渡效果(LINEARBLEND)。
leds[9] = ColorFromPalette( OceanColors_p, 120, 255, LINEARBLEND);
以上语句将leds光带的第十个灯珠设置为OceanColors_p色板中颜色序号为120的颜色。LED亮度为255。色彩过渡为线性过渡效果(LINEARBLEND)。
fadeToBlacBy()函数
fadeToBlackBy( leds, 30, 10);
以上语句将leds光带的30个灯珠亮度调低10。(注:LED亮度值可选数值范围为0 – 255)
FastLED.setBrightness()函数
FastLED.setBrightness(128);
以上语句将LED亮度设置为128。该亮度为最大亮度(255)的一半左右
random8()函数
random8函数将返回0-255之间的随机数值。返回值最大值可以设置为自定义的0-255间数值
random8()
以上语句将返回0-255之间的随机数值。
random8(10)
以上语句将返回0-9之间的随机数值。
beatsin8()函数
beatsin8可以视作一个信号发生器。它的返回值会沿着正弦曲线返回数值。
参数
beats_per_minute: 每分钟产生循环次数
lowest: 最小值
lowest: 最大值
示例语句
以下图示为 beatsin8(10, 0, 255) 返回值示意图。↓
这一示例语句中第一个参数为10。这说明此函数所产生的正弦曲线周期时间为6秒(1分钟有60秒,60除以参数10等于6秒钟)。第二个参数为0。这说明此函数所产生的正弦曲线最小返回值为0(如图中绿色数字所示)。第三个参数为255。这说明此函数所产生的正弦曲线最大返回值为255(如图中红色数字所示)。
以下图示为 beatsin8(20, 90, 100) 返回值示意图。↓
这一示例语句修改了上面的示例语句的第一个参数。因此示意图中正弦曲线周期时间由6秒变为3秒(如图中绿色蓝字所示)。
EVERY_N_SECONDS()函数
EVERY_N_SECONDS函数所包含的程序内容将定时执行。执行时间间隔由函数参数决定。
用法
EVERY_N_SECONDS(10)
以上函数所包含的程序内容将定时执行,执行时间间隔为10秒钟。
EVERY_N_SECONDS(1)
以上函数所包含的程序内容将定时执行,执行时间间隔为1秒钟。
自定义addGlitter()函数
void loop(){
fill_gradient(myled,0,CHSV(50,255,255),29,CHSV(150,255,255),LONGEST_HUES);
addGlitter(60);
FastLED.show();
delay(50);
}
void addGlitter(uint8_t chanceOfGlitter){
if (random8()<chanceOfGlitter){
myled[random8(NUM_LEDS)]=CRGB::White;
}
}
/*
– addGlitter 函数说明(WWW.TAICHI-MAKER.COM) –
random8()的返回值是0-255之间的随机整数。当random8()返回值小于
用户传递到addGlitter函数中的chanceOfGlitter参数时,Arduino将在任意
leds灯带上的任意序号灯珠(leds[ random8(NUM_LEDS) ] )上
显示白色( CRGB::White)。否则addGlitter函数将不进行任何操作而返回。
基于以上原因,如果用户传递到addGlitter函数中的chanceOfGlitter参数越大,
则产生随机点亮闪烁效果的机会也就越大。
通过以上操作,灯带将产生随机点亮LED为白色的效果,犹如星光闪烁。
*/