改变部分代码,使每次流水灯循环直接无时间差。#include <Adafruit_NeoPixel.h> #define PIN 6 // 灯带数据-Arduino引脚 #define NUMPIXELS 60 // 灯珠数量 #define MIC_PIN A0 // 声音传感器-Arduino引脚 Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); unsigned long previousMillis = 0; // 上一次流水灯时间 int interval = 2000; // 流水灯间隔时间 bool isFlowing = false; // 是否正在流水灯 void setup() { pixels.begin(); // 初始化 灯带 Serial.begin(9600); // 串口9600 } void loop() { int micValue = analogRead(MIC_PIN); // 读 声音传感器值 if (micValue > 30) { // 判断声音传感器的值是否大于30 int brightness = map(micValue, 0, 1023, 0, 255); // 将数值映射到0-255范围内 int a = random(0, 255); int b = random(0, 255); for (int i = 0; i < NUMPIXELS; i++) { pixels.setPixelColor(i, pixels.ColorHSV(a, b, brightness)); // 灯珠亮度 } pixels.show(); // 显示 isFlowing = false; // 停止流水灯 } else { if (!isFlowing) { // 如果之前没有流水灯,则设置上一次流水灯时间 previousMillis = millis(); isFlowing = true; } unsigned long currentMillis = millis(); // 获取当前时间 // 判断是否到达流水灯时间间隔 if (currentMillis - previousMillis >= interval) { // 流水灯效果 for (int i = 0; i < NUMPIXELS; i++) { pixels.setPixelColor(i, pixels.Color(0, 0, 255)); // 蓝色 pixels.show(); // 显示 delay(50); // 每个灯珠之间的间隔 pixels.setPixelColor(i, pixels.Color(0, 0, 0)); // 关闭 } pixels.show(); // 显示 isFlowing = false; // 停止流水灯 } else { pixels.clear(); // 关闭所有灯珠 pixels.show(); // 显示 } } delay(50); // 0.05秒 }
时间: 2024-03-09 09:44:20 浏览: 25
可以尝试将流水灯效果中的 delay(50) 改为一个更小的值,比如 delay(10),这样每个灯珠之间的间隔就会更短,流水灯效果就可以直接无时间差循环了。代码如下:
```
if (currentMillis - previousMillis >= interval) {
// 流水灯效果
for (int i = 0; i < NUMPIXELS; i++) {
pixels.setPixelColor(i, pixels.Color(0, 0, 255)); // 蓝色
pixels.show(); // 显示
delay(10); // 每个灯珠之间的间隔
pixels.setPixelColor(i, pixels.Color(0, 0, 0)); // 关闭
}
pixels.show(); // 显示
isFlowing = false; // 停止流水灯
}
```
相关问题
#include <Adafruit_GFX.h> //OLED库 #include <Adafruit_SSD1306.h> //
#include <Adafruit_GFX.h>和#include <Adafruit_SSD1306.h>是两个Arduino库文件,用于控制OLED屏幕的显示。其中,Adafruit_GFX库是一个通用的图形库,提供了一系列基础的绘图函数,比如画线、画矩形、画圆等;而Adafruit_SSD1306库则是基于Adafruit_GFX库开发的,专门用于控制SSD1306型号的OLED屏幕。这两个库文件可以在Arduino开发环境中直接安装使用,使得开发者可以方便地在自己的项目中使用OLED屏幕进行信息显示。
#include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h>中有没有清除指定位置的方法
`#include <Adafruit_GFX.h>` 和 `#include <Adafruit_SSD1306.h>` 是 Arduino 平台上用于驱动 128x64 或者其他尺寸 SSD1306 型 OLED 显示屏的库。Adafruit_GFX.h 提供了一套通用的图形绘制 API,而 Adafruit_SSD1306.h 则是针对 SSD1306 特性的具体封装。
在 SSD1306 类中,通常会提供一个方法来清除屏幕或指定区域。对于 SSD1306,你可以使用 `clearDisplay()` 或 `fillScreen()` 方法来清除整个屏幕,这些方法会将屏幕所有像素设置为默认的背景颜色(通常是黑色)。
如果你想清除屏幕的一部分,比如指定位置,SSD1306 类通常没有直接提供这个功能,因为 OLED 屏幕的显示是块状的,不像 LCD 那样可以逐行或逐列操作。但是,你可以通过先写入全屏幕的白色,然后仅覆盖你想要清除的区域,达到类似的效果。这可以通过循环遍历像素并检查是否需要重置来实现,但这并非库提供的标准方法。
如果你需要精确地清除某一行或一列,可能需要自己编写一些辅助函数,通过遍历像素数组来完成。但请注意,这需要对硬件底层的工作原理有深入了解。