NightDriverStrip is a source code package for building a flash program that you upload to the ESP32 microcontroller.

Overview

NightDriverStrip

CI

Davepl, 9/19/2021

  • See Discussions for questions and comments.
  • See source code and COPYING.txt for detailed technical and licensing information including versions.

What NightDriverStrip is

NightDriverStrip is a source code package for building a flash program that you upload to the ESP32 microcontroller. It can drive up to 8 channels of WS2812B style LEDs connected to the chip pins and display fancy colors and patterns and designs on them. There are numerous effects built in that can be configured to be shown on the LED strip, including audio/music/beat-reactive effects for modules equipped with a microphone. It can also optionally receive color data for the LEDs in a simple LZ-compressed (or noncompressed) format over a TCP/IP socket that is opened by default on port 49152. The ESP32 keeps its clock in sync using NTP.

To add new effects, you derive from LEDStripEffect (or an existing effect class) and the good stuff happens in the only important function, Draw(). Add your class to the AllEffects table in effects.cpp (under your build configuration section, like DEMO). Check out what the built in effects do, but in short you're basically drawing into an array of CRGB objects that each represent a 24-bit color triplet. Once you're done, the CRGB array is sent to the LEDs and you are asked for the next frame immediately. Your draw method should take somewhere around 30ms, ideally, and should delay() to sleep for the balance if it's quicker. You can draw repeatedly basically in a busy loop, but its not needed.

There is a global EffectsManager instance that reads the AllEffects table in effect.cpp and then rotates amongst those effects at a rate controled by DEFAULT_EFFEECT_INTERVAL. Effects are not notified when they go active or not, they're just asked to draw when needed.

Each channel of LEDs has an LEDMatrixGfx instance associated with it. _GFX[0] is the LEDMatrixGfx associated with LED_PIN0, and so on. You can get the LED buffer of Pin0 by calling _GFX[0]->GetLEDBuffer(), and it will contain _GFX[0]->GetLEDCount pixels. You can draw into the buffer without ever touching the raw bytes by calling fill_solid, fill_rainbow, setPixel, and other drawing functions.

The simplest configuation, DEMO, assumes you have a single meter strip of 144 LEDs and a power supply connected to your ESP32. It boots up, finds a single PaletteEffect object in the AllEffects table, and repeatedly calls its Draw() method to update the CRGB array before sending it out to the LEDs. If working correctly it should draw a scrolling rainbow palette on your LED strip.

Getting Started

I recommend you do the following:

  • Build the source code. In particular, build the DEMO configuration. Some pointers on what's needed to do this can be found below.
  • Upload the resultant binary to the ESP32
  • Connect PIN5 and GND and 5V of a WS2812B strip to the ESP32
  • Provide an adequate power source for the LEDs and ESP32
  • Enjoy the pretty lights
  • Start enabling features in the globals.h file like WiFi and WebServer. Set your WiFi SSID and password first.
  • Connect to the ESP32's web user interface with a browser to its IP address

Sample Parts (Plummer's Software LLC Amazon Affiliate Links)

Bonus Exercise

Write something simple to send color data to the socket. The format is very basic: which channel, how many LEDs you're drawing, when to draw it, and the color data itself. You can send uncompressed data with a zero timestamp as long as you send the correct header before your data, which is very simple. Data with a zero timestamp will just be drawn immediately with no buffering.

BYTES FUNCTION
0, 1 CommandID (Set it to 3, which is WIFI_COMMAND_PIXELDATA64)
2, 3 ChannelID (Set it to 1 for single channel, though 0 works too for historical reasons)
4 - 7 Length (Number of 24-bit PIXELS being set)
8 - 15 Seconds (Set it to 0)
16 - 24 Micros (Set it to 0)
25+ RGB (24-bit RGB color data, one per PIXEL specified in Length above)

If built with ENABLE_WIFI and INCOMING_WIFI_ENABLED, if the chip is able to get a WiFi connection and DHCP address it will open a socket on port 49152 and wait for packets formed as described above.

Super Bonus Exercise

Generate a series of 24 frames per second (or 30 if under 500 LEDs) and set the timestamp to "Now" plus 1/2 a second. Send them to the chip over WiFi and they will be drawn 1/2 second from now in a steady stream as the timestamps you gave each packet come due.

Contributing, and the BlinkenPerBit Metric

Rather than produce a complex set of guidelines, here's what I hope open-source collaboration will bring to the project: that folks will add important features and fix defects and shortcomings in the code. When they're adding features, they'll do it in a way consistent with the way things are done in the existing code. They resist the urge to rearchitect and rewrite everything in their own image and instead put their efforts towards maximizing functional improvement while reducing source code thrash and change.

Let's consider the inconsistent naming, which should be fixed. Some is camelCase, some is pszHungarian, and so on, depending on the source. I'd prefer it were all updated to a single standard TBD. Until the TBD is determined, I lean towards the Win32 standard.

When working in a function, work in the style of the function. When working on a class, work in the style of the class. When working on a file, work in the style of the file. If those are inconsistent, do whatever minimizes changes. Stylistic changes should only be introduced after discussion in the group, and generally should entain owning that style change across the entire project.

Next, let's consider #defines to control the build. There may be better and more elegant ways of doing things. There could be entire configuration platforms. But I'd prefer to keep it simple. And I define simplest to be "the least that an experienced C++ programmer needs to learn before being constructive with the code in question". I don't want to learn a new class library if I can avoid it!

A lifetime of coding has taught me to err on the side of simplicity, so please don't introduce variadic template constructs unless they demonstrably shrink the source code. Anything that grows the complexity AND length of the code should be suspect.

Add whatever you want and/or need to make your LED dreams come true. Fix my blunders. Fill in the obvious gaps in my knowledge. Whatever has the most blinken for the fewest bits get my vote. You only get so much additional cool blinken for every byte of code and program. That return is measured in BlinkenPerBit, the amount of blinking awesomeness the code adds divided by the impact on the source (and binary).

Build Pointers

The project can be built using PlatformIO. There's a PlatformIO IDE available, which is built on top of Visual Studio Code. Included in it are the command-line PlatformIO Core tools. They can also be installed on their own if you prefer not using the IDE.

When either the IDE or Core are installed, NightDriverStrip can be built from a command shell by entering the project/repository directory and issuing the following command:

pio run

This will build the DEMO config.

Note that the repository CI builds both the DEMO and SPECTRUM configurations. This can be done locally using this command:

pio run -e demo -e spectrum

Time It Takes To Build This Project

Time to build the SPECTRUM config. Assumes a clean build after everything has been installed and downloaded.

  • AMD 3970 32-cores, 128GB, RAID SSD -> [davepl 09/19/2021] 12.93 seconds (Running Under WSL)

  • AMD 5950X 16-cores, 64GB, SSD -> [davepl 09/19/2021] 16.90 seconds

  • MacBook Pro 2020, 8 Cores 2.4GHz i9, 64GB, 4TB SSD -> [davepl 09/19/2021] 34.09 seconds

  • Mac Mini, 4 Perf cores, 16GB -> [davepl 09/19/2021] 39.06 seconds

  • Mac Pro, 6 cores, 3.5 GHz, 64GB, 1TB SSD -> [davepl 09/19/2021] 48.42 seconds

  • Raspberry Pi 4, 64-bit Ubuntu LTS, 4 core, 4GB -> [davepl 09/23/2021] 6 min 25 seconds

  • Jetson Nano 2G, 4 Core ARM A57 -> [davepl 10/04/2021] 2 min 56 seconds

Issues
  • Fix math error in partitions_custom.csv, enable 4M storage partition by default

    Fix math error in partitions_custom.csv, enable 4M storage partition by default

    Description

    I made a few math errors in my previous PR modifying the partitions_custom.csv file. This PR fixes them, and enables the 4M storage partition by default.

    I have folks from the discord to thank for figuring this out. Thanks!

    This was tested:

    > pio run --target uploadfs --environment demo
     <snipped>
    Building SPIFFS image from 'data' directory to .pio\build\demo\spiffs.bin
    <snipped>
    Auto-detected Flash size: 4MB
    <snipped>
    Environment    Status    Duration
    -------------  --------  ------------
    demo           SUCCESS   00:00:11.208
    

    Contributing requirements

    • [x] I read the contribution guidelines in CONTRIBUTING.md.
    • [x] I understand the BlinkenPerBit metric, and maximized it in this PR.
    • [x] I selected main as the target branch.
    • [x] All code herein is subjected to the license terms in COPYING.txt.
    opened by BeldrothTheGold 27
  • Count enabled effects

    Count enabled effects

    Description

    With this fix, disabling all effects will now:

    • Immediately turn off all LEDs
    • No longer get stuck in NextEffect()

    This partially addresses Issue #90.

    Contributing requirements

    • [x] I read the contribution guidelines in CONTRIBUTING.md.
    • [x] I understand the BlinkenPerBit metric, and maximized it in this PR.
    • [x] I selected main as the target branch.
    • [x] All code herein is subjected to the license terms in COPYING.txt.
    opened by xcalibur839 6
  • Add .click() handler to webserver checkboxes

    Add .click() handler to webserver checkboxes

    Description

    Adds a .click() event handler to the checkboxes in index.html. When a checkbox is checked, EnableEffect() is called, otherwise DisableEffect() is called.

    Contributing requirements

    • [x] I read the contribution guidelines in CONTRIBUTING.md.
    • [x] I understand the BlinkenPerBit metric, and maximized it in this PR.
    • [x] I selected main as the target branch.
    • [x] All code herein is subjected to the license terms in COPYING.txt.
    opened by xcalibur839 6
  • Add USE_SCREEN define to enable all supported displays. Make screen code consistent.

    Add USE_SCREEN define to enable all supported displays. Make screen code consistent.

    Description

    • Make it so all supported displays can be enabled with one define, USE_SCREEN. Adds a section at the bottom of globals.h which checks which board was defined in platformio.ini. (PlatformIO defines a unique variable for each board type) to enable the correct USE_ for each screen type.

    • Also this corrects the project's misuse of TFT for the Heltec board and OLED for the M5StickC board. These boards have a monochrome OLED panel and a TFT LCD display respectively. See the linked Amazon product pages in the README.md or the excerpts from from the board manufacturer's sites below:

    https://heltec.org/project/wifi-kit-32/ "Onboard 0.96-inch 128x64 dot matrix OLED display" - The OLED controller is an SSD1306

    https://docs.m5stack.com/en/core/m5stickc_plus "LCD screen 1.14 inch, 135x240 Colorful TFT LCD, ST7789v2"

    Contributing requirements

    • [x] I read the contribution guidelines in CONTRIBUTING.md.
    • [x] I understand the BlinkenPerBit metric, and maximized it in this PR.
    • [x] I selected main as the target branch.
    • [x] All code herein is subjected to the license terms in COPYING.txt.
    opened by BeldrothTheGold 6
  • Move secrets to a new file secrets.h add add to gitignore

    Move secrets to a new file secrets.h add add to gitignore

    Description

    • Move secrets, such as Wifi network, and credentials to secrets.h. This file is added to .gitignore. This should make it so users don't need to worry about publishing their network SSID/password when committing changes.

    • Also, moves NTP network address to define at top of ntptimeclient.h

    Contributing requirements

    • [x] I read the contribution guidelines in CONTRIBUTING.md.
    • [x] I understand the BlinkenPerBit metric, and maximized it in this PR.
    • [x] I selected main as the target branch.
    • [x] All code herein is subjected to the license terms in COPYING.txt.
    opened by BeldrothTheGold 5
  • Implement HueFireFanEffect class. Removed GreenFireFanEffect and BlueFireFanEffect classes.

    Implement HueFireFanEffect class. Removed GreenFireFanEffect and BlueFireFanEffect classes.

    Description

    Implements HueFireFanEffect, a replacement for existing BlueFireFanEffect and GreenFireFanEffect that allows for easy access to many more color options.

    Removed BlueFireFanEffect and GreenFireFanEffect.

    Fixed up effects.cpp to reflect changes. Didn't add any new colors as examples, but usage is clear from existing, re-worked effect entries.

    Contributing requirements

    • [X] I read the contribution guidelines in CONTRIBUTING.md.
    • [X] I understand the BlinkenPerBit metric, and maximized it in this PR.
    • [X] I selected main as the target branch.
    • [X] All code herein is subjected to the license terms in COPYING.txt.
    opened by hemi426 4
  • /getEffectList returns faulty JSON when there are many effects

    /getEffectList returns faulty JSON when there are many effects

    Bug report

    Problem

    The problem is the following line: https://github.com/PlummersSoftwareLLC/NightDriverStrip/blob/992a5413ff08d1ed185dae9b7e729720916ce511/include/spiffswebserver.h#L87

    This initializes a new AsyncJsonResponse with 1024 bytes of JSON buffer. But if there are many effects, this buffer runs out and creates the following JSON:

    {"currentEffect":0,"millisecondsRemaining":258835,"effectInterval":300000,"enabledCount":24,"Effects":[{"name":"RainbowFill Effect","enabled":true},{"name":"RainbowFill Effect","enabled":true},{"name":"Sample Effect","enabled":true},{"name":"Sample Effect","enabled":true},{"name":"Palette Effect","enabled":true},{"name":"DoublePaletteEffect Effect","enabled":true},{"name":"Meteor Effect","enabled":true},{"name":"Magenta Twinkle Stars","enabled":true},{"name":"Blue Sparkle Stars","enabled":true},{"name":"Red Twinkle Stars","enabled":true},{"name":"Lava Stars","enabled":true},{"name":"Rainbow Twinkle Stars","enabled":true},{"name":"Little Blooming Rainbow Stars","enabled":true},{"name":"Big Blooming Rainbow Stars","enabled":true},{"name":"Neon Bars","enabled":true},{"name":"VU Effect","enabled":true},{"name":"VU Effect","enabled":true},{"name":"VU Effect","enabled":true},{"name":"VU Effect","enabled":true},{}]}

    Manually setting the buffer to e.g. 2048 bytes fixes the issue, although this is just a matter of time until this buffer size is gonna be too small again.

    What are your thoughts on how to handle this? Is it worth the effort and calculating the buffer size beforehand, or would you just set the buffer size to a reasonable big size?

    Steps

    1. Build the Brooklynroom config with the webserver enabled
    2. Make the web request

    Example

    The Brooklynroom config already comes with this issue

    Notes

    My temporary "fix" was to change this line AsyncJsonResponse * response = new AsyncJsonResponse(); to AsyncJsonResponse * response = new AsyncJsonResponse(false, 2048U);

    opened by laufersteppenwolf 4
  • Unexpected behavior when effects are disabled via webserver

    Unexpected behavior when effects are disabled via webserver

    Bug report

    Problem

    • Disabling an effect that is currently running does not immediately stop the effect, it will continue to run until DEFAULT_EFFECT_INTERVAL has elapsed
    • If you only have one effect in AllEffects[] and you disable that effect, the LEDs will appear to freeze in whatever their final state was after DEFAULT_EFFECT_INTERVAL has elapsed. This does not happen when there are multiple effects in AllEffects[] that are all disabled, due to the fading between effects that sets all LEDs to Off/Black (i.e. the final state of the LEDs is Off/Black)

    Steps

    1. Enable the webserver and Wi-Fi in globals.h and configure secrets.h
    2. Determine the IP address of the ESP32 and connect to the webserver with a web browser
    3. Disable all of the listed effects (or call the /disableEffect endpoint using the curl example below on every effect)

    Example

    curl -d 'effectIndex=0' 192.168.0.25/disableEffect

    opened by xcalibur839 4
  • Fix StarryNight variables

    Fix StarryNight variables

    Description

    This:

    • converts the mult and glob variables that were added in #75 into globals.h #defines.
    • adds the brooklynroom and ledstrip (#81) configurations to the CI workflow.
    • removed the treeset config from CI, based on a comment on PR #95.

    Contributing requirements

    • [x] I read the contribution guidelines in CONTRIBUTING.md.
    • [x] I understand the BlinkenPerBit metric, and maximized it in this PR.
    • [x] I selected main as the target branch.
    • [x] All code herein is subjected to the license terms in COPYING.txt.
    opened by rbergen 4
  • Fixes and addition of treeset

    Fixes and addition of treeset

    Description

    A number of smaller fixes, a build fix for spectrum, and the addition of the treeset project and a new effect for it

    Contributing requirements

    • [X] I read the contribution guidelines in CONTRIBUTING.md.
    • [X] I understand the BlinkenPerBit metric, and maximized it in this PR.
    • [X] I selected main as the target branch.
    • [X] All code herein is subjected to the license terms in COPYING.txt.
    opened by davepl 4
  • WIP: Revert

    WIP: Revert "Fix OTA regression"

    Description

    Reverting as this causes issues at runtime.

    Contributing requirements

    • [x] I read the contribution guidelines in CONTRIBUTING.md.
    • [x] I understand the BlinkenPerBit metric, and maximized it in this PR.
    • [x] I selected main as the target branch.
    • [x] All code herein is subjected to the license terms in COPYING.txt.
    opened by BeldrothTheGold 3
  • Brite: Calculation on screen

    Brite: Calculation on screen

    Problem Brite: section of display goes over 100% if it has to reduce the brightness to keep within the designated power. I would think it would report the % reduced from originally designated brightness.

    Steps

    1. Set POWER_LIMIT_MW to low milliwatts in SPECTRUM section in globals.h
    2. Build and upload SPECTRUM project to controller
    3. Observer Brite: in controller display. Shows over 100% when power is cut back Should be under 100% indicating how much the power has been reduced from normal

    Example If you have the power limit set to 5000mW but the power required for set brightness at 255 would be 10,000mW, power control would cut the brightness probably to around 127. Brite: would display 200%. It should instead display 50% in that the LED brightness was cut in half.

    Notes Problem seems to be how the % is calculated in screen.cpp: 255.0f * 100 / calculate_max_brightness_for_power_mW(g_Brightness, POWER_LIMIT_MW));

    calculate_max_brightness_for_power_mW returns the cut back brightness level from 1-255. So, the calculation should be in the numerator, and the base amount in the denominator: calculate_max_brightness_for_power_mW(g_Brightness, POWER_LIMIT_MW))*100/255.0f ;

    This unless the intent of the Brite: value was to show the % overage in brightness setting to maintain power limits but I would think it more meaningful to show how much the brightness was automatically cut back rather than how much overage the set brightness is to what it was cut back.

    Since the user might be intentionally setting a lower brightness than maximum to begin with, and is required for the calculation function, might also be good to make the change based on what the target brightness is as set by g_Brightness rather than a fixed value of 255: calculate_max_brightness_for_power_mW(g_Brightness, POWER_LIMIT_MW))*100/g_Brightness;

    Not sure if g_Brightness would need a qualifier to make it as a float for the division.

    opened by DanMan32 0
  • std::bad_alloc exception in Arduino OTA handler

    std::bad_alloc exception in Arduino OTA handler

    Bug report

    Problem The ESP32 repeatedly keeps on rebooting due to an unhandled exception (std::bad_alloc) I don't know why exactly, but with the BROOKLYNROOM config, it happens the most.

    The issue seems to be related to the Arduino OTA handler, see the stack trace below src/main.cpp:674 relates to this line

    Steps

    1. build the BROOKLYNROOM config
    2. run the monitor
    3. catch the stacktrace

    Example

    Notes Stack trace: ` (I) (TerminateHandler)(C1) ------------------------------------------------------------------------------------- (I) (TerminateHandler)(C1) - NightDriverStrip Guru Meditation Unhandled Exception - (I) (TerminateHandler)(C1) ------------------------------------------------------------------------------------- (I) (PrintOutputHeader)(C1) NightDriverStrip (I) (I) (PrintOutputHeader)(C1) ------------------------------------------------------------------------------------- (I) (PrintOutputHeader)(C1) M5STICKC: 0, USE_OLED: 1, USE_TFT: 0 (I) (PrintOutputHeader)(C1) Version 137: Wifi SSID: NETGEAR90 - ESP32 Free Memory: 68692, PSRAM:0, PSRAM Free: 0 (I) (PrintOutputHeader)(C1) ESP32 Clock Freq : 240 MHz (I) (TerminateHandler)(C1) Terminated due to exception: std::bad_alloc

    ELF file SHA256: 0000000000000000

    Backtrace: 0x4008c84c:0x3ffb1e20 0x4008cac9:0x3ffb1e40 0x400dd3c9:0x3ffb1e60 0x4017f3f7:0x3ffb1e90 0x4017f45e:0x3ffb1eb0 0x4017e89b:0x3ffb1ed0 0x4017ee4e:0x3ffb1ef0 0x4017ea05:0x3ffb1f10 0x400e58dd:0x3ffb1f30 0x4010144e:0x3ffb1f70 0x400dd455:0x3ffb1f90 0x40104254:0x3ffb1fb0 0x4008db1a:0x3ffb1fd0 #0 0x4008c84c:0x3ffb1e20 in invoke_abort at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/esp32/panic.c:715 #1 0x4008cac9:0x3ffb1e40 in abort at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/esp32/panic.c:715 #2 0x400dd3c9:0x3ffb1e60 in TerminateHandler() at src/main.cpp:404 #3 0x4017f3f7:0x3ffb1e90 in __cxxabiv1::__terminate(void ()()) at /builds/idf/crosstool-NG/.build/src/gcc-5.2.0/libstdc++-v3/libsupc++/eh_terminate.cc:112 #4 0x4017f45e:0x3ffb1eb0 in std::terminate() at /builds/idf/crosstool-NG/.build/src/gcc-5.2.0/libstdc++-v3/libsupc++/eh_terminate.cc:112 #5 0x4017e89b:0x3ffb1ed0 in __cxa_throw at /builds/idf/crosstool-NG/.build/src/gcc-5.2.0/libstdc++-v3/libsupc++/eh_throw.cc:87 #6 0x4017ee4e:0x3ffb1ef0 in operator new(unsigned int) at /builds/idf/crosstool-NG/.build/src/gcc-5.2.0/libstdc++-v3/libsupc++/new_op.cc:54 #7 0x4017ea05:0x3ffb1f10 in operator new[](unsigned int) at /builds/idf/crosstool-NG/.build/src/gcc-5.2.0/libstdc++-v3/libsupc++/new_opv.cc:32 #8 0x400e58dd:0x3ffb1f30 in WiFiUDP::parsePacket() at C:\Users\John Doe.platformio\packages\framework-arduinoespressif32\cores\esp32/Udp.h:46 #9 0x4010144e:0x3ffb1f70 in ArduinoOTAClass::handle() at C:\Users\John Doe.platformio\packages\framework-arduinoespressif32\libraries\ArduinoOTA\src/ArduinoOTA.cpp:100 #10 0x400dd455:0x3ffb1f90 in loop() at src/main.cpp:674 #11 0x40104254:0x3ffb1fb0 in loopTask(void) at C:\Users\John Doe.platformio\packages\framework-arduinoespressif32\cores\esp32/main.cpp:23 #12 0x4008db1a:0x3ffb1fd0 in vPortTaskWrapper at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/port.c:355 (discriminator 1)

    Rebooting... ets Jun 8 2016 00:22:57

    rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 188777542, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:2 load:0x3fff0018,len:4 load:0x3fff001c,len:1044 load:0x40078000,len:10124 load:0x40080400,len:5828 entry 0x400806a8 `

    opened by laufersteppenwolf 6
  • REGRESSION: OTA updates not functioning with expanded partition table

    REGRESSION: OTA updates not functioning with expanded partition table

    Problem The code contains OTA support that worked when the project was small enough to fit in the default partition table. When the code grew, partitions_custom.csv was added to accommodate it. Unfortunately doing so seems to have broken OTA support.

    Steps

    1. Build the SPECTRUM config, ensure ENABLE_OTA is on
    2. Run it, note IP, set upload_port to it, upload
    3. Note that it connects but the OTA code bails internally when checking the partition table. That's as far as I debugged.
    opened by davepl 10
Owner
Plummer's Software LLC
Handles billing
Plummer's Software LLC
An ESP32 system that can perform a Directory, Upload, Download, Delete, Rename and Stream Files in SPIFFS

ESP-File-Server An ESP32 system that can perform a Directory, Upload, Download, Delete, Rename and Stream Files in SPIFFS Using an ESP32 to handle fil

G6EJD 24 Aug 7, 2022
ESP32-Skid-Steer - Bruder Catepillar Skid Steer model converted to RC, controlled by an ESP32 with 2 analog joysticks and a receiver that is an ESP32 on the model.

ESP32-Skid-Steer Bruder Catepillar Skid Steer model converted to RC, controlled by an ESP32 with 2 analog joysticks and a receiver that is an ESP32 on

null 5 Feb 4, 2022
This is a set of utilities that allow you to read, write or erase SPI flash chips using a Raspberry Pi Pico (RP2040) chip.

Pico SPI Utilities This is a set of utilities that allow you to read, write or erase SPI flash chips using a Raspberry Pi Pico (RP2040) chip. While th

Two Bean Development 2 Aug 7, 2022
Program that allows you to get the source code of a website's home page without doing it manually. Use it at your own risk.

Website-Homepage-Grabber Install one of the folders x64 or x32 if the program doesn't work(probably because you don't have visual studio installed) If

null 5 Feb 19, 2022
Open Source STC8G/STC8H ISP flash tool

stc8prog - STC MCU ISP flash tool stc8prog is a command line flash programming tool for STC 8051 series microcontrollers, Currently, only STC8H/STC8G/

IOsetting 20 Jul 31, 2022
a C program to say hi to you :) also you're cute <3

You're gonna need to be on linux (too lazy for windows) and have gcc installed. * Installing ---------- * 1 --- To install first create a "hi

ibx34 2 Sep 21, 2021
Had a tough time playing Microsoft Wordament ? Well WORDament_Solver has your back. It suggests you meaningful words you can use while playing the game and help you top the leaderboard.

WORDament_Solver Had a tough time playing Microsoft Wordament ? Well WORDament_Solver has your back. It suggests you meaningful words you can use whil

Tushar Agarwal 3 Aug 19, 2021
💉This is the ultimate great source code for building the best injectable Exec on FiveM.

FiveM Lua Executor This is the ultimate great source code for building the best injectable Exec on FiveM. I'm not going to tell you how to create a pr

Sarnax 30 Aug 3, 2022
Phan Sang 8 Jul 30, 2022
Upload arbitrary data via Apple's Find My network.

Send My Send My allows you to to upload abritrary data from devices without an internet connection by (ab)using Apple's Find My network. The data is b

Positive Security 1.5k Aug 7, 2022
This was the first ever Computer Science project that I made back in Class XII (2016). I thought I should upload it on GitHub so that it does not get lost. :)

First Ever Project This was the first ever Computer Science project that I made back in Class XII (2016). I thought I should upload it on github so th

Kshitiz Srivastava 3 Jun 7, 2021
THIS REPO IS PART OF WHAT ORCA TOLD ME TO UPLOAD

artifact64 THIS REPO IS PART OF WHAT ORCA TOLD ME TO UPLOAD Generate x64 arch undetactable executables directly from cobalt strike . USAGE : compile u

null 68 Jul 16, 2022
Resize, crop, and convert images on Upload.

Upload Image Plugin Resize, crop, and convert images on Upload. To use this plugin use the following settings in a "Transformation Step" in the Upload

Upload.js 20 Mar 31, 2022
Upload codes in any language in this repository

HacktoberFest21 Hello Hackers! HacktoberFest has begun again for year 2021, and everyone's excited to get started! What is Hacktoberfest? Hacktoberfes

SUDIP MONDAL 56 Jan 1, 2022
THIS REPO IS PART OF WHAT ORCA TOLD ME TO UPLOAD

ACHLYSv2 How it works: First ACHLYS detects the environment of the machine its being in, by checking sandboxes and debuggers presents. second when the

null 27 Feb 1, 2022
THIS REPO IS PART OF WHAT ORCA TOLD ME TO UPLOAD

ACHLYSv1 How it works: First ACHLYS detects the environment of the machine its being in, by checking sandboxes and debuggers presents. second when the

null 16 Nov 29, 2021
THIS REPO IS PART OF WHAT ORCA TOLD ME TO UPLOAD

How Does 0x41 work: 1- checks the environment [detect sandboxes / debuggers / virtual machines] 2- download the [encrypted] shellcode file [.bin] if t

null 38 Jan 12, 2022
THIS REPO IS PART OF WHAT ORCA TOLD ME TO UPLOAD

WHALE : A AES CRYPTOR USAGE: All u have to do is to build "builder" project and run it according to ur arguments. the builder.exe will then build and

null 39 Jun 27, 2022
Unofficial upload of ChinesePython, a translation of the Python programming language in Chinese [Provided by UrduPython engineers]

# Downloaded from SourceForge: https://sourceforge.net/projects/chinesepython/ # (Uploaded as is) ---------------------------------------------------

Saad A. Bazaz 3 Feb 12, 2022