基于ESP32开发板用PlatformIO编写包含音乐fft频谱显示/温湿度表/WiFi时钟功能的文件
时间: 2024-01-25 11:02:25 浏览: 316
以下是基于ESP32开发板使用PlatformIO编写包含音乐fft频谱显示/温湿度表/WiFi时钟功能的文件的示例代码:
```c++
#include <Arduino.h>
#include <WiFi.h>
#include <WiFiUdp.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <Adafruit_NeoPixel.h>
#include <FastLED.h>
#include <ESPAsyncWebServer.h>
#include <WebSocketsServer.h>
#include <WiFiManager.h>
#include <WiFi.h>
#include "esp_wifi.h"
#include "esp_wifi_types.h"
#include "esp_system.h"
#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include <Ticker.h>
#include <esp32-hal-ledc.h>
#include <driver/i2s.h>
#include <driver/adc.h>
#include "esp_adc_cal.h"
#define DHTPIN 15
#define DHTTYPE DHT22
#define LED_PIN 19
#define LED_COUNT 16
#define LED_TYPE WS2812B
#define COLOR_ORDER GRB
#define I2S_BCK 26
#define I2S_WS 25
#define I2S_SD 22
#define I2S_NUM I2S_NUM_0
#define ADC_EN 14
#define ADC_PIN 34
#define ADC_ATTENUATION ADC_ATTEN_DB_11
#define ADC_WIDTH ADC_WIDTH_BIT_12
#define FFT_N 256
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
DHT dht(DHTPIN, DHTTYPE);
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, LED_TYPE);
WebSocketsServer webSocket = WebSocketsServer(81);
AsyncWebServer server(80);
Ticker clockTicker;
Ticker ledTicker;
float temperature = 0.0;
float humidity = 0.0;
unsigned long lastMillis = 0;
unsigned long lastLedMillis = 0;
unsigned long lastClockMillis = 0;
uint16_t spectrumValues[FFT_N / 2];
void clockTick() {
lastClockMillis = millis();
}
void ledTick() {
strip.show();
FastLED.show();
}
void wifiSetup() {
WiFiManager wifiManager;
wifiManager.autoConnect("AutoConnectAP");
Serial.println("Connected to WiFi!");
}
void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) {
switch(type) {
case WStype_DISCONNECTED:
Serial.printf("[%u] Disconnected!\n", num);
break;
case WStype_CONNECTED: {
IPAddress ip = webSocket.remoteIP(num);
Serial.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload);
String message = "Connected to WebSocket server at IP address ";
message += ip.toString();
webSocket.sendTXT(num, message);
break;
}
}
}
void handleRoot(AsyncWebServerRequest *request) {
request->send(200, "text/plain", "Hello World!");
}
void handleNotFound(AsyncWebServerRequest *request) {
request->send(404, "text/plain", "Not found");
}
void i2sSetup() {
i2s_config_t i2sConfig = {
.mode = i2s_mode_t(I2S_MODE_MASTER | I2S_MODE_RX),
.sample_rate = 44100,
.bits_per_sample = i2s_bits_per_sample_t(32),
.channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
.communication_format = i2s_comm_format_t(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),
.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
.dma_buf_count = 8,
.dma_buf_len = 64
};
i2s_pin_config_t pinConfig = {
.bck_io_num = I2S_BCK,
.ws_io_num = I2S_WS,
.data_out_num = -1,
.data_in_num = I2S_SD
};
i2s_driver_install(I2S_NUM, &i2sConfig, 0, NULL);
i2s_set_pin(I2S_NUM, &pinConfig);
}
void adcSetup() {
adc1_config_width(ADC_WIDTH);
adc1_config_channel_atten(ADC1_CHANNEL_6, ADC_ATTENUATION);
}
void setup() {
Serial.begin(115200);
wifiSetup();
dht.begin();
strip.begin();
strip.setBrightness(255);
strip.show();
FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(strip.leds(), strip.numPixels());
i2sSetup();
adcSetup();
server.on("/", HTTP_GET, handleRoot);
server.onNotFound(handleNotFound);
server.begin();
webSocket.begin();
webSocket.onEvent(webSocketEvent);
clockTicker.attach(1, clockTick);
ledTicker.attach(50, ledTick);
}
void loop() {
webSocket.loop();
if (millis() - lastMillis > 1000) {
temperature = dht.readTemperature();
humidity = dht.readHumidity();
Serial.print("Temperature: ");
Serial.println(temperature);
Serial.print("Humidity: ");
Serial.println(humidity);
lastMillis = millis();
}
if (millis() - lastLedMillis > 20) {
int i = 0;
int16_t samples[FFT_N];
uint32_t adcValue = 0;
for (i = 0; i < FFT_N; i++) {
i2s_pop_sample(I2S_NUM, (char *)&adcValue, portMAX_DELAY);
samples[i] = (int16_t)(adcValue << 16 >> 16);
}
fft(samples, spectrumValues, FFT_N);
for (i = 0; i < LED_COUNT; i++) {
uint16_t value = spectrumValues[i * (FFT_N / LED_COUNT)];
int red = map(value, 0, 5000, 0, 255);
int green = map(value, 0, 5000, 0, 255);
int blue = map(value, 0, 5000, 0, 255);
strip.setPixelColor(i, strip.Color(red, green, blue));
}
lastLedMillis = millis();
}
}
```
该代码文件包含了温湿度传感器、WS2812B LED灯带、I2S音频输入和WebSocket服务器的代码。它还使用了FastLED库和ESP32库的FFT函数来计算音频频谱,并使用WiFiManager库来连接WiFi网络。此外,还包括了一个定时器用于更新时钟,并使用了AsyncWebServer库和WebSocketsServer库来创建一个服务器和一个WebSocket服务器,用于通过WebSockets发送数据。
阅读全文