The Arduino Uno R3 has been the default "first board" for over a decade, and it's still a genuinely reasonable choice in 2026 -- not because nothing better exists, but because its entire ecosystem (tutorials, libraries, forum answers, shields) is built around exactly this board. This guide is the complete first-project path: what's actually on the board, installing the software, uploading your first sketch, and reading your first input.
What's Actually on the Board
| Feature | Detail |
|---|---|
| Microcontroller | ATmega328P |
| Clock speed | 16 MHz |
| Flash memory | 32 KB (about 0.5 KB used by the bootloader) |
| RAM | 2 KB |
| Digital I/O pins | 14 (6 support PWM, marked with ~) |
| Analog input pins | 6 (A0-A5, 10-bit resolution) |
| Operating logic | 5V |
| Power input | USB, or 7-12V via barrel jack/Vin |
That 2 KB of RAM is worth internalizing early -- it's small enough that a sketch juggling several String objects or a large array can genuinely run out of memory, producing strange, hard-to-diagnose crashes rather than a clear error.
Installing the Arduino IDE
- Download the Arduino IDE (2.x) from arduino.cc/en/software
- Plug in the Uno via USB
- Tools > Board > Arduino Uno
- Tools > Port -- select the port that appears once the board is connected
If no port shows up on Windows with a clone/third-party board, it very likely uses a CH340 USB chip rather than the genuine board's ATmega16U2, and needs its own driver installed separately -- searching "CH340 driver" for your OS resolves this in nearly every case.
Your First Sketch: Blink
void setup() {
pinMode(LED_BUILTIN, OUTPUT); // the Uno has an onboard LED on pin 13
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
}
setup() runs exactly once at power-on or reset; loop() runs repeatedly, forever, immediately after. Nearly every Arduino sketch, no matter how complex, is structured around these same two functions -- setup() for one-time configuration, loop() for anything that happens continuously or repeatedly.
Reading a Button
const int BUTTON_PIN = 2;
void setup() {
Serial.begin(9600);
pinMode(BUTTON_PIN, INPUT_PULLUP); // no external resistor needed
}
void loop() {
if (digitalRead(BUTTON_PIN) == LOW) { // pressed pulls the pin LOW
Serial.println("Button pressed");
}
delay(50);
}
INPUT_PULLUP enables the ATmega328P's built-in pull-up resistor, meaning the pin reads HIGH by default and drops to LOW when a button wired between the pin and ground is pressed -- this is why the logic above checks for LOW, not HIGH, and it avoids needing an external resistor at all for the simplest button wiring.
Reading an Analog Value
const int POT_PIN = A0;
void setup() {
Serial.begin(9600);
}
void loop() {
int value = analogRead(POT_PIN); // 0-1023, since the ADC is 10-bit
Serial.println(value);
delay(100);
}
The Uno's ADC reports a 10-bit value (0-1023) representing the voltage on the pin relative to 5V -- a potentiometer wired between 5V and ground, with its wiper on A0, is the standard first way to see this in action, since turning the knob visibly moves the printed number across its full range.
The Serial Monitor
Serial.begin(9600) opens a communication channel over USB, and Serial.println() sends text back to your computer -- open it with Tools > Serial Monitor (or the magnifying-glass icon), matching the baud rate to whatever was passed into Serial.begin(). This is the single most useful debugging tool for a beginner project: printing sensor values, button states, or just "got here" markers is usually faster than reasoning through code silently.
Common Mistakes
Wrong board or port selected. The sketch will fail to upload, usually with an error mentioning the programmer or port -- double-check both under the Tools menu first.
Forgetting pinMode(). A pin defaults to INPUT mode; calling digitalWrite() on a pin never set to OUTPUT won't behave as expected.
No common ground with external power. If a project uses a separate supply for anything (motors, some sensors), that supply's ground must be tied to the Arduino's ground, or nothing will read or drive correctly, even if voltages otherwise look right.
Exceeding a pin's current limit. Roughly 20 mA per pin is the safe sustained draw -- driving an LED without a resistor, or anything more current-hungry, risks damaging the pin or the whole chip.
Assuming every module is 5V-safe. The Uno is a 5V board, but plenty of modern sensor breakouts are 3.3V logic -- check a module's datasheet before wiring it directly.
Where to Go Next
From here, Mastering PWM on Arduino is a natural next step for anything involving dimming or motor speed, and Arduino Uno Power Options is worth reading before taking a project off the USB cable and into a standalone enclosure.