Libraries are the superpower of the Arduino ecosystem. Instead of writing hundreds of lines of low-level code every time you want to read a DHT11 sensor or drive an I2C OLED display, you include a library and call three or four functions. This arduino libraries guide covers everything from the basics of installation to writing and distributing your own library — giving you the skills to make any hardware work with any Arduino board.
Table of Contents
- What Is an Arduino Library?
- Installing Libraries via Library Manager
- Manual Installation: ZIP and Folder Methods
- Built-in, Contributed & Platform Libraries
- Managing, Updating & Removing Libraries
- Creating Your Own Arduino Library
- Library Best Practices & Troubleshooting
- FAQ
What Is an Arduino Library?
An Arduino library is a collection of C++ source files (a .h header and usually a .cpp implementation file) packaged together so you can include them in any sketch with a single #include statement. Libraries abstract away hardware-specific register operations and communication protocols, letting you focus on application logic rather than datasheet details.
Every library lives in a folder under your sketchbook/libraries directory. The Arduino IDE discovers and compiles any library folder it finds there. The full path is shown in the IDE under File → Preferences → Sketchbook location; typically:
- Windows:
C:Users[user]DocumentsArduinolibraries - Linux:
~/Arduino/libraries/ - Mac:
~/Documents/Arduino/libraries/
Library folders contain at minimum: a folder named after the library, a .h file, and optionally a .cpp file, a library.properties metadata file, an examples/ folder, and a keywords.txt for IDE syntax highlighting.
Installing Libraries via Library Manager
The Library Manager (introduced in Arduino IDE 1.6.2) is the easiest way to install verified libraries. It connects to the official Arduino library index which lists over 5,000 community-submitted libraries.
Steps to Install a Library
- Open the Arduino IDE and go to Sketch → Include Library → Manage Libraries… (or press Ctrl+Shift+I).
- Type the library name in the search box — for example,
DHT sensor library. - Find the correct entry (look at the author name to avoid confusion with similarly named libraries).
- Select the version from the dropdown (latest is usually best unless a project requires a specific version).
- Click Install. The IDE downloads the library, extracts it, and confirms with “INSTALLED” next to the version.
If a library has dependencies, the IDE will ask whether to install them too — always click Install all. Dependencies are listed in the library’s library.properties file under the depends= key.
Arduino IDE 2.x Library Manager
In Arduino IDE 2.x, the Library Manager is a persistent panel on the left sidebar (the books icon). The search and install workflow is identical, but you can see all installed libraries at a glance without opening a separate window.
Manual Installation: ZIP and Folder Methods
Not every library is in the Library Manager index. GitHub-hosted libraries, beta releases, and private libraries require manual installation.
Method A — Install from ZIP
- Download the library ZIP from GitHub (click Code → Download ZIP) or the project’s release page.
- In Arduino IDE, go to Sketch → Include Library → Add .ZIP Library…
- Navigate to the downloaded ZIP and click Open. The IDE extracts it into your libraries folder automatically.
The ZIP must contain the library folder at the top level (not nested inside another folder). If the extracted folder name ends in -main or -master, the IDE will use that exact name — you may want to rename it for clarity.
Method B — Manual Folder Copy
- Extract the ZIP or clone the repository.
- Copy the entire library folder to your sketchbook’s
libraries/directory. - Restart the Arduino IDE (it only scans the libraries folder on startup).
This method is useful when you want to keep the library under version control (git) in a specific location, or when you have multiple Arduino installations and want to share one library folder between them.
Built-in, Contributed & Platform Libraries
Arduino distinguishes three categories of libraries, and knowing the difference prevents confusion when libraries conflict or override each other:
Built-in Libraries
Shipped with the Arduino IDE and always available regardless of sketchbook. Examples: SPI, Wire (I2C), EEPROM, SD, Servo, SoftwareSerial. These live inside the IDE’s own installation directory, not your sketchbook.
Platform (Hardware) Libraries
Installed alongside board packages (e.g., the ESP32 or SAMD board packages). They provide hardware-specific functionality like WiFi.h for ESP32 or CAN.h for SAMD boards. You find them inside ~/.arduino15/packages/[vendor]/hardware/[arch]/[version]/libraries/.
Contributed Libraries
Everything installed via Library Manager or manually into your sketchbook. These have the highest priority — if a contributed library has the same name as a built-in, the contributed version wins. This can cause subtle bugs if you have an outdated fork competing with the current built-in.
Managing, Updating & Removing Libraries
Checking Installed Libraries
In the Library Manager, filter by Type: Installed to see every library currently on your system. The version number is shown; a notification indicator (circle with an up-arrow) appears when a newer version is available in the index.
Updating Libraries
Click the version dropdown next to an installed library and select the newer version, then click Update. The old version is replaced. Note: updating a library can break sketches that rely on an older API — always check the library’s changelog before updating production projects.
To update all libraries at once in IDE 2.x, go to Sketch → Include Library → Update All Libraries (this option may not exist in all versions — check your IDE version).
Removing Libraries
The Library Manager does not offer a one-click remove button. To remove a library, navigate to your sketchbook’s libraries/ folder and delete the library folder manually. Restart the IDE afterward.
Resolving Library Conflicts
If two libraries define the same class or function name, the compiler will throw errors like “redefinition of class X”. Check if you have multiple copies of the same library in different locations. Use Sketch → Show Sketch Folder and inspect the IDE output for which library path is being compiled to identify duplicates.
Creating Your Own Arduino Library
Writing a library is not as daunting as it sounds. Any functionality you find yourself copy-pasting between sketches is a candidate for a library.
Minimum Library Structure
MyLibrary/
├── MyLibrary.h
├── MyLibrary.cpp
├── library.properties
└── examples/
└── BasicExample/
└── BasicExample.ino
Writing the Header File (MyLibrary.h)
#ifndef MyLibrary_h
#define MyLibrary_h
#include "Arduino.h"
class MyLibrary {
public:
MyLibrary(uint8_t pin);
void begin();
float readValue();
private:
uint8_t _pin;
};
#endif
The include guards (#ifndef / #define / #endif) prevent the header from being included twice in the same compilation unit — always include them.
Writing the Implementation File (MyLibrary.cpp)
#include "MyLibrary.h"
MyLibrary::MyLibrary(uint8_t pin) {
_pin = pin;
}
void MyLibrary::begin() {
pinMode(_pin, INPUT);
}
float MyLibrary::readValue() {
return analogRead(_pin) * (5.0 / 1023.0);
}
The library.properties File
name=MyLibrary
version=1.0.0
author=Your Name
maintainer=Your Name
sentence=One-line description.
paragraph=Extended description.
category=Sensors
url=https://github.com/yourname/MyLibrary
architectures=*
The architectures=* field means the library works on all platforms. Set it to avr, samd, or esp32 if it uses hardware-specific code.
Submitting to the Library Manager Index
Once your library is on GitHub with a valid library.properties, you can submit it to the Arduino Library Registry by opening an issue on the arduino/library-registry GitHub repository. After review, it appears in the Library Manager for every Arduino user worldwide.
Library Best Practices & Troubleshooting
Don’t Use delay() Inside Libraries
Libraries that call delay() block the entire CPU. Use a non-blocking approach with millis() timestamps instead, especially for sensor polling or communication timeouts. This makes your library composable with other code that also needs to run concurrently.
Use F() Macro for String Literals
String literals in library code consume SRAM on AVR boards. Wrap them in the F() macro to store them in flash: Serial.println(F("Library initialized"));. On a Uno with 2KB SRAM, this can make the difference between a stable sketch and random crashes.
Avoid Global Variables in Libraries
Global variables in a library pollute the user’s namespace and prevent instantiating multiple objects. Always encapsulate state in private class member variables.
Test on Multiple Boards
Compile your library for at least three target architectures (AVR Uno, SAMD Nano 33 IoT, ESP32) to catch platform-specific issues. Arduino IDE 2.x’s CLI mode makes this easy to automate in a CI pipeline.
Frequently Asked Questions
Why does the Library Manager show “no libraries found” for my search?
The Library Manager index may not have loaded yet. Check your internet connection and go to File → Preferences to confirm the Additional Boards Manager URLs are not blocking the library index download. If the IDE has never connected to the internet, the index file may be absent — deleting the IDE preferences folder and restarting forces a fresh index download.
Can I install two different versions of the same library?
Not easily. The IDE resolves libraries by folder name, and only one instance can exist in each library location. If you need two versions (e.g., for two different projects), use the Arduino CLI with project-local library directories, or manage projects in PlatformIO which supports per-project library versioning via platformio.ini.
My library compiles on Uno but fails on ESP32 — why?
The most common reasons: (1) The library uses AVR-specific registers or headers (avr/pgmspace.h, avr/io.h) directly. (2) It uses int type arithmetic assuming a 16-bit int (AVR), but ESP32 uses 32-bit ints. (3) It uses PROGMEM macros that have different or no equivalents on non-AVR platforms. Wrap platform-specific code in #ifdef ARDUINO_ARCH_AVR guards.
What is the difference between #include <Library.h> and #include “Library.h”?
Angle brackets (<>) tell the compiler to search system/IDE include paths first. Quotes ("") tell it to search the sketch’s local folder first, then fall back to system paths. For third-party libraries, both usually work, but using quotes is safer when you have a local copy that should take precedence.
How do I use a library that needs SPI or Wire without conflicts?
Both SPI and Wire are singleton objects — only one instance exists per bus. Libraries that use SPI or Wire are written to share the bus. Problems arise when two libraries configure the bus with different settings (clock speed, mode). Check each library’s documentation for its bus configuration and sequence your begin() calls to avoid conflicts. The library that calls SPI.begin() or Wire.begin() last wins the configuration.
Mastering Arduino libraries unlocks the full potential of the platform and dramatically reduces development time. Shop the complete Arduino range at zbotic.in Arduino & Microcontrollers — every board ships with the Arduino IDE fully compatible and the Library Manager ready to use from day one.
Add comment