Dos blocos ao código: o Python e o C++ por trás da IDE
Como cada cartão da IDE de blocos vira código, a diferença entre o setup e o loop do Arduino e o laço do MicroPython, e um exemplo lado a lado do mesmo programa do braço robótico em Python e em C++.

Cada cartão da IDE de blocos é uma instrução, e a IDE traduz a lista de cartões em código de verdade. O painel de código mostra essa tradução enquanto você monta. Este artigo explica como ela é feita, para quem quer entender o que vai para a placa e, um dia, escrever direto.
Duas formas de organizar um programa
No Arduino (C++), todo programa tem duas funções obrigatórias:
- setup() roda uma vez, quando a placa liga. É onde se diz que um pino é saída, onde se prende o servo ao pino.
- loop() roda de novo e de novo, para sempre. É o "repetir sempre" do robô.
No MicroPython (ESP32), o arquivo main.py roda de cima para baixo quando a placa liga. O que fica no começo é a preparação; o "repetir sempre" vira um laço while True.
A IDE faz essa separação sozinha: os cartões de preparação vão para o começo, e o que está dentro de "repetir sempre" vai para o laço.
O mesmo programa, nas duas linguagens
O programa: repetir sempre; o servo da base segue o joystick; se a distância for menor que 10 cm, apitar.
Em C++, para o Arduino Nano:
#include <Servo.h>
Servo servoBase;
long distanciaCm(int trig, int echo) {
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
long us = pulseIn(echo, HIGH, 30000);
return us == 0 ? 999 : us / 58;
}
void setup() {
servoBase.attach(3);
pinMode(7, OUTPUT);
pinMode(8, INPUT);
pinMode(10, OUTPUT);
}
void loop() {
servoBase.write(map(analogRead(A0), 0, 1023, 0, 180));
if (distanciaCm(7, 8) < 10) {
tone(10, 2000, 200);
delay(200);
}
delay(20);
}
Em MicroPython, para o ESP32:
from machine import Pin, PWM, ADC, time_pulse_us
import time
servo_base = PWM(Pin(13), freq=50)
joy_x = ADC(Pin(32))
joy_x.atten(ADC.ATTN_11DB)
trig = Pin(18, Pin.OUT)
echo = Pin(19, Pin.IN)
buzzer = PWM(Pin(23), freq=2000, duty_u16=0)
def angulo(servo, graus):
servo.duty_ns(500_000 + int(graus * 1_900_000 / 180))
def distancia_cm():
trig.on(); time.sleep_us(10); trig.off()
us = time_pulse_us(echo, 1, 30000)
return 999 if us < 0 else us / 58
while True:
angulo(servo_base, joy_x.read_u16() * 180 / 65535)
if distancia_cm() < 10:
buzzer.duty_u16(32768); time.sleep_ms(200); buzzer.duty_u16(0)
time.sleep_ms(20)
O código que a IDE gera pode ter outros nomes e detalhes, mas a estrutura é esta.
O que a tradução cuida por você
- Funções de apoio. Medir distância precisa de cinco linhas; o cartão é um só. A IDE escreve a função uma vez e a chama onde o cartão aparece.
- Preparação dos pinos. Cada pino usado num cartão ganha a sua preparação no começo, sem repetir.
- Conversões. Ângulo em graus vira largura de pulso; leitura do joystick vira ângulo; centímetros viram o limite da comparação.
- Uma pausa no laço. Os 20 ms no fim do laço dão tempo para o servo e evitam medir o ultrassônico mais rápido do que ele aguenta.
Por que mostrar o código
Ver o código ao lado dos cartões faz a ponte entre o bloco e o texto. "Se" vira if, "repetir sempre" vira loop ou while True, o número que você digitou aparece no lugar certo. Quem quer ir além pode copiar o código, abrir na Arduino IDE ou no Thonny e continuar a partir dali.
Monte o exemplo na IDE de blocos e troque a placa: o código ao lado muda de linguagem, e os cartões continuam os mesmos.
A IoTData faz o cadastro e o envio por você.
Um engenheiro nosso responde: qual rede chega até o poço, o que o IGAM ou a ANA vão pedir, quanto custa e quem cuida do cadastro de operador.