【Proteus仿真】Arduino UNO +WS2812玩转霓虹灯

【Proteus仿真】Arduino UNO +WS2812玩转霓虹灯


  • Proteus仿真效果演示
    在这里插入图片描述
    在这里插入图片描述

不同显示效果修改方式

1
2
3
//例如组合:NEO\_GRB + NEO\_KHZ800;NEO\_RGB + NEO\_KHZ400;NEO\_RGBW + NEO\_KHZ400等等
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

组合方式:NEO_GRB + NEO_KHZ800NEO_RGB + NEO_KHZ400NEO_RGBW + NEO_KHZ400等等
在这里插入图片描述
在这里插入图片描述

  • 彩虹效果
    在这里插入图片描述
  • 相关代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 彩虹沿整个带状循环
void rainbow(unsigned int wait) {
for(long firstPixelHue = 0; firstPixelHue < 5\*65536; firstPixelHue += 256) {
for(int i=0; i<pixels.numPixels(); i++) {
int pixelHue = firstPixelHue + (i \* 65536L / pixels.numPixels());
pixels.setPixelColor(i, pixels.gamma32(pixels.ColorHSV(pixelHue)));
}
pixels.show(); // 更新当前带内容
delay(wait); // 暂停wait毫秒
}
}

void theaterChaseRainbow(unsigned int wait) {
int firstPixelHue = 0; // 第一个像素从红色开始(色调0)
for(int a=0; a<30; a++) { // 重复30次
for(int b=0; b<3; b++) {
pixels.clear(); // 将RAM中的所有像素设置为0(关闭)
for(int c=b; c <pixels.numPixels(); c += 3) {
int hue = firstPixelHue + c \* 65536L / pixels.numPixels();
uint32\_t color = pixels.gamma32(pixels.ColorHSV(hue));
pixels.setPixelColor(c, color);
}
pixels.show();
delay(wait);
firstPixelHue += 65536 / 90;
}
}
}

VSM Studio代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
/\* Main.ino file generated by New Project wizard
\*
\* Created: 周三 6月 8 2022
\* Processor: Arduino Uno
\* Compiler: Arduino AVR
\*/

// Peripheral Configuration Code (do not edit)
//---CONFIG\_BEGIN---
#pragma GCC push\_options
#pragma GCC optimize ("Os")


#pragma GCC pop\_options

// Peripheral Constructors

void peripheral\_setup () {
}

void peripheral\_loop() {
}
//---CONFIG\_END---

// NeoPixel test program showing use of the WHITE channel for RGBW
// pixels only (won't look correct on regular RGB NeoPixel strips).

#include <Adafruit\_NeoPixel.h>
#ifdef \_\_AVR\_\_
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif

// Which pin on the Arduino is connected to the NeoPixels?
// 输出控制引脚
#define LED\_PIN 6

// WS2812彩灯灯珠数量设置。
#define LED\_COUNT 80

// WS2812灯珠亮度设置, 0 (min) to 255 (max)仿真时尽量将其设置大一些,才亮的明显
#define BRIGHTNESS 240 // Set BRIGHTNESS to about 1/5 (max = 255)

// 灯条显示模式,这里可以自由组合,不同的组合方式,显示效果不一样
//例如组合:NEO\_GRB + NEO\_KHZ800;NEO\_RGB + NEO\_KHZ400;NEO\_RGBW + NEO\_KHZ400等等
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
// Argument 1 = Number of pixels in NeoPixel strip
// Argument 2 = Arduino pin number (most are valid)
// Argument 3 = Pixel type flags, add together as needed:
// NEO\_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
// NEO\_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
// NEO\_GRB Pixels are wired for GRB bitstream (most NeoPixel products)
// NEO\_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
// NEO\_RGBW Pixels are wired for RGBW bitstream (NeoPixel RGBW products)

void setup() {
// These lines are specifically to support the Adafruit Trinket 5V 16 MHz.
// Any other board, you can remove this part (but no harm leaving it):
#if defined(\_\_AVR\_ATtiny85\_\_) && (F\_CPU == 16000000)
clock\_prescale\_set(clock_div_1);
#endif
// END of Trinket-specific code.

strip.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
strip.show(); // Turn OFF all pixels ASAP
strip.setBrightness(BRIGHTNESS);
}

void loop() {
// Fill along the length of the strip in various colors...
colorWipe(strip.Color(255, 0, 0) , 20); // Red
colorWipe(strip.Color( 0, 255, 0) , 20); // Green
colorWipe(strip.Color( 0, 0, 255) , 20); // Blue
colorWipe(strip.Color( 0, 0, 0, 255), 20); // True white (not RGB white)

whiteOverRainbow(75, 5);

pulseWhite(5);

rainbowFade2White(3, 3, 1);
}

// Fill strip pixels one after another with a color. Strip is NOT cleared
// first; anything there will be covered pixel by pixel. Pass in color
// (as a single 'packed' 32-bit value, which you can get by calling
// strip.Color(red, green, blue) as shown in the loop() function above),
// and a delay time (in milliseconds) between pixels.
void colorWipe(uint32\_t color, int wait) {
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
strip.setPixelColor(i, color); // Set pixel's color (in RAM)
strip.show(); // Update strip to match
delay(wait); // Pause for a moment
}
}

void whiteOverRainbow(int whiteSpeed, int whiteLength) {

if(whiteLength >= strip.numPixels()) whiteLength = strip.numPixels() - 1;

int head = whiteLength - 1;
int tail = 0;
int loops = 3;
int loopNum = 0;
uint32\_t lastTime = millis();
uint32\_t firstPixelHue = 0;

for(;;) { // Repeat forever (or until a 'break' or 'return')
for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
if(((i >= tail) && (i <= head)) || // If between head & tail...
((tail > head) && ((i >= tail) || (i <= head)))) {
strip.setPixelColor(i, strip.Color(0, 0, 0, 255)); // Set white
} else { // else set rainbow
int pixelHue = firstPixelHue + (i \* 65536L / strip.numPixels());
strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
}
}

strip.show(); // Update strip with new contents
// There's no delay here, it just runs full-tilt until the timer and
// counter combination below runs out.

firstPixelHue += 40; // Advance just a little along the color wheel

if((millis() - lastTime) > whiteSpeed) { // Time to update head/tail?
if(++head >= strip.numPixels()) { // Advance head, wrap around
head = 0;
if(++loopNum >= loops) return;
}
if(++tail >= strip.numPixels()) { // Advance tail, wrap around
tail = 0;
}
lastTime = millis(); // Save time of last movement
}
}
}

void pulseWhite(uint8\_t wait) {
for(int j=0; j<256; j++) { // Ramp up from 0 to 255
// Fill entire strip with white at gamma-corrected brightness level 'j':
strip.fill(strip.Color(0, 0, 0, strip.gamma8(j)));
strip.show();
delay(wait);
}

for(int j=255; j>=0; j--) { // Ramp down from 255 to 0
strip.fill(strip.Color(0, 0, 0, strip.gamma8(j)));
strip.show();
delay(wait);
}
}

void rainbowFade2White(int wait, int rainbowLoops, int whiteLoops) {
int fadeVal=0, fadeMax=100;

// Hue of first pixel runs 'rainbowLoops' complete loops through the color
// wheel. Color wheel has a range of 65536 but it's OK if we roll over, so
// just count from 0 to rainbowLoops\*65536, using steps of 256 so we
// advance around the wheel at a decent clip.
for(uint32\_t firstPixelHue = 0; firstPixelHue < rainbowLoops\*65536;
firstPixelHue += 256) {

for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...

// Offset pixel hue by an amount to make one full revolution of the
// color wheel (range of 65536) along the length of the strip
// (strip.numPixels() steps):
uint32\_t pixelHue = firstPixelHue + (i \* 65536L / strip.numPixels());

// strip.ColorHSV() can take 1 or 3 arguments: a hue (0 to 65535) or
// optionally add saturation and value (brightness) (each 0 to 255).
// Here we're using just the three-argument variant, though the
// second value (saturation) is a constant 255.
strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue, 255,
255 \* fadeVal / fadeMax)));
}

strip.show();
delay(wait);

if(firstPixelHue < 65536) { // First loop,
if(fadeVal < fadeMax) fadeVal++; // fade in
} else if(firstPixelHue >= ((rainbowLoops-1) \* 65536)) { // Last loop,
if(fadeVal > 0) fadeVal--; // fade out
} else {
fadeVal = fadeMax; // Interim loop, make sure fade is at max
}
}

for(int k=0; k<whiteLoops; k++) {
for(int j=0; j<256; j++) { // Ramp up 0 to 255
// Fill entire strip with white at gamma-corrected brightness level 'j':
strip.fill(strip.Color(0, 0, 0, strip.gamma8(j)));
strip.show();
}
delay(1000); // Pause 1 second
for(int j=255; j>=0; j--) { // Ramp down 255 to 0
strip.fill(strip.Color(0, 0, 0, strip.gamma8(j)));
strip.show();
}
}

delay(500); // Pause 1/2 second
}

Arduino IDE编译所库

在这里插入图片描述

仿真资源和程序源码

本实验基于Proteus8.12平台。

1
2
3
链接:https://pan.baidu.com/s/1mgBwNedRbOYaCpvBo0YA3A 
提取码:zgjo


纸上得来终觉浅,绝知此事要躬行。–陆游《冬夜读书示子聿》