diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2f4af26..1144f0d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -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) diff --git a/src/abfall.cpp b/src/abfall.cpp index 606e78f..e861930 100644 --- a/src/abfall.cpp +++ b/src/abfall.cpp @@ -3,7 +3,9 @@ #include +#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); } diff --git a/src/ws2812.cpp b/src/ws2812.cpp new file mode 100644 index 0000000..bb3b836 --- /dev/null +++ b/src/ws2812.cpp @@ -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(color)); +} + +void WS2812::putPixel(uint32_t pixel_grb) { pio_sm_put_blocking(m_pio, m_sm, pixel_grb << 8u); } \ No newline at end of file diff --git a/src/ws2812.h b/src/ws2812.h new file mode 100644 index 0000000..8bfe79a --- /dev/null +++ b/src/ws2812.h @@ -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); +// } \ No newline at end of file