《项目》 之 ESP8266 心知天气 + 时钟 + WS2812点阵屏 + B站粉丝计数

项目简介:

在2019年下半学期,突然想做一个类似手表一样的时钟,想要确保时间的实时精准性,就要接入网络,于是便想到了ESP8266这款高性价比的单片机,结合它的好伙伴——0.96寸OLED(相信不少人都是这个组合),但这些硬件资源还远远不够,于是我又在其中加入了WS2812B(8*32点阵屏)和DS3231(用来解决无网络时的时间获取问题 )。

1.你可以在设置界面设置是否开启WS2812屏的显示;

2.也可以决定时间源(网络NTP时钟DS3231时钟);

3.可以选择获取哪个城市的天气;

4.可以智能配网smartconfg

5.可以查看板子信息参数;

6.可以用来播放badapple(哔哩哔哩上的开源项目);

7.可以通过OTA远程上传固件;

8.也可为了防止OLED烧屏而自动息屏,也可以查看OLED的烧屏等级。

9.可以在设置界面决定你显示哪个桌面(哔哩哔哩 或 天气时钟

10.可以查看ESP8266所连接的WIFI信息;

11.可以改变信息更新的时间;

12.可以查看手表电量

你可以通过IIC总线加入其它传感器:血氧、光照、气压、温湿度等等,用来拓宽代码的功能,尽管Flash已经占用了很多。

项目代码地址:码云

硬件:

ESP8266:

DS3231:

0.96OLED :

8*32 WS2812点阵屏:

开发环境及所需库:

开发环境:

VS code下Platform IO插件 或 Arduino IDE

库文件:

DS3231:https://github.com/rodan/ds3231

FastLED:https://github.com/FastLED/FastLED

Time-master:https://github.com/PaulStoffregen/Time

U8g2:https://github.com/olikraus/U8g2_Arduino

ArduinoJson V5:https://github.com/bblanchon/ArduinoJson/tree/5.x

下载这些库放在你的Arduino安装目录下的libraries文件夹下面

看下效果吧:

天气时钟界面:

哔哩哔哩数据统计界面:

 设置界面:

 

 

 

 

 

 

 

 

根据提供的引用内容,可以了解到控制WS2812B需要使用PWM+DMA或SPI+DMA的方式。而ESP32芯片支持SPI+DMA的方式控制WS2812B,因此可以使用ESP32来实现控制WS2812B的功能。 下面是ESP32+DMA+SPI控制WS2812B的步骤: 1. 首先需要连接ESP32和WS2812B。将WS2812B的DI引脚连接到ESP32的任意一个SPI输出引脚(如GPIO14),将WS2812B的VCC引脚连接到ESP32的3.3V电源引脚,将WS2812B的GND引脚连接到ESP32的GND引脚。 2. 在ESP32上配置SPI控制器。可以使用ESP-IDF提供的spi_master驱动程序来配置SPI控制器。需要设置SPI控制器的时钟频率、数据位宽、传输模式等参数。 3. 准备要发送的数据。WS2812B需要接收24位的数据,每个数据位的高电平时间决定了该位的值。因此需要将要发送的数据转换为24位的二进制数据,并计算出每个数据位的高电平时间。 4. 配置DMA控制器。可以使用ESP-IDF提供的esp32_dma驱动程序来配置DMA控制器。需要设置DMA控制器的通道、传输模式、传输数据长度等参数。 5. 启动DMA传输。将要发送的数据存储在内存中,然后启动DMA传输,将数据发送到SPI控制器中。 下面是一个ESP32+DMA+SPI控制WS2812B的示例代码: ```c #include "driver/spi_master.h" #include "esp32_dma.h" #define WS2812B_NUM_LEDS 10 // WS2812B的颜色数据 typedef struct { uint8_t r; uint8_t g; uint8_t b; } ws2812b_color_t; // 将颜色数据转换为24位的二进制数据 static uint32_t ws2812b_color_to_binary(ws2812b_color_t color) { uint32_t binary = 0; for (int i = 0; i < 8; i++) { binary |= ((color.g >> (7 - i)) & 0x01) << (i * 3); binary |= ((color.r >> (7 - i)) & 0x01) << (i * 3 + 1); binary |= ((color.b >> (7 - i)) & 0x01) << (i * 3 + 2); } return binary; } // 计算每个数据位的高电平时间 static uint16_t ws2812b_calculate_high_time(uint8_t data) { if (data & 0x80) { return 56; } else { return 28; } } // 准备要发送的数据 static void ws2812b_prepare_data(ws2812b_color_t *colors, uint32_t *data) { for (int i = 0; i < WS2812B_NUM_LEDS; i++) { uint32_t binary = ws2812b_color_to_binary(colors[i]); for (int j = 0; j < 24; j++) { uint8_t bit = (binary >> (23 - j)) & 0x01; uint16_t high_time = ws2812b_calculate_high_time(bit); data[i * 24 + j] = high_time; } } } // 配置SPI控制器 static void ws2812b_configure_spi(spi_device_handle_t spi) { spi_bus_config_t bus_config = { .miso_io_num = -1, .mosi_io_num = GPIO_NUM_14, .sclk_io_num = -1, .quadwp_io_num = -1, .quadhd_io_num = -1, .max_transfer_sz = WS2812B_NUM_LEDS * 24, }; spi_device_interface_config_t dev_config = { .clock_speed_hz = 8000000, .mode = 0, .spics_io_num = -1, .queue_size = 1, }; spi_bus_initialize(HSPI_HOST, &bus_config, 1); spi_bus_add_device(HSPI_HOST, &dev_config, &spi); } // 配置DMA控制器 static void ws2812b_configure_dma(esp32_dma_chan_t *dma) { dma_config_t dma_config = { .direction = DMA_MEM_TO_PERIPH, .src_buffer = NULL, .dst_buffer = &SPI1W0_REG, .buffer_size = WS2812B_NUM_LEDS * 24 * sizeof(uint32_t), .channel = 1, .irq = 0, .transfer_size = 32, .flags = DMAF_NONE, }; esp32_dma_chan_config(dma, &dma_config); } // 启动DMA传输 static void ws2812b_start_dma(esp32_dma_chan_t *dma, uint32_t *data) { dma_config_t dma_config = esp32_dma_get_config(dma); dma_config.src_buffer = data; esp32_dma_chan_config(dma, &dma_config); esp32_dma_start(dma); } // 控制WS2812B显示颜色 void ws2812b_show_colors(ws2812b_color_t *colors) { spi_device_handle_t spi; esp32_dma_chan_t dma; uint32_t data[WS2812B_NUM_LEDS * 24]; ws2812b_prepare_data(colors, data); ws2812b_configure_spi(spi); ws2812b_configure_dma(&dma); ws2812b_start_dma(&dma, data); esp32_dma_wait_done(&dma); spi_bus_remove_device(spi); spi_bus_free(HSPI_HOST); } // 示例代码 void example() { ws2812b_color_t colors[WS2812B_NUM_LEDS] = { {255, 0, 0}, // 红色 {0, 255, 0}, // 绿色 {0, 0, 255}, // 蓝色 {255, 255, 0}, // 黄色 {255, 0, 255}, // 紫色 {0, 255, 255}, // 青色 {255, 255, 255}, // 白色 {128, 128, 128}, // 灰色 {255, 128, 0}, // 橙色 {0, 128, 255}, // 深蓝色 }; ws2812b_show_colors(colors); } ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值