Pular para o conteúdo

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
ModeloPara quê
firmatao StandardFirmata — é o que torna a placa controlável daqui
piscao "olá mundo": prova que gravar funcionou
sensorlê um analógico e escreve na serial, pronto para iot monitorar
ultrassomHC-SR04 — distância em centímetros
dhtDHT11/DHT22 — temperatura e umidade
wifi-mqttESP32 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 codigo

Uma 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.message

Gravar 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"