ESP32 Bluetooth – ohjaa LEDiä puhelimella BLE:n avulla
Haluatko ohjata elektroniikkaa suoraan puhelimellasi – ilman Wi-Fi-verkkoa tai monimutkaisia verkkoasetuksia? ESP32 bluetooth -teknologia, erityisesti Bluetooth Low Energy (BLE), tekee siitä yllättävän helppoa. Tässä tutoriaalissa rakennamme projektin, jossa ohjaat LEDiä puhelimella ESP32-mikrokontrollerin ja BLE:n avulla. Tarvitset vain ESP32-kehitysalustan, LEDin, vastuksen ja ilmaisen puhelinsovelluksen.
ESP32 bluetooth -ohjaus on erinomainen tapa aloittaa IoT-projektit, koska BLE ei vaadi Wi-Fi-reititintä eikä monimutkaista verkkoasetusta. Puhelin yhdistetään suoraan ESP32:een, ja komennot kulkevat välittömästi. Tämä on täydellinen ratkaisu esimerkiksi kotiautomaation prototyyppeihin, robottien ohjaukseen tai yksinkertaisiin IoT bluetooth -sovelluksiin.
Sisällysluettelo
Mitä on Bluetooth Low Energy (BLE)?
Bluetooth Low Energy eli BLE on Bluetooth 4.0 -standardissa esitelty energiatehokas tiedonsiirtoprotokolla. Perinteiseen Bluetooth Classiciin verrattuna BLE kuluttaa jopa 100 kertaa vähemmän virtaa, mikä tekee siitä ihanteellisen IoT-laitteille ja pienille ohjauskomentoja lähettäville sovelluksille.
BLE:n keskeiset ominaisuudet:
- Erittäin matala virrankulutus: huippuvirta alle 15 mA (Classic BT ~30 mA)
- Nopea yhteydenmuodostus: datan lähetys vain 3 ms (Classic BT ~100 ms)
- Kantama: noin 10–50 metriä suoralla näköyhteydellä
- Tiedonsiirtonopeus: 1 Mbps – riittää hyvin ohjauskomentoja varten
- Toimintataajuus: 2,4 GHz ISM-kaista, 40 kanavaa
BLE käyttää palvelin/asiakas-mallia (server/client). ESP32 toimii palvelimena (peripheral), joka mainostaa läsnäoloaan ja tarjoaa dataa. Puhelin toimii asiakkaana (central), joka skannaa, yhdistää ja lähettää komentoja. Tietorakenne perustuu GATT-profiiliin (Generic Attribute Profile), jossa data järjestetään hierarkkisesti: palvelu (service) → ominaisuus (characteristic). Jokainen palvelu ja ominaisuus tunnistetaan yksilöllisellä UUID-tunnisteella.
Tarvittavat komponentit
Tähän ESP32 BLE -projektiin tarvitset seuraavat komponentit:

- ESP32 DevKitC (WROOM-32) – Protocachen ESP32-kehitysalusta (21,90 €). Huomaa, että kyseessä on itse asiassa ESP32-C6-DevKitC-1, joka tukee Bluetooth 5.3 LE:tä, Wi-Fi 6:ta ja Zigbee 3.0:aa. ESP32-C6 tukee ainoastaan BLE:tä (ei Bluetooth Classicia), mikä sopii tähän projektiin täydellisesti.
- LED – mikä tahansa 3 mm tai 5 mm LED (punainen, vihreä, sininen…)
- 220 Ω vastus – rajoittaa LEDin virtaa
- Hyppylangat – kytkentöjä varten (esim. Dupont-hyppylangat 30 cm uros-uros)
- Koekytkentälevy (breadboard) – valinnainen mutta suositeltava
- USB-C-kaapeli – ohjelmointia ja virransyöttöä varten
- Älypuhelin – Android tai iOS, nRF Connect -sovelluksella
Vinkki: Jos haluat testata ilman ulkoista LEDiä, ESP32-C6-kehitysalustassa on sisäänrakennettu WS2812B RGB-LED GPIO8-pinnissä. Tässä tutoriaalissa käytämme kuitenkin ulkoista LEDiä GPIO2-pinnissä, koska se on yksinkertaisempi ja opettavaisempi.
Kytkentäohje

Kytkentä on hyvin yksinkertainen. Tarvitset vain kolme johtoa:
- ESP32-C6 GPIO2 → 220 Ω vastus → LEDin anodi (pidempi jalka, +)
- LEDin katodi (lyhyempi jalka, −) → ESP32-C6:n GND-pinni
Miksi GPIO2? ESP32-C6:ssa GPIO2 on niin sanottu ”turvallinen” pinni – se ei ole strapping-pinni eikä sillä ole muita erikoistoimintoja käynnistyksen aikana. Vältä GPIO4, 5, 8, 9 ja 15 (strapping-pinnit) sekä GPIO12/13 (USB) ja GPIO16/17 (UART-sarjaportti).
Tärkeää: ESP32-C6:n GPIO-pinnit toimivat 3,3 V jännitteellä. Älä kytke 5 V laitteita suoraan GPIO-pinneihin.
Arduino IDE -asennus ESP32-C6:lle
Ennen koodin lataamista sinun täytyy asentaa ESP32-tuki Arduino IDE:hen:
- Avaa Arduino IDE ja mene File → Preferences
- Lisää ”Additional Board Manager URLs” -kenttään:
https://espressif.github.io/arduino-esp32/package_esp32_index.json - Mene Tools → Board → Boards Manager, hae ”esp32” ja asenna ”esp32 by Espressif Systems”
- Valitse kortiksi ”ESP32C6 Dev Module” (Tools → Board)
- Valitse oikea USB-portti (Tools → Port)
- Aseta Upload Speed: 921600
Kaikki tässä projektissa käytettävät BLE-kirjastot (BLEDevice, BLEServer, BLEUtils, BLE2902) tulevat ESP32 Arduino -ytimen mukana – erillistä kirjastoasennusta ei tarvita.
Arduino-koodi: BLE LED -ohjaus
Tässä on valmis ESP32 bluetooth -koodi, joka luo BLE-palvelimen ja odottaa puhelimelta ”ON”- tai ”OFF”-komentoja LEDin ohjaamiseksi:
/*
* ESP32 BLE LED Control
* Ohjaa LEDiä Bluetooth Low Energyn avulla puhelimella
* Käytä nRF Connect -sovellusta komentojen lähettämiseen
*
* Toimii: ESP32-C6, ESP32-S3, ESP32-C3 ja alkuperäinen ESP32
*/
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
// LED-pinni: GPIO2 ulkoiselle LEDille
#define LED_PIN 2
// Yksilölliset UUID-tunnisteet palvelulle ja ominaisuudelle
// Luo omat osoitteessa https://www.uuidgenerator.net/
#define SERVICE_UUID "12345678-1234-1234-1234-123456789abc"
#define CHARACTERISTIC_UUID "abcdefab-1234-1234-1234-abcdefabcdef"
BLEServer* pServer = NULL;
BLECharacteristic* pCharacteristic = NULL;
bool deviceConnected = false;
bool oldDeviceConnected = false;
// Palvelimen callback-luokka: seuraa yhteyden tilaa
class MyServerCallbacks : public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
deviceConnected = true;
Serial.println("Asiakas yhdistetty!");
}
void onDisconnect(BLEServer* pServer) {
deviceConnected = false;
Serial.println("Asiakas katkaisi yhteyden!");
}
};
// Ominaisuuden callback-luokka: käsittelee kirjoituskomennot
class MyCharacteristicCallbacks : public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic* pCharacteristic) {
String value = pCharacteristic->getValue();
if (value.length() > 0) {
Serial.print("Vastaanotettu: ");
Serial.println(value);
// Muunna isoiksi kirjaimiksi vertailua varten
value.toUpperCase();
if (value == "ON" || value == "1") {
digitalWrite(LED_PIN, HIGH);
Serial.println("LED PÄÄLLÄ");
} else if (value == "OFF" || value == "0") {
digitalWrite(LED_PIN, LOW);
Serial.println("LED POIS");
}
}
}
};
void setup() {
Serial.begin(115200);
Serial.println("Käynnistetään BLE LED -ohjaus...");
// Aseta LED-pinni ulostuloksi
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
// 1. Luo BLE-laite nimellä
BLEDevice::init("ESP32-LED");
// 2. Luo BLE-palvelin
pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
// 3. Luo BLE-palvelu UUID:lla
BLEService* pService = pServer->createService(SERVICE_UUID);
// 4. Luo ominaisuus: luku + kirjoitus + ilmoitukset
pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE |
BLECharacteristic::PROPERTY_NOTIFY
);
// Lisää BLE2902-kuvaaja ilmoituksia varten
pCharacteristic->addDescriptor(new BLE2902());
// Aseta callback kirjoitustapahtumille
pCharacteristic->setCallbacks(new MyCharacteristicCallbacks());
// Aseta alkuarvo
pCharacteristic->setValue("OFF");
// 5. Käynnistä palvelu
pService->start();
// 6. Aloita mainostaminen (advertising)
BLEAdvertising* pAdvertising = BLEDevice::getAdvertising();
pAdvertising->addServiceUUID(SERVICE_UUID);
pAdvertising->setScanResponse(true);
pAdvertising->setMinPreferred(0x06); // parantaa iPhone-yhteensopivuutta
pAdvertising->setMinPreferred(0x12);
BLEDevice::startAdvertising();
Serial.println("BLE-palvelin valmis! Laitteen nimi: ESP32-LED");
Serial.println("Odotetaan yhteyttä...");
}
void loop() {
// Käsittele uudelleenyhdistäminen: aloita mainostus uudelleen
if (!deviceConnected && oldDeviceConnected) {
delay(500); // Anna BLE-pinolle aikaa palautua
pServer->startAdvertising();
Serial.println("Mainostus käynnistetty uudelleen...");
oldDeviceConnected = deviceConnected;
}
// Tunnista uusi yhteys
if (deviceConnected && !oldDeviceConnected) {
oldDeviceConnected = deviceConnected;
}
delay(10);
}
Koodin toimintaperiaate
Käydään läpi ESP32 BLE -koodin keskeiset osat:
UUID-tunnisteet
SERVICE_UUID ja CHARACTERISTIC_UUID ovat 128-bittisiä yksilöllisiä tunnisteita, jotka identifioivat BLE-palvelun ja sen ominaisuuden. Virallisissa Bluetooth-palveluissa käytetään 16-bittisiä UUID:ita (esim. 0x180D sydämen sykkeelle), mutta omissa projekteissa luodaan 128-bittiset tunnisteet osoitteessa uuidgenerator.net.
Callback-luokat
MyServerCallbacks seuraa yhteyden tilaa: onConnect() kutsutaan kun puhelin yhdistää, onDisconnect() kun yhteys katkeaa. MyCharacteristicCallbacks käsittelee puhelimelta tulevat kirjoituskomennot. Kun puhelin lähettää arvon, onWrite() tarkistaa onko se ”ON”/”1” (LED päälle) vai ”OFF”/”0” (LED pois).
GATT-rakenne
Koodi luo seuraavan hierarkian:
- BLE-laite nimellä ”ESP32-LED”
- Palvelin (server) joka kuuntelee yhteyksiä
- Palvelu (service) joka ryhmittelee toiminnallisuuden
- Ominaisuus (characteristic) joka sisältää varsinaisen datan ja tukee lukua, kirjoitusta ja ilmoituksia
Uudelleenyhdistäminen
loop()-funktiossa seurataan yhteyden tilaa. Kun puhelin katkaisee yhteyden, ESP32 aloittaa automaattisesti uudelleen mainostamisen (advertising), jotta puhelin voi yhdistää uudelleen ilman ESP32:n uudelleenkäynnistystä.
Puhelinsovelluksen käyttö
ESP32 puhelin -ohjaukseen suosittelemme nRF Connect -sovellusta, joka on Nordic Semiconductorin ilmainen BLE-työkalu. Se on saatavilla sekä Androidille (Google Play) että iOS:lle (App Store).
Vaiheittaiset ohjeet nRF Connectilla
- Asenna nRF Connect for Mobile sovelluskaupasta
- Lataa Arduino-koodi ESP32:lle ja avaa Serial Monitor (115200 baud)
- Avaa nRF Connect puhelimessa
- Paina ”SCAN” – etsi laite nimeltä ”ESP32-LED”
- Paina ”CONNECT” laitteen vieressä
- Näet palvelun, jonka UUID alkaa ”12345678…” – avaa se
- Laajenna palvelu nähdäksesi ominaisuuden (characteristic)
- Paina ylänuoli-kuvaketta (↑) ominaisuuden vieressä kirjoittaaksesi arvon
- Valitse kirjoitusikkunassa muodoksi ”Text” (ei Hex)
- Kirjoita ”ON” ja paina ”Send” – LED syttyy!
- Kirjoita ”OFF” ja paina ”Send” – LED sammuu!
- Voit myös painaa alanuolta (↓) lukeaksesi nykyisen tilan
Vaihtoehtoisia sovelluksia: LightBlue (iOS/Android) on toinen hyvä ilmainen vaihtoehto yksinkertaisemmalla käyttöliittymällä. Huomaa, että ”Serial Bluetooth Terminal” -tyyppiset sovellukset eivät toimi, koska ne käyttävät Bluetooth Classicia eivätkä BLE:tä.
BLE vs. Wi-Fi – kumpi kannattaa valita?
ESP32 tukee sekä BLE:tä että Wi-Fi:tä, joten kumpi sopii bluetooth-ohjaukseen paremmin? Tässä vertailu:
- Kantama: Wi-Fi kattaa koko kodin reitittimen kautta, BLE toimii noin 10–50 metrin etäisyydellä suoraan
- Reititin: Wi-Fi vaatii reitittimen, BLE toimii ilman mitään verkkoinfrastruktuuria
- Virrankulutus: BLE kuluttaa huomattavasti vähemmän virtaa – tärkeää paristokäyttöisissä laitteissa
- Asennus: BLE on yksinkertaisempi (skannaa ja yhdistä), Wi-Fi vaatii SSID:n ja salasanan
- Useat käyttäjät: Wi-Fi-palvelin palvelee monta käyttäjää, BLE yleensä yhden kerrallaan
- Internet-yhteys: Wi-Fi mahdollistaa etäkäytön internetin yli, BLE on vain paikallinen
Nyrkkisääntö: Käytä BLE:tä kun haluat suoran, energiatehokkaan puhelin-laite-yhteyden ilman verkkoa. Käytä Wi-Fi:tä kun tarvitset internet-yhteyttä, dashboardia tai usean käyttäjän tukea. ESP32:n vahvuus on, että voit käyttää molempia samassa projektissa!
Jatkokehitysideoita
Kun perus-ESP32 bluetooth -ohjaus toimii, voit laajentaa projektia moneen suuntaan:
1. Releen ohjaus LEDin sijaan
Korvaa LED relemodulilla ja ohjaa verkkovirtalaitteita – lamppuja, tuulettimia tai muita kodinkoneita. Käytä 3,3 V yhteensopivaa relettä tai lisää transistoriohjain.
2. Tilapalaute puhelimeen (Notify)
Lisää koodiin ilmoitustoiminto: kun LED vaihtaa tilaa, päivitä ominaisuuden arvo ja lähetä notify-viesti puhelimelle. Näin puhelinsovellus näyttää reaaliaikaisen tilan.
3. Usean LEDin tai lähdön ohjaus
Lisää palveluun useita ominaisuuksia, yksi per lähtö. Vaihtoehtoisesti käytä yhtä ominaisuutta komennoilla kuten ”LED1_ON”, ”LED2_OFF” ja laajenna onWrite()-käsittelijää.
4. Anturidatan lukeminen
Luo toinen ominaisuus esimerkiksi lämpötila-anturin datalle. Puhelin voi lukea anturiarvoja samalla kun ohjaa LEDiä – kaikki yhden BLE-yhteyden yli.
5. Oma puhelinsovellus
MIT App Inventorilla voit rakentaa yksinkertaisen BLE-ohjaussovelluksen graafisilla painikkeilla. Edistyneempiin sovelluksiin Flutter tai React Native tarjoavat BLE-kirjastot.
Turvallisuushuomio: Tämä perusesimerkki ei sisällä autentikointia tai paritusta. Harrastuskäyttöön tämä riittää, mutta tuotantokäytössä kannattaa toteuttaa BLE-paritus (bonding) ja salaus. ESP32-C6:n Bluetooth 5.3 tarjoaa parannettuja turvaominaisuuksia tähän tarkoitukseen.
Suositellut komponentit tähän projektiin
Kaikki tarvittavat osat saat kätevästi Protocachen verkkokaupasta:
Yhteenveto: ESP32 bluetooth -ohjaus käytännössä
ESP32 bluetooth -ohjaus avaa oven lukemattomille IoT-projekteille. Tässä tutoriaalissa opit:
- Miten BLE (Bluetooth Low Energy) eroaa perinteisestä Bluetoothista ja miksi se sopii IoT-projekteihin
- Kuinka kytkeä LED ESP32-C6:n GPIO-pinniin turvallisesti
- Miten luoda BLE-palvelin Arduino-koodilla GATT-palveluineen ja -ominaisuuksineen
- Kuinka ohjata LEDiä puhelimella nRF Connect -sovelluksella
BLE:n matala virrankulutus, yksinkertainen käyttöönotto ja suora puhelin-yhteys tekevät siitä erinomaisen valinnan harrastusprojekteihin ja prototyyppeihin. Kokeile, muokkaa ja rakenna oma bluetooth-ohjattu laitteesi!
Tutustu Protocachen valikoimaan ja hanki kaikki tarvitsemasi komponentit ESP32 BLE -projektiin: ESP32-C6-kehitysalusta, hyppylangat ja muut elektroniikkakomponentit löytyvät verkkokaupastamme.





















