37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百九十九:WS2812B全彩RGB像素屏 8x32点阵LED显示屏 可编程硬屏模块
知识点:WS2812B主要特点
智能反接保护,电源反接不会损坏IC。
IC控制电路与LED点光源公用一个电源。
控制电路与RGB芯片集成在一个5050封装的元器件中,构成一个完整的外控像素点。
内置信号整形电路,任何一个像素点收到信号后经过波形整形再输出,保证线路波形畸变不会累加。
内置上电复位和掉电复位电路。
每个像素点的三基色颜色可实现256级亮度显示,完成16777216种颜色的全真色彩显示,扫描频率不低于400Hz/s。
串行级联接口,能通过一根信号线完成数据的接收与解码。
任意两点传传输距离在不超过5米时无需增加任何电路。
当刷新速率30帧/秒时,级联数不小于1024点。
数据发送速度可达800Kbps。
光的颜色高度一致,性价比高。
主要应用领域
LED全彩发光字灯串,LED全彩模组, LED全彩软灯条硬灯条,LED护栏管。
LED点光源,LED像素屏,LED异形屏,各种电子产品,电器设备跑马灯。
WS2812B灯屏电原理参考图
实验涉及到的几个WS2812B相关库
安装FastLED库,工具—管理库—搜索FastLED—安装
安装NeoPixel库,工具—管理库—搜索NeoPixel—安装
安装Adafruit_NeoPixel库,
下载https://github.com/adafruit/Adafruit_NeoPixel
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十四:WS2812B全彩RGB像素屏 8x32点阵LED显示屏 硬屏模块
项目程序十四:将噪声数据转换为 LED 阵列中的动态颜色
Arduino实验开源代码
/*【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)实验二百一十四:WS2812B全彩RGB像素屏 8x32点阵LED显示屏 硬屏模块项目程序十四:将噪声数据转换为 LED 阵列中的动态颜色
*/#include <FastLED.h>#define LED_PIN 6
#define BRIGHTNESS 26
#define LED_TYPE WS2811
#define COLOR_ORDER GRB// Params for width and height
const uint8_t kMatrixWidth = 8;
const uint8_t kMatrixHeight = 32;// Param for different pixel layouts
const bool kMatrixSerpentineLayout = true;// This example combines two features of FastLED to produce a remarkable range of
// effects from a relatively small amount of code. This example combines FastLED's
// color palette lookup functions with FastLED's Perlin noise generator, and
// the combination is extremely powerful.
//
// You might want to look at the "ColorPalette" and "Noise" examples separately
// if this example code seems daunting.
//
//
// The basic setup here is that for each frame, we generate a new array of
// 'noise' data, and then map it onto the LED matrix through a color palette.
//
// Periodically, the color palette is changed, and new noise-generation parameters
// are chosen at the same time. In this example, specific noise-generation
// values have been selected to match the given color palettes; some are faster,
// or slower, or larger, or smaller than others, but there's no reason these
// parameters can't be freely mixed-and-matched.
//
// In addition, this example includes some fast automatic 'data smoothing' at
// lower noise speeds to help produce smoother animations in those cases.
//
// The FastLED built-in color palettes (Forest, Clouds, Lava, Ocean, Party) are
// used, as well as some 'hand-defined' ones, and some proceedurally generated
// palettes.#define NUM_LEDS (kMatrixWidth * kMatrixHeight)
#define MAX_DIMENSION ((kMatrixWidth>kMatrixHeight) ? kMatrixWidth : kMatrixHeight)// The leds
CRGB leds[kMatrixWidth * kMatrixHeight];// The 16 bit version of our coordinates
static uint16_t x;
static uint16_t y;
static uint16_t z;// We're using the x/y dimensions to map to the x/y pixels on the matrix. We'll
// use the z-axis for "time". speed determines how fast time moves forward. Try
// 1 for a very slow moving effect, or 60 for something that ends up looking like
// water.
uint16_t speed = 20; // speed is set dynamically once we've started up// Scale determines how far apart the pixels in our noise matrix are. Try
// changing these values around to see how it affects the motion of the display. The
// higher the value of scale, the more "zoomed out" the noise iwll be. A value
// of 1 will be so zoomed in, you'll mostly see solid colors.
uint16_t scale = 30; // scale is set dynamically once we've started up// This is the array that we keep our computed noise values in
uint8_t noise[MAX_DIMENSION][MAX_DIMENSION];CRGBPalette16 currentPalette( PartyColors_p );
uint8_t colorLoop = 1;void setup() {delay(3000);FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);FastLED.setBrightness(BRIGHTNESS);// Initialize our coordinates to some random valuesx = random16();y = random16();z = random16();
}// Fill the x/y array of 8-bit noise values using the inoise8 function.
void fillnoise8() {// If we're runing at a low "speed", some 8-bit artifacts become visible// from frame-to-frame. In order to reduce this, we can do some fast data-smoothing.// The amount of data smoothing we're doing depends on "speed".uint8_t dataSmoothing = 0;if ( speed < 50) {dataSmoothing = 200 - (speed * 4);}for (int i = 0; i < MAX_DIMENSION; i++) {int ioffset = scale * i;for (int j = 0; j < MAX_DIMENSION; j++) {int joffset = scale * j;uint8_t data = inoise8(x + ioffset, y + joffset, z);// The range of the inoise8 function is roughly 16-238.// These two operations expand those values out to roughly 0..255// You can comment them out if you want the raw noise data.data = qsub8(data, 16);data = qadd8(data, scale8(data, 39));if ( dataSmoothing ) {uint8_t olddata = noise[i][j];uint8_t newdata = scale8( olddata, dataSmoothing) + scale8( data, 256 - dataSmoothing);data = newdata;}noise[i][j] = data;}}z += speed;// apply slow drift to X and Y, just for visual variation.x += speed / 8;y -= speed / 16;
}void mapNoiseToLEDsUsingPalette()
{static uint8_t ihue = 0;for (int i = 0; i < kMatrixWidth; i++) {for (int j = 0; j < kMatrixHeight; j++) {// We use the value at the (i,j) coordinate in the noise// array for our brightness, and the flipped value from (j,i)// for our pixel's index into the color palette.uint8_t index = noise[j][i];uint8_t bri = noise[i][j];// if this palette is a 'loop', add a slowly-changing base valueif ( colorLoop) {index += ihue;}// brighten up, as the color palette itself often contains the// light/dark dynamic range desiredif ( bri > 127 ) {bri = 255;} else {bri = dim8_raw( bri * 2);}CRGB color = ColorFromPalette( currentPalette, index, bri);leds[XY(i, j)] = color;}}ihue += 1;
}void loop() {// Periodically choose a new palette, speed, and scaleChangePaletteAndSettingsPeriodically();// generate noise datafillnoise8();// convert the noise data to colors in the LED array// using the current palettemapNoiseToLEDsUsingPalette();FastLED.show();// delay(10);
}// There are several different palettes of colors demonstrated here.
//
// FastLED provides several 'preset' palettes: RainbowColors_p, RainbowStripeColors_p,
// OceanColors_p, CloudColors_p, LavaColors_p, ForestColors_p, and PartyColors_p.
//
// Additionally, you can manually define your own color palettes, or you can write
// code that creates color palettes on the fly.// 1 = 5 sec per palette
// 2 = 10 sec per palette
// etc
#define HOLD_PALETTES_X_TIMES_AS_LONG 1void ChangePaletteAndSettingsPeriodically()
{uint8_t secondHand = ((millis() / 1000) / HOLD_PALETTES_X_TIMES_AS_LONG) % 60;static uint8_t lastSecond = 99;if ( lastSecond != secondHand) {lastSecond = secondHand;if ( secondHand == 0) {currentPalette = RainbowColors_p;speed = 20;scale = 30;colorLoop = 1;}if ( secondHand == 5) {SetupPurpleAndGreenPalette();speed = 10;scale = 50;colorLoop = 1;}if ( secondHand == 10) {SetupBlackAndWhiteStripedPalette();speed = 20;scale = 30;colorLoop = 1;}if ( secondHand == 15) {currentPalette = ForestColors_p;speed = 8;scale = 120;colorLoop = 0;}if ( secondHand == 20) {currentPalette = CloudColors_p;speed = 4;scale = 30;colorLoop = 0;}if ( secondHand == 25) {currentPalette = LavaColors_p;speed = 8;scale = 50;colorLoop = 0;}if ( secondHand == 30) {currentPalette = OceanColors_p;speed = 20;scale = 90;colorLoop = 0;}if ( secondHand == 35) {currentPalette = PartyColors_p;speed = 20;scale = 30;colorLoop = 1;}if ( secondHand == 40) {SetupRandomPalette();speed = 20;scale = 20;colorLoop = 1;}if ( secondHand == 45) {SetupRandomPalette();speed = 50;scale = 50;colorLoop = 1;}if ( secondHand == 50) {SetupRandomPalette();speed = 90;scale = 90;colorLoop = 1;}if ( secondHand == 55) {currentPalette = RainbowStripeColors_p;speed = 30;scale = 20;colorLoop = 1;}}
}// This function generates a random palette that's a gradient
// between four different colors. The first is a dim hue, the second is
// a bright hue, the third is a bright pastel, and the last is
// another bright hue. This gives some visual bright/dark variation
// which is more interesting than just a gradient of different hues.
void SetupRandomPalette()
{currentPalette = CRGBPalette16(CHSV( random8(), 255, 32),CHSV( random8(), 255, 255),CHSV( random8(), 128, 255),CHSV( random8(), 255, 255));
}// This function sets up a palette of black and white stripes,
// using code. Since the palette is effectively an array of
// sixteen CRGB colors, the various fill_* functions can be used
// to set them up.
void SetupBlackAndWhiteStripedPalette()
{// 'black out' all 16 palette entries...fill_solid( currentPalette, 16, CRGB::Black);// and set every fourth one to white.currentPalette[0] = CRGB::White;currentPalette[4] = CRGB::White;currentPalette[8] = CRGB::White;currentPalette[12] = CRGB::White;}// This function sets up a palette of purple and green stripes.
void SetupPurpleAndGreenPalette()
{CRGB purple = CHSV( HUE_PURPLE, 255, 255);CRGB green = CHSV( HUE_GREEN, 255, 255);CRGB black = CRGB::Black;currentPalette = CRGBPalette16(green, green, black, black,purple, purple, black, black,green, green, black, black,purple, purple, black, black );
}//
// Mark's xy coordinate mapping code. See the XYMatrix for more information on it.
//
uint16_t XY( uint8_t x, uint8_t y)
{uint16_t i;if ( kMatrixSerpentineLayout == false) {i = (y * kMatrixWidth) + x;}if ( kMatrixSerpentineLayout == true) {if ( y & 0x01) {// Odd rows run backwardsuint8_t reverseX = (kMatrixWidth - 1) - x;i = (y * kMatrixWidth) + reverseX;} else {// Even rows run forwardsi = (y * kMatrixWidth) + x;}}return i;
}
Arduino实验场景图
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十四:WS2812B全彩RGB像素屏 8x32点阵LED显示屏 硬屏模块
项目程序十五:随机追逐的彗星效果
Arduino实验开源代码
/*【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)实验二百一十四:WS2812B全彩RGB像素屏 8x32点阵LED显示屏 硬屏模块项目程序十五:随机追逐的彗星效果
*/#include <WS2812FX.h>#define LED_COUNT 256
#define LED_PIN 6WS2812FX ws2812fx = WS2812FX(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);void setup() {Serial.begin(115200);ws2812fx.init();ws2812fx.setBrightness(25);// segment 0 is the builtin comet effectws2812fx.setSegment(0, 0, LED_COUNT / 2 - 1, FX_MODE_COMET, RED, 1000, false);// segment 1 is our custom effectws2812fx.setCustomMode(myCustomEffect);ws2812fx.setSegment(1, LED_COUNT / 2, LED_COUNT - 1, FX_MODE_CUSTOM, RED, 50, false);ws2812fx.start();
}void loop() {ws2812fx.service();
}uint16_t myCustomEffect(void) { // random chaseWS2812FX::Segment* seg = ws2812fx.getSegment(); // get the current segmentfor (uint16_t i = seg->stop; i > seg->start; i--) {ws2812fx.setPixelColor(i, ws2812fx.getPixelColor(i - 1));}uint32_t color = ws2812fx.getPixelColor(seg->start + 1);int r = random(6) != 0 ? (color >> 16 & 0xFF) : random(256);int g = random(6) != 0 ? (color >> 8 & 0xFF) : random(256);int b = random(6) != 0 ? (color & 0xFF) : random(256);ws2812fx.setPixelColor(seg->start, r, g, b);return seg->speed; // return the delay until the next animation step (in msec)
}
Arduino实验场景图
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十四:WS2812B全彩RGB像素屏 8x32点阵LED显示屏 硬屏模块
项目程序十六:WS2812FX库最简单的程序形式
Arduino实验开源代码
/*【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)实验二百一十四:WS2812B全彩RGB像素屏 8x32点阵LED显示屏 硬屏模块项目程序十六:WS2812FX库最简单的程序形式
*/#include <WS2812FX.h> //导入库
#define LED_COUNT 256 //WS2812B LED数量
#define LED_PIN 6 //WS2812B LED接脚WS2812FX ws2812fx = WS2812FX(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);void setup() {ws2812fx.init(); //初始化ws2812fx.setBrightness(255); //设置亮度(0-255),可以控制总电流(重要!)ws2812fx.setSpeed(200); // 设置速度ws2812fx.setMode(FX_MODE_FIREWORKS_RANDOM);// 设置模式(内置63种模式)ws2812fx.start(); //启动
}void loop() {ws2812fx.service(); //循环运行
}
Arduino实验场景图