Sketches: C++ gerado e gravado
Seis modelos prontos, o arduino-cli por baixo, e o que a linguagem NÃO faz.
Firmata cobre o protótipo. O que precisa rodar sem computador — um sensor a bateria, um controle com resposta em microssegundos — é sketch: C++ na placa. A linguagem escreve o sketch e chama o arduino-cli para compilar e gravar.
dataforge
adopt Arcane.IoT as IoT
cycle nome in keys(IoT.sketches()):
out $"{nome}: {IoT.sketches()[nome]["descricao"]}"
assert len(IoT.sketches()) >= 6| Modelo | Para quê |
|---|---|
firmata | o StandardFirmata — é o que torna a placa controlável daqui |
pisca | o "olá mundo": prova que gravar funcionou |
sensor | lê um analógico e escreve na serial, pronto para iot monitorar |
ultrassom | HC-SR04 — distância em centímetros |
dht | DHT11/DHT22 — temperatura e umidade |
wifi-mqtt | ESP32 que publica leituras num broker MQTT |
As opções entram no código#
dataforge
adopt Arcane.IoT as IoT
codigo := IoT.sketch("pisca", {"led": 7, "intervalo": 120})
assert "const int LED = 7;" in codigo
assert "void setup()" in codigo and "void loop()" in codigoUma opção que não existe é recusada, e não ignorada — opcoes.ler de novo. Um --lde=7 que passa calado grava o sketch com o LED errado, e a pessoa vai procurar o defeito no fio:
dataforge
adopt Arcane.IoT as IoT
monitor:
IoT.sketch("pisca", {"lde": 7})
handle Error as e:
out e.messageGravar em disco, e depois na placa#
dataforge
adopt Arcane.IoT as IoT
adopt Arcane.OS as OS
adopt Arcane.IO as IO
pasta := $"{OS.temp_dir()}/df-doc-iot-{randint(100000, 999999)}"
caminho := IoT.gravar_sketch(pasta, "sensor", {"canal": 0, "velocidade": 9600})
assert "sensor.ino" in caminho
assert "Serial.begin(9600)" in IO.read(caminho)
IO.remove_tree(pasta)bash
$ dataforge iot carregar /tmp/fw/sensor --fqbn=arduino:avr:uno
gravado.
$ dataforge iot compilar /tmp/fw/sensor --fqbn=esp32:esp32:esp32
Sketch uses 265417 bytes (20%) of program storage space.
compilou.O que a linguagem não faz — e por quê#
IoT.compilar e IoT.carregar chamam o arduino-cli. Compilar C++ para AVR, resolver bibliotecas e falar com o bootloader é o que ele faz, e bem; reimplementar isso seria refazer o GCC e o avrdude. O projeto prefere dizer que depende dele a fingir que não:
dataforge
adopt Arcane.IoT as IoT
given IoT.tem_arduino_cli():
out "dá para compilar e gravar daqui"
otherwise:
out "instale: brew install arduino-cli"