Working WS2812 led.
This commit is contained in:
parent
3f0c09c0a9
commit
d98c72cb9f
4 changed files with 59 additions and 3 deletions
|
@ -1,6 +1,7 @@
|
|||
#set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||
|
||||
set(SOURCES
|
||||
ws2812.cpp
|
||||
abfall.cpp
|
||||
)
|
||||
|
||||
|
@ -30,6 +31,8 @@ set_target_properties(${CMAKE_PROJECT_NAME}
|
|||
CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}"
|
||||
)
|
||||
|
||||
pico_generate_pio_header(${CMAKE_PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR}/ws2812.pio)
|
||||
|
||||
pico_enable_stdio_uart(${CMAKE_PROJECT_NAME} 1)
|
||||
pico_enable_stdio_usb(${CMAKE_PROJECT_NAME} 0)
|
||||
|
||||
|
|
|
@ -3,7 +3,9 @@
|
|||
|
||||
#include <string>
|
||||
|
||||
#include "hardware/pio.h"
|
||||
#include "hardware/rtc.h"
|
||||
|
||||
#include "pico/cyw43_arch.h"
|
||||
#include "pico/stdlib.h"
|
||||
#include "pico/util/datetime.h"
|
||||
|
@ -11,8 +13,12 @@
|
|||
#include "lwip/apps/http_client.h"
|
||||
#include "lwip/apps/sntp.h"
|
||||
|
||||
#include "ws2812.h"
|
||||
|
||||
using std::string;
|
||||
|
||||
#define WS2812_PIN 22
|
||||
|
||||
int wifi_setup(uint32_t country, const string &ssid, const string &pw, bool firstTry = true) {
|
||||
if (firstTry) {
|
||||
if (cyw43_arch_init_with_country(country)) {
|
||||
|
@ -40,7 +46,7 @@ int wifi_setup(uint32_t country, const string &ssid, const string &pw, bool firs
|
|||
continue;
|
||||
}
|
||||
flashrate = flashrate / (status + 1);
|
||||
//printf("Connect status: %d %d\n", status, flashrate);
|
||||
// printf("Connect status: %d %d\n", status, flashrate);
|
||||
}
|
||||
cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, 1);
|
||||
sleep_ms(flashrate);
|
||||
|
@ -82,7 +88,7 @@ err_t headers_callback(httpc_state_t *connection, void *arg, struct pbuf *hdr, u
|
|||
}
|
||||
|
||||
err_t body_callback(void *arg, struct altcp_pcb *conn, struct pbuf *p, err_t err) {
|
||||
//printf("Body\n");
|
||||
// printf("Body\n");
|
||||
pbuf_copy_partial(p, myBuffer, p->tot_len, 0);
|
||||
// printf("%s", myBuffer);
|
||||
|
||||
|
@ -116,6 +122,8 @@ int main() {
|
|||
stdio_init_all();
|
||||
rtc_init();
|
||||
|
||||
WS2812 led(WS2812_PIN);
|
||||
|
||||
bool firstTry = true;
|
||||
int res = -1;
|
||||
do {
|
||||
|
@ -154,7 +162,8 @@ int main() {
|
|||
while (true) {
|
||||
rtc_get_datetime(&dt);
|
||||
datetime_to_str(datetime_str, sizeof(datetime_buf), &dt);
|
||||
//printf("DateTime: %s\n", datetime_str);
|
||||
// printf("DateTime: %s\n", datetime_str);
|
||||
led.switchColor(Color::RED);
|
||||
sleep_ms(5000);
|
||||
}
|
||||
|
||||
|
|
13
src/ws2812.cpp
Normal file
13
src/ws2812.cpp
Normal file
|
@ -0,0 +1,13 @@
|
|||
#include "ws2812.h"
|
||||
|
||||
WS2812::WS2812(uint gpio, PIO pio, uint sm) : m_pio{pio}, m_sm{sm} {
|
||||
uint offset = pio_add_program(m_pio, &ws2812_program);
|
||||
ws2812_program_init(m_pio, m_sm, offset, gpio, 800000, true);
|
||||
switchColor(Color::OFF);
|
||||
}
|
||||
|
||||
void WS2812::switchColor(Color color) {
|
||||
putPixel(static_cast<uint32_t>(color));
|
||||
}
|
||||
|
||||
void WS2812::putPixel(uint32_t pixel_grb) { pio_sm_put_blocking(m_pio, m_sm, pixel_grb << 8u); }
|
31
src/ws2812.h
Normal file
31
src/ws2812.h
Normal file
|
@ -0,0 +1,31 @@
|
|||
#pragma once
|
||||
|
||||
#include "pico/stdlib.h"
|
||||
|
||||
#include "ws2812.pio.h"
|
||||
|
||||
enum class Color : uint32_t {
|
||||
RED = 0xff0000,
|
||||
GREEN = 0x00ff00,
|
||||
BLUE = 0x0000ff,
|
||||
WHITE = 0xffffff,
|
||||
OFF = 0x000000,
|
||||
YELLOW = 0xffff00
|
||||
};
|
||||
|
||||
class WS2812 {
|
||||
public:
|
||||
WS2812(uint gpio, PIO pio = pio0, uint sm = 0);
|
||||
void switchColor(Color color);
|
||||
|
||||
private:
|
||||
void putPixel(uint32_t pixel_rgb);
|
||||
PIO m_pio;
|
||||
uint m_sm;
|
||||
};
|
||||
|
||||
static inline void put_pixel(uint32_t pixel_grb) { pio_sm_put_blocking(pio0, 0, pixel_grb << 8u); }
|
||||
|
||||
// static inline uint32_t urgb_u32(uint8_t r, uint8_t g, uint8_t b) {
|
||||
// return ((uint32_t)(r) << 8) | ((uint32_t)(g) << 16) | (uint32_t)(b);
|
||||
// }
|
Loading…
Reference in a new issue