Comandos do Arduino: 36 cartões, C++ e MicroPython lado a lado
Comandos do Arduino na ordem de aprendizado: 18 cartões de pinMode a tone, os equivalentes em MicroPython, código lado a lado, um plano de 4 semanas e 8 erros comuns.
O jeito mais confiável de aprender os comandos do Arduino não é decorar uma lista longa, e sim passar por eles em ordem, cada um com um exemplo pequeno e um projeto real. O app BlueGrays tem um Guia de código exatamente para isso na seção Lições da aba Aprender: 18 cartões na trilha Arduino C++, de pinMode a tone, e 18 cartões na trilha MicroPython, de import a I2C, 36 cartões no total. Todo cartão segue o mesmo formato: Para que serve?, Por quê?, Sintaxe, Exemplo (com as abas Blocos, Arduino e MicroPython), Erro comum, Dica, Ver nos projetos e um Miniteste de duas perguntas. A ordem também é fixa: primeiro os pinos (pinMode, digitalWrite, digitalRead, analogRead, analogWrite), depois o tempo (delay, millis), em seguida variáveis, condições, laços e funções e, por fim, Serial, map, random e tone. Se você usa um Raspberry Pi Pico, aprende as mesmas ideias na trilha MicroPython com Pin, Pin.value, time.sleep, ADC.read_u16 e PWM.
Este post é um mapa do guia. Primeiro você vai ver o que tem dentro de um cartão e, depois, os 18 cartões de cada trilha na ordem real do app, com o equivalente na outra linguagem. Em seguida vêm três exemplos curtos que colocam lado a lado as versões em C++ e em MicroPython do mesmo programa, como funcionam o miniteste e o acompanhamento do progresso, uma ordem de aprendizado de 4 semanas, uma rotina diária de 20 minutos e os 8 erros mais comuns com esses comandos. Se você procura uma explicação detalhada de cada comando, o post Lista de comandos do Arduino com exemplos dedica uma seção a cada um; este post trata da ordem para aprendê-los e de como praticar.

Onde fica o Guia de código e como ele funciona?
Você abre o guia pela aba Aprender, na parte inferior: na seção Lições, no topo, toque no bloco Guia de código. Quando o guia abre, você vê duas abas no topo: Arduino C++ e MicroPython; o app lembra qual trilha você abriu por último. Abaixo das abas há um contador O que você aprendeu e uma linha Próximo cartão, para você nunca precisar procurar onde parou. Os cartões são agrupados por tema: Pinos, Tempo, Variáveis, Condições, Laços, Funções, Porta serial, Matemática e Som; a trilha MicroPython acrescenta Estrutura básica e Tratamento de erros. O Guia de código é grátis: você não precisa do Premium para ler os cartões, ver os exemplos ou resolver os minitestes. Os cartões estão disponíveis em 10 idiomas, então você lê as explicações no idioma em que usa o app.
O que tem dentro de um cartão?
Todo cartão usa o mesmo esqueleto, então, a partir do terceiro cartão, você já sabe exatamente onde olhar. A tabela abaixo mostra as seções usando o 7º cartão da trilha Arduino, millis; a coluna da direita é um resumo curto do que o cartão realmente diz. A própria ordem das seções é uma ordem de aprendizado: primeiro você ouve numa frase o que o comando faz, depois entende por que precisa dele com uma comparação do dia a dia, vê como ele é escrito, lê um exemplo que funciona, conhece a armadilha mais comum e se testa com duas perguntas.
| Seção | O que ela traz | No cartão millis |
|---|---|---|
| Para que serve? | A função do comando numa frase | Informa quantos milissegundos se passaram desde que a placa foi ligada. |
| Por quê? | Por que você precisa dele, com uma comparação do dia a dia | É como colocar um bolo no forno e olhar o relógio de vez em quando: você faz outras coisas enquanto espera. |
| Sintaxe | Como o comando é escrito | unsigned long now = millis(); (guarda o tempo atual) |
| Exemplo | Um programa curto que funciona; abas Blocos, Arduino e MicroPython | Código que inverte um LED a cada 500 ms; no Pico, o mesmo trabalho com time.ticks_ms |
| Erro comum | A armadilha em que os iniciantes mais caem | Armazenar millis num int: o número fica incorreto depois de uns 33 segundos. |
| Dica | Uma regrinha que facilita a vida | Sempre escreva a comparação como now - previous >= interval. |
| Ver nos projetos | Projetos que usam o comando, do mais fácil ao mais difícil | Mais de 50 projetos; a lista começa com um projeto grátis de botão com ESP32 |
| Miniteste | Duas perguntas, com uma explicação curta depois de cada resposta | O que millis() retorna? Em qual tipo você deve armazenar millis? |
A seção Exemplo abre na trilha do próprio cartão: num cartão de Arduino, a aba Arduino vem primeiro; num cartão de MicroPython, a aba MicroPython. Mas a outra aba está sempre lá também, e isso transforma o guia num dicionário. No cartão Pino de saída: Pin(15, Pin.OUT) da trilha MicroPython, por exemplo, a aba Arduino traz um código que faz o mesmo trabalho com pinMode e digitalWrite, e os comentários dizem qual linha corresponde a quê (como a linha que faz o papel de led.toggle()). Quase todo cartão tem também uma terceira aba, Blocos, que mostra o programa de exemplo em blocos. Se você está passando do Arduino para o Pico, o método mais rápido é este: abra um cartão que você já conhece, troque de aba e compare os dois programas linha por linha.
Trilha Arduino C++: 18 cartões e seus equivalentes em MicroPython
A tabela abaixo é a ordem real da trilha Arduino no app; a última coluna mostra como o mesmo trabalho é feito em MicroPython num Raspberry Pi Pico. Os números dos pinos são os mesmos dos exemplos dos cartões: para um LED, 13 ou 9 no Uno e GP15 no Pico; para um botão, 2 no Uno e GP14 no Pico; para leitura analógica, A0 no Uno e GP26 no Pico. Os cinco primeiros cartões cobrem os pinos, o 6 e o 7 cobrem o tempo, do 8 ao 14 vêm os fundamentos de programação e os quatro últimos cobrem a porta serial, a mudança de escala, os números aleatórios e o som. A ordem é proposital: primeiro você aprende como a placa toca o mundo lá fora e, depois, controla esses toques com variáveis, condições e laços.
| Nº | Cartão | Para que serve? | Equivalente em MicroPython |
|---|---|---|---|
| 1 | pinMode | Diz à placa se um pino é saída (LED, buzzer) ou entrada (botão, sensor) | Pin(15, Pin.OUT) · Pin(14, Pin.IN, Pin.PULL_UP) |
| 2 | digitalWrite | Liga (HIGH, 5 V) ou desliga (LOW, 0 V) um pino de saída | led.value(1) · led.on() (liga) · led.off() (desliga) |
| 3 | digitalRead | Lê se um pino de entrada está em HIGH ou LOW | button.value() → 1 ou 0 |
| 4 | analogRead | Converte a tensão em A0–A5 num número de 0 a 1023 | ADC(26).read_u16() → 0–65535 |
| 5 | analogWrite (PWM) | Diminui o brilho de um LED ou a velocidade de um motor com um valor de 0 a 255 num pino ~ | PWM(Pin(15)) · freq(1000) · duty_u16(0–65535) |
| 6 | delay | Pausa o código pelo número de milissegundos indicado | time.sleep(0.5) (segundos) · time.sleep_ms(500) (milissegundos) |
| 7 | millis | Milissegundos desde a inicialização; temporização sem parar o código | time.ticks_ms() · time.ticks_diff() |
| 8 | Variáveis e tipos | Guarda valores com tipos como int, float, bool, unsigned long | Não se escreve o tipo: count = 0, volts = 3.3 |
| 9 | if / else if / else | Executa códigos diferentes conforme uma condição | if / elif / else |
| 10 | Operadores de comparação e lógicos | Monta condições com ==, !=, <, >, &&, ||, ! | ==, !=, <, > · and, or, not |
| 11 | Laço for | Repete uma tarefa um número definido de vezes | for i in range(10): |
| 12 | Laço while | Repete enquanto uma condição for verdadeira | while condição: |
| 13 | Funções (void, parâmetros, return) | Divide o código em partes com nome, que podem ser reutilizadas | def blink(times): … return (função com parâmetro) |
| 14 | Arrays | Guarda em ordem, sob um único nome, valores do mesmo tipo | Lista: pins = [2, 3, 4] · len(pins) |
| 15 | Serial.begin / print / println (porta serial) | Envia textos e valores para o computador (Monitor Serial) | print(x) · f-string; não precisa de Serial.begin |
| 16 | map | Converte uma faixa de números em outra | Não há comando pronto: raw * 255 // 1023 ou uma função sua |
| 17 | random / randomSeed | Gera números aleatórios | import random · random.randint(1, 6) (número de 1 a 6) |
| 18 | tone / noTone | Toca num buzzer um som de frequência definida e o interrompe | PWM: freq(440) · duty_u16(32768); duty_u16(0) para silenciar |
Trilha MicroPython: 18 cartões e seus equivalentes em Arduino
A trilha MicroPython foi escrita pensando no Raspberry Pi Pico; os exemplos dos cartões são programas curtos que você pode rodar num Pico, por exemplo com o Thonny. A ordem é um pouco diferente da trilha Arduino, porque em Python você precisa primeiro se acostumar às regras da própria linguagem: adicionar módulos com import, imprimir com print e a regra da indentação e dos dois-pontos. A aba Arduino de cada cartão de MicroPython também traz a versão em C++ do mesmo programa, então, se você já conhece Arduino, pode ler a tabela da direita para a esquerda. Se é a primeira vez que você usa um Pico, o post O que é o Raspberry Pi Pico é uma boa preparação para a instalação e os pinos.
| Nº | Cartão | Para que serve? | Equivalente em Arduino |
|---|---|---|---|
| 1 | import e from … import | Adiciona ao programa módulos como machine e time | #include para bibliotecas; comandos básicos como pinMode e delay já vêm embutidos |
| 2 | print e f-strings | Imprime textos e valores no shell do Thonny | Serial.begin(9600) + Serial.println() |
| 3 | Pino de saída: Pin(15, Pin.OUT) | Transforma um pino GP em saída; value(), on(), off(), toggle() | pinMode(13, OUTPUT) + digitalWrite() |
| 4 | Pino de entrada: Pin.IN, PULL_UP, PULL_DOWN | Transforma um pino em entrada, escolhe o resistor interno e o lê com value() | pinMode(2, INPUT_PULLUP) + digitalRead() |
| 5 | time.sleep e sleep_ms | Pausa o programa em segundos ou milissegundos | delay() |
| 6 | while True: o loop infinito | Repete as linhas abaixo dele enquanto o Pico estiver ligado | loop() |
| 7 | Indentação e dois-pontos (:) | Define qual linha pertence a qual bloco | Chaves { } e ponto e vírgula ; |
| 8 | Variáveis: int, float, str, bool | Guarda valores; o tipo é definido automaticamente | int, float, String, bool (o tipo é declarado) |
| 9 | if / elif / else, and / or / not (condições) | Ramifica conforme uma condição e combina condições | if / else if / else · &&, ||, ! |
| 10 | for e range | Repete um número definido de vezes; range(0, 10) conta de 0 a 9 | for (int i = 0; i < 10; i++) |
| 11 | Listas: [ ], índice, len | Guarda vários valores em ordem; o primeiro item fica no índice 0 | Arrays: int pins[] = {2, 3, 4}; |
| 12 | def e return (funções) | Dá nome a um código reutilizável e devolve um resultado | Funções void ou com tipo, return |
| 13 | ADC: leitura analógica com read_u16 | Lê a tensão em GP26, GP27, GP28 como 0–65535 | analogRead() → 0–1023 |
| 14 | PWM: freq e duty_u16 | Diminui o brilho de um LED, toca notas num buzzer | analogWrite() e tone() |
| 15 | time.ticks_ms e ticks_diff | Mede o tempo decorrido sem parar o código | millis() |
| 16 | Pin.irq: botões com interrupções | Executa uma função no instante em que um botão é pressionado | attachInterrupt() |
| 17 | try / except (captura de erros) | Evita que o programa pare quando ocorre um erro | Não há equivalente comum no Arduino; você verifica os valores de retorno |
| 18 | I2C e scan() | Encontra os endereços dos dispositivos no barramento I2C | Wire.begin() + código de scanner I2C |
O mesmo programa em duas linguagens: 3 exemplos lado a lado
O primeiro exemplo é o “olá, mundo” de toda linguagem: piscar o LED da placa a cada meio segundo. No Uno, o LED integrado está ligado ao pino 13, então você não precisa montar nenhum circuito. O Pico é um pouco diferente: no Pico comum, o LED da placa fica no GP25, mas no Pico W o LED está ligado ao chip sem fio e Pin(25) não o acende. Por isso, escrever Pin("LED", Pin.OUT) em MicroPython é mais seguro; nas versões atuais do MicroPython, esse nome encontra o LED da placa tanto no Pico quanto no Pico W. Se o firmware da sua placa não reconhecer o nome “LED”, instale um MicroPython atual no Pico. O projeto grátis Piscar o LED integrado do Raspberry Pi Pico (Pico e Pico W) explica justamente essa diferença.
1// Örnek 1: dahili LED'i yakıp söndür / Example 1: blink the built-in LED
2void setup() {
3 pinMode(13, OUTPUT); // Uno'da dahili LED 13. pinde / built-in LED is on pin 13 on the Uno
4}
5
6void loop() {
7 digitalWrite(13, HIGH); // LED yanar / LED on
8 delay(500); // 500 ms bekle / wait 500 ms
9 digitalWrite(13, LOW); // LED söner / LED off
10 delay(500); // 500 ms bekle / wait 500 ms
11}1# Örnek 1: dahili LED'i yakıp söndür / Example 1: blink the onboard LED
2from machine import Pin
3import time
4
5led = Pin("LED", Pin.OUT) # Pico ve Pico W'de dahili LED / onboard LED on Pico and Pico W
6# Pin(25, Pin.OUT) yalnız düz Pico'da çalışır / Pin(25, Pin.OUT) works only on the plain Pico
7
8while True: # Arduino'daki loop() gibi / like loop() in Arduino
9 led.on() # LED yanar / LED on
10 time.sleep_ms(500) # 500 ms bekle / wait 500 ms
11 led.off() # LED söner / LED off
12 time.sleep_ms(500) # 500 ms bekle / wait 500 msO segundo exemplo acrescenta uma entrada: o LED fica aceso enquanto o botão está pressionado. O botão vai entre o pino 2 e o GND no Uno, e entre o GP14 e o GND no Pico. No Uno, usamos de novo o LED integrado do pino 13; no Pico, ligue um LED externo ao GP15 por um resistor de 220 Ω (a ferramenta Resistor para LED calcula esse valor para o seu LED). As duas linguagens ativam o resistor de pull-up interno: INPUT_PULLUP no Arduino, Pin.PULL_UP no MicroPython. Com essa ligação, a lógica fica invertida: pressionar o botão puxa o pino para o GND, então o Arduino lê LOW e o Pico lê 0. A pausa de 20 ms no final não resolve totalmente o repique mecânico do botão, mas reduz as oscilações muito curtas. Os detalhes da ligação do botão estão no post Como ligar um botão no Arduino.
1// Örnek 2: butona basılıyken LED yanar / Example 2: LED on while the button is pressed
2const int BUTTON_PIN = 2; // buton: 2. pin ile GND arasında / button between pin 2 and GND
3const int LED_PIN = 13; // dahili LED / built-in LED
4
5void setup() {
6 pinMode(BUTTON_PIN, INPUT_PULLUP); // iç pull-up direnci açık / internal pull-up on
7 pinMode(LED_PIN, OUTPUT);
8}
9
10void loop() {
11 if (digitalRead(BUTTON_PIN) == LOW) { // basılıyken LOW okunur / reads LOW while pressed
12 digitalWrite(LED_PIN, HIGH);
13 } else {
14 digitalWrite(LED_PIN, LOW);
15 }
16 delay(20); // kısa bekleme / short pause
17}1# Örnek 2: butona basılıyken LED yanar / Example 2: LED on while the button is pressed
2from machine import Pin
3import time
4
5button = Pin(14, Pin.IN, Pin.PULL_UP) # buton: GP14 ile GND arasında / button between GP14 and GND
6led = Pin(15, Pin.OUT) # LED: GP15 + 220 ohm direnç / LED on GP15 with 220 ohm
7
8while True:
9 if button.value() == 0: # basılıyken 0 okunur / reads 0 while pressed
10 led.value(1)
11 else:
12 led.value(0)
13 time.sleep_ms(20) # kısa bekleme / short pauseO terceiro exemplo mostra a diferença mais importante entre as duas linguagens: as faixas de números. O pino do meio do potenciômetro vai no A0 no Uno e no GP26 no Pico; os pinos das pontas vão no 5V e no GND no Uno, e no 3V3 (OUT) e no GND no Pico. O LED vai no pino 9 (marcado com ~) no Uno e no GP15 no Pico, cada um com um resistor de 220 Ω. No Arduino, analogRead retorna 0–1023, mas analogWrite espera 0–255, por isso map(raw, 0, 1023, 0, 255) fica no meio. No Pico, tanto read_u16 quanto duty_u16 usam 0–65535, então você pode passar a leitura direto para o PWM. Você vê como o PWM funciona no post O que é PWM e como acompanhar os valores ao vivo no guia do Monitor Serial.
1// Örnek 3: potansiyometreyle LED parlaklığı / Example 3: LED brightness with a potentiometer
2const int POT_PIN = A0; // potansiyometrenin orta ucu / potentiometer wiper
3const int LED_PIN = 9; // ~ işaretli PWM pini / PWM pin marked with ~
4
5void setup() {
6 pinMode(LED_PIN, OUTPUT);
7 Serial.begin(9600);
8}
9
10void loop() {
11 int raw = analogRead(POT_PIN); // 0-1023
12 int brightness = map(raw, 0, 1023, 0, 255); // 0-255 aralığına ölçekle / scale to 0-255
13 analogWrite(LED_PIN, brightness);
14 Serial.println(raw); // Seri Monitör'de izle / watch in the Serial Monitor
15 delay(50);
16}1# Örnek 3: potansiyometreyle LED parlaklığı / Example 3: LED brightness with a potentiometer
2from machine import Pin, ADC, PWM
3import time
4
5pot = ADC(26) # GP26 = ADC0, orta uç / wiper on GP26 (ADC0)
6led = PWM(Pin(15)) # LED: GP15 + 220 ohm direnç / LED on GP15 with 220 ohm
7led.freq(1000) # saniyede 1000 aç-kapa / 1000 cycles per second
8
9while True:
10 raw = pot.read_u16() # 0-65535
11 led.duty_u16(raw) # aynı aralık, ölçekleme gerekmez / same range, no scaling needed
12 print(raw) # Thonny kabuğunda izle / watch in the Thonny shell
13 time.sleep_ms(50)| Conceito | Arduino C++ | MicroPython (Pico) |
|---|---|---|
| Roda uma vez | void setup() { … } | As linhas antes de while True: |
| Repete para sempre | void loop() { … } | while True: e as linhas indentadas abaixo dele |
| Bloco de código | Chaves { } e ; no fim da linha | : no fim da linha e uma indentação de 4 espaços |
| Comentário | // comentário | # comentário |
| Pino de saída | pinMode(13, OUTPUT); digitalWrite(13, HIGH); | led = Pin(15, Pin.OUT) · led.value(1) (liga o LED) |
| Pino de entrada | pinMode(2, INPUT_PULLUP); digitalRead(2) | Pin(14, Pin.IN, Pin.PULL_UP) · button.value() |
| Leitura analógica | analogRead(A0) → 0–1023 | ADC(26).read_u16() → 0–65535 |
| Saída PWM | analogWrite(9, 0–255) | PWM(Pin(15)).duty_u16(0–65535) |
| Espera | delay(500) | time.sleep_ms(500) ou time.sleep(0.5) |
| Impressão | Serial.begin(9600); Serial.println(x); | print(x) |
Miniteste, “Concluir” e seu progresso em Meu nível
- Miniteste: todo cartão termina com duas perguntas, e o título mostra Miniteste · 1 / 2. Quando você toca numa opção, recebe na hora Correta. ou Incorreta. com uma explicação curta; você continua com Próxima pergunta.
- Pontuação: quando as duas perguntas terminam, você vê uma pontuação como 2 / 2 corretas. O cartão não pode ser concluído sem o teste; no lugar do botão aparece Resolva o miniteste para concluir este cartão.
- Concluir: depois do teste, aparece o botão Concluir e avançar (no último cartão de uma trilha, é só Concluir). Ao tocar nele, o cartão fica salvo como aprendido na sua conta, uma breve comemoração mostra seu progresso, como Muito bem! 5 / 18 cartões, e o próximo cartão se abre.
- Selo e contador: os cartões que você aprendeu mostram a marca Aprendido na lista, e o contador O que você aprendeu no topo do guia aumenta. Quando você termina todos os cartões de uma trilha, aparece Você aprendeu todos os cartões desta trilha.
- Meu nível: na tela Meu nível da seção Aprender, sob o título Guia de código e a nota Cartões que você já estudou, há duas barras separadas: Arduino C++ x/18 e MicroPython x/18. Essas barras contam só os cartões do guia de código.
- Uma regra honesta para você mesmo: o app não bloqueia você depois de uma resposta errada; o botão Concluir aparece assim que o teste termina. Então, antes de tocar nele, confira se você consegue explicar em voz alta por que as duas respostas estão corretas; se não conseguir, volte à seção Exemplo e leia o código linha por linha mais uma vez.
Ver nos projetos: encontrando o comando em código de verdade
O último passo para aprender um comando é reconhecê-lo num projeto que funciona, escrito por outra pessoa. A seção Ver nos projetos de um cartão mostra alguns projetos selecionados, com uma frase embaixo dizendo quantos projetos usam o comando no código; o link Todos abre a lista completa. A lista vai do mais fácil ao mais difícil e pode ser filtrada com Todos, Grátis e Premium. O millis, por exemplo, aparece no código de mais de 50 projetos: a lista começa com o grátis Controle de LED com botão no ESP32 (alternância), segue com projetos de Pico para iniciantes como Piano de botões com Raspberry Pi Pico (5 botões + buzzer + gravador de melodias) e Sensor de estacionamento com Raspberry Pi Pico (HC-SR04 + 3 LEDs + buzzer) e sobe até projetos intermediários como Raspberry Pi Pico: semáforo com 4 modos selecionados por botão (máquina de estados, GP11-13 + GP4), que combinam um botão com temporização. Nossa sugestão: abra um projeto grátis da lista, encontre o comando no código, mude um valor e preveja o resultado antes. Para ver o que cada linha do código faz, a aba Entenda o código do projeto é o próximo passo natural.
Ordem de aprendizado recomendada: um plano de 4 semanas
Vamos supor que você tenha uns 20 minutos por dia, 5 dias por semana. Para terminar uma trilha em 4 semanas, um cartão na maioria dos dias basta; nos outros dias, em vez de um cartão novo, você revisa e trabalha num projeto. Se você tem um Arduino, siga só a coluna do Arduino; se tem um Pico, a coluna do MicroPython. Se tem os dois, termine primeiro a trilha Arduino e passe para o MicroPython no segundo mês; os conceitos são os mesmos, então a segunda trilha vai bem mais rápido. Todos os projetos da tabela são grátis no BlueGrays. Se quiser um plano mais amplo, o roteiro de 30 dias do post App para aprender Arduino combina bem com esta tabela; se você dá aulas com o Pico, o plano de aula de Raspberry Pi Pico distribui os cartões de MicroPython em 6 semanas de aulas.
| Semana | Cartões de Arduino C++ | Cartões de MicroPython | Projetos grátis da semana | O que você consegue fazer no fim da semana |
|---|---|---|---|---|
| 1 | 1–5: pinMode, digitalWrite, digitalRead, analogRead, analogWrite | 1–5: import, print, pino de saída, pino de entrada, time.sleep | LED piscante, Controle de LED com botão (momentâneo); Pico: Piscar o LED integrado do Raspberry Pi Pico (Pico e Pico W) | Piscar um LED, ler um botão; no Arduino, ver um valor analógico |
| 2 | 6–10: delay, millis, variáveis, if / else, operadores | 6–9: while True, indentação, variáveis, if / elif / else | Luz noturna com LDR, Controle de LED com botão no ESP32 (alternância); Pico: Raspberry Pi Pico: dois LEDs alternados (padrão flip-flop, GP14 + GP13) | Tomar decisões com base numa leitura, controlar o tempo sem parar o programa |
| 3 | 11–14: for, while, funções, arrays | 10–13: for e range, listas, def, ADC | Efeito Knight Rider com LEDs, Sequencial de LEDs; Pico: Raspberry Pi Pico: semáforo (3 LEDs em sequência, GP11/GP12/GP13) | Pôr repetições em laços, pinos em arrays e tarefas em funções |
| 4 | 15–18: Serial, map, random e tone | 14–18: PWM, ticks_ms, Pin.irq, try / except e I2C | Uso do buzzer, Medição da intensidade da luz com LDR; Pico: Raspberry Pi Pico: semáforo com 4 modos selecionados por botão (máquina de estados, GP11-13 + GP4) | Imprimir valores, ajustar som e brilho, montar um projeto pequeno do zero |
Uma rotina diária de 20 minutos
- 3 minutos, aquecimento: resolva as Perguntas do dia na seção Aprender ou refaça o miniteste de ontem. O objetivo é conferir se você ainda lembra hoje do comando de ontem.
- 5 minutos, cartão novo: leia as seções Para que serve?, Por quê? e Sintaxe. Copie a sintaxe à mão no papel; escrevendo, fica mais difícil seus olhos pularem parênteses e pontos e vírgulas.
- 3 minutos, exemplo: explique o exemplo para si mesmo linha por linha e depois troque de aba. Num cartão de Arduino, olhe a aba MicroPython; num cartão de MicroPython, a aba Arduino, e compare as linhas que fazem o mesmo trabalho nos dois programas.
- 2 minutos, miniteste: responda às duas perguntas e leia a explicação das que errou. Dê mais uma olhada nas caixas Erro comum e Dica nesse momento.
- 6 minutos, projeto: abra um projeto grátis e fácil da lista Ver nos projetos, encontre o comando no código e mude um único valor: um tempo de espera, um número de pino ou um limite. Se o seu circuito estiver pronto, carregue na placa; se não, preveja o resultado e confira com Entenda o código.
- 1 minuto, anotação: escreva uma linha no caderno: o nome do comando, o significado dele numa frase e o equivalente na outra linguagem. No fim das quatro semanas, essa página é o seu próprio dicionário de comandos.
8 erros comuns com esses comandos
| Erro | Sintoma | Solução | Cartão |
|---|---|---|---|
| Esquecer o pinMode | O LED não acende de jeito nenhum ou fica muito fraco | Escreva pinMode(pino, OUTPUT) no setup(); no Pico, crie o pino com Pin(15, Pin.OUT) | pinMode · Pino de saída |
| Escrever = em vez de == numa condição | if (x = 5) é sempre verdadeiro, então o programa sempre executa o mesmo ramo | Use == para comparar; em Python, if x = 5 dá SyntaxError na hora | if / else · operadores |
| Travar o código com um delay longo | Você aperta o botão, mas a reação demora ou nunca vem | Faça a espera com millis; no Pico, use time.ticks_ms e ticks_diff | delay · millis · ticks_ms |
| Confundir a faixa do analogRead | Um limite copiado do Arduino nunca dispara no Pico | analogRead dá 0–1023 no Uno, read_u16 dá 0–65535 no Pico; recalcule o limite para a nova faixa | analogRead · ADC |
| Levar um valor de analogWrite para o duty_u16 | No Pico, duty_u16(255) deixa o LED quase apagado | duty_u16 espera 0–65535: meio brilho é 32768, brilho total é 65535 | analogWrite · PWM |
| Guardar millis num int | No Uno, a temporização falha depois de uns 33 segundos | Declare as variáveis de tempo como unsigned long e escreva a comparação como now - previous >= interval | millis |
| Esperar a lógica do INPUT_PULLUP ao contrário | Você espera HIGH ou 1 ao apertar o botão, mas recebe LOW ou 0 | Com pull-up, pressionado é LOW (0) e solto é HIGH (1) | digitalRead · Pino de entrada |
| Escrever sleep(500) no Pico | O Pico espera 500 segundos, mais de 8 minutos, em vez de meio segundo | sleep recebe segundos: escreva sleep(0.5) ou sleep_ms(500) | time.sleep |
A aba Blocos: entender um comando vendo-o

A aba Blocos permite ver o que um comando faz sem escrever código, principalmente nos primeiros cartões de uma trilha. Na imagem acima, pinMode vira o bloco “configurar pino 9 como SAÍDA”, digitalWrite vira “escrever ALTO no pino 9” e delay vira “aguardar 100 ms”; no cartão pinMode, uma nota abaixo da visualização em blocos também lista as opções do menu suspenso: SAÍDA, ENTRADA e ENTRADA (PULLUP). Os blocos aparecem no idioma do app e servem para leitura: no app você não arrasta blocos para escrever um programa, e a placa sempre recebe o código de verdade. O jeito sugerido de usá-los: primeiro preveja o que o programa vai fazer na aba Blocos, depois troque para a aba Arduino e descubra qual linha é cada bloco. Nos projetos que têm visualização em blocos, o botão Ver em blocos na página do projeto permite fazer a mesma comparação com um projeto inteiro; o básico está no post O que é programação em blocos.
Resumindo, você não precisa de uma lista longa para aprender os comandos do Arduino: bastam a ordem certa, um exemplo pequeno que funcione para cada comando, uma verificação de duas perguntas e um projeto real que use o comando. Se você começar hoje pelo cartão pinMode, em quatro semanas terá terminado os 18 cartões e visto com os próprios olhos cada comando em pelo menos um projeto; quando passar para o Pico, vai percorrer os mesmos conceitos na trilha MicroPython bem mais rápido. Se quiser experimentar os cartões e os projetos dentro deles, instale o BlueGrays no celular e abra o primeiro cartão na seção Aprender.
Perguntas frequentes
Quais são os comandos básicos do Arduino?
Os comandos do Arduino mais usados são os de pinos (pinMode, digitalWrite, digitalRead, analogRead, analogWrite), os de tempo (delay, millis), os da porta serial em Serial e auxiliares como map, random e tone. Junto com eles, estruturas de C++ como if, for e while, além das funções, formam o fluxo do programa. A trilha Arduino C++ do Guia de código do BlueGrays cobre esses temas em ordem, em 18 cartões.
Qual comando do Arduino devo aprender primeiro?
Comece com pinMode e digitalWrite, porque esses dois bastam para acender um LED e você vê o resultado na hora. Depois, acrescente a temporização com delay e a leitura de botão com digitalRead. analogRead, millis, if e for se apoiam todos nesses quatro comandos.
Qual é a diferença entre os comandos do Arduino e do MicroPython?
Os conceitos são os mesmos, a escrita é diferente: Pin(15, Pin.OUT) e led.value(1) substituem pinMode e digitalWrite, time.sleep_ms substitui delay e while True substitui loop(). As faixas de números também mudam: analogRead retorna 0–1023 no Uno, enquanto read_u16 retorna 0–65535 no Pico. Em Python, a indentação e os dois-pontos ocupam o lugar das chaves e dos pontos e vírgulas do C++.
Existe um comando delay no MicroPython?
Não existe um comando chamado delay; sleep (segundos), sleep_ms (milissegundos) e sleep_us (microssegundos), do módulo time, fazem o mesmo trabalho. O delay(500) do Arduino vira time.sleep_ms(500) ou time.sleep(0.5) no Pico. Para temporizar sem parar o código, time.ticks_ms e time.ticks_diff substituem o millis.
Em qual pino fica o LED da placa no Raspberry Pi Pico?
No Pico comum, o LED da placa está ligado ao GP25. No Pico W, o LED está ligado ao chip sem fio, então Pin(25) não o acende. Nas versões atuais do MicroPython, Pin("LED", Pin.OUT) encontra o LED da placa nas duas placas.
O Guia de código do BlueGrays é grátis?
Sim, o Guia de código é grátis: você pode ler os 36 cartões, ver os exemplos e resolver os minitestes. As listas Ver nos projetos dos cartões trazem projetos grátis e Premium; o filtro Grátis mostra só os grátis.
Projetos para montar depois desta leitura
Ver todos os projetos
LED piscante
O primeiro contato com a eletrônica: acender e apagar um único LED. O Arduino acende e apaga o LED em intervalos curtos, fazendo a luz piscar rapidamente. Você vê da forma mais simples como a placa co

Controle de LED com botão (momentâneo)
É como uma campainha: a luz fica acesa enquanto você pressiona o botão e apaga quando você solta. O Arduino monitora o botão continuamente; enquanto ele está pressionado, o LED fica aceso e apaga assi

Luz noturna com LDR
Uma pequena luz noturna que acende sozinha quando escurece e apaga ao amanhecer. Um sensor de luz mede a luminosidade do quarto, e o Arduino acende o LED quando está escuro o suficiente e apaga quando

Controle de LED com botão no ESP32 (alternância)
Cada vez que o botão é pressionado, o estado do LED muda: se estiver aceso, apaga; se estiver apagado, acende. É o padrão clássico de alternância. Com debounce, eliminamos o ruído mecânico dos contatos do botão para garantir uma única mudança a cada pressionamento.

Efeito Knight Rider com LEDs
O clássico efeito Knight Rider: um ponto de luz percorre seis LEDs de uma ponta à outra e depois volta. O Arduino acende cada LED por um décimo de segundo antes de passar para o próximo, muda de direç

Piscar o LED integrado do Raspberry Pi Pico (Pico e Pico W)
O primeiro projeto da série Raspberry Pi Pico! Fazemos o LED verde integrado piscar para verificar se a placa funciona — um primeiro experimento no estilo clássico "Hello World". SEM componentes externos, apenas o Pico e um cabo USB. O código foi escrito em MicroPython (a linguagem com suporte oficial da Raspberry Pi Foundation). Aprenda a usar a classe machine.Pin, o modo Pin.OUT, os métodos led.on()/off() e time.sleep() no Thonny IDE.

Raspberry Pi Pico: dois LEDs alternados (padrão flip-flop)
O próximo passo após um único LED no Pico: dois LEDs piscam alternadamente no clássico padrão flip-flop. Quando um apaga, o outro acende — o exemplo mais básico de coordenação entre vários GPIOs. Neste projeto, dois LEDs de cores diferentes (vermelho no GP14, verde no GP13) trocam de estado a cada 500ms. O método Pin.toggle() do MicroPython deixa o código curto e claro. Essa mesma lógica é a base de semáforos, luzes policiais, LEDs sequenciais e todas as animações com vários LEDs.

Raspberry Pi Pico: semáforo (3 LEDs em sequência)
Simulamos um semáforo real com LEDs vermelho, amarelo e verde — o primeiro projeto com 3 LEDs da série Pico! Verde por 4 segundos: "siga"; amarelo por 1,5 segundo: "prepare-se"; vermelho por 3 segundos: "pare"; e vermelho+amarelo por 1 segundo: "saída" (padrão de semáforo europeu). Aprenda definição de funções (def all_off()), lógica de máquina de estados (sequência) e sincronização de vários GPIOs.
Mais artigos
App BlueGrays
Monte este circuito passo a passo pelo celular
Esquema do circuito, código e lista de componentes em uma só tela. Mais de 200 projetos com Arduino, ESP32 e Pico prontos para montar.
Escaneie com seu celular
Aponte a câmera para o código para abrir a loja de aplicativos do seu celular.
ou abrir a loja

