帮·我写一个上电恢复上次断电前的状态 触摸按键3s,关闭/打开状态 触碰按键一下,可切换档位 1档为七彩,2档为红色,3档为橙色,4档为黄色,5档为绿色,6档为蓝色。1-6,6-1循环的代码
时间: 2023-10-10 13:11:33 浏览: 19
好的,这里给你一个示例代码,实现了上电恢复上次断电前的状态,触摸按键3s可关闭或打开状态,触碰按键一下可切换档位。代码如下:
```c
#include <EEPROM.h> // 引用EEPROM库
#include <Adafruit_NeoPixel.h> // 引用Adafruit_NeoPixel库
#define PIN 6 // 定义NeoPixel灯带连接的引脚
#define NUMPIXELS 16 // 定义灯带上的LED数量
#define BUTTON_PIN 2 // 定义触碰按键连接的引脚
#define TOUCH_PIN 3 // 定义触摸按键连接的引脚
#define TOUCH_TIME 3000 // 定义触摸按键触碰时间
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
bool powerState = false; // 记录开关状态,初始为关闭
int gear = 1; // 记录档位,初始为1
void setup() {
pixels.begin(); // 初始化NeoPixel灯带
pinMode(BUTTON_PIN, INPUT_PULLUP); // 配置触碰按键引脚为输入模式,上拉电阻使其默认高电平
pinMode(TOUCH_PIN, INPUT_PULLUP); // 配置触摸按键引脚为输入模式,上拉电阻使其默认高电平
powerState = EEPROM.read(0); // 从EEPROM读取上次的开关状态
if (powerState) { // 如果上次是开启状态
turnOn(); // 打开灯带
gear = EEPROM.read(1); // 从EEPROM读取上次的档位
changeColor(); // 根据档位改变灯带颜色
}
}
void loop() {
if (digitalRead(BUTTON_PIN) == LOW) { // 检测到触碰按键被按下
delay(50); // 延时去抖动
if (digitalRead(BUTTON_PIN) == LOW) {
powerState = !powerState; // 切换开关状态
if (powerState) {
turnOn(); // 打开灯带
} else {
turnOff(); // 关闭灯带
}
EEPROM.write(0, powerState); // 将开关状态写入EEPROM
}
}
if (digitalRead(TOUCH_PIN) == LOW) { // 检测到触摸按键被按下
delay(50); // 延时去抖动
if (digitalRead(TOUCH_PIN) == LOW) {
unsigned long startTime = millis(); // 记录按键按下的时间
while (digitalRead(TOUCH_PIN) == LOW) { // 等待按键释放
if (millis() - startTime > TOUCH_TIME) { // 如果按键按下超过3秒
powerState = false; // 强制关闭开关状态
turnOff(); // 关闭灯带
EEPROM.write(0, powerState); // 将开关状态写入EEPROM
while (digitalRead(TOUCH_PIN) == LOW); // 等待按键释放
return; // 退出loop()函数,程序停止运行
}
}
gear = (gear % 6) + 1; // 切换档位,1-6循环
changeColor(); // 根据档位改变灯带颜色
EEPROM.write(1, gear); // 将档位写入EEPROM
}
}
}
// 打开灯带函数
void turnOn() {
for (int i = 0; i < NUMPIXELS; i++) {
pixels.setPixelColor(i, pixels.Color(255, 255, 255)); // 将所有LED点亮
}
pixels.show();
}
// 关闭灯带函数
void turnOff() {
for (int i = 0; i < NUMPIXELS; i++) {
pixels.setPixelColor(i, pixels.Color(0, 0, 0)); // 将所有LED关闭
}
pixels.show();
}
// 根据档位改变灯带颜色函数
void changeColor() {
int colors[][3] = {{255, 0, 0}, {255, 127, 0}, {255, 255, 0}, {0, 255, 0}, {0, 0, 255}, {75, 0, 130}}; // 定义6种颜色
for (int i = 0; i < NUMPIXELS; i++) {
pixels.setPixelColor(i, pixels.Color(colors[gear - 1][0], colors[gear - 1][1], colors[gear - 1][2])); // 根据档位设置颜色
}
pixels.show();
}
```
在这个代码中,我们使用了EEPROM库来保存上次断电前的状态。程序启动后,先从EEPROM中读取上次的开关状态和档位。如果上次是开启状态,则打开灯带并根据档位改变颜色;如果上次是关闭状态,则关闭灯带。当检测到触碰按键被按下时,切换开关状态并将其写入EEPROM。当检测到触摸按键被按下时,如果按键按下超过3秒,则强制关闭开关状态并退出程序;否则切换档位并将其写入EEPROM,并根据档位改变颜色。