# ESP32-CAM WiFi Manager Enhanced - Istruzioni Complete

## 📋 Panoramica del Progetto

Questo firmware avanzato per ESP32-CAM integra:
- **WiFi Manager** con portale web a 192.168.4.1
- **Streaming camera** ad alta qualità
- **Comunicazione UART** con Arduino Nano
- **Controllo LED NeoPixel** WS2812B
- **Protocollo EZB** completo per Synthiam ARC

## 🎯 Caratteristiche Principali

### ✅ Funzionalità WiFi
- Portale di configurazione automatico a **192.168.4.1**
- Scansione reti WiFi disponibili
- Salvataggio credenziali persistente
- Riconnessione automatica con 3 tentativi
- Fallback automatico alla modalità AP

### 📷 Funzionalità Camera
- Streaming video in tempo reale (porta 24)
- Compressione JPEG automatica adattiva
- Qualità immagine ottimizzata
- Compatibilità con Synthiam ARC

### 🤖 Comunicazione Arduino Nano
- UART bidirezionale (9600 baud)
- Controllo servo remoto (8 canali)
- Lettura sensori analogici (6 canali)
- Comandi digitali e PWM

### 💡 Controllo NeoPixel
- Supporto LED WS2812B (30 LED)
- Controllo colore individuale/globale
- Regolazione luminosità
- Comandi EZB personalizzati

## 🛠️ Requisiti Hardware

### ESP32-CAM
- **Modello**: AI-Thinker ESP32-CAM
- **Alimentazione**: 5V/2A (minimo 1A)
- **Antenna**: WiFi 2.4GHz collegata

### Arduino Nano
- **Modello**: Arduino Nano v3.0 o compatibile
- **Alimentazione**: 5V tramite USB o Vin
- **Connessioni**: 8 servo + 6 sensori analogici

### Componenti Aggiuntivi
- **Striscia LED**: NeoPixel WS2812B (30 LED)
- **Servo**: Fino a 8 servo standard
- **Sensori**: Fino a 6 sensori analogici
- **Cavi**: Jumper wire per collegamenti

## 📐 Schema Collegamenti Completo

### ESP32-CAM Pinout
```
                    ESP32-CAM AI-Thinker
                 ┌─────────────────────────┐
                 │                         │
                 │    ┌─────────────┐     │
                 │    │   CAMERA    │     │
                 │    │   OV2640    │     │
                 │    └─────────────┘     │
                 │                         │
    5V ──────────┤ 5V                  GND ├──── GND
    U0R ─────────┤ U0R                 U0T ├──── U0T
    GPIO0 ───────┤ IO0 (Programming)   IO2 ├──── LED Built-in
                 │                         │
    NeoPixel ────┤ IO12 (Data)        IO13 ├──── UART RX (da Nano)
                 │                         │
                 │ IO14               IO15 ├──── UART TX (a Nano)
                 │                         │
                 │ IO16               IO4  ├──── Flash LED
                 └─────────────────────────┘
```

### Collegamento Arduino Nano
```
Arduino Nano                    ESP32-CAM
┌─────────────────┐            ┌─────────────────┐
│                 │            │                 │
│ Pin 2 (RX) ●────┼────────────┼────● GPIO15 (TX)│
│                 │            │                 │
│ Pin 3 (TX) ●────┼────────────┼────● GPIO13 (RX)│
│                 │            │                 │
│ 5V         ●────┼─── Alimentazione comune ──────│
│ GND        ●────┼─── GND comune ──────────────── │
│                 │            │                 │
│ Pin 4-11   ●────┼──── Servo Motors             │
│ A0-A5      ●────┼──── Sensori Analogici        │
│ Pin 13     ●────┼──── LED Status               │
└─────────────────┘            └─────────────────┘
```

### Collegamento NeoPixel
```
NeoPixel WS2812B               ESP32-CAM
┌─────────────────┐            ┌─────────────────┐
│                 │            │                 │
│ VCC (5V)   ●────┼────────────┼────● 5V         │
│ GND        ●────┼────────────┼────● GND        │
│ DIN        ●────┼────────────┼────● GPIO12     │
│                 │            │                 │
└─────────────────┘            └─────────────────┘

Nota: Aggiungere resistenza 470Ω tra GPIO12 e DIN
      Aggiungere condensatore 1000µF tra VCC e GND
```

## ⚙️ Configurazione Arduino IDE

### 1. Installazione Board Package ESP32
```
File → Preferenze → URL aggiuntive:
https://dl.espressif.com/dl/package_esp32_index.json

Strumenti → Gestore schede → ESP32 by Espressif Systems
```

### 2. Librerie Richieste
Installare via **Strumenti → Gestione librerie**:
- **ESP32Servo** by Kevin Harrington
- **Adafruit NeoPixel** by Adafruit
- **Preferences** (inclusa)
- **WiFi** (inclusa)
- **WebServer** (inclusa)

### 3. Impostazioni Scheda ESP32-CAM
```
Scheda: "AI Thinker ESP32-CAM"
Upload Speed: "921600"
CPU Frequency: "240MHz (WiFi/BT)"
Flash Frequency: "80MHz"
Flash Mode: "QIO"
Flash Size: "4MB (32Mb)"
Partition Scheme: "Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS)"
Core Debug Level: "Nessuno"
```

### 4. Impostazioni Arduino Nano
```
Scheda: "Arduino Nano"
Processor: "ATmega328P (Old Bootloader)" o "ATmega328P"
Port: Seleziona porta COM corretta
```

## 🔧 Procedura di Installazione

### Passo 1: Preparazione Hardware
1. **Collegare ESP32-CAM** al programmatore FTDI
2. **Collegare GPIO0 a GND** (modalità programmazione)
3. **Alimentare con 5V** stabile
4. **Verificare antenna WiFi** collegata

### Passo 2: Upload Firmware ESP32-CAM
1. Aprire `ESP32-CAM-WiFiManager-Enhanced.ino`
2. Copiare `camera_pins.h` nella stessa cartella
3. Creare cartella `src` e aggiungere libreria OV2640
4. Selezionare impostazioni corrette
5. **Upload** del codice
6. **Scollegare GPIO0 da GND**
7. **Reset** del modulo

### Passo 3: Upload Codice Arduino Nano
1. Collegare Arduino Nano via USB
2. Aprire `Arduino_Nano_Code.ino`
3. Selezionare porta COM corretta
4. **Upload** del codice
5. Verificare LED di stato lampeggiante

### Passo 4: Collegamenti Hardware
1. **Collegare UART** tra ESP32-CAM e Nano
2. **Collegare NeoPixel** a GPIO12
3. **Collegare servo** ai pin 4-11 del Nano
4. **Collegare sensori** ai pin A0-A5 del Nano
5. **Verificare alimentazione** comune

## 🚀 Utilizzo del Sistema

### Prima Configurazione
1. **Accendere ESP32-CAM**
2. **Connettere** al WiFi: `ESP32-CAM-Config`
3. **Aprire browser**: `http://192.168.4.1`
4. **Inserire credenziali** WiFi
5. **Salvare e attendere** connessione

### Funzionalità Disponibili

#### 📡 Rete WiFi
- **AP Mode**: 192.168.4.1 (configurazione)
- **Client Mode**: IP assegnato dal router
- **Riconnessione**: Automatica con fallback

#### 📷 Camera Stream
- **Porta**: 24
- **Formato**: MJPEG
- **Risoluzione**: QVGA (320x240)
- **Compressione**: Automatica adattiva

#### 🎮 Controllo EZB (Porta 23)
- **Servo**: Comandi standard EZB
- **Digital I/O**: Pin virtuali
- **Analog**: Lettura ADC
- **UART**: Comunicazione bidirezionale

#### 💡 Comandi NeoPixel
```cpp
// Comandi personalizzati EZB
CmdNeoPixelSetColor     = 240  // Imposta colore pixel
CmdNeoPixelSetBrightness = 241  // Imposta luminosità
CmdNeoPixelClear        = 242  // Pulisci tutti i pixel
CmdNeoPixelShow         = 243  // Aggiorna display
```

#### 🤖 Protocollo Arduino Nano
```
Formato comandi UART:
SERVO:port:value     - Controllo servo (port 0-7, value 0-180)
DIGITAL:port:value   - Output digitale (port 0-7, value 0/1)
PWM:port:value       - Output PWM (port 0-7, value 0-100)
SENSOR:port          - Richiesta lettura sensore (port 0-5)
```

## 🔍 Monitoraggio e Debug

### Monitor Seriale ESP32-CAM (115200 baud)
```
=== ESP32-CAM Controller with WiFi Manager ===
Features: Camera + NeoPixel + UART + EZB Protocol
Camera initialized
NeoPixel initialized on GPIO12
UART initialized for Arduino Nano communication
RX: GPIO13, TX: GPIO15
Credenziali salvate trovate
SSID: MiaReteWiFi
Tentativo 1 di 3
Connessione a: MiaReteWiFi
✅ Connesso!
IP: 192.168.1.100
EZB Server started on port 23
Camera Server started on port 24
```

### Monitor Seriale Arduino Nano (9600 baud)
```
Arduino Nano - ESP32-CAM Slave Controller
Ready for commands...
Received: SERVO:0:90
Servo 0 attached to pin 4
Servo 0 moved to 90°
ACK:SERVO:0:90
```

## 🛠️ Troubleshooting

### ❌ Problemi Upload ESP32-CAM
**Sintomo**: "Failed to connect"
**Soluzione**:
- Verificare GPIO0 → GND durante upload
- Controllare cavi TX/RX
- Usare alimentazione 5V/2A
- Premere RESET prima upload

### ❌ Problemi WiFi
**Sintomo**: Non vede AP o non si connette
**Soluzione**:
- Attendere 30 secondi dopo boot
- Verificare rete 2.4GHz (non 5GHz)
- Controllare SSID/password case-sensitive
- Avvicinare al router

### ❌ Problemi Camera
**Sintomo**: Nessuna immagine
**Soluzione**:
- Verificare cavo flat camera
- Controllare alimentazione stabile
- Verificare porta 24 non bloccata
- Reset del modulo

### ❌ Problemi UART Nano
**Sintomo**: Nessuna comunicazione
**Soluzione**:
- Verificare collegamenti RX/TX
- Controllare baud rate (9600)
- Verificare alimentazione Nano
- Controllare LED status lampeggiante

### ❌ Problemi NeoPixel
**Sintomo**: LED non si accendono
**Soluzione**:
- Verificare alimentazione 5V
- Controllare resistenza 470Ω su data
- Verificare GPIO12 collegato a DIN
- Aggiungere condensatore 1000µF

## 📊 Specifiche Tecniche

### ESP32-CAM
- **CPU**: Dual-core Tensilica LX6 240MHz
- **RAM**: 520KB SRAM + 4MB PSRAM
- **Flash**: 4MB
- **WiFi**: 802.11 b/g/n 2.4GHz
- **Camera**: OV2640 2MP
- **GPIO**: 16 pin disponibili

### Arduino Nano
- **CPU**: ATmega328P 16MHz
- **RAM**: 2KB SRAM
- **Flash**: 32KB
- **GPIO**: 14 digital + 6 analog
- **PWM**: 6 canali
- **UART**: 1 hardware + software

### Prestazioni
- **Frame Rate**: 10-15 FPS (QVGA)
- **Latenza UART**: <10ms
- **Consumo**: 200-800mA (picco WiFi)
- **Range WiFi**: 50-100m (line of sight)

## 🔧 Personalizzazioni Avanzate

### Modifica Parametri WiFi
```cpp
#define CONFIG_AP_SSID "MioESP32-Setup"
#define CONFIG_AP_PASSWORD "miapassword"
#define MAX_CONNECTION_ATTEMPTS 5
```

### Modifica Configurazione NeoPixel
```cpp
#define NEOPIXEL_PIN 14           // Cambia pin
#define NEOPIXEL_COUNT 60         // Cambia numero LED
#define NEOPIXEL_BRIGHTNESS 100   // Cambia luminosità
```

### Modifica UART Nano
```cpp
#define NANO_UART_RX 16          // Cambia pin RX
#define NANO_UART_TX 17          // Cambia pin TX
#define NANO_UART_BAUD 19200     // Cambia baud rate
```

### Aggiunta Sensori Custom
Nel codice Arduino Nano, aggiungere:
```cpp
// Sensore temperatura DS18B20
#include <OneWire.h>
#include <DallasTemperature.h>

OneWire oneWire(12);
DallasTemperature sensors(&oneWire);

void sendTemperature() {
  sensors.requestTemperatures();
  float temp = sensors.getTempCByIndex(0);
  esp32Comm.println("TEMP:0:" + String(temp));
}
```

## 📋 Lista Componenti Completa

### Componenti Principali
- **1x ESP32-CAM AI-Thinker** (~15€)
- **1x Arduino Nano v3.0** (~8€)
- **1x Striscia LED NeoPixel 30 LED** (~12€)
- **8x Servo SG90** (~3€ ciascuno)
- **1x Programmatore FTDI USB-TTL** (~5€)

### Componenti Elettronici
- **1x Resistenza 470Ω** (per NeoPixel data)
- **1x Condensatore 1000µF 16V** (per NeoPixel power)
- **20x Jumper wire M-M** (~3€)
- **10x Jumper wire M-F** (~3€)
- **2x Breadboard 400 punti** (~5€)

### Sensori Opzionali
- **Sensore temperatura DS18B20** (~3€)
- **Sensore ultrasuoni HC-SR04** (~3€)
- **Potenziometri 10kΩ** (~1€ ciascuno)
- **Fotoresistenze LDR** (~1€ ciascuno)

### Alimentazione
- **Alimentatore 5V 3A** (~8€)
- **Connettori DC Jack** (~2€)
- **Cavi alimentazione** (~3€)

**Costo totale stimato: ~100-120€**

## 🎯 Progetti di Esempio

### Robot Umanoide Base
- **8 servo** per articolazioni
- **Camera** per visione
- **NeoPixel** per occhi/status
- **Sensori** per equilibrio

### Sistema Domotico
- **Camera** per sorveglianza
- **Servo** per tende/finestre
- **NeoPixel** per illuminazione
- **Sensori** ambientali

### Braccio Robotico
- **6 servo** per movimenti
- **Camera** per targeting
- **Sensori** per feedback
- **NeoPixel** per status

## 📞 Supporto e Risorse

### Link Utili
- **Synthiam ARC**: https://synthiam.com
- **ESP32 Docs**: https://docs.espressif.com
- **Arduino Reference**: https://www.arduino.cc/reference
- **NeoPixel Guide**: https://learn.adafruit.com/adafruit-neopixel-uberguide

### Community
- **Forum Synthiam**: https://synthiam.com/Community
- **Reddit ESP32**: r/esp32
- **Arduino Forum**: https://forum.arduino.cc

### Troubleshooting Avanzato
Per problemi complessi:
1. Abilitare debug seriale dettagliato
2. Controllare consumo corrente
3. Verificare integrità segnali con oscilloscopio
4. Testare componenti singolarmente

---

**Versione Firmware**: 1.2 Enhanced  
**Data**: Dicembre 2024  
**Compatibilità**: ESP32-CAM + Arduino Nano + NeoPixel WS2812B  
**Protocollo**: EZB compatibile Synthiam ARC