blog

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.

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-C6-DevKitC-1 kehitysalusta Bluetooth BLE -projektiin
ESP32-C6-DevKitC-1 – projektin sydän, joka tukee Bluetooth 5.3 LE:tä, Wi-Fi 6:ta ja Zigbee 3.0:aa
  1. 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.
  2. LED – mikä tahansa 3 mm tai 5 mm LED (punainen, vihreä, sininen…)
  3. 220 Ω vastus – rajoittaa LEDin virtaa
  4. Hyppylangat – kytkentöjä varten (esim. Dupont-hyppylangat 30 cm uros-uros)
  5. Koekytkentälevy (breadboard) – valinnainen mutta suositeltava
  6. USB-C-kaapeli – ohjelmointia ja virransyöttöä varten
  7. Ä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

Dupont-hyppylangat 30cm uros-uros
Dupont-hyppylangat 30 cm uros-uros – kytkentöihin tarvitset muutaman hyppylangan

Kytkentä on hyvin yksinkertainen. Tarvitset vain kolme johtoa:

  1. ESP32-C6 GPIO2 → 220 Ω vastus → LEDin anodi (pidempi jalka, +)
  2. 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:

  1. Avaa Arduino IDE ja mene File → Preferences
  2. Lisää ”Additional Board Manager URLs” -kenttään: https://espressif.github.io/arduino-esp32/package_esp32_index.json
  3. Mene Tools → Board → Boards Manager, hae ”esp32” ja asenna ”esp32 by Espressif Systems”
  4. Valitse kortiksi ”ESP32C6 Dev Module” (Tools → Board)
  5. Valitse oikea USB-portti (Tools → Port)
  6. 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

  1. Asenna nRF Connect for Mobile sovelluskaupasta
  2. Lataa Arduino-koodi ESP32:lle ja avaa Serial Monitor (115200 baud)
  3. Avaa nRF Connect puhelimessa
  4. Paina ”SCAN” – etsi laite nimeltä ”ESP32-LED”
  5. Paina ”CONNECT” laitteen vieressä
  6. Näet palvelun, jonka UUID alkaa ”12345678…” – avaa se
  7. Laajenna palvelu nähdäksesi ominaisuuden (characteristic)
  8. Paina ylänuoli-kuvaketta (↑) ominaisuuden vieressä kirjoittaaksesi arvon
  9. Valitse kirjoitusikkunassa muodoksi ”Text” (ei Hex)
  10. Kirjoita ”ON” ja paina ”Send” – LED syttyy!
  11. Kirjoita ”OFF” ja paina ”Send” – LED sammuu!
  12. 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.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *