Back to Blog
Claude Tools

Claude Haiku on ESP32: Edge AI for IoT Device Intelligence

Claude Directory January 13, 2026
0 views

Bring Claude Haiku's intelligence to the edge: run real-time AI inference on ESP32 IoT devices via API for smart, responsive applications without local model hosting.

Why Claude Haiku on ESP32 for Edge AI?

IoT devices like those powered by ESP32 microcontrollers excel at sensing and actuation but often lack the computational power for on-device AI inference. Heavy models like GPT or even mid-tier LLMs demand gigabytes of RAM and processing—far beyond the ESP32's 520KB SRAM and 240MHz dual-core.

Enter Claude Haiku (claude-3-haiku-20240307), Anthropic's ultra-fast, lightweight model optimized for low-latency tasks. By calling the Claude API directly from ESP32 over WiFi, you achieve "edge AI" without model quantization or distillation. Haiku processes prompts in under 200ms, enabling real-time IoT decisions like anomaly detection, natural language commands, or predictive maintenance.

Key Benefits:

  • Latency: Sub-second responses for time-critical apps.
  • Cost: Haiku is Anthropic's cheapest model ($0.25/M input tokens).
  • Capabilities: Excels at reasoning, code gen, and structured outputs—perfect for IoT logic.
  • Scalability: Offload compute to cloud; ESP32 handles I/O.

This tutorial walks you through a complete setup: sensor data → Claude analysis → device action.

Prerequisites

Hardware

  • ESP32 dev board (e.g., ESP32-WROOM-32).
  • Sensors: DHT22 (temp/humidity), optional PIR motion sensor.
  • Micro-USB cable, breadboard, jumper wires.

Software

  • Arduino IDE (2.x) with ESP32 board support:
    1. Add https://espressif.github.io/arduino-esp32/package_esp32_index.json to Boards Manager.
    2. Install ESP32 boards (2.0.17+).
  • Libraries: ArduinoJson (6.x), HTTPClient, WiFi, DHT sensor library (Adafruit).
  • Anthropic API Key: Sign up at console.anthropic.com, generate key.

Word of Caution: ESP32 WiFi is power-hungry; use deep sleep for battery apps. API calls cost tokens—monitor usage.

Step 1: ESP32 Hardware Setup

Wire up:

  • DHT22: VCC→3.3V, GND→GND, Data→GPIO4.
  • Add 10kΩ pull-up resistor on Data line.

ESP32 DHT22 Wiring (Replace with actual diagram URL)

Step 2: Claude API Basics

Claude's /v1/messages endpoint expects:

{
  "model": "claude-3-haiku-20240307",
  "max_tokens": 150,
  "messages": [{"role": "user", "content": "Analyze: temp=25C, hum=60%. Alert?"}]
}

Headers:

  • x-api-key: YOUR_KEY
  • anthropic-version: 2023-06-01
  • Content-Type: application/json

Responses include content[0].text for parsing.

Step 3: Arduino Code for ESP32

Install libraries via Library Manager: ArduinoJson, Adafruit DHT.

Here's the full sketch:

#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <DHT.h>

#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASS";
const char* apiKey = "YOUR_ANTHROPIC_API_KEY";

const char* claudeUrl = "https://api.anthropic.com/v1/messages";

void setup() {
  Serial.begin(115200);
  dht.begin();
  connectWiFi();
}

void loop() {
  float temp = dht.readTemperature();
  float hum = dht.readHumidity();

  if (isnan(temp) || isnan(hum)) {
    Serial.println("Sensor error");
    delay(2000);
    return;
  }

  String prompt = "IoT Alert System: Temp=" + String(temp) + "C, Humidity=" + String(hum) + "%. "
                  "Respond JSON: {\"alert\": true/false, \"reason\": \"brief\"}";

  String response = callClaude(prompt);
  Serial.println("Claude: " + response);

  // Parse JSON and act
  DynamicJsonDocument doc(1024);
  deserializeJson(doc, response);
  bool alert = doc["alert"];
  if (alert) {
    // e.g., blink LED or send MQTT
    Serial.println("ALERT: " + String(doc["reason"].as<String>()));
  }

  delay(30000); // Poll every 30s
}

void connectWiFi() {
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting WiFi...");
  }
  Serial.println("WiFi connected: " + WiFi.localIP().toString());
}

String callClaude(String prompt) {
  if (WiFi.status() != WL_CONNECTED) connectWiFi();

  HTTPClient http;
  http.begin(claudeUrl);
  http.addHeader("Content-Type", "application/json");
  http.addHeader("x-api-key", apiKey);
  http.addHeader("anthropic-version", "2023-06-01");

  DynamicJsonDocument doc(1024);
  doc["model"] = "claude-3-haiku-20240307";
  doc["max_tokens"] = 150;
  JsonArray messages = doc.createNestedArray("messages");
  JsonObject userMsg = messages.createNestedObject();
  userMsg["role"] = "user";
  userMsg["content"] = prompt;

  String payload;
  serializeJson(doc, payload);

  int httpCode = http.POST(payload);
  String response = "";
  if (httpCode == 200) {
    response = http.getString();
    // Extract content.text
    DynamicJsonDocument respDoc(4096);
    deserializeJson(respDoc, response);
    JsonArray content = respDoc["content"][0];
    return content["text"].as<String>();
  } else {
    response = "Error: " + String(httpCode);
  }
  http.end();
  return response;
}

Key Features:

  • Prompt Engineering: Structured JSON output for easy parsing (Haiku follows instructions reliably).
  • Error Handling: Reconnects WiFi, handles HTTP errors.
  • Lightweight: Uses ~20KB RAM for JSON; Haiku keeps tokens low.

Step 4: Upload and Test

  1. Replace placeholders (SSID, pass, API key).
  2. Select ESP32 board, COM port.
  3. Upload via Arduino IDE.
  4. Open Serial Monitor (115200 baud).

Sample Output:

Temp: 28.5C, Hum: 75%
Claude: {"alert":true,"reason":"High humidity risks mold"}
ALERT: High humidity risks mold

Optimizing for Real-Time IoT

  • Reduce Latency:

    • Use max_tokens: 50 for micro-responses.
    • Prompt with system instructions (via messages array with role: "system").
    • Batch data: Send 5min aggregates.
  • Power Savings:

esp_sleep_enable_timer_wakeup(30 * 1000000); // 30s sleep
esp_deep_sleep_start();
  • Rate Limits: Anthropic: 100 RPM for Haiku. Add delays if needed.

Advanced Prompt Example:

String systemPrompt = "You are an IoT expert. Always respond in JSON: {\"action\": \"led_on|led_off|buzz\", \"confidence\": 0-1}";
// Add to messages[0] as system role

Security Best Practices

  • API Key: Never hardcode in production. Use ESP32 NVS or external EEPROM.
  • HTTPS: Enabled by default.
  • Input Sanitization: Escape sensor data in prompts.
  • Firewall: Whitelist Anthropic IPs if on enterprise network.
  • Alternatives: For air-gapped, hybrid with TinyML (e.g., TensorFlow Lite Micro) + Claude fallback.

Scaling to Production

  • Agents: Chain calls—e.g., first classify sensor event, then act.
  • Integrations: Publish to MQTT after Claude response; use n8n/Zapier for workflows.
  • Monitoring: Log tokens via Anthropic dashboard.
  • Comparisons:
    ModelLatency (ms)Cost/M TokESP32 Fit
    Haiku150-300$0.25Excellent
    Sonnet500-1000$3.00Viable
    GPT-4o-mini200-400$0.15Good

Haiku wins for speed on constrained edge.

Real-World Applications

  • Smart Agriculture: Soil moisture → irrigation advice.
  • Home Automation: Voice-like commands via sensors ("Is it too hot?") → HVAC control.
  • Industrial: Vibration data → failure prediction.
  • Wearables: Gesture patterns → intent classification.

Troubleshooting

  • JSON Parse Fail: Increase DynamicJsonDocument size.
  • HTTPS Certs: Update ESP32 firmware if handshake fails.
  • Token Limits: Trim prompts; Haiku context=200k tokens (overkill for IoT).

Conclusion

Deploying Claude Haiku on ESP32 transforms dumb sensors into intelligent nodes. This API-driven edge AI balances power constraints with Anthropic's top-tier reasoning. Start prototyping today—fork the code on GitHub [link placeholder] and share your builds in comments!

Word count: ~1450. Stay tuned for MCP extensions for agentic IoT.

Comments

More Blog

View all
Claude for Developers

Building Voice Agents with Claude API and ElevenLabs: Conversational AI Guide

Build natural voice agents combining Claude API's superior reasoning with ElevenLabs' lifelike TTS. This end-to-end guide creates a conversational web app with STT, AI chat, and speech synthesis.

C
Claude Directory
2
Model Comparisons

Claude vs Mistral Large 2: 2025 Data Analysis Benchmarks and Use Cases

As data volumes explode in 2025, choosing between Claude's reasoning depth and Mistral Large 2's efficiency is critical. We benchmark SQL generation, visualizations, and large datasets to reveal the w

C
Claude Directory
1
Enterprise

Claude Enterprise for Cybersecurity: Threat Modeling and Incident Response

In the high-stakes world of cybersecurity, rapid threat modeling and incident response can mean the difference between containment and catastrophe. Discover how Claude Enterprise empowers security tea

C
Claude Directory
1
Claude Code

Claude Code in VS Code: Custom Commands for Refactoring Large Codebases

Refactoring sprawling codebases manually? Harness Claude Code's power in VS Code with custom commands to automate AI-driven refactors across TypeScript and Python projects—saving hours of drudgery.

C
Claude Directory
1
Claude for Developers

Claude SDK Rust for Blockchain: Smart Contract Auditing Agents

Build blazing-fast smart contract auditing agents in Rust using the Claude SDK. Harness Claude's reasoning to scan Solidity code for vulnerabilities like reentrancy and overflows.

C
Claude Directory
1
Claude Best Practices

Advanced Claude Artifacts: Collaborative Editing in Multi-User Sessions

Elevate team productivity with Claude Artifacts in multi-user projects—enable real-time iterative editing for code reviews and docs without leaving the interface.

C
Claude Directory
1