This commit is contained in:
2026-05-07 12:13:53 +02:00
parent f141da2b05
commit 879906abc7
38 changed files with 2445 additions and 2 deletions

4
.gitignore vendored
View File

@@ -2,6 +2,10 @@
# Prerequisites
*.d
.pio
.DS_Store
# Compiled Object files
*.slo
*.lo

519
.vscode/c_cpp_properties.json vendored Normal file
View File

@@ -0,0 +1,519 @@
//
// !!! WARNING !!! AUTO-GENERATED FILE!
// PLEASE DO NOT MODIFY IT AND USE "platformio.ini":
// https://docs.platformio.org/page/projectconf/section_env_build.html#build-flags
//
{
"configurations": [
{
"name": "PlatformIO",
"includePath": [
"/Users/lklich/Programowanie/robotic_hand/include",
"/Users/lklich/Programowanie/robotic_hand/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/Ticker/src",
"/Users/lklich/Programowanie/robotic_hand/.pio/libdeps/esp32-c3-devkitm-1/ESP32Servo/src",
"/Users/lklich/Programowanie/robotic_hand/.pio/libdeps/esp32-c3-devkitm-1/Adafruit PWM Servo Driver Library",
"/Users/lklich/Programowanie/robotic_hand/.pio/libdeps/esp32-c3-devkitm-1/Adafruit BusIO",
"/Users/lklich/Programowanie/robotic_hand/.pio/libdeps/esp32-c3-devkitm-1/ServoEasing/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/Wire/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/SPI/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/newlib/platform_include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freertos/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freertos/include/esp_additions/freertos",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freertos/port/riscv/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freertos/include/esp_additions",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hw_support/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hw_support/include/soc",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hw_support/include/soc/esp32c3",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hw_support/port/esp32c3",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hw_support/port/esp32c3/private_include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/heap/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/log/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/lwip/include/apps",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/lwip/include/apps/sntp",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/lwip/lwip/src/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/lwip/port/esp32/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/lwip/port/esp32/include/arch",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/soc/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/soc/esp32c3",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/soc/esp32c3/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/hal/esp32c3/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/hal/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/hal/platform_port/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_rom/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_rom/include/esp32c3",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_rom/esp32c3",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_common/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_system/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_system/port/soc",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_system/port/include/riscv",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_system/port/public_compat",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/riscv/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/driver/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/driver/esp32c3/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_pm/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_ringbuf/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/efuse/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/efuse/esp32c3/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/vfs/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_wifi/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_event/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_netif/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_eth/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/tcpip_adapter/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_phy/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_phy/esp32c3/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_ipc/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/app_trace/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_timer/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/mbedtls/port/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/mbedtls/mbedtls/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/mbedtls/esp_crt_bundle/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/app_update/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/spi_flash/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bootloader_support/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/nvs_flash/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/pthread/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_gdbstub/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_gdbstub/riscv",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_gdbstub/esp32c3",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espcoredump/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espcoredump/include/port/riscv",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/wpa_supplicant/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/wpa_supplicant/port/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/wpa_supplicant/esp_supplicant/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/ieee802154/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/console",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/asio/asio/asio/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/asio/port/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/common/osi/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/include/esp32c3/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/common/api/include/api",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/common/btc/profile/esp/blufi/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/common/btc/profile/esp/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/host/bluedroid/api/include/api",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_common/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_common/tinycrypt/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_core",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_core/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_core/storage",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/btc/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_models/common/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_models/client/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_models/server/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/api/core/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/api/models/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/api",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/cbor/port/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/unity/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/unity/unity/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/cmock/CMock/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/coap/port/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/coap/libcoap/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/nghttp/port/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/nghttp/nghttp2/lib/includes",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-tls",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-tls/esp-tls-crypto",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_adc_cal/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hid/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/tcp_transport/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_http_client/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_http_server/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_https_ota/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_https_server/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_lcd/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_lcd/interface",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/protobuf-c/protobuf-c",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/protocomm/include/common",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/protocomm/include/security",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/protocomm/include/transports",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/mdns/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_local_ctrl/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/sdmmc/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_serial_slave_link/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_websocket_client/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/expat/expat/expat/lib",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/expat/port/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/wear_levelling/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/fatfs/diskio",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/fatfs/vfs",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/fatfs/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freemodbus/freemodbus/common/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/idf_test/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/idf_test/include/esp32c3",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/jsmn/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/json/cJSON",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/libsodium/libsodium/src/libsodium/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/libsodium/port_include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/mqtt/esp-mqtt/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/openssl/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/spiffs/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/wifi_provisioning/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/rmaker_common/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_diagnostics/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/rtc_store/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_insights/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/json_parser/upstream/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/json_parser/upstream",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/json_generator/upstream",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_schedule/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp_secure_cert_mgr/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_rainmaker/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/gpio_button/button/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/qrcode/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/ws2812_led",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_littlefs/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/tool",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/typedef",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/image",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/math",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/nn",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/layer",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/detect",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/model_zoo",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp32-camera/driver/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp32-camera/conversions/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/dotprod/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/support/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/support/mem/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/hann/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/blackman/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/blackman_harris/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/blackman_nuttall/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/nuttall/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/flat_top/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/iir/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/fir/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/add/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/sub/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/mul/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/addc/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/mulc/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/sqrt/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/mul/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/add/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/addc/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/mulc/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/sub/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/fft/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/dct/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/conv/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/common/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/mul/test/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/kalman/ekf/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/kalman/ekf_imu13states/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/fb_gfx/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/qio_qspi/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/cores/esp32",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/variants/esp32c3",
"/Users/lklich/Programowanie/robotic_hand/lib/ArduinoThread",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/ArduinoOTA/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/AsyncUDP/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/BLE/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/BluetoothSerial/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/DNSServer/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/EEPROM/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/ESP32/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/ESPmDNS/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/Ethernet/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/FFat/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/FS/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/HTTPClient/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/HTTPUpdate/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/HTTPUpdateServer/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/I2S/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/Insights/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/LittleFS/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/NetBIOS/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/Preferences/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/RainMaker/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/SD/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/SD_MMC/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/SPIFFS/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/SimpleBLE/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/USB/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/Update/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/WebServer/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/WiFi/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/WiFiClientSecure/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/WiFiProv/src",
""
],
"browse": {
"limitSymbolsToIncludedHeaders": true,
"path": [
"/Users/lklich/Programowanie/robotic_hand/include",
"/Users/lklich/Programowanie/robotic_hand/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/Ticker/src",
"/Users/lklich/Programowanie/robotic_hand/.pio/libdeps/esp32-c3-devkitm-1/ESP32Servo/src",
"/Users/lklich/Programowanie/robotic_hand/.pio/libdeps/esp32-c3-devkitm-1/Adafruit PWM Servo Driver Library",
"/Users/lklich/Programowanie/robotic_hand/.pio/libdeps/esp32-c3-devkitm-1/Adafruit BusIO",
"/Users/lklich/Programowanie/robotic_hand/.pio/libdeps/esp32-c3-devkitm-1/ServoEasing/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/Wire/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/SPI/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/newlib/platform_include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freertos/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freertos/include/esp_additions/freertos",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freertos/port/riscv/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freertos/include/esp_additions",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hw_support/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hw_support/include/soc",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hw_support/include/soc/esp32c3",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hw_support/port/esp32c3",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hw_support/port/esp32c3/private_include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/heap/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/log/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/lwip/include/apps",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/lwip/include/apps/sntp",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/lwip/lwip/src/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/lwip/port/esp32/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/lwip/port/esp32/include/arch",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/soc/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/soc/esp32c3",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/soc/esp32c3/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/hal/esp32c3/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/hal/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/hal/platform_port/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_rom/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_rom/include/esp32c3",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_rom/esp32c3",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_common/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_system/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_system/port/soc",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_system/port/include/riscv",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_system/port/public_compat",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/riscv/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/driver/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/driver/esp32c3/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_pm/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_ringbuf/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/efuse/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/efuse/esp32c3/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/vfs/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_wifi/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_event/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_netif/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_eth/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/tcpip_adapter/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_phy/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_phy/esp32c3/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_ipc/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/app_trace/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_timer/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/mbedtls/port/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/mbedtls/mbedtls/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/mbedtls/esp_crt_bundle/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/app_update/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/spi_flash/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bootloader_support/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/nvs_flash/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/pthread/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_gdbstub/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_gdbstub/riscv",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_gdbstub/esp32c3",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espcoredump/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espcoredump/include/port/riscv",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/wpa_supplicant/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/wpa_supplicant/port/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/wpa_supplicant/esp_supplicant/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/ieee802154/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/console",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/asio/asio/asio/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/asio/port/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/common/osi/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/include/esp32c3/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/common/api/include/api",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/common/btc/profile/esp/blufi/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/common/btc/profile/esp/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/host/bluedroid/api/include/api",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_common/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_common/tinycrypt/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_core",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_core/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_core/storage",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/btc/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_models/common/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_models/client/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/mesh_models/server/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/api/core/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/api/models/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/bt/esp_ble_mesh/api",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/cbor/port/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/unity/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/unity/unity/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/cmock/CMock/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/coap/port/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/coap/libcoap/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/nghttp/port/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/nghttp/nghttp2/lib/includes",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-tls",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-tls/esp-tls-crypto",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_adc_cal/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_hid/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/tcp_transport/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_http_client/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_http_server/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_https_ota/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_https_server/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_lcd/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_lcd/interface",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/protobuf-c/protobuf-c",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/protocomm/include/common",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/protocomm/include/security",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/protocomm/include/transports",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/mdns/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_local_ctrl/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/sdmmc/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_serial_slave_link/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_websocket_client/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/expat/expat/expat/lib",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/expat/port/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/wear_levelling/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/fatfs/diskio",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/fatfs/vfs",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/fatfs/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freemodbus/freemodbus/common/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/idf_test/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/idf_test/include/esp32c3",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/jsmn/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/json/cJSON",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/libsodium/libsodium/src/libsodium/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/libsodium/port_include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/mqtt/esp-mqtt/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/openssl/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/spiffs/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/wifi_provisioning/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/rmaker_common/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_diagnostics/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/rtc_store/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_insights/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/json_parser/upstream/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/json_parser/upstream",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/json_generator/upstream",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_schedule/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp_secure_cert_mgr/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_rainmaker/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/gpio_button/button/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/qrcode/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/ws2812_led",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp_littlefs/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/tool",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/typedef",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/image",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/math",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/nn",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/layer",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/detect",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp-dl/include/model_zoo",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp32-camera/driver/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/esp32-camera/conversions/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/dotprod/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/support/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/support/mem/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/hann/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/blackman/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/blackman_harris/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/blackman_nuttall/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/nuttall/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/windows/flat_top/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/iir/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/fir/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/add/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/sub/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/mul/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/addc/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/mulc/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/math/sqrt/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/mul/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/add/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/addc/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/mulc/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/sub/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/fft/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/dct/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/conv/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/common/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/matrix/mul/test/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/kalman/ekf/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/espressif__esp-dsp/modules/kalman/ekf_imu13states/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/fb_gfx/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/qio_qspi/include",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/cores/esp32",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/variants/esp32c3",
"/Users/lklich/Programowanie/robotic_hand/lib/ArduinoThread",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/ArduinoOTA/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/AsyncUDP/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/BLE/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/BluetoothSerial/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/DNSServer/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/EEPROM/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/ESP32/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/ESPmDNS/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/Ethernet/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/FFat/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/FS/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/HTTPClient/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/HTTPUpdate/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/HTTPUpdateServer/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/I2S/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/Insights/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/LittleFS/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/NetBIOS/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/Preferences/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/RainMaker/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/SD/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/SD_MMC/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/SPIFFS/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/SimpleBLE/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/USB/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/Update/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/WebServer/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/WiFi/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/WiFiClientSecure/src",
"/Users/lklich/.platformio/packages/framework-arduinoespressif32/libraries/WiFiProv/src",
""
]
},
"defines": [
"PLATFORMIO=60119",
"ARDUINO_ESP32C3_DEV",
"ARDUINO_USB_MODE=1",
"ARDUINO_USB_CDC_ON_BOOT=1",
"CORE_DEBUG_LEVEL=3",
"LOG_LOCAL_LEVEL=ESP_LOG_INFO",
"HAVE_CONFIG_H",
"MBEDTLS_CONFIG_FILE=\"mbedtls/esp_config.h\"",
"UNITY_INCLUDE_CONFIG_H",
"WITH_POSIX",
"_GNU_SOURCE",
"IDF_VER=\"v4.4.7-dirty\"",
"ESP_PLATFORM",
"_POSIX_READER_WRITER_LOCKS",
"ARDUINO_ARCH_ESP32",
"ESP32",
"F_CPU=160000000L",
"ARDUINO=10812",
"ARDUINO_VARIANT=\"esp32c3\"",
"ARDUINO_BOARD=\"Espressif ESP32-C3-DevKitM-1\"",
"ARDUINO_PARTITION_default",
""
],
"cStandard": "gnu99",
"cppStandard": "gnu++11",
"compilerPath": "/Users/lklich/.platformio/packages/toolchain-riscv32-esp/bin/riscv32-esp-elf-gcc",
"compilerArgs": [
"-march=rv32imc",
""
]
}
],
"version": 4
}

10
.vscode/extensions.json vendored Normal file
View File

@@ -0,0 +1,10 @@
{
// See http://go.microsoft.com/fwlink/?LinkId=827846
// for the documentation about the extensions.json format
"recommendations": [
"platformio.platformio-ide"
],
"unwantedRecommendations": [
"ms-vscode.cpptools-extension-pack"
]
}

44
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,44 @@
// AUTOMATICALLY GENERATED FILE. PLEASE DO NOT MODIFY IT MANUALLY
//
// PlatformIO Debugging Solution
//
// Documentation: https://docs.platformio.org/en/latest/plus/debugging.html
// Configuration: https://docs.platformio.org/en/latest/projectconf/sections/env/options/debug/index.html
{
"version": "0.2.0",
"configurations": [
{
"type": "platformio-debug",
"request": "launch",
"name": "PIO Debug",
"executable": "/Users/lklich/Programowanie/robotic_hand/.pio/build/esp32-c3-devkitm-1/firmware.elf",
"projectEnvName": "esp32-c3-devkitm-1",
"toolchainBinDir": "/Users/lklich/.platformio/packages/toolchain-riscv32-esp/bin",
"internalConsoleOptions": "openOnSessionStart",
"preLaunchTask": {
"type": "PlatformIO",
"task": "Pre-Debug"
}
},
{
"type": "platformio-debug",
"request": "launch",
"name": "PIO Debug (skip Pre-Debug)",
"executable": "/Users/lklich/Programowanie/robotic_hand/.pio/build/esp32-c3-devkitm-1/firmware.elf",
"projectEnvName": "esp32-c3-devkitm-1",
"toolchainBinDir": "/Users/lklich/.platformio/packages/toolchain-riscv32-esp/bin",
"internalConsoleOptions": "openOnSessionStart"
},
{
"type": "platformio-debug",
"request": "launch",
"name": "PIO Debug (without uploading)",
"executable": "/Users/lklich/Programowanie/robotic_hand/.pio/build/esp32-c3-devkitm-1/firmware.elf",
"projectEnvName": "esp32-c3-devkitm-1",
"toolchainBinDir": "/Users/lklich/.platformio/packages/toolchain-riscv32-esp/bin",
"internalConsoleOptions": "openOnSessionStart",
"loadMode": "manual"
}
]
}

View File

@@ -1,3 +1,28 @@
# robotic_hand
# Robotyczna dłoń
Ręka robotyczna - oprogramowanie mikrokontrolera
## Podłączenie sterownika PCA9685 do ESP32-S3
| ![Opis](docs/PCA9685.jpg) |
|:--:|
| **Rysunek 1.** Moduł sterowania serwomechanizmami |
* PCA9685 Supermini Uwagi
* VCC 3.3V Zasilanie logiki układu PCA
* GND, GND, Wspólna masa
* SDA, GPIO 8, Linia danych I2C
* SCL, GPIO 9, Linia zegarowa I2C
* V+, Zewnętrzne 5V-6V, Zasilanie serwomechanizmów z zewnętrznej przetwornicy 5V
## Podłączenie kolejności palców
* Kanał (PCA9685),Palec
* 0, Kciuk
* 1, Wskazujący
* 2, Środkowy
* 3, Serdeczny
* 4, Mały

BIN
docs/PCA9685.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

46
docs/test.md Normal file
View File

@@ -0,0 +1,46 @@
```
#include <Arduino.h>
#include <Pinout.h>
#include <Tool.h>
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
uint licznik=1;
void setup() {
Serial.begin(115200);
delay(2000);
Serial.println("--- TEST KANAŁÓW PCA9685 ---");
Wire.begin(PIN_SDA, PIN_SCL);
pwm.begin();
pwm.setPWMFreq(50);
Serial.println("Rozpoczynam sekwencję testową...");
}
void loop() {
// Sprawdzamy pierwsze 8 kanałów (większość rąk ma 5 lub 6)
for (int channel = 0; channel < 5; channel++) {
Serial.print("Testuję kanał nr: ");
Serial.println(channel);
// Ruch w jedną stronę
pwm.setPWM(channel, 0, 150);
delay(800);
// Ruch w drugą stronę
pwm.setPWM(channel, 0, 500);
delay(800);
// Krótka pauza przed następnym palcem
delay(500);
}
Serial.println("Koniec cyklu. Powtarzam...");
delay(2000);
}
```

15
include/Logger.h Normal file
View File

@@ -0,0 +1,15 @@
#ifndef LOGGER_H
#define LOGGER_H
#include "esp_log.h"
// Wszystkie tagi logowania w jednym miejscu
extern const char *TAG_MAIN;
extern const char *TAG_DISP;
extern const char *TAG_ADXL;
extern const char *TAG_CONF;
// Funkcja inicjalizacji poziomów logowania
void init_log_levels();
#endif

31
include/Pinout.h Normal file
View File

@@ -0,0 +1,31 @@
#pragma once
#if defined(ESP32)
// SPI3 (HSPI) - SD Card nie kolidują z PSRAM
// #define SD_SCK 16 // 36 //18
// #define SD_MOSI 17 // 35 //17
// #define SD_MISO 18 // 37 //16
// #define SD_CS 15 // 34 //15 ?? 34
// SPI2 (VSPI) - ADXL345
// #define MOSI_ADSX 11 // SDA
// #define CLK_ADSX 12 // SCL
// #define MISO_ADSX 13 // SDO
//I2C C3
#define PIN_SDA 8
#define PIN_SCL 9
// Przycisk
// #define BTN_UP 5
// #define BTN_OK 6
// #define BTN_DOWN 7
// Przekaźnik
// #define RELAY_OUT 4
#endif

14
include/Tool.h Normal file
View File

@@ -0,0 +1,14 @@
#ifndef TOOL_H
#define TOOL_H
#include <Arduino.h>
#include <Wire.h>
#include "esp_log.h"
#include "Watchdog.h"
void scanI2C();
/* Funkcja przyjmuje adres jako argument i zwraca true gdy urządzenie odpowiada, w przeciwnym wypadku false */
bool isI2CDevPresent(uint8_t address);
#endif

7
include/Version.h Normal file
View File

@@ -0,0 +1,7 @@
#ifndef VERSION_H
#define VERSION_H
#define VERSION "0.1"
#endif

38
include/Watchdog.h Normal file
View File

@@ -0,0 +1,38 @@
#pragma once
/**
* Watchdog — prosty interfejs do inicjalizacji i karmienia WDT z dowolnego modułu.
*
* Obsługiwane środowiska:
* - ESP32 Arduino Core / ESP-IDF (esp_task_wdt)
* - Fallback: no-op na innych platformach
*
* Użycie:
* Watchdog::init(5, true);
* Watchdog::addThisTask();
* ...
* Watchdog::feed();
*/
#include <stdint.h>
namespace Watchdog {
/** Inicjalizacja Task Watchdog (idempotentna). */
bool init(int timeout_seconds = 5, bool panic_on_trigger = true);
/** Dodaje bieżący task (wątki FreeRTOS: wołaj w ciele tego taska). */
bool addThisTask();
/** Usuwa bieżący task z nadzoru WDT. */
bool removeThisTask();
/** Karmi watchdog (reset licznika). */
void feed();
/** Zmienia timeout (wykonuje re-init wewnętrznie, jeśli trzeba). */
bool setTimeout(int timeout_seconds);
/** Czy watchdog jest aktywny (zainicjalizowany)? */
bool isActive();
} // namespace Watchdog

13
lib/ArduinoThread/.gitignore vendored Normal file
View File

@@ -0,0 +1,13 @@
# Compiled Object files
*.slo
*.lo
*.o
# Compiled Dynamic libraries
*.so
*.dylib
# Compiled Static libraries
*.lai
*.la
*.a

1
lib/ArduinoThread/.piopm Normal file
View File

@@ -0,0 +1 @@
{"type": "library", "name": "ArduinoThread", "version": "2.1.1", "spec": {"owner": "ivanseidel", "id": 7097, "name": "ArduinoThread", "requirements": null, "uri": null}}

View File

@@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2015 Ivan Seidel
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

205
lib/ArduinoThread/README.md Normal file
View File

@@ -0,0 +1,205 @@
![ArduinoThread Logo](https://raw.githubusercontent.com/ivanseidel/ArduinoThread/master/extras/ArduinoThread.png)
Arduino does not support "REAL" parallel tasks (aka Threads), but we can make use of this Library to
improve our code, and easily schedule tasks with fixed (or variable) time between runs.
This Library helps to maintain organized and to facilitate the use of multiple tasks. We can
use Timers Interrupts, and make it really powerfull, running "pseudo-background" tasks under the rug.
For example, I personaly use it for all my projects, and put all sensor aquisition and
filtering inside it, leaving the main loop, just for logic and "cool" part.
#### ArduinoThreads is a library for managing the periodic execution of multiple tasks.
Blinking an LED is often the very first thing an Arduino user learns. And this demonstrates that periodically performing one single task, like toggling the LED state, is really easy. However, one may quickly discover that managing multiple periodic tasks is not so simple if the tasks have different execution periods.
ArduinoThreads is designed to simplify programs that need to perform multiple periodic tasks. The user defines a Thread object for each of those tasks, then lets the library manage their scheduled execution.
It should be noted that these are not “threads” in the real computer-science meaning of the term: tasks are implemented as functions that are periodically run to completion. On the one hand, this means that the only way a task can “yield” the CPU is by returning to the caller, and it is thus inadvisable to delay() or do long waits inside a task. On the other hand, this makes ArduinoThreads memory friendly, as no stack needs to be allocated per task.
## Installation
1. "Download":https://github.com/ivanseidel/ArduinoThread/archive/master.zip the Master branch from gitHub.
2. Unzip and modify the Folder name to "ArduinoThread" (Remove the '-master')
3. Paste the modified folder on your Library folder (On your `Libraries` folder inside Sketchbooks or Arduino software).
4. Restart Arduino IDE
**If you are here, because another Library requires this class, just don't waste time reading bellow. Install and ready.**
## Getting Started
There are many examples showing many ways to use it. Here, we will explain Class itself,
what it does and "how" it does.
There are basicaly, three Classes included in this Library:
`Thread`, `ThreadController` and `StaticThreadController` (both controllers inherit from Thread).
- `Thread class`: This is the basic class, witch contains methods to set and run callbacks,
check if the Thread should be runned, and also creates a unique ThreadID on the instantiation.
- `ThreadController class`: Responsable for "holding" multiple Threads. Can also be called
as "a group of Threads", and is used to perform run in every Thread ONLY when needed.
- `StaticThreadController class`: Slighly faster and smaller version of `ThreadController`.
It works similar to `ThreadController`, but once constructed it can't add or remove threads to run.
* The instantiation of a Thread class is very simple:
```c++
Thread myThread = Thread();
// or, if initializing a pointer
Thread* myThread = new Thread();
```
* Setting up a thread is essential. You can configure many things:
```c++
myThread.enabled = true; // Default enabled value is true
myThread.setInterval(10); // Setts the wanted interval to be 10ms
/*
This is useful for debugging
(Thread Name is disabled by default, to use less memory)
(Enable it by definint USE_THREAD_NAMES on 'Thread.h')
*/
myThread.ThreadName = "myThread tag";
// This will set the callback of the Thread: "What should I run"?
myThread.onRun(callback_function); // callback_function is the name of the function
```
Ok, creating Threads are not so hard. But what do we do with them now?
* First, let's see how Threads should work, to understand what a `ThreadController` is and does
```c++
// First check if our Thread "should" be runned
if(myThread.shouldRun()){
// Yes, the Thread should be runned, let's run it
myThread.run();
}
```
Now that you got the idea, let's think a little bit: What if i have 3, 5, 100 Threads. Do I need to check EACH one?!?
* The answer is: NO. Create a `ThreadController` or `StaticThreadController`,
and put all your boring-complex Threads inside it!
```c++
// Instantiate a new ThreadController
ThreadController controller = ThreadController();
// Now, put a bunch of Threads inside it, FEED it!
controller.add(&myThread); // Notice the & before the thread, IF it's not instantied as a pointer.
controller.add(&hisThread);
controller.add(&sensorReadings);
...
```
or
```c++
// Instantiate a new StaticThreadController with the number of threads to be supplied as template parameter
StaticThreadController<3> controller (&myThread, &hisThread, &sensorReadings);
// You don't need to do anything else, controller now contains all the threads.
...
```
* You have created, configured, grouped it. What is missing? Yes, whe should RUN it!
```c++
// call run on a Thread, a ThreadController or a StaticThreadController to run it
controller.run();
```
This will run all the Threads that NEED to be runned.
Congratulations, you have learned the basics of `ArduinoThread`. If you want some TIPS, see bellow.
### TIPs and Warnings
* ThreadController is not a `LinkedList`. It's "MAXIMUM" size (the maximum Threads that it can
store) is defined on ThreadController.h (default is 15)
* !!!! VERY IMPORTANT !!!! When extending `Thread` class and implementing the function
`run()`, always remember to put `runned();` after all, otherwhise the `Thread` will ALWAYS run.
* It's a good idea, to create a Timer interrupt and call a ThreadController.run() there.
That way, you don't need to worry about reading sensors and doing time-sensitive stuff
on your main code (loop). Check `ControllerWithTimer` example.
* Inheriting from `Thread` or even `ThreadController` is always a good idea.
For example, I always create base classes of sensors that extends `Thread`,
so that I can "register" the sensors inside a ThreadController, and forget
about really reading sensors, just getting theirs values within my main code.
Checkout `SensorThread` example.
* Remember that `ThreadController` is in fact, a Thread. If you want to enable
or disable a GROUP of Threads, think about putting all of them inside a ThreadController,
and adding this ThreadController to another ThreadController (YES! One ThreadController
inside another). Check `ControllerInController` example.
* There is a `StaticThreadController` which is better to use when you know exact number of
threads to run. You cannot add or remove threads in runtime, but `StaticThreadController`
doesn't have additional memory overhead to keep all the treads together, doesn't have any
limitations how many threads to store (except of available memory) and also the code may be slighly
more optimized because all the threads always exist and no need to do any runtime checks.
* Check the full example `CustomTimedThread` for a cool application of Threads that runs
for a period, after a button is pressed.
* Running tasks on the Timer interrupts must be tought REALLY carefully
You cannot use "sleep()" inside a interrupt, because it will get into a infinite loop.
Things must do stuff quickly. Waiting too loooong on a interrupt, means waiting too
loooong on the main code (loop)
Things might get "scrambled". Since Timers interrupts actualy "BREAK" your code in half
and start running the interrupt, you might want to call `noInterrupts` and `interrupts`
on places where cannot be interrupted:
```c++
noInterrupts();
// Put the code that CANNOT be interrupted...
interrupts(); // This will enable the interrupts egain. DO NOT FORGET!
```
## Library Reference
### You should know:
- `bool Thread::enabled` - Enables or disables the Thread. (do not stop it from running, but will
return false when shouldRun() is called)
- `void Thread::setInterval()` - Setts the desired interval for the Thread (in Ms).
- `bool Thread::shouldRun()` - Returns true, if the Thread should be runned.
(Basicaly,the logic is: (reached time AND is enabled?).
- `void Thread::onRun(<function>)` - The target callback function to be called.
- `void Thread::run()` - This will run the Thread (call the callback function).
- `int Thread::ThreadID` - Theoretically, it's the address of memory. It's unique, and can
be used to compare if two threads are identical.
- `int Thread::ThreadName` - A human-redable thread name. Default is "Thread ThreadID"
eg.: "Thread 141515"; Note that to enable this attribute, you must uncomment the line that disables it on 'Thread.h';
- protected: `void Thread::runned()` - Used to reset internal timer of the Thread.
This is automaticaly called AFTER a call to `run()`.
- `void ThreadController::run()` - This will run the all `Threads` within the `ThreadController`,
only if needed (if shouldRun returns true);
- `bool ThreadController::add(Thread* _thread)` - This will add a the thread to the ThreadController,
and return `true` if suceeded (it the array is full, returns false).
- `void ThreadController::remove(Thread* _thread)` - This will remove the Thread from the ThreadController.
- `void ThreadController::remove(int index)` - This will remove the thread on the position `index`.
- `void ThreadController::clear()` - This will remove ALL threads from the ThreadController array.
- `int ThreadController::size(bool cached = true)` - Returns how many Threads are allocated
inside the ThreadController. If cached is `false`, will force the calculation of threads.
- `Thread* ThreadController::get(int index)` - Returns the Thread on the position `index`.
- `void StaticThreadController::run()` - This will run the all `Threads` within the `StaicThreadController`,
only if needed (if shouldRun returns true);
- `int StaticThreadController::size()` - Returns how many Threads are allocated inside the StaticThreadController.
- `Thread* ThreadController::get(int index)` - Returns the Thread on the position `index` and `nullptr` if `index`
is out of bounds.
### You don't need to know:
- Nothing, yet ;)

View File

@@ -0,0 +1,75 @@
/*
StaticThreadController.h - Controlls a list of Threads with different timings
Basicaly, what it does is to keep track of current Threads and run when
necessary.
StaticThreadController is an extended class of Thread, because of that,
it allows you to add a StaticThreadController inside another kind of ThreadController...
It works exact as ThreadController except you can't add or remove treads dynamically.
Created by Alex Eremin, September, 2016.
Released into the public domain.
*/
#ifndef StaticThreadController_h
#define StaticThreadController_h
#include "Thread.h"
template <int N>
class StaticThreadController: public Thread{
protected:
//since this is a static controller, the pointers themselves can be const
//it should be distinguished from 'const Thread* thread[N]'
Thread * const thread[N];
public:
template <typename... T>
StaticThreadController(T... params) :
Thread(),
thread{params...}
{
#ifdef USE_THREAD_NAMES
// Overrides name
ThreadName = "StaticThreadController ";
ThreadName = ThreadName + ThreadID;
#endif
};
// run() Method is overrided
void run() override
{
// Run this thread before
if(_onRun != nullptr && shouldRun())
_onRun();
for(int i = 0; i < N; i++){
// Is enabled? Timeout exceeded?
if(thread[i]->shouldRun()){
thread[i]->run();
}
}
// StaticThreadController extends Thread, so we should flag as runned thread
runned();
}
// Return the quantity of Threads
static constexpr int size() { return N; };
// Return the I Thread on the array
// Returns nullptr if index is out of bounds
Thread* get(int index) {
return (index >= 0 && index < N) ? thread[index] : nullptr;
};
// Return the I Thread on the array
// Doesn't perform any bounds checks and behaviour is
// unpredictable in case of index > N
Thread& operator[](int index) {
return *thread[index];
};
};
#endif

View File

@@ -0,0 +1,52 @@
#include "Thread.h"
Thread::Thread(void (*callback)(void), unsigned long _interval){
enabled = true;
onRun(callback);
_cached_next_run = 0;
last_run = millis();
ThreadID = (int)this;
#ifdef USE_THREAD_NAMES
ThreadName = "Thread ";
ThreadName = ThreadName + ThreadID;
#endif
setInterval(_interval);
};
void Thread::runned(unsigned long time){
// Saves last_run
last_run = time;
// Cache next run
_cached_next_run = last_run + interval;
}
void Thread::setInterval(unsigned long _interval){
// Save interval
interval = _interval;
// Cache the next run based on the last_run
_cached_next_run = last_run + interval;
}
bool Thread::shouldRun(unsigned long time){
// If the "sign" bit is set the signed difference would be negative
bool time_remaining = (time - _cached_next_run) & 0x80000000;
// Exceeded the time limit, AND is enabled? Then should run...
return !time_remaining && enabled;
}
void Thread::onRun(void (*callback)(void)){
_onRun = callback;
}
void Thread::run(){
if(_onRun != NULL)
_onRun();
// Update last_run and _cached_next_run
runned();
}

View File

@@ -0,0 +1,89 @@
/*
Thread.h - An runnable object
Thread is responsable for holding the "action" for something,
also, it responds if it "should" or "should not" run, based on
the current time;
For instructions, go to https://github.com/ivanseidel/ArduinoThread
Created by Ivan Seidel Gomes, March, 2013.
Released into the public domain.
*/
#ifndef Thread_h
#define Thread_h
#if defined(ARDUINO) && ARDUINO >= 100
#include <Arduino.h>
#else
#include <WProgram.h>
#endif
#include <inttypes.h>
/*
Uncomment this line to enable ThreadName Strings.
It might be usefull if you are loging thread with Serial,
or displaying a list of threads...
*/
// #define USE_THREAD_NAMES 1
class Thread{
protected:
// Desired interval between runs
unsigned long interval;
// Last runned time in Ms
unsigned long last_run;
// Scheduled run in Ms (MUST BE CACHED)
unsigned long _cached_next_run;
/*
IMPORTANT! Run after all calls to run()
Updates last_run and cache next run.
NOTE: This MUST be called if extending
this class and implementing run() method
*/
void runned(unsigned long time);
// Default is to mark it runned "now"
void runned() { runned(millis()); }
// Callback for run() if not implemented
void (*_onRun)(void);
public:
// If the current Thread is enabled or not
bool enabled;
// ID of the Thread (initialized from memory adr.)
int ThreadID;
#ifdef USE_THREAD_NAMES
// Thread Name (used for better UI).
String ThreadName;
#endif
Thread(void (*callback)(void) = NULL, unsigned long _interval = 0);
// Set the desired interval for calls, and update _cached_next_run
virtual void setInterval(unsigned long _interval);
// Return if the Thread should be runned or not
virtual bool shouldRun(unsigned long time);
// Default is to check whether it should run "now"
bool shouldRun() { return shouldRun(millis()); }
// Callback set
void onRun(void (*callback)(void));
// Runs Thread
virtual void run();
};
#endif

View File

@@ -0,0 +1,115 @@
#include "Thread.h"
#include "ThreadController.h"
ThreadController::ThreadController(unsigned long _interval): Thread(){
cached_size = 0;
clear();
setInterval(_interval);
#ifdef USE_THREAD_NAMES
// Overrides name
ThreadName = "ThreadController ";
ThreadName = ThreadName + ThreadID;
#endif
}
/*
ThreadController run() (cool stuf)
*/
void ThreadController::run(){
// Run this thread before
if(_onRun != NULL)
_onRun();
unsigned long time = millis();
int checks = 0;
for(int i = 0; i < MAX_THREADS && checks <= cached_size; i++){
// Object exists? Is enabled? Timeout exceeded?
if(thread[i]){
checks++;
if(thread[i]->shouldRun(time)){
thread[i]->run();
}
}
}
// ThreadController extends Thread, so we should flag as runned thread
runned();
}
/*
List controller (boring part)
*/
bool ThreadController::add(Thread* _thread){
// Check if the Thread already exists on the array
for(int i = 0; i < MAX_THREADS; i++){
if(thread[i] != NULL && thread[i]->ThreadID == _thread->ThreadID)
return true;
}
// Find an empty slot
for(int i = 0; i < MAX_THREADS; i++){
if(!thread[i]){
// Found a empty slot, now add Thread
thread[i] = _thread;
cached_size++;
return true;
}
}
// Array is full
return false;
}
void ThreadController::remove(int id){
// Find Threads with the id, and removes
bool found = false;
for(int i = 0; i < MAX_THREADS; i++){
if(thread[i]->ThreadID == id){
thread[i] = NULL;
cached_size--;
return;
}
}
}
void ThreadController::remove(Thread* _thread){
remove(_thread->ThreadID);
}
void ThreadController::clear(){
for(int i = 0; i < MAX_THREADS; i++){
thread[i] = NULL;
}
cached_size = 0;
}
int ThreadController::size(bool cached){
if(cached)
return cached_size;
int size = 0;
for(int i = 0; i < MAX_THREADS; i++){
if(thread[i])
size++;
}
cached_size = size;
return cached_size;
}
Thread* ThreadController::get(int index){
int pos = -1;
for(int i = 0; i < MAX_THREADS; i++){
if(thread[i] != NULL){
pos++;
if(pos == index)
return thread[i];
}
}
return NULL;
}

View File

@@ -0,0 +1,53 @@
/*
ThreadController.h - Controlls a list of Threads with different timings
Basicaly, what it does is to keep track of current Threads and run when
necessary.
ThreadController is an extended class of Thread, because of that,
it allows you to add a ThreadController inside another ThreadController...
For instructions, go to https://github.com/ivanseidel/ArduinoThread
Created by Ivan Seidel Gomes, March, 2013.
Released into the public domain.
*/
#ifndef ThreadController_h
#define ThreadController_h
#include "Thread.h"
#include "inttypes.h"
#define MAX_THREADS 15
class ThreadController: public Thread{
protected:
Thread* thread[MAX_THREADS];
int cached_size;
public:
ThreadController(unsigned long _interval = 0);
// run() Method is overrided
void run();
// Adds a thread in the first available slot (remove first)
// Returns if the Thread could be added or not
bool add(Thread* _thread);
// remove the thread (given the Thread* or ThreadID)
void remove(int _id);
void remove(Thread* _thread);
// Removes all threads
void clear();
// Return the quantity of Threads
int size(bool cached = true);
// Return the I Thread on the array
// Returns NULL if none found
Thread* get(int index);
};
#endif

View File

@@ -0,0 +1,78 @@
#include <Thread.h>
#include <ThreadController.h>
int ledPin = 13;
// ThreadController that will controll all threads
ThreadController controll = ThreadController();
//My Thread
Thread myThread = Thread();
//His Thread
Thread hisThread = Thread();
//Blink Led Thread
Thread blinkLedThread = Thread();
//ThreadController, that will be added to controll
ThreadController groupOfThreads = ThreadController();
// callback for myThread
void niceCallback(){
Serial.print("COOL! I'm running on: ");
Serial.println(millis());
}
// callback for hisThread
void boringCallback(){
Serial.println("BORING...");
}
// callback for blinkLedThread
void blinkLed(){
static bool ledStatus = false;
ledStatus = !ledStatus;
digitalWrite(ledPin, ledStatus);
Serial.print("blinking: ");
Serial.println(ledStatus);
}
void setup(){
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
// Configure myThread
myThread.onRun(niceCallback);
myThread.setInterval(500);
// Configure hisThread
hisThread.onRun(boringCallback);
hisThread.setInterval(250);
// Configure blinkLedThread
blinkLedThread.onRun(blinkLed);
blinkLedThread.setInterval(100);
// Adds myThread to the controll
controll.add(&myThread);
// Adds hisThread and blinkLedThread to groupOfThreads
groupOfThreads.add(&hisThread);
groupOfThreads.add(&blinkLedThread);
// Add groupOfThreads to controll
controll.add(&groupOfThreads);
}
void loop(){
// run ThreadController
// this will check every thread inside ThreadController,
// if it should run. If yes, he will run it;
controll.run();
// Rest of code
float h = 3.1415;
h/=2;
}

View File

@@ -0,0 +1,100 @@
#include <Thread.h>
#include <ThreadController.h>
/*
This example, requires a Timer Interrupt Library.
If you are using Arduino NANO, UNO... (with ATmega168/328)
Please go to: http://playground.arduino.cc/code/timer1
If you are using Arduino DUE,
Please go to: https://github.com/ivanseidel/DueTimer
Include the library corresponding to your Arduino.
*/
// #include <DueTimer.h>
// #include <TimerOne.h>
// ThreadController that will controll all threads
ThreadController controll = ThreadController();
//My Thread
Thread myThread = Thread();
//His Thread
Thread hisThread = Thread();
// callback for myThread
void myThreadCallback(){
Serial.println("myThread\t\tcallback");
}
// callback for hisThread
void hisThreadCallback(){
Serial.println("\thisThread\tcallback");
}
// This is the callback for the Timer
void timerCallback(){
controll.run();
}
void setup(){
Serial.begin(9600);
// Configure myThread
myThread.onRun(myThreadCallback);
myThread.setInterval(500);
// Configure myThread
hisThread.onRun(hisThreadCallback);
hisThread.setInterval(200);
// Adds both threads to the controller
controll.add(&myThread); // & to pass the pointer to it
controll.add(&hisThread);
/*
If using DueTimer...
*/
// Timer1.attachInterrupt(timerCallback).start(20000);
/*
If using TimerOne...
*/
// Timer1.initialize(20000);
// Timer1.attachInterrupt(timerCallback);
// Timer1.start();
}
void waitSerial(){
while (!Serial.available());
delay(10);
while (Serial.available() && Serial.read());
}
void loop(){
while(1){
noInterrupts(); // Call to disable interrupts
Serial.println("Type anyting to stop myThread!");
interrupts(); // Call to enable interrupts
waitSerial();
myThread.enabled = false;
noInterrupts();
Serial.println("Type anyting to stop hisThread!");
interrupts();
waitSerial();
hisThread.enabled = false;
noInterrupts();
Serial.println("Type anyting to enable myThread!");
interrupts();
waitSerial();
myThread.enabled = true;
noInterrupts();
Serial.println("Type anyting to enable hisThread!");
interrupts();
waitSerial();
hisThread.enabled = true;
}
}

View File

@@ -0,0 +1,257 @@
/*
This is an example from ArduinoThread. You can find more information
in https://github.com/ivanseidel/ArduinoThread.
Coded by Ivan Seidel, Jun/2014 - ivanseidel@gmail.com
Dont be afraid. 90% is commented lines. READ them, they will teach you.
*/
#include <Thread.h>
#include <ThreadController.h>
/*
This example provides an object-oriented approach to
develop a custom Thread that overrides the 'shouldRun'
method, to only run the thread after a button was pushed.
After the push, it should 'keep' running for a desired time.
It should also provide us, a way to easily implement this
controll multiple times, without trouble.
We are giving this Custom Thread the name 'ButtonThread'.
Exemplifying what it does:
+ ButtonThread added to our mainController ThreadList
=> Instantiated with a custom Pin #,
=> and a time duration (in miliseconds)
+ ButtonThread is not running.
+ When the button is pressed:
+ Thread will start and keep running.
+ If the thread runned for our defined period,
we stop it.
================ HOW TO SETUP HARDWARE ==================
In order to make this example work with any arduino, hook up
the pins on the board to 3 buttons. You can change the inputs
if you need below here.
The Buttons are being SOFTWARE pulled UP (to VCC), and when
pushed, should go LOW. Connect like this:
(Arduino Input) <----> (Btn) <----> GND (-)
We are using digital pins 9, 10 and 11 as input.
It also uses a LED, but we are using the default one in the board.
=============== WHAT YO LEARN WITH THIS =================
1) Threads are actually running in 'parallel'.
Synce each thread process time is very tiny, they appear
as being runned in parallel.
Because of that, clicking multiple buttons at any time,
will looks like there is a program for each one of them.
2) If you keep the button 'pressed', it will continue to run.
Since we are 'enabling' the thread, and reseting the timer
flag (_lastButtonPushed) every time the button is pressed,
we should notice that in btn1Callback, where we print this
flag, it will never go beyond 0 if we keep pressing it.
3) The LED turns off, only because the Thread runs a last time
with the flag 'enabled' as false. This way, we can turn the
LED off and remain OFF until we press it egain.
I hope you enjoy, and learn some advanced-cool stuf with this tutorial.
Any feedback is apreciated!
*/
#define BTN1 9
#define BTN2 10
#define BTN3 11
#define LED 13
// ThreadController that will controll all button threads
ThreadController controll = ThreadController();
// Here we implement our custom ButtonThread, that Inherits from Thread
class ButtonThread: public Thread{
public:
// Our custom thread attributes
int pin;
long duration;
long _lastButtonPushed;
/*
Our Constructor. This will initialize the thread
with it's corresponding pin and duration after clicked.
*/
ButtonThread(int _pin, long _duration): Thread(){
// Set our attributes on construct
pin = _pin;
duration = _duration;
_lastButtonPushed = 0;
// Thread will start disabled
enabled = false;
// Configure the pin as INPUT and enable pull-up
pinMode(pin, INPUT);
digitalWrite(pin, HIGH);
}
/*
Override the method responsible for
checking if the thread should run.
It will first check if the button is pressed.
If so, we enable the thread, and then let the
"Old" default Thread method 'shouldRun' return if
it should run.
*/
bool shouldRun(long time){
// Override enabled on thread when pin goes LOW.
if(digitalRead(pin) == LOW){
enabled = true;
/*
Here, we save the current time in this object,
to compare it later.
the 'time' parameter in this method, is an override for the
'millis()' method. It allows who is checking the thread, to
pass a custom time.
This is sintax for writing an 'inline' if is very usefull,
it's the same as:
if(time > 0){
_lastButtonPushed = time;
}else{
_lastButtonPushed = millis();
}
*/
_lastButtonPushed = (time ? time : millis());
}
// Let default method check for it.
return Thread::shouldRun(time);
}
/*
We 'disable' the thread after the duration on the
'run' method.
What we should do here, is check if the time saved
in the _lastButtonPushed variable plus the duration,
is greater than our current time. If that's true, it
means we exceeded the thread time, and that we must
disable it and prevent from running.
*/
void run(){
// Check if time elapsed since last button push
if(millis() > _lastButtonPushed + duration){
// It exceeded time. We should disable it.
enabled = false;
}
/*
Run the thread.
Note that this method will only get called
from the ThreadList, IF the 'shouldRun' returns true.
If the thread is not enabled anymore, it will run a 'last'
time with the flag 'enabled' as false, meaning it's the last
run in the period. You can use it for doing something only
before it stops running.
*/
Thread::run();
}
};
/*
ButtonThreads objects instantiation
(we are instantiating 2 as a member, and one
as pointer in the setup, just to show you
different ways of doing it)
*/
// Thread 1 will be reading BTN1 pin, and will run for 3 secs
ButtonThread btn1Thread(BTN1, 3000);
// Thread 2 will be reading BTN1 pin, and will run for 5 secs
ButtonThread btn2Thread = ButtonThread(BTN2, 5000);
// Thread 3 will be instantiated in the setup()
ButtonThread *btn3Thread;
/*
Callback for ButtonThreads
*/
void btn1Callback(){
// When it's running, this thread will write to the serial.
/*
This math will print 'how long' the thread has been running,
since the button was/is pressed.
After pressing it, it should print as 0, and goes up untill
the thread duration (in this case, +-5000ms).
*/
Serial.print("BTN 1 Thread: ");
Serial.println(millis() - btn1Thread._lastButtonPushed);
}
void btn2Callback(){
/*
This thread will remain with the LED on pin 13 turned on
while it is running.
We detect that this method is called for the LAST time, if
the flag 'enabled' is FALSE on the btn2Thread object.
So, basically: If it's TRUE, we should turn ON the led, if not
we should turn OFF. We can simplify that into one line.
(Same 'inline' sintax as above)
*/
digitalWrite(LED, btn2Thread.enabled ? HIGH : LOW);
}
void btn3Callback(){
// When it's running, this thread will also write to the serial
Serial.println("BTN 3 Thread");
}
void setup(){
// Configure serial and output pins
Serial.begin(9600);
pinMode(LED, OUTPUT);
// Configure btn1Thread callback
// (During the 'enabled' time, it will run every 100ms, aka Interval)
btn1Thread.onRun(btn1Callback);
btn1Thread.setInterval(100);
// Configure btn2Thread callback and interval
btn2Thread.onRun(btn2Callback);
btn2Thread.setInterval(200);
// Instantiate btn3Thread
btn3Thread = new ButtonThread(BTN3, 4000);
// Configure btn3Thread callback and interval
btn3Thread->onRun(btn3Callback);
btn3Thread->setInterval(100);
// Adds all threads to the controller
controll.add(&btn1Thread); // & to pass the pointer to it
controll.add(&btn2Thread);
controll.add(btn3Thread); // Its already a pointer, no need for &
}
void loop(){
// Here we just run the main thread controller
controll.run();
}

View File

@@ -0,0 +1,105 @@
#include "Thread.h"
#include "ThreadController.h"
/*
This is a more "complex" for of using Threads.
You can also inherit from Thread, and do your entire code on the class.
This allows you, to create for example:
Sensor Readings (aquire, filter, and save localy values)
Custom Blinks, Beeps...
Anything you can imagine.
Threads are more "usefull" when used within Timer interrupts
This way of coding is more "reusable", and "correct" (Object Oriented)
*/
/*
This example, requires a Timer Interrupt Library.
If you are using Arduino NANO, UNO... (with ATmega168/328)
Please go to: http://playground.arduino.cc/code/timer1
If you are using Arduino DUE,
Please go to: https://github.com/ivanseidel/DueTimer
Include the library corresponding to your Arduino.
*/
#include <DueTimer.h>
// #include <TimerOne.h>
// Create a new Class, called SensorThread, that inherits from Thread
class SensorThread: public Thread
{
public:
int value;
int pin;
// No, "run" cannot be anything...
// Because Thread uses the method "run" to run threads,
// we MUST overload this method here. using anything other
// than "run" will not work properly...
void run(){
// Reads the analog pin, and saves it localy
value = map(analogRead(pin), 0,1023,0,255);
runned();
}
};
// Now, let's use our new class of Thread
SensorThread analog1 = SensorThread();
SensorThread analog2 = SensorThread();
// Instantiate a new ThreadController
ThreadController controller = ThreadController();
// This is the callback for the Timer
void timerCallback(){
controller.run();
}
void setup(){
Serial.begin(9600);
// Configures Thread analog1
analog1.pin = A1;
analog1.setInterval(100);
// Configures Thread analog2
analog2.pin = A2;
analog2.setInterval(100);
// Add the Threads to our ThreadController
controller.add(&analog1);
controller.add(&analog2);
/*
If using DueTimer...
*/
Timer1.attachInterrupt(timerCallback).start(10000);
/*
If using TimerOne...
*/
// Timer1.initialize(20000);
// Timer1.attachInterrupt(timerCallback);
// Timer1.start();
}
void loop(){
// Do complex-crazy-timeconsuming-tasks here
delay(1000);
// Get the fresh readings
Serial.print("Analog1 Thread: ");
Serial.println(analog1.value);
Serial.print("Analog2 Thread: ");
Serial.println(analog2.value);
// Do more complex-crazy-timeconsuming-tasks here
delay(1000);
}

View File

@@ -0,0 +1,35 @@
#include <Thread.h>
int ledPin = 13;
//My simple Thread
Thread myThread = Thread();
// callback for myThread
void niceCallback(){
static bool ledStatus = false;
ledStatus = !ledStatus;
digitalWrite(ledPin, ledStatus);
Serial.print("COOL! I'm running on: ");
Serial.println(millis());
}
void setup(){
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
myThread.onRun(niceCallback);
myThread.setInterval(500);
}
void loop(){
// checks if thread should run
if(myThread.shouldRun())
myThread.run();
// Other code...
int x = 0;
x = 1 + 2;
}

View File

@@ -0,0 +1,48 @@
#include <Thread.h>
#include <ThreadController.h>
// ThreadController that will controll all threads
ThreadController controll = ThreadController();
//My Thread (as a pointer)
Thread* myThread = new Thread();
//His Thread (not pointer)
Thread hisThread = Thread();
// callback for myThread
void niceCallback(){
Serial.print("COOL! I'm running on: ");
Serial.println(millis());
}
// callback for hisThread
void boringCallback(){
Serial.println("BORING...");
}
void setup(){
Serial.begin(9600);
// Configure myThread
myThread->onRun(niceCallback);
myThread->setInterval(500);
// Configure myThread
hisThread.onRun(boringCallback);
hisThread.setInterval(250);
// Adds both threads to the controller
controll.add(myThread);
controll.add(&hisThread); // & to pass the pointer to it
}
void loop(){
// run ThreadController
// this will check every thread inside ThreadController,
// if it should run. If yes, he will run it;
controll.run();
// Rest of code
float h = 3.1415;
h/=2;
}

View File

@@ -0,0 +1,56 @@
#include <Thread.h>
#include <StaticThreadController.h>
//My Thread (as a pointer)
Thread* myThread = new Thread();
//His Thread (not pointer)
Thread hisThread = Thread();
// callback for myThread
void niceCallback(){
Serial.print("COOL! I'm running on: ");
Serial.println(millis());
}
// callback for hisThread
void boringCallback(){
Serial.println("BORING...");
}
// callback for theThread
void justCallback(){
Serial.println("executing...");
}
//The Thread (as a pointer) with justCallback initialized
Thread* theThread = new Thread(justCallback);
// StaticThreadController that will controll all threads
// All non-pointers go with '&', but pointers go without '&',
StaticThreadController<3> controll (myThread, &hisThread, theThread);
void setup(){
Serial.begin(9600);
// Configure myThread
myThread->onRun(niceCallback);
myThread->setInterval(500);
// Configure hisThread
hisThread.onRun(boringCallback);
hisThread.setInterval(250);
// Set interval for theThread using StaticThreadController interface
controll[3].setInterval(375);
}
void loop(){
// run StaticThreadController
// this will check every thread inside ThreadController,
// if it should run. If yes, he will run it;
controll.run();
// Rest of code
float h = 3.1415;
h/=2;
}

View File

@@ -0,0 +1,32 @@
#######################################
# Syntax Coloring
#######################################
#######################################
# Datatypes (KEYWORD1)
#######################################
Thread KEYWORD1
ThreadController KEYWORD1
StaticThreadController KEYWORD1
#######################################
# Methods and Functions (KEYWORD2)
#######################################
runned KEYWORD2
setInterval KEYWORD2
shouldRun KEYWORD2
onRun KEYWORD2
run KEYWORD2
# Specific of ThreadController or StaticThreadController
add KEYWORD2
remove KEYWORD2
clear KEYWORD2
size KEYWORD2
get KEYWORD2
#######################################
# Constants (LITERAL1)
#######################################

View File

@@ -0,0 +1,13 @@
{
"name": "ArduinoThread",
"keywords": "thread, task",
"description": "A library for managing the periodic execution of multiple tasks",
"repository": {
"type": "git",
"url": "https://github.com/ivanseidel/ArduinoThread.git"
},
"frameworks": "arduino",
//"platforms": "atmelavr", LK 2025
"platforms": "*"
"version": "2.1.1"
}

View File

@@ -0,0 +1,9 @@
name=ArduinoThread
version=2.1.1
author=Ivan Seidel <ivanseidel@gmail.com>
maintainer=Ivan Seidel <ivanseidel@gmail.com>
sentence=A simple way to run Threads on Arduino
paragraph=This Library helps to maintain organized and to facilitate the use of multiple tasks. We can use Timers Interrupts, and make it really powerfull, running "pseudo-background" tasks on the rug.
category=Timing
url=https://github.com/ivanseidel/ArduinoThread
architectures=*

4
lib/README Normal file
View File

@@ -0,0 +1,4 @@
# Biblioteki
Ten folder zawiera biblioteki wykorzystane w projekcie.

30
platformio.ini Normal file
View File

@@ -0,0 +1,30 @@
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:esp32-c3-devkitm-1]
platform = espressif32
board = esp32-c3-devkitm-1
framework = arduino
monitor_speed = 115200
build_flags =
-DARDUINO_USB_MODE=1
-DARDUINO_USB_CDC_ON_BOOT=1
-DCORE_DEBUG_LEVEL=3
-DLOG_LOCAL_LEVEL=ESP_LOG_INFO
; Wymuszenie poprawnego sprawdzania zależności
lib_ldf_mode = deep+
lib_deps =
SPI
Wire
arminjo/ServoEasing@^3.6.0
adafruit/Adafruit PWM Servo Driver Library@^3.0.3
madhephaestus/ESP32Servo@^3.2.0

16
src/Logger.cpp Normal file
View File

@@ -0,0 +1,16 @@
#include <Logger.h>
const char *TAG_MAIN = "MAIN";
const char *TAG_DISPLAY = "DISPLAY";
const char *TAG_WIFI = "WiFi";
const char *TAG_ADXL = "ADXL345";
const char *TAG_CONF = "CONFIG";
void init_log_levels() {
esp_log_level_set(TAG_MAIN, ESP_LOG_INFO);
esp_log_level_set(TAG_DISPLAY, ESP_LOG_INFO);
esp_log_level_set(TAG_WIFI, ESP_LOG_INFO);
esp_log_level_set(TAG_ADXL, ESP_LOG_INFO);
esp_log_level_set(TAG_CONF, ESP_LOG_INFO);
}

48
src/Tool.cpp Normal file
View File

@@ -0,0 +1,48 @@
#include <Tool.h>
static const char *TOOL = "tool";
bool isI2CDevPresent(uint8_t address) {
Wire.beginTransmission(address);
uint8_t error = Wire.endTransmission();
if (error == 0) {
ESP_LOGI(TOOL, "I2C response from 0x%02X", address);
return true;
} else {
if (error == 4) {
//ESP_LOGW(TOOL, "I2C unknown error at 0x%02X", address);
} else {
ESP_LOGI(TOOL, "No I2C device at 0x%02X", address);
}
return false;
}
}
void scanI2C() {
byte error, address;
int nDevices = 0;
ESP_LOGI(TOOL, "I2C start scan");
for (address = 1; address < 127; address++) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
char buf[32];
snprintf(buf, sizeof(buf), "I2C device: 0x%02X", address);
ESP_LOGI(TOOL, "%s", buf);
nDevices++;
Watchdog::feed();
}
else if (error == 4) {
ESP_LOGW(TOOL, "I2C error at address: 0x%02X", address);
}
}
if (nDevices == 0) {
ESP_LOGE(TOOL, "I2C no devices found");
} else {
ESP_LOGI(TOOL, "I2C scan finished. Found %d device(s)", nDevices);
}
Watchdog::feed();
}

81
src/Watchdog.cpp Normal file
View File

@@ -0,0 +1,81 @@
#include "Watchdog.h"
// Wykrywanie środowiska
#if defined(ESP_PLATFORM) || defined(ESP32)
#include <esp_task_wdt.h>
#define WDOG_HAS_ESP 1
#else
#define WDOG_HAS_ESP 0
#endif
namespace Watchdog {
static bool s_initialized = false;
bool init(int timeout_seconds, bool panic_on_trigger) {
#if WDOG_HAS_ESP
if (s_initialized) return true;
esp_err_t err = esp_task_wdt_init(timeout_seconds, panic_on_trigger);
if (err == ESP_OK || err == ESP_ERR_INVALID_STATE) {
// ESP_ERR_INVALID_STATE: już zainicjalizowany — traktujemy jako OK
s_initialized = true;
return true;
}
return false;
#else
(void)timeout_seconds; (void)panic_on_trigger;
s_initialized = true; // no-op, aby nie blokować wywołań w kodzie
return true;
#endif
}
bool addThisTask() {
#if WDOG_HAS_ESP
if (!s_initialized) return false;
esp_err_t err = esp_task_wdt_add(nullptr); // nullptr = bieżący task
return (err == ESP_OK || err == ESP_ERR_INVALID_STATE);
#else
return true; // no-op
#endif
}
bool removeThisTask() {
#if WDOG_HAS_ESP
if (!s_initialized) return false;
esp_err_t err = esp_task_wdt_delete(nullptr); // bieżący task
return (err == ESP_OK || err == ESP_ERR_INVALID_STATE);
#else
return true; // no-op
#endif
}
void feed() {
#if WDOG_HAS_ESP
esp_task_wdt_reset();
#else
// no-op
#endif
}
bool setTimeout(int timeout_seconds) {
#if WDOG_HAS_ESP
if (!s_initialized) {
// jeśli ktoś nie zainicjalizował — zrób to teraz
return init(timeout_seconds, true);
}
// W ESP-IDF/Arduino brak prostego API na „live update” — re-init:
esp_err_t err = esp_task_wdt_deinit();
(void)err; // nie każdy port raportuje OK/INVALID_STATE spójnie
s_initialized = false;
return init(timeout_seconds, true);
#else
(void)timeout_seconds;
return true; // no-op
#endif
}
bool isActive() {
return s_initialized;
}
} // namespace Watchdog

143
src/main.cpp Normal file
View File

@@ -0,0 +1,143 @@
#include <Logger.h>
#include "Watchdog.h"
#include <Arduino.h>
#include <Pinout.h>
#include <Tool.h>
#include <Version.h>
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_PWMServoDriver.h>
#define WDT_TIMEOUT 60 // Czas watchdoga do restartu
// Konfiguracja serw (to trzeba skalibrować)
#define SERVOMIN 150 // Minimalna długość impulsu (0 stopni)
#define SERVOMAX 550 // Maksymalna długość impulsu (180 stopni)
#define NUM_FINGERS 5
// Aktualne pozycje serw (do płynnych przejść)
int currentPositions[NUM_FINGERS] = {0, 0, 0, 0, 0};
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40);
// Struktura gestu
struct Gesture {
const char *name;
int angles[NUM_FINGERS]; // Kąty 0-180
};
// --- DEFINICJA GESTÓW ---
// Kolejność: Kciuk, Wskazujący, Środkowy, Serdeczny, Mały
Gesture gestureList[] = {
{"OTWARTA", {0, 0, 0, 0, 0}}, // Wszystkie wyprostowane
{"PIESC", {170, 170, 170, 170, 170}},// Wszystkie zgięte
{"V-SIGN", {170, 0, 0, 170, 170}}, // Pokój / Zwycięstwo
{"OK", {150, 150, 0, 0, 0}}, // Kciuk i wskazujący złączone
{"PALEC", {170, 0, 170, 170, 170}}, // Wskazywanie palcem
// --- NOWE GESTY ---
{"KCIUK_GORA", {0, 170, 170, 170, 170}}, // Lajk (Kciuk wyprostowany, reszta pięść)
{"ROCK_ON", {0, 0, 170, 170, 0}}, // "Rogi" (Kciuk, wskazujący i mały wyprostowane)
{"SPIDERMAN", {0, 0, 170, 170, 0}}, // Podobnie jak rock, ale kciuk szeroko
{"SHAKA", {0, 170, 170, 170, 0}}, // Gest surferów (Kciuk i mały wyprostowane)
{"PUNKT", {170, 0, 0, 170, 170}}, // Wskazujący i środkowy (jak pistolet)
// --- LICZBY ---
{"LICZBA_1", {170, 0, 170, 170, 170}}, // Tylko wskazujący
{"LICZBA_2", {170, 0, 0, 170, 170}}, // Wskazujący i środkowy
{"LICZBA_3", {170, 0, 0, 0, 170}}, // Trzy środkowe palce
{"LICZBA_4", {170, 0, 0, 0, 0}}, // Bez kciuka
// --- INNE ---
{"CZEŚĆ", {40, 40, 40, 40, 40}}, // Lekko ugięte (naturalna dłoń)
{"CHWYT_PRECYZ", {120, 120, 170, 170, 170}} // Pęseta (Kciuk i wskazujący do połowy)
};
int totalGestures = sizeof(gestureList) / sizeof(Gesture);
//////// PROTOTYPY /////////////////
void setup();
void loop();
//void playGesture(Gesture g);
void moveToGesture(Gesture g, int speed);
int angleToPWM(int angle);
void setup() {
Serial.begin(115200);
delay(500);
unsigned long t0 = millis();
while (!Serial && millis()-t0 < 2000) { delay(10); }
esp_log_level_set("*", ESP_LOG_INFO); // _ERROR, _WARN, _INFO, _DEBUG, _VERBOSE
delay(500);
ESP_LOGI(TAG_MAIN, "----------------------");
ESP_LOGI(TAG_MAIN, "WMT Stalowa Wola L.Klich");
ESP_LOGI(TAG_MAIN, "Robotyczna reka");
ESP_LOGI(TAG_MAIN, "Firmware: %s", VERSION);
ESP_LOGI(TAG_MAIN, "----------------------");
ESP_LOGI(TAG_MAIN, "ESP32 model: %s Rev %d", ESP.getChipModel(), ESP.getChipRevision());
ESP_LOGI(TAG_MAIN, "Chip cores: %d", ESP.getChipCores());
// Inicjalizacja Watchdoga panic_on_trigger = true
if (Watchdog::init(25, true)) {
ESP_LOGI(TAG_MAIN, "Watchdog init ok.");
} else {
ESP_LOGE(TAG_MAIN, "Watchdog init error.");
}
Wire.begin(PIN_SDA, PIN_SCL);
scanI2C(); // Skanowanie magistrali I2C
pwm.begin();
pwm.setPWMFreq(50);
// Dodanie taska loop do WDT
if (Watchdog::addThisTask()) {
ESP_LOGI(TAG_MAIN, "Added main task to Watchdog");
}
// Ustawienie pozycji startowej (otwarta dłoń)
for(int i=0; i<NUM_FINGERS; i++) {
currentPositions[i] = 0;
pwm.setPWM(i, 0, angleToPWM(0));
}
delay(1000);
ESP_LOGI(TAG_MAIN, "System ready");
}
// Zamiana kąta na impuls PWM
int angleToPWM(int angle) {
return map(angle, 0, 180, SERVOMIN, SERVOMAX);
}
// Funkcja płynnego przejścia do gestu
void moveToGesture(Gesture g, int speed) {
Serial.print("Wykonuję gest: ");
Serial.println(g.name);
bool allReached = false;
while (!allReached) {
allReached = true;
for (int i = 0; i < NUM_FINGERS; i++) {
if (currentPositions[i] < g.angles[i]) {
currentPositions[i]++;
allReached = false;
} else if (currentPositions[i] > g.angles[i]) {
currentPositions[i]--;
allReached = false;
}
pwm.setPWM(i, 0, angleToPWM(currentPositions[i]));
}
delay(speed); // Kontrola prędkości (im mniejsza wartość, tym szybciej)
}
}
void loop() {
Watchdog::feed();
for (int i = 0; i < totalGestures; i++) {
moveToGesture(gestureList[i], 10); // Prędkość 10ms na stopień
delay(1000); // 1 sekunda przed kolejnym gestem
Watchdog::feed();
}
}

11
test/README Normal file
View File

@@ -0,0 +1,11 @@
This directory is intended for PlatformIO Test Runner and project tests.
Unit Testing is a software testing method by which individual units of
source code, sets of one or more MCU program modules together with associated
control data, usage procedures, and operating procedures, are tested to
determine whether they are fit for use. Unit testing finds problems early
in the development cycle.
More information about PlatformIO Unit Testing:
- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html