Nota

Ciao, benvenuto nella comunità degli appassionati di SunFounder Raspberry Pi, Arduino e ESP32 su Facebook! Approfondisci le tue conoscenze su Raspberry Pi, Arduino e ESP32 con altri appassionati.

Perché unirti?

  • Supporto Esperto: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra comunità e del nostro team.

  • Impara e Condividi: Scambia suggerimenti e tutorial per migliorare le tue competenze.

  • Anteprime Esclusive: Ottieni accesso anticipato agli annunci di nuovi prodotti e anteprime.

  • Sconti Speciali: Approfitta di sconti esclusivi sui nostri prodotti più recenti.

  • Promozioni e Giveaway Festivi: Partecipa a giveaway e promozioni festive.

👉 Pronto a esplorare e creare con noi? Clicca [Qui] e unisciti oggi!

Monitor Ambientale Bluetooth

Questo progetto utilizza un’app Android creata con MIT App Inventor per ricevere e visualizzare i dati ambientali da una scheda Arduino. La scheda Arduino raccoglie i dati da un sensore DHT11 per misurare temperatura e umidità. Una volta raccolti i dati, vengono trasmessi tramite Bluetooth. L’app visualizzerà i dati sullo schermo una volta ricevuti.

L’applicazione Android verrà costruita utilizzando una piattaforma web gratuita nota come MIT App Inventor. Il progetto rappresenta un’eccellente opportunità per familiarizzare con l’interfacciamento di un Arduino con uno smartphone.

Componenti Necessari

In questo progetto, avremo bisogno dei seguenti componenti.

È sicuramente conveniente acquistare un kit completo, ecco il link:

Nome

ARTICOLI IN QUESTO KIT

LINK

Elite Explorer Kit

300+

Elite Explorer Kit

Puoi anche acquistarli separatamente dai link sottostanti.

INTRODUZIONE DEI COMPONENTI

LINK PER L’ACQUISTO

Arduino Uno R4 WiFi

-

Breadboard

ACQUISTA

Cavi Jumper

ACQUISTA

Modulo Sensore di Umidità e Temperatura DHT11

ACQUISTA

1. Costruisci il Circuito

../_images/08-bluetooth_environmental_monitor_bb.png ../_images/08_ble_home_schematic.png

2. Crea l’App Android

L’applicazione Android verrà sviluppata utilizzando un’applicazione web gratuita nota come MIT App Inventor. MIT App Inventor è un eccellente punto di partenza per lo sviluppo Android, grazie alle sue funzionalità intuitive di drag-and-drop che consentono la creazione di applicazioni semplici.

Iniziamo.

  1. Vai su Get Started with MIT App Inventor e clicca su «online tool» per accedere. Avrai bisogno di un account Google per registrarti su MIT App Inventor.

    ../_images/08_ai_signup.png
  2. Dopo aver effettuato l’accesso, naviga su Projects -> Import project (.aia) from my computer. Successivamente, carica il file ble_environmental_monitor.aia situato nel percorso elite-explorer-kit-main\iot_project\08-bluetooth_environmental_monitor.

    Puoi anche scaricarlo direttamente qui: ble_environmental_monitor.aia

    ../_images/08_ai_import.png
  3. Una volta caricato il file .aia, vedrai l’applicazione nel software MIT App Inventor. Questo è un modello preconfigurato. Puoi modificare questo modello dopo aver familiarizzato con MIT App Inventor seguendo i passaggi successivi.

  4. In MIT App Inventor, hai 2 sezioni principali: il Designer e i Blocks. Puoi passare da una sezione all’altra nell’angolo in alto a destra della pagina.

    ../_images/08_ai_intro_1.png
  5. Il Designer ti permette di aggiungere pulsanti, testo, schermate e modificare l’estetica generale della tua applicazione.

    ../_images/08_ai_intro_2.png
  6. Successivamente, c’è la sezione Blocks. Questa sezione ti consente di creare funzionalità personalizzate per la tua app, permettendoti di programmare ogni componente dell’interfaccia utente dell’app per ottenere le funzionalità desiderate.

    ../_images/08_ai_intro_3.png
  7. Per installare l’applicazione su uno smartphone, naviga sulla scheda Build.

    ../_images/08_ai_intro_4.png
    • Puoi generare un file .apk. Dopo aver selezionato questa opzione, apparirà una pagina che ti permetterà di scegliere tra scaricare un file .apk o scansionare un codice QR per l’installazione. Segui la guida all’installazione per completare l’installazione dell’applicazione.

      Puoi anche scaricare il nostro APK precompilato qui: ble_environmental_monitor.apk

    • Se desideri caricare questa app su Google Play o un altro marketplace di app, puoi generare un file .aab.

3. Carica il Codice

  1. Apri il file 08-bluetooth_environmental_monitor.ino nel percorso elite-explorer-kit-main\iot_project\08-bluetooth_environmental_monitor, oppure copia questo codice in Arduino IDE.

    Nota

    Per installare la libreria, utilizza l’Arduino Library Manager per cercare e installare «DHT sensor library» e «ArduinoBLE».

08-bluetooth_environmental_monitor.ino
  1/*
  2  This code is designed for an Arduino Uno R4 board to read temperature and humidity data 
  3  from a DHT11 sensor. It then transmits this data via Bluetooth Low Energy (BLE) to a connected 
  4  device. The code uses the DHT library for reading sensor data and the ArduinoBLE library for 
  5  Bluetooth communication. The BLE service and characteristics are set up according to the 
  6  specifications of the Bluetooth SIG for environmental sensing. Additionally, the code includes 
  7  functions for managing BLE connection and disconnection events, as well as a debug function 
  8  that prints sensor data to the serial monitor.
  9
 10  Board: Arduino Uno R4 
 11  Component: DHT11
 12  Library: https://github.com/adafruit/DHT-sensor-library  (DHT sensor library by Adafruit)
 13           https://www.arduino.cc/reference/en/libraries/arduinoble/ (ArduinoBLE by Arduino)
 14*/
 15
 16
 17#include <DHT.h>
 18#include <ArduinoBLE.h>
 19
 20#define DHTPIN 11      // Define the pin used to connect the sensor
 21#define DHTTYPE DHT11  // Define the sensor type
 22
 23// Define UUIDs for BLE Environmental Sensing Service and Characteristics as per Bluetooth SIG specifications
 24// https://bitbucket.org/bluetooth-SIG/public/src/8a7ea26ae56d43e6fea88693232a01a78e28213e/assigned_numbers/uuids/service_uuids.yaml#lines-104:105
 25BLEService environmentalSensingService("181A");
 26// https://bitbucket.org/bluetooth-SIG/public/src/8a7ea26ae56d43e6fea88693232a01a78e28213e/assigned_numbers/uuids/characteristic_uuids.yaml#lines-299:303
 27BLEShortCharacteristic temperatureCharacteristic("2A6E", BLERead | BLENotify);
 28BLEUnsignedShortCharacteristic humidityCharacteristic("2A6F", BLERead | BLENotify);
 29
 30DHT dht(DHTPIN, DHTTYPE);  // Create a DHT object
 31
 32unsigned long lastUpdateTime = 0;           // Timestamp of last sensor data update
 33const unsigned long updateInterval = 5000;  // Sensor data update interval (ms)
 34
 35void setup() {
 36
 37  Serial.begin(9600);  // Initialize serial communication at 9600 baud
 38  dht.begin();         // Initialize DHT sensor
 39
 40  // Initialize BLE, halt if initialization fails
 41  if (!BLE.begin()) {
 42    Serial.println("starting Bluetooth® Low Energy module failed!");
 43    while (1)
 44      ;
 45  }
 46
 47  setupBle();  // Setup BLE service and characteristics
 48}
 49
 50void loop() {
 51
 52  BLE.poll();  // Poll for BLE events
 53
 54  // Check if it's time to update sensor data
 55  if (lastUpdateTime == 0 || millis() - lastUpdateTime > updateInterval) {
 56    float humidity = dht.readHumidity();        // Read humidity
 57    float temperature = dht.readTemperature();  // Read temperature
 58
 59    // Check if any reads failed and exit early (to try again).
 60    if (isnan(humidity) || isnan(temperature)) {
 61      Serial.println(F("Failed to read from DHT sensor!"));
 62      return;
 63    }
 64
 65    // Debug: print sensor data to serial monitor
 66    printDHT(humidity, temperature);
 67
 68    // Update BLE characteristics with new sensor data
 69    temperatureCharacteristic.writeValue(round(temperature * 100.0));
 70    humidityCharacteristic.writeValue(round(humidity * 100.0));
 71
 72    lastUpdateTime = millis();  // Update timestamp
 73  }
 74}
 75
 76void printDHT(float h, float t) {
 77  // Print humidity and temperature data to serial monitor
 78  Serial.print(F("Humidity: "));
 79  Serial.print(h);
 80  Serial.print(F("%  Temperature: "));
 81  Serial.print(t);
 82  Serial.println(F("°C "));
 83}
 84
 85void setupBle() {
 86  // Set advertised local name and service UUID:
 87  BLE.setLocalName("UNO R4 Home");
 88  BLE.setAdvertisedService(environmentalSensingService);
 89
 90  // Add characteristics to the service
 91  environmentalSensingService.addCharacteristic(temperatureCharacteristic);
 92  environmentalSensingService.addCharacteristic(humidityCharacteristic);
 93
 94  // Add service
 95  BLE.addService(environmentalSensingService);
 96
 97  // Set initial characteristic values
 98  temperatureCharacteristic.writeValue(0);
 99  humidityCharacteristic.writeValue(0);
100
101  // Set BLE event handlers for connection and disconnection
102  BLE.setEventHandler(BLEConnected, blePeripheralConnectHandler);
103  BLE.setEventHandler(BLEDisconnected, blePeripheralDisconnectHandler);
104
105  // Start advertising
106  BLE.advertise();
107}
108
109void blePeripheralConnectHandler(BLEDevice central) {
110  // Handle BLE peripheral connect event
111  digitalWrite(LED_BUILTIN, HIGH);  // Turn on built-in LED
112  Serial.print(F("Connected to central: "));
113  Serial.println(central.address());
114}
115
116void blePeripheralDisconnectHandler(BLEDevice central) {
117  // Handle BLE peripheral disconnect event
118  digitalWrite(LED_BUILTIN, LOW);  // Turn off built-in LED
119  Serial.print(F("Disconnected from central: "));
120  Serial.println(central.address());
121}
  1. Dopo aver selezionato la scheda e la porta corrette, clicca sul pulsante Upload.

  2. Apri il monitor seriale (imposta il baudrate a 9600) per visualizzare i messaggi di debug.

4. Connessione dell’App e del modulo Bluetooth

Assicurati che l’applicazione creata in precedenza sia installata sul tuo smartphone.

  1. Inizialmente, attiva il Bluetooth sul tuo smartphone.

    ../_images/08_app_1.png
  2. Ora apri la nuova app Environmental Monitor installata.

    ../_images/08_app_2.png
  3. Quando apri l’app per la prima volta, appariranno due richieste di autorizzazione in successione. Questi sono i permessi necessari per utilizzare il Bluetooth.

    ../_images/08_app_3.png
  4. Nell’APP, clicca sul pulsante Connetti per stabilire una connessione tra l’APP e il modulo Bluetooth.

    ../_images/08_app_4.png
  5. Questa pagina mostra un elenco di tutti i dispositivi Bluetooth abbinati. Scegli l’opzione xx.xx.xx.xx.xx.xx UNO R4 Home dall’elenco. Il nome di ogni dispositivo è elencato accanto al suo indirizzo MAC.

    ../_images/08_app_5.png
  6. Se non vedi dispositivi nella pagina mostrata sopra, puoi provare ad attivare l’interruttore di localizzazione del dispositivo (alcune versioni di sistema Android includono l’interruttore di localizzazione con la funzione Bluetooth).

    ../_images/08_app_6.png
  7. Dopo una connessione riuscita, sarai reindirizzato alla pagina principale dove verranno visualizzati temperatura e umidità.

    ../_images/08_app_7.png

5. Spiegazione del Codice

  1. Importazione delle Librerie e Definizione delle Costanti

    • Importa le librerie necessarie e definisci le costanti per il pin e il tipo di sensore DHT.

    Nota

    Per installare la libreria, utilizza il Gestore Librerie Arduino per cercare e installare «DHT sensor library» e «ArduinoBLE».

    #include <DHT.h>
    #include <ArduinoBLE.h>
    #define DHTPIN 11
    #define DHTTYPE DHT11
    
  2. Inizializzazione dei Servizi e delle Caratteristiche BLE

    BLEService environmentalSensingService("181A");
    BLEShortCharacteristic temperatureCharacteristic("2A6E", BLERead | BLENotify);
    BLEUnsignedShortCharacteristic humidityCharacteristic("2A6F", BLERead | BLENotify);
    
  3. Funzione di Setup

    • Inizializza la comunicazione Seriale, il sensore DHT e il BLE.

    void setup() {
      Serial.begin(9600);
      dht.begin();
      if (!BLE.begin()) {
        Serial.println("starting Bluetooth® Low Energy module failed!");
        while (1)
          ;
      }
      setupBle();
    }
    
  4. Loop Principale

    • Controlla gli eventi BLE e aggiorna i dati del sensore a intervalli regolari.

    • La linea millis() - lastUpdateTime > updateInterval assicura che i dati del sensore vengano aggiornati ogni updateInterval millisecondi.

    void loop() {
      BLE.poll();
      if (millis() - lastUpdateTime > updateInterval) {
        // Leggi i dati del sensore e aggiorna le caratteristiche BLE
      }
    }
    
  5. Funzioni BLE e di Debug

    Funzioni per configurare il BLE, stampare informazioni di debug e gestire gli eventi BLE.

    void printDHT(float h, float t) { /* ... */ }
    void setupBle() { /* ... */ }
    void blePeripheralConnectHandler(BLEDevice central) { /* ... */ }
    void blePeripheralDisconnectHandler(BLEDevice central) { /* ... */ }
    
    • printDHT(float h, float t): Utilizzata per stampare i dati di temperatura e umidità letti dal DHT11 sul monitor seriale. Questa funzione è per scopi di debug.

    • setupBle(): Inizializza il Bluetooth, inclusi il nome di broadcast, le caratteristiche e i servizi.

    • blePeripheralConnectHandler(BLEDevice central) e blePeripheralDisconnectHandler(BLEDevice central): Queste funzioni gestiscono gli eventi quando il Bluetooth si connette o si disconnette. Quando un dispositivo si connette con UNO R4 tramite Bluetooth, il LED integrato si accende. Quando il dispositivo si disconnette, il LED si spegne.