Hypatia: le linee guida

Installazione Iniziale

Installazione del driver: Inizia installando l’ultima versione dell’Arduino IDE sul tuo computer.
Installazione dei pacchetti: Una volta completata l’installazione dell’IDE, apri l’Arduino IDE e vai al menu Strumenti.
Seleziona Strumenti > Scheda > Gestore schede
Nella finestra Gestore schede, utilizza la barra di ricerca per trovare esp32 digitando il suo nome
per iniziare - IDE
Clicca su esp32 nella barra di ricerca e seleziona Scheda. Si aprirà una finestra.
Nella finestra Gestore schede, utilizza la barra di ricerca per trovare Wroom digitando il suo nome
IDE
Dai risultati della ricerca, seleziona Fri3d Badge 2024 (ESP32-S3-WROOM-1) e clicca su OK per installare il pacchetto richiesto.
Il pacchetto Fri3d Badge 2024 (ESP32-S3-WROOM-1) include il supporto per diverse schede con ESP32, inclusa Hypatia. La scheda selezionata viene indicata nella barra di stato

1. L’Arduino IDE deve essere configurato prima di utilizzare la scheda.

Scegli lo schema di partizione: Strumenti > Schema di partizione > 16M Flash (3MB APP/9.9MB FATFS)
Scegli la modalità di caricamento: Strumenti > Modalità di upload > USB-OTG CDC (TinyUSB)
Scegli la modalità USB: Strumenti > Modalità USB > USB-OTG (TinyUSB)

Dopo aver completato l’installazione, collega Hypatia al tuo computer usando un cavo USB-A a USB-C.
Successivamente, è necessario selezionare la porta corretta: Strumenti > Porta.

Qualche suggerimento

1. Se provi a caricare un nuovo sketch su Hypatia e ricevi il messaggio di errore “A fatal error occurred: Failed to connect to ESP32: Timed out…Connecting…”, significa che il tuo ESP32 non è in modalità di flashing/caricamento.
Avendo selezionato correttamente il nome della scheda e la porta COM, segui questi passaggi:

Tieni premuto il pulsante “Boot” sulla tua scheda
Premi il pulsante “Carica” nell’Arduino IDE per caricare lo sketch
Quando vedi il messaggio “Connecting…” nell’Arduino IDE, rilascia il pulsante “Boot”
Dopo di ciò, dovresti vedere il messaggio “Caricamento completato” (“Done uploading”)

Dovrai ripetere questa sequenza di pulsanti ogni volta che vuoi caricare un nuovo sketch.

2. Se ricevi l’errore “COM Port not found/not available” (porta COM non trovata/non disponibile), potresti dover controllare la porta:

Apri il Gestore dispositivi di Windows
Controlla le porte USB

3. Se ricevi ancora l’errore “COM Port not found/not available”, potresti dover installare i driver CP210x:

Installa i driver USB – CP210x USB to UART Bridge (per Windows)
Installa i driver USB – CP210x USB to UART Bridge (per macOS)

Al suo avvio il microcontrollore con MicroPython cerca ed esegue i seguenti file nell’ordine:

boot.py (opzionale)
Eseguito sempre all’accensione o al reset. Usato tipicamente per configurazioni iniziali (ad esempio, modalità Wi-Fi, pin, ecc.).È opzionale, ma se presente, viene eseguito per primo.
main.py (opzionale)
Eseguito dopo boot.py. Contiene solitamente la parte principale del codice. Anche questo è opzionale, ma se esiste, viene eseguito automaticamente.

Se vuoi che il codice venga eseguito automaticamente all’avvio, il nome deve essere main.py (oppure devi richiamarlo da boot.py).
Se carichi ad esempio un file chiamato codice.py, per farlo partire all’avvio scrivi nel main.py: “import codice”

Connetti la tua Hypatia

Wi-Fi

Per iniziare a configurare e programmare la scheda Hypatia:

Installa l’Arduino IDE sul tuo computer
Installa la libreria Adafruit, necessaria per comunicare correttamente con alcuni componenti della scheda
Verifica che tutte le configurazioni corrette per la scheda Hypatia siano state applicate
Seleziona correttamente la scheda e la porta COM

Poi, adatta il codice inserendo l’SSID e la password della tua rete Wi-Fi nei punti indicati.
Assicurati di sostituire i segnaposto con le credenziali reali per consentire alla scheda di connettersi correttamente.
Dopo averlo fatto, compila e carica il codice sull’ESP32 della scheda Hypatia cliccando sul pulsante Upload.
Dopo il caricamento, apri il Monitor Seriale cliccando sull’apposito pulsante in alto a destra.
Nel Monitor Seriale, imposta il baud rate a 115200, lo stesso definito nel codice.
Il Monitor Seriale fornisce:

Tieni premuto il pulsante “Boot” sulla tua scheda
l’indirizzo IP del server web appena creato

Una volta che il server è attivo, inserisci l’indirizzo IP in un qualsiasi browser connesso alla stessa rete Wi-Fi
configurata nel codice. Se tutto è stato configurato correttamente e il Wi-Fi della scheda Hypatia funziona, apparirà una pagina web che consente di interagire con la scheda. Premendo i pulsanti presenti sulla pagina, il LED cambierà colore tra rosso, verde e blu. Questo conferma che la connessione Wi-Fi e il server web stanno funzionando correttamente.


#include <WiFi.h>         //including library for Wifi
#include <WebServer.h>    //including library for WebServer Design
#include <FastLED.h>    //including library for LED


//....................ENTER THE PIN NUMBER OF THE LED...........................................................
// Define the pin to which the WS2812B LED is connected
#define LED_PIN 21
#define NUM_LEDS 1

// Creating the object for the LED
CRGB leds[NUM_LEDS];

//....................ENTER THE NAME AND PASSWORD TO YOUR WIFI..................................................
// WiFi credentials
const char *ssid = "SSID_WIFI";
const char *password = "PASSWORD_WIFI";

// Creating WebServer object on port 80
WebServer server(80);

// Functions to handle LED colors
void handleRed() {
  leds[0] = CRGB::Red;      //Set the LED to red
  FastLED.show();
}

void handleGreen() {
  leds[0] = CRGB::Green;    //set the LED to green
  FastLED.show();
}

void handleBlue() {
  leds[0] = CRGB::Blue;    //set the LED to blue
  FastLED.show();
}

// html code to deinfe Website Design
void handleRoot() {
  String html = R"rawliteral(
  <!DOCTYPE html>
  <html lang="en">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>SYDE Hypatia Wifi connection check </title>
    <style>
      body {
        font-family: Arial, sans-serif;
        background-color: #f4f4f9;
        color: #333;
        text-align: center;
        margin: 0;
        padding: 0;
      }
      .container {
        max-width: 600px;
        margin: 20px auto;
        padding: 20px;
        background-color: white;
        box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
        border-radius: 10px;
      }
      h1 {
        color: #6e6e6e;
        margin-top: 10px;
      }
      button {
        background-color: #02aff3;
        color: white;
        padding: 10px 20px;
        margin: 10px;
        border: none;
        border-radius: 5px;
        cursor: pointer;
        font-size: 16px;
        display: inline-block;
      }
      button:hover {
        background-color: #6e6e6e;
      }
      img {
        margin-top: 10px;
        margin-bottom: 20px;
        max-width: 80%;
        border-radius: 10px;
      }
      #color-circle {
        width: 100px;
        height: 100px;
        border-radius: 50%;
        background-color: lightgray;
        margin: 20px auto;
        box-shadow: 0 0 15px 5px rgba(0, 0, 0, 0.2); /* Glow effect */
      }
    </style>
  </head>
  <body>
    <div class="container">
      <h1>SYDE Hypatia Wifi connection check</h1>
      <p>Control the LED on the Hypatia Board:.</p>

    <div id="color-circle" style="width: 20px; height: 20px; border-radius: 50%; background-color: lightgray; margin: 20px auto;"></div>
    <div style="display: flex; justify-content: center; gap: 10px; margin-top: 20px;">
    
    <button onclick="fetch('/H', { method: 'GET' }); changeCircleColor('red');" style="display: block; margin: 10px auto; padding: 10px 20px;">Turn LED RED</button>
    <button onclick="fetch('/L', { method: 'GET' }); changeCircleColor('green');" style="display: block; margin: 10px auto; padding: 10px 20px;">Turn LED GREEN</button>
    <button onclick="fetch('/K', { method: 'GET' }); changeCircleColor('blue');" style="display: block; margin: 10px auto; padding: 10px 20px;">Turn LED BLUE</button>
    </div>

    <script>
       function changeCircleColor(color) {
        document.getElementById('color-circle').style.backgroundColor = color;
        document.getElementById('color-circle').style.boxShadow = `0 0 15px 5px ${color}`;
        }
     </script>
     </div>
    
  </body>
  </html>
  )rawliteral";

  server.send(200, "text/html", html);
}


//setup communication with the esp system
void setup() {
  Serial.begin(115200);
  delay(5000);
  FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);   //Declare and initialize the LED
  FastLED.show();
  
  // Connect to WiFi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500); 
    Serial.print(".");
  }

  //feedback to user of connecting wifi
  Serial.println("\nWiFi connected");
  Serial.print("IP Address: ");
  Serial.println(WiFi.localIP());

  // Define routes
  server.on("/", handleRoot);// Mainsite
  server.on("/H", handleRed);// LED red
  server.on("/L", handleGreen);// LED green
  server.on("/K", handleBlue);// LED blue
 
  // Start server
  server.begin();
  Serial.println("WebServer started!");
}

void loop() {
  server.handleClient(); // Handle incoming requests
}


Quando si vuole utilizzare il Wi-fi per connettere Hypatia, il codice viene scritto in maniera tale da connettere la scheda alll’ssid e alla password scritte nel codice stesso.
Inoltre, nel codice si troveranno anche indirizzo IP locale, Subnet mask, Gateway e server DNS.


from machine import Pin
from network import WLAN
import esp32
import network
import machine
import time
import ubinascii


station = None
id = str(ubinascii.hexlify(machine.unique_id()).decode().upper())
def wificonnect():
    global station
    print('INIT WIFI CONNECTION')
    Pin(21, Pin.OUT).value(0)
    station = WLAN(network.STA_IF)
    station.active(True)

    for (ssid, bssid, channel, RSSI, authmode, hidden) in station.scan():
        if (ssid == None):
            print(ssid)
        else:
            ssid = ssid.decode('utf-8')
            print(ssid)
            if str(ssid) == "SSID_WIFI":                     #SSID WiFi
                i = 0
                station.connect(str(ssid), "PASSWORD_WIFI")  #Password WiFi
                print('WIFI connecting....')
                while not station.isconnected():
                    i += 1
                    if i > 15:
                        print('WIFI forced closed')
                        return
                    machine.idle()  #save power while waiting
                    time.sleep(1)

    if station.isconnected():
        print('WIFI connected')
    time.sleep(5)
    print(station.ifconfig())
    return station

def close_wifi():
    global station
    station = WLAN(network.STA_IF)

    print('Closing WIFI...')
    station.active(False)
    print('WIFI Closed')

print("START WIFI")
wificonnect()
time.sleep(15)
close_wifi()

Sigfox

Per iniziare a configurare e programmare la scheda Hypatia:

Installa l’Arduino IDE sul tuo computer
Installa la libreria Adafruit, necessaria per comunicare correttamente con alcuni componenti della scheda
Verifica che tutte le configurazioni corrette per la scheda Hypatia siano state applicate
Seleziona correttamente la scheda e la porta COM
Compila e carica il codice fornito sull’ESP32 della scheda Hypatia cliccando sul pulsante di upload

Una volta completato l’upload con successo, è necessario:

aprire il Monitor Seriale (tramite il pulsante in alto a destra dell’IDE)
assicurarsi che la velocità di trasmissione (baudrate) sia impostata su 9600, come inizializzato nel codice
assicurarsi di inserire tutti e tre i codici sotto riportati nell’IDE

#include <Arduino.h>
#include <SigfoxModule.h>

#include "SigfoxModule.h"

#define RXD2 13  //  RX-Pin
#define TXD2 14  //  TX-Pin
#define SIGFOX_PWR 6


// Builds Sigfox-Object with UART2
SigfoxModule sigfox(Serial2);

void setup() {
    Serial2.begin(9600);
    digitalWrite(SIGFOX_PWR, HIGH);  // Turn on the module
    Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2);
    delay(6000);

    Serial.println("Starting Sigfox Test...");
    
    // Initialisise the Sigfox-Modul
    sigfox.setSigFoxMode();

    // gets the Sigfox ID
    String sigfoxID = sigfox.getID();
    Serial.println("Device ID: " + sigfoxID);
}

void loop() {
    // Example to send a Message
    sigfox.sendMessage("HELLO1234");
    delay(10000);
}


#include "SigfoxModule.h"

SigfoxModule::SigfoxModule(HardwareSerial &uart){
  _uart = &uart;
  _uart->begin(9600, SERIAL_8N1, SIGFOX_RX, SIGFOX_TX);
  setSigFoxMode();
}

void SigfoxModule::setSigFoxMode() {
  Serial.println("Set SigFox Mode LMS100A");
  sendCommand("AT+MODE=0\r");
  }

String SigfoxModule::getID() {
  String id = sendCommand("AT$ID\r");
  while (id.indexOf("ERROR") >= 0) {
    Serial.println("Error, retrying...");
    id = sendCommand("AT$ID\r");
    }
  id.trim(); 
  Serial.println("SIGFOX ID: " + id);
  return id;
}

String SigfoxModule::sendCommand(String cmd) {
  _uart->print(cmd);
  delay(1000);

  String response = "";
  unsigned long startMillis = millis();
  while (!_uart->available() && millis() - startMillis < 5000) {
    delay(100);
  }

  while (_uart->available()) {
    response += (char)_uart->read();
  }

  Serial.println("Received response: " + response);//Debug

  return response;
}

void SigfoxModule::sendMessage(String message) {
  Serial.println("Sending SIGFOX message: " + message);
  String hexMessage = stringToHex(message);
  sendCommand("AT$SF=" + hexMessage + "\r");
}

String SigfoxModule::stringToHex(String input) {
  String hexString = "";
  for (unsigned int i = 0; i < input.length(); i++) {
    hexString += String(input[i], HEX);
  }
  return hexString;
}
void SigfoxModule::resetSigfox() {
  Serial.println("Resetting Sigfox module...");
  sendCommand("AT$RESET\r");
  delay(5000);
}




#include <Arduino.h>

#ifndef SIGFOX_MODULE_H
#define SIGFOX_MODULE_H

class SigfoxModule {
    private:
      HardwareSerial *_uart; // UART for Sigfox
      //Define the Sigfox Pinout
      int SIGFOX_TX = 14;  // USART2_TX
      int SIGFOX_RX = 13;  // USART2_RX
      int SIGFOX_RESET = 30;  // NRST (Reset Pin)
      int SIGFOX_POWER = 6;  // Power control pin (if applicable)

   

      //Define Variables for Sigfox ID and Pack
      String _sigfox_id = "";
      String _sigfox_pack = "";
    
    public:
      SigfoxModule(HardwareSerial &uart);
      String getID();
      void setSigFoxMode();
      String sendCommand(String cmd);
      void sendMessage(String message);
      String stringToHex(String input);
      void resetSigfox();
};  

#endif

Di seguito il codice da utilizzare per connettere Hypatia utilizzando Sigfox.


from machine import Pin, UART
import esp32
import machine
import time
import ubinascii
from micropython import const


class SIGFOX(object):
    _sigfox_id = ""
    _sigfox_pack = ""

    def __init__(self, uart, debug=False):
        # turn on uart power
        if (uart == None):
            self._uart = UART(2, 9600, tx=14, rx=13, timeout=5000)
            self._uart.init(baudrate=9600, bits=8, parity=None, stop=1)
        else:
            self._uart = uart
        self.setSigFoxMode()

    def setSigFoxMode(self):
        print('Set SigFox Mode LSM100A')
        self._getuartcmd('AT+MODE=0\r')

    def setLoraMode(self):
        print('Set Lora Mode LSM100A: ' + str(self._getuartcmd('AT+MODE=1\r').decode('utf8')))

    def getid(self):
        id = self._getuartcmd('AT$ID\r')
        id = id.decode('utf8')
        while ("error" in id.lower()):
            print("errparse--->", id)
            id = self._getuartcmd('AT$ID\r')
            id = id.decode('utf8')
        id = id.lstrip('0').rstrip('\n').rstrip('\r')
        print("SIGFOX ID : " + id)
        return id

    def getpac(self):
        print('GET PAC')
        print("PAC : " + str(self._getuartcmd('AT$PAC\r').decode('utf8')))

    def getsigfoxlibrary(self):
        print('GET SIGFOX LIBRARY')
        print("SIGFOX LIBRARY : " + str(self._getuartcmd('AT$I=9\r').decode('utf8')))

    def _getuartcmd(self, cmd):
        self._uart.write(cmd)
        time.sleep(1)
        retry = 0
        ' CICLO IN ATTESA DI ATTIVAZIONE SENSORE '
        while (self._uart.any() < 1) and (retry < 10):
            retry = retry + 1
            print("retry", retry)
            self._uart.write(cmd)
            time.sleep(1)
        return self._uart.read()

    # send some bytes
    def sendmessage(self, message):
        print('Sending SIGFOX message : ' + str(message))
        self._uart.write("AT$SF=")
        self._uart.write(ubinascii.hexlify(message))
        self._uart.write("\r")
        print('Sended SIGFOX message : ' + str(message))

    def sendBytesmessage(self, message):
        print('Sending SIGFOX message : ' + str(message))
        self._uart.write("AT$SF=")
        self._uart.write(message.hex())
        self._uart.write("\r")
        print('Sended SIGFOX message : ' + str(message))

        while (self._uart.any() < 1):
            print('attendere prego')
            time.sleep(1)
        print("SIGFOX RETURN : " + str(self._uart.read()))


sig = None
sigfoxid = ""

sig = SIGFOX(None, True)
sigfoxid = sig.getid()
sig.getpac()
sig.sendmessage("Hello World")

LoRaWan

Per iniziare a configurare e programmare la scheda Hypatia:

Installa l’Arduino IDE sul tuo computer
Installa la libreria Adafruit, necessaria per comunicare correttamente con alcuni componenti della scheda
Verifica che tutte le configurazioni corrette per la scheda Hypatia siano state applicate
Seleziona correttamente la scheda e la porta COM
Compila e carica il codice fornito sull’ESP32 della scheda Hypatia cliccando sul pulsante di upload

Una volta completato l’upload con successo, è necessario:

aprire il Monitor Seriale (tramite il pulsante in alto a destra dell’IDE)
assicurarsi che la velocità di trasmissione (baudrate) sia impostata su 9600, come inizializzato nel codice

//P2P Hypatia to Gateway Up and Downlink works
#include &lt;Arduino.h&gt;
#include &lt;HardwareSerial.h&gt;

#define LORA_UART_NUM     2
#define LORA_RX_PIN       13
#define LORA_TX_PIN       14
#define LORA_BAUD_RATE    9600

HardwareSerial LoRaSerial(LORA_UART_NUM);

void sendCommand(const char* cmd);
void readDebugResponse();
void handleLoRaToSerial();
void handleSerialToLoRa();

void setup() {
  Serial.begin(115200);
  delay(5000);
  while (!Serial);
  Serial.println(&quot;[BOOT] ESP32 LoRa Gateway Initializing...&quot;);

  LoRaSerial.begin(LORA_BAUD_RATE, SERIAL_8N1, LORA_RX_PIN, LORA_TX_PIN);
  Serial.println(&quot;[INFO] LoRa UART initialized.&quot;);

  // Soft reset
  sendCommand(&quot;ATZ\r&quot;);
  delay(1000);
  readDebugResponse();

  // Set LoRa mode
  sendCommand(&quot;AT+MODE=1\r&quot;);
  delay(500);
  readDebugResponse();

  // Set frequency band to EU868 (Band ID 5)
  sendCommand(&quot;AT+BAND=5\r&quot;);
  delay(500);
  readDebugResponse();

  // Basic ping
  sendCommand(&quot;AT\r&quot;);
  delay(500);
  readDebugResponse();

  // Look for Gateway
  sendCommand(&quot;AT+JOIN=1\r&quot;);
  delay(500);
  readDebugResponse();

  Serial.println(&quot;[READY] LSM100A configured for EU868. Enter AT commands below.&quot;);
}

void loop() {
  handleLoRaToSerial();
  handleSerialToLoRa();
}

void sendCommand(const char* cmd) {
  Serial.print(&quot;[SEND] &quot;);
  Serial.println(cmd);
  for (int i = 0; i &lt; strlen(cmd); i++) {
    LoRaSerial.write(cmd[i]);
    Serial.print(&quot; 0x&quot;);
    Serial.print(cmd[i], HEX);
  }
  Serial.println();
}

void readDebugResponse() {
  unsigned long start = millis();
  while (millis() - start &lt; 1000) {
    if (LoRaSerial.available()) {
      uint8_t c = LoRaSerial.read();
      //Serial.print(&quot;[RECV] 0x&quot;);
      //Serial.print(c, HEX);
      //Serial.print(&quot; (&#039;&quot;);
      Serial.print((char)c);
      //Serial.print(&quot;&#039;)&quot;);
    }
  }
}

void handleLoRaToSerial() {
  while (LoRaSerial.available()) {
    char c = LoRaSerial.read();
    Serial.print(c);
  }
}

void handleSerialToLoRa() {
  while (Serial.available()) {
    String cmd = Serial.readStringUntil(&#039;\n&#039;);
    cmd.trim();
    if (!cmd.isEmpty()) {
      // Wenn es ein AT-Befehl ist, sende ihn direkt weiter
      if (cmd.startsWith(&quot;AT&quot;)) {
        Serial.print(&quot;[ESP32 &gt; LoRa] Sending: &quot;);
        Serial.println(cmd);
        LoRaSerial.print(cmd);
        LoRaSerial.write(&#039;\r&#039;);
      } else {
        // Text in HEX umwandeln
        String hexPayload = &quot;&quot;;
        for (size_t i = 0; i &lt; cmd.length(); i++) {
          char hex[3];
          sprintf(hex, &quot;%02X&quot;, (uint8_t)cmd[i]);
          hexPayload += hex;
        }

        // AT+SEND-Befehl erzeugen
        String atCommand = &quot;AT+SEND=1:0:&quot; + hexPayload;
        Serial.print(&quot;[ESP32 &gt; LoRa] Converted to: &quot;);
        Serial.println(atCommand);
        LoRaSerial.print(atCommand);
        LoRaSerial.write(&#039;\r&#039;);
      }
    }
  }
}



Lavoro in corso

Bluetooth

Per iniziare a configurare e programmare la scheda Hypatia:

Installa l’Arduino IDE sul tuo computer
Installa la libreria Adafruit, necessaria per comunicare correttamente con alcuni componenti della scheda
Verifica che tutte le configurazioni corrette per la scheda Hypatia siano state applicate
Seleziona correttamente la scheda e la porta COM
Compila e carica il codice fornito sull’ESP32 della scheda Hypatia cliccando sul pulsante di upload

Una volta completato l’upload con successo, è necessario:

aprire il Monitor Seriale (tramite il pulsante in alto a destra dell’IDE)
assicurarsi che la velocità di trasmissione (baudrate) sia impostata su 115200, come inizializzato nel codice

#include &lt;BLEDevice.h&gt; 
#include &lt;BLEUtils.h&gt;
#include &lt;BLEServer.h&gt;

#include &lt;FastLED.h&gt;               // Library for controlling WS2812B LED strip   

// Define the pin to which the WS2812B LED is connected
#define LED_PIN 21
#define NUM_LEDS 1

// UUIDs for the BLE service and characteristic (can be customized)
#define SERVICE_UUID        &quot;b0cee666-6f5c-48fa-9b6b-ee42fec51a13&quot;
#define CHARACTERISTIC_UUID &quot;4b15cd64-97b9-4ff2-9599-88ccd01f07f1&quot;

// Create the object to control the LED
CRGB leds[NUM_LEDS];

// Function to set the LED color to green
void handleGreen() {
  leds[0] = CRGB::Green;  // Set color to green
  FastLED.show(); // Apply the color change
}

// BLE callback class to handle incoming data
class MyCallbacks : public BLECharacteristicCallbacks {
  void onWrite(BLECharacteristic *pCharacteristic) {
    String value = pCharacteristic-&gt;getValue(); // Get received data
    if (value.length() &gt; 0) {
      Serial.println(&quot;*********&quot;);
      Serial.print(&quot;New value: &quot;);
      for (int i = 0; i &lt; value.length(); i++) {
        Serial.print(value[i]); // Print received data character by character
      }
      Serial.println();
      
      // Check if received value is &quot;on&quot;
      if (strncmp(value.c_str(), &quot;on&quot;, 2) == 0) {
        leds[0] = CRGB::Blue;  // Set LED to blue
        FastLED.show(); 
      } 
      // Check if received value is &quot;off&quot;
      else if (strncmp(value.c_str(), &quot;off&quot;, 3) == 0) {
        leds[0] = CRGB::Black;  // Turn off LED
        FastLED.show();
      }
      Serial.println(&quot;*********&quot;);
    }
  }
};

void setup() {
  Serial.begin(115200); // Start serial communication
  delay(2000); // Wait for initialization

  // Initialize the LED strip
  FastLED.addLeds&lt;WS2812B, LED_PIN, GRB&gt;(leds, NUM_LEDS);   //Declare and initialize the LED
  FastLED.show(); // Ensure the LED is off initially

  Serial.println(&quot;Starting BLE initialization...&quot;);
  
  // Initialize BLE and set device name
  BLEDevice::init(&quot;MyESP32&quot;);
  Serial.println(&quot;BLE initialized!&quot;);

  // Create BLE server
  BLEServer *pServer = BLEDevice::createServer();
  Serial.println(&quot;BLE server created!&quot;);

  // Create BLE service
  BLEService *pService = pServer-&gt;createService(SERVICE_UUID);
  Serial.println(&quot;BLE service created!&quot;);

  // Define BLE characteristic with read/write properties
  BLECharacteristic *pCharacteristic = pService-&gt;createCharacteristic(
    CHARACTERISTIC_UUID,
    BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE
  );
  Serial.println(&quot;BLE characteristic created!&quot;);

  // Assign callback to handle characteristic writes
  pCharacteristic-&gt;setCallbacks(new MyCallbacks());
  Serial.println(&quot;Callback for characteristic set!&quot;);

  // Set initial value for the characteristic
  pCharacteristic-&gt;setValue(&quot;Hello World&quot;);

  // Start the BLE service
  pService-&gt;start();
  Serial.println(&quot;BLE service started!&quot;);

  // Start advertising BLE service
  BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  pAdvertising-&gt;addServiceUUID(SERVICE_UUID); // Include service in advertisements
  pAdvertising-&gt;start();
  Serial.println(&quot;BLE advertising started! Ready for connections.&quot;);
}

void loop() {
  // The loop runs continuously, but BLE handles communication automatically
  delay(2000); // Wait before next loop iteration
}


Lavoro in corso

Torna in alto