http://currentmillis.com/

``` U8G2_SSD1306_128X64_NONAME_F_SW_I2C #include <U8g2lib.h> #include <Wire.h> #include "BluetoothSerial.h" BluetoothSerial BT; U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, 22, 21, U8X8_PIN_NONE); // 引脚定义 int IN1 = 3; int IN2 = 5; #define CHINESE_FONT u8g2_font_wqy16_t_gb2312b #define HIGH_SPEED_THRESHOLD 150 // 高速阈值定义 // 系统状态变量 enum SystemState { BOOTING, STANDBY, MASSAGING }; SystemState currentState = BOOTING; unsigned long bootStartTime = 0; int currentSpeed = 0; // 当前速度值 int pinNum = 3; // 默认控制引脚 bool needUpdateDisplay = true; // 显示刷新标志 void displayCenteredText(const char* text) { u8g2.clearBuffer(); int text_width = u8g2.getUTF8Width(text); u8g2.drawUTF8((128 - text_width)/2, 32, text); u8g2.sendBuffer(); } void updateDisplayState() { if (currentSpeed == 0) { currentState = STANDBY; displayCenteredText("待机中"); } else if (currentSpeed >= HIGH_SPEED_THRESHOLD) { displayCenteredText("高速运行中"); } else { displayCenteredText("低速运行中"); } } void setup() { // 初始化硬件 pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); // 初始化蓝牙 BT.begin("ESP32-Zh"); // 初始化OLED u8g2.begin(); u8g2.setFont(CHINESE_FONT); u8g2.setFontPosCenter(); // 显示开机画面 displayCenteredText("开机"); bootStartTime = millis(); } void loop() { // 状态机处理 switch(currentState){ case BOOTING: if(millis() - bootStartTime > 2000){ currentState = STANDBY; displayCenteredText("待机中"); } break; case STANDBY: case MASSAGING: if(BT.available()){ String command = BT.readStringUntil('\n'); command.trim(); if(command.length() > 0){ char cmd = command.charAt(0); String param = command.substring(1); int value = param.toInt(); switch(cmd){ case 'p': // 设置引脚 if(value != 3 && value !=5){ BT.println("Error: 仅支持3/5引脚"); break; } pinNum = value; BT.print("选中引脚"); BT.println(pinNum); break; case 'a': // 模拟输出 analogWrite(pinNum, value); currentSpeed = value; currentState = MASSAGING; updateDisplayState(); BT.print("PWM设置:"); BT.println(value); break; case 'd': // 数字输出 digitalWrite(pinNum, value); currentSpeed = value ? 255 : 0; currentState = value ? MASSAGING : STANDBY; updateDisplayState(); BT.print("数字设置:"); BT.println(value); break; default: BT.println("未知指令"); break; } } } break; } }```请增加pwm渐变功能和实现多级速度
04-03
改变部分代码,使每次流水灯循环直接无时间差。#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秒 }
06-07
添加代码,加一个总开关。#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; // 流水灯间隔时间 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(); // 重置流水灯时间 previousMillis = millis(); } else{ unsigned long currentMillis = millis(); // 获取当前时间 // 如果达到两秒 if(currentMillis - previousMillis >= interval){ // 开始流水灯 for(int i=0; i<NUMPIXELS; i++) { int a = random(0,255); int b = random(0,255); int c = random(0,255); pixels.setPixelColor(i, pixels.Color(a, b, c)); // 蓝 pixels.show(); delay(50); pixels.setPixelColor(i, pixels.Color(0, 0, 0)); // 关 int micValue = analogRead(MIC_PIN); if(micValue > 30){ i=60; } } pixels.show(); // 重置流水灯时间 previousMillis = millis(); } else{ pixels.clear(); // 关all pixels.show(); } } delay(50); }
06-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值