Hardware: a placa responde?
O que funciona com Arduino e ESP32, o que foi medido com a placa na mesa, e o que a linguagem não faz.
Responde — e esta página foi escrita com duas placas ligadas. A distinção que importa vem primeiro: *a linguagem fala com a placa, e não roda dentro dela.*
O modelo#
Você grava um firmware na placa uma vez. A partir daí ela deixa de ter um programa e passa a ter um protocolo: obedece. Quem decide é o computador, e o laço de trabalho passa a ser o dele — sem recompilar, sem regravar, sem esperar o upload.
$ dataforge iot portas
$ dataforge iot sketch firmata --em=/tmp/fw
$ dataforge iot carregar /tmp/fw/firmata --fqbn=arduino:renesas_uno:unor4wifi
$ dataforge iot piscar --pino=13 --vezes=5O que foi medido, com a placa na mesa#
| Placa | Pinos | Analógicos | Provado |
|---|---|---|---|
| Arduino UNO R4 WiFi | 20 | 6 | LED no 13, PWM no 9, A0 lendo ruído |
| ESP32-D0WD-V3 | 40 | 14 | LED no GPIO2, mapa de ADC completo |
arduino:avr:uno | 20 | 6 | compilação |
arduino:avr:mega | 70 | 16 | compilação |
Nada de tabela de pinos#
modo(13, "pwm") é recusado porque a placa disse que aquele pino não faz PWM — ela responde a pergunta de capacidade no handshake. Uma tabela escrita na linguagem envelheceria na primeira placa nova, e UNO, Mega e ESP32 têm mapas diferentes.
As duas armadilhas que mais custam tempo#
- Sem `relatar_analogico(canal)` a leitura é zero, calada. A placa envia sozinha, ela não responde perguntas — sem ligar o relatório,
analogico(0)devolve o valor inicial para sempre. - `escala` limita por padrão. O
map()do C não limita, e um ADC que devolve 1024 por ruído vira 101% num painel.
Sem placa, com o simulador#
IoT.conectar_simulada("uno") devolve uma placa que fala os mesmos bytes. Ela não é um dublê da API: é um dispositivo do outro lado do cabo, e por isso exercita o parser, a partição em sete bits e o sysex — que é onde estão os erros.
adopt Arcane.IoT as IoT
placa := IoT.conectar_simulada("uno")
placa.modo(13, "saida")
placa.escrever(13, 1)
assert placa.ler(13) is 1
assert placa.info()["firmware"]["nome"] is "DataForge"
out $"{placa.info()["pinos"]} pinos, sem placa nenhuma"