Arduino Bluetooth Camera (ABC): Smartphone per Bluetooth verbinden & Bilder aufnehmen
Komponenten und Zubehör
| Komponente | Menge |
|---|---|
| Arduino UNO | 1 |
| HC-05 Bluetooth-Modul (oder HC-06) | 1 |
| Kamera OV7670 (ohne FIFO, 20-polig) | 1 |
| Unique TFT Shield für Arduino (3,5″, 320×240, 65k Farben, Touch, microSD, RTC, BT-Stecker, Kamera-Stecker) | 1 |
Über das Projekt
Heutzutage hat jedes Smartphone eine Kamera. Mit Arduino und Bluetooth lassen sich Daten austauschen – aber Bilder? Der Arduino UNO ist zu langsam für große Datenmengen. Die Lösung: Ein spezielles TFT-Shield, das die „schwere“ Bildverarbeitung (JPEG-Encoding/Decoding, Kamera-Interface) übernimmt. Der Arduino fungiert nur als Steuerzentrale und Datendurchreiche.
Besonderheiten des Unique TFT Shield
- 3,5″ Diagonale, 320×240 Pixel, 65 536 Farben (16-bit)
- Resistiver Touchscreen (XPT2046)
- 5 Taster
- RTC DS1307 + CR1220 Pufferbatterie
- microSD-Kartenslot
- 4-poliger Stecker (2,54 mm) für HC-05/HC-06 oder ESP8266
- 20-poliger Stecker (2,54 mm) für OV7670 Kamera
Benötigte Komponenten

Hardware: Arduino UNO, Unique TFT Shield, 6–12 V Netzteil (>600 mA), OV7670 Kamera, HC-05/HC-06 Bluetooth, Android-Smartphone.
WICHTIG: USB liefert max. 500 mA – nicht genug für Shield + Kamera. Externes Netzteil (6–12 V) zwingend erforderlich!
Software: Arduino IDE, Library für Unique TFT Shield (GitHub), APK für Android (ArduinoTFT.apk).
Vorbereitung
Software (PC)
- Arduino IDE installieren (arduino.cc).
- YATFT-Library herunterladen, entpacken in
libraries-Ordner. - Arduino UNO ohne Shield per USB flashen (Bluetooth-Modul vorher abziehen!):
Sketch ArduinoBluetoothCamera.ino + Header ov7670_regs.h hochladen.
/**********************************************************************/
#include <YATFT.h>
#include <util/yacam.h>
#include <util/yacodec.h>
#include <util/yasrl.h>
#include "ov7670_regs.h"
JPEG_DECODE jpeg_decode;
YATFT tft(0);
INTRFC ifc;
CAM cam;
CODEC codec;
SRL srl;
#define IMG_SizeX 320
#define IMG_SizeY 240
uint8_t mode = 0, last_mode = 0, start_capt = 0;
uint16_t err;
void setup() {
Serial.begin(115200);
tft.begin(); tft.SetColor(BRIGHTRED); tft.ClearDevice();
}
void loop() {
if (Serial.available()) {
uint8_t temp = Serial.read();
switch (temp) {
case 0x10: // Single Photo Senden
mode = 1; start_capt = 1;
if (last_mode != mode && last_mode != 2) {
tft.begin(); tft.SetRGB();
cam.CamInit(&OV7670_QVGA[0][0]);
cam.CamVideoPreview(0, 0, 1, true);
codec.JPEGInit(); codec.JPEGSetRegs(IMG_SizeX, IMG_SizeY);
delay(1000);
}
break;
case 0x20: // Continuous Photo Senden
mode = 2; start_capt = 2;
if (last_mode != mode && last_mode != 1) {
tft.begin(); tft.SetRGB();
cam.CamInit(&OV7670_QVGA[0][0]);
cam.CamVideoPreview(0, 0, 1, true);
codec.JPEGInit(); codec.JPEGSetRegs(IMG_SizeX, IMG_SizeY);
}
break;
case 0x30: // Single Photo Empfangen
mode = 3; start_capt = 3;
if (last_mode != mode && last_mode != 4) { tft.begin(); tft.SetYUV(); }
break;
case 0x40: // Continuous Photo Empfangen
mode = 4; start_capt = 4;
if (last_mode != mode && last_mode != 3) { tft.begin(); tft.SetYUV(); }
break;
}
}
if (mode == 1) { if (start_capt == 1) { start_capt = 0; last_mode = mode; mode = 0; CamCapture(); } }
else if (mode == 2) {
while (1) {
uint8_t temp = Serial.read();
if (start_capt == 2) start_capt = 0;
if (temp == 0x21) { start_capt = 0; last_mode = mode; mode = 0; break; }
if (CamCapture()) continue;
}
}
else if (mode == 3) {
if (start_capt == 3) {
start_capt = 0; last_mode = mode; mode = 0;
Serial.print("!");
srl.JPEGReadFromSerial(&jpeg_decode, 0, 0, GetMaxX()+1, GetMaxY()+1, 32000);
}
}
else if (mode == 4) {
uint8_t temp = Serial.read();
while (1) {
if (start_capt == 4) start_capt = 0;
if (temp == 0x41) { start_capt = 0; last_mode = mode; mode = 0; break; }
Serial.print("!");
srl.JPEGReadFromSerial(&jpeg_decode, 0, 0, GetMaxX()+1, GetMaxY()+1, 32000);
}
}
}
uint8_t CamCapture(void) {
uint8_t temp = 0xff, temp_last = 0;
bool is_header = false;
uint32_t length = codec.JPEGStart();
uint32_t en_jpeg_address = ifc.rdReg32(0x414) << 2;
int k = 0;
if ((length >= 0x5FFFF) || (length == 0)) { start_capt = 2; return 1; }
temp = ifc.GetMem(en_jpeg_address + k); k++; length--;
while (length--) {
temp_last = temp;
temp = ifc.GetMem(en_jpeg_address + k); k++;
if (is_header) { Serial.write(temp); }
else if ((temp == 0xD8) && (temp_last == 0xFF)) { is_header = true; Serial.write(temp_last); Serial.write(temp); }
if ((temp == 0xD9) && (temp_last == 0xFF)) break;
}
is_header = false;
return 0;
}
ov7670_regs.h enthält die Register-Initialisierung für VGA (640×480) und QVGA (320×240) Modus.
Android
ArduinoTFT.apk installieren, Bluetooth- & Kamerazugriff erlauben. Update 07/2020: App funktioniert erst nach Erteilung der Kameraberechtigung.
Quellcode der App: ArduinoTFT.zip.h → umbenennen in .zip → entpacken.
Bluetooth-Modul konfigurieren
Baudrate auf 115200 setzen: AT+UART=115200,0,0. Anleitung z. B. Instructables.
ACHTUNG: Bluetooth-Modul nutzt Debug-Port (Pins 0/1) des Arduino UNO. Vor dem Flashen Bluetooth-Modul abziehen, danach wieder aufstecken!
Aufbau
- Arduino UNO + TFT-Shield verbinden.
- OV7670 Kamera in 20-poligen Stecker des Shields stecken (ggf. gewinkelter Adapter).
- HC-05/HC-06 in 4-poligen „Bluetooth“-Stecker des Shields stecken.
- 6–12 V Netzteil an Arduino UNO anschließen.
Nach Einschalten leuchtet der Bildschirm rot – Bereitschaft für Android-Befehle.








Demonstration






Android-App Bedienung:
- App
ArduinoTFTstarten, Handy querhalten. - Bluetooth aktivieren, Modul (HC-06) verbinden.
- Zwei Fenster + vier Buttons erscheinen:
- Rechts oben: Handy-Kamera-Vorschau
- Links groß: Empfangenes/gesendetes Bild
- Buttons:
- Einzelbild Handy → Arduino
- Kontinuierlich Handy → Arduino
- Einzelbild Arduino → Handy
- Kontinuierlich Arduino → Handy
Bildgröße: 320×240 Pixel (2–5 kB JPEG). Demo-Video im Originalprojekt.
Code / Library
YATFT Library: github.com/YATFT/YATFT
3D-Druck-Teile & Gehäuse
- Experiment: OV7670 + TV-Fernbedienung (IR-Test)
- Experiment: OV7670 + TV-Fernbedienung (Variante)


Weiterführende Artikel des Autors:
- Unique TFT Shield für Arduino Uno – Start
- Unique Arduino TFT Shield – OV7670 Cam
- TFT Shield für Arduino Nano – Start
- Fotos & RGB-Video auf TFT SPI Display
- Smartphone-Steuerung 4WD Roboter-Auto per Bluetooth
Update 01.04.2021: Aktualisierte Library für Shield-Serie (2 Shields + 2 Breakout-Boards) mit Unterstützung für MegaAVR & ESP32: github.com/Ekaburg/EkaTFT
Herstellungsprozess
- Entwicklung und Design moderner Kameras
- Kameraobjektive verstehen: Design, Geschichte und zukünftige Innovationen
- BrickPi Bookreader: Kindle-Lesen automatisieren mit Raspberry Pi und LEGO Mindstorms
- Bluetooth-gesteuerter Raspberry Pi Roboter mit Audio-Feedback bauen
- Bluetooth-gesteuerter Arduino Motorisierter Kameraschlitten für kinematische Aufnahmen
- LED per Bluetooth mit Arduino steuern – Einfache DIY-Anleitung
- Sprachgesteuerte Haushaltsgeräte: Bluetooth-Steuerung mit Google Assistant
- Tragbares Überwachungs-Roboter-System mit Raspberry Pi & Android-App
- Fortschrittliches Sturz-Erkennungssystem mit Arduino, Windows IoT & Azure Cloud
- Glühlampe per Arduino Uno, Relais & Android-App fernsteuern