DEV Community

Cover image for Built an AI Tool That Generates Wiring Diagrams and Code for Arduino Projects. Here's What I Learned.
Gal Ofel
Gal Ofel

Posted on

Built an AI Tool That Generates Wiring Diagrams and Code for Arduino Projects. Here's What I Learned.

I'm not an electrical engineer. But I kept wanting to build smart devices - a mosquito trap for the garden, a nightlight my kid controls with claps, a smart dog collar.

Every time, I'd hit the same wall: which components are compatible? What pins do I connect? What libraries do I need?

So I built Make-it - you describe a device in plain English and it generates:

  • A complete parts list with specs
  • A wiring diagram with pin assignments
  • Working Arduino/ESP32/Raspberry Pi code
  • A step-by-step build guide

The technical challenge

The hard part isn't generating code - any LLM can do that. The hard part is making the output actually buildable:

  • GPIO pin conflict detection across multiple sensors
  • Component compatibility validation (will this sensor work with this board?)
  • Correct library dependencies and imports
  • Pin assignments that match the physical wiring

A raw LLM will confidently tell you to connect a sensor to a pin that doesn't support analog input. The domain layer on top catches that.

Real-world testing

I've been dogfooding by posting actual builds on Reddit:

  • An automated mosquito trap hit 339K views and #1 on r/homeautomation
  • A clap-activated nightlight for kids got 25K views on r/arduino
  • People are actually ordering parts and building these projects

What's next

I'm working on multi-board communication (Arduino + RPi over serial), better PCB-level layouts, and eventually simulation.

Would love feedback from anyone who's tried using AI for hardware projects. What works? What breaks?

Try it here

Top comments (2)

Collapse
 
professor_marcoscosta_a8 profile image
Professor Marcos Costa

include

// Biblioteca que permite criar uma porta serial virtual
// (necessária para comunicação com o módulo Bluetooth HC-05)

// ==========================
// CONFIGURAÇÃO DO BLUETOOTH
// ==========================

// HC-05 TX -> pino 2 do Arduino (recebe dados)
// HC-05 RX -> pino 3 do Arduino (envia dados)
SoftwareSerial bluetooth(2, 3);

// ==========================
// DEFINIÇÃO DOS PINOS DOS MOTORES
// ==========================

// Motor esquerdo

define PINO_IN1 5 // Movimento para frente

define PINO_IN2 6 // Movimento para trás

// Motor direito

define PINO_IN3 9 // Movimento para frente

define PINO_IN4 10 // Movimento para trás

// ==========================
// VELOCIDADE FIXA
// ==========================

// Valor PWM de 0 a 255
// 180 representa uma velocidade média/alta
const int VELOCIDADE = 180;

// ==========================
// CONFIGURAÇÃO INICIAL
// ==========================
void setup() {

// Define os pinos dos motores como saída
pinMode(PINO_IN1, OUTPUT);
pinMode(PINO_IN2, OUTPUT);
pinMode(PINO_IN3, OUTPUT);
pinMode(PINO_IN4, OUTPUT);

// Inicializa comunicação serial (monitor)
Serial.begin(9600);

// Inicializa comunicação com Bluetooth
bluetooth.begin(9600);

Serial.println("Carrinho Bluetooth pronto");

// Garante que o carrinho inicia parado
parar();
}

// ==========================
// FUNÇÃO: PARAR O CARRINHO
// ==========================
void parar() {

// Zera o PWM de todos os motores
// Isso faz o carrinho parar completamente
analogWrite(PINO_IN1, 0);
analogWrite(PINO_IN2, 0);
analogWrite(PINO_IN3, 0);
analogWrite(PINO_IN4, 0);
}

// ==========================
// FUNÇÃO: MOVIMENTO PARA FRENTE
// ==========================
void frente() {

// Ativa os dois motores para frente
analogWrite(PINO_IN3, VELOCIDADE); // Motor direito frente
analogWrite(PINO_IN1, VELOCIDADE); // Motor esquerdo frente

// Garante que o sentido contrário está desligado
digitalWrite(PINO_IN4, LOW);
digitalWrite(PINO_IN2, LOW);
}

// ==========================
// FUNÇÃO: MOVIMENTO PARA TRÁS
// ==========================
void tras() {

// Ativa os dois motores para trás
analogWrite(PINO_IN4, VELOCIDADE); // Motor direito trás
analogWrite(PINO_IN2, VELOCIDADE); // Motor esquerdo trás

// Desliga o sentido contrário
digitalWrite(PINO_IN3, LOW);
digitalWrite(PINO_IN1, LOW);
}

// ==========================
// FUNÇÃO: VIRAR PARA ESQUERDA
// ==========================
void esquerda() {

// Motor esquerdo vai para trás
// Motor direito vai para frente
// Isso faz o carrinho girar para esquerda
analogWrite(PINO_IN4, VELOCIDADE);
analogWrite(PINO_IN1, VELOCIDADE);

// Desliga os outros sentidos
digitalWrite(PINO_IN3, LOW);
digitalWrite(PINO_IN2, LOW);
}

// ==========================
// FUNÇÃO: VIRAR PARA DIREITA
// ==========================
void direita() {

// Motor esquerdo vai para frente
// Motor direito vai para trás
// Isso faz o carrinho girar para direita
analogWrite(PINO_IN3, VELOCIDADE);
analogWrite(PINO_IN2, VELOCIDADE);

// Desliga os outros sentidos
digitalWrite(PINO_IN4, LOW);
digitalWrite(PINO_IN1, LOW);
}

// ==========================
// LOOP PRINCIPAL
// ==========================
void loop() {

// Verifica se chegou algum dado via Bluetooth
if (bluetooth.available() > 0) {

// Lê o caractere recebido
char comando = bluetooth.read();

// Mostra no monitor serial (debug)
Serial.print("Comando recebido: ");
Serial.println(comando);

// ==========================
// CONTROLE DE MOVIMENTO
// ==========================

if (comando == 'F' || comando == 'f') {
  frente(); // Move para frente
}
else if (comando == 'B' || comando == 'b') {
  tras(); // Move para trás
}
else if (comando == 'L' || comando == 'l') {
  esquerda(); // Vira para esquerda
}
else if (comando == 'R' || comando == 'r') {
  direita(); // Vira para direita
}
else if (comando == 'S' || comando == 's') {
  parar(); // Para o carrinho
}
Enter fullscreen mode Exit fullscreen mode

}
}

Collapse
 
nirit_altony profile image
Nirit Altony

Nicely done!