Arduino学习篇(二)

中断函数


除了设置中断模式外,还需要编写一个响应中断的处理程序——中断函数,当中断被触发后,便可以让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为白色的效果,犹如星光闪烁。
*/
 

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值