iotdata, por Data Frontieriot
data
Programação em blocos

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++.

Engenharia Data Frontier· Publicado em 22 de outubro de 2026

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.

Na prática

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.