Ardui­no Nano 33 IoT

Lese­zeit: 5 Minu­ten

Das Board

Der Ardui­no Nano 33 IoT ist ein Mikro­con­trol­ler-Board im Nano-For­mat. Es besteht aus dem eigent­li­chen Mikro­con­trol­ler, digi­ta­len Ein- und Aus­gän­gen und ana­lo­gen Ein­gän­gen. Zusätz­lich ist ein WiFi-Modul und ein Blue­tooth-LE-Modul verbaut.

Quel­le: 🔗https://​docs​.ardui​no​.cc/​h​a​r​d​w​a​r​e​/​n​a​n​o​-​3​3​-​iot (abge­ru­fen am 11.03.23)

An die­se Ein- und Aus­gän­ge kön­nen zum Bei­spiel ➨LEDs, Laut­spre­cher, Dis­plays, Moto­ren oder Sen­so­ren ange­schlos­sen wer­den. Der Mikro­con­trol­ler kann alle die­se Bau­tei­le steu­ern, Signa­le aus­le­sen und auf­grund der gele­se­nen Daten ver­schie­de­ne Aktio­nen auslösen. 

  • Der Reset-Knopf star­tet das gera­de hoch­ge­la­de­ne Pro­gramm neu.
  • Die digi­ta­len Ein-/Aus­gän­ge lie­fern im Nor­mal­fall ein HIGH (1) oder LOW (0). Eine Aus­nah­me bil­den die mit einem ~ gekenn­zeich­ne­ten Pins. Sie kön­nen mit der Puls­wei­ten­mo­du­la­ti­on ange­spro­chen werden.
  • Die ana­lo­gen Ein­gän­ge mes­sen die anlie­gen­de Span­nung. Die­se Span­nung wird vom Ana­log-Digi­tal-Wand­ler (ADC = Ana­log Digi­tal Con­ver­ter) in digi­ta­le Wer­te zwi­schen 0 und 1023 umgewandelt.
  • Die Ein­gän­ge SCL (A5) und SDA (A4) wer­den über den ➨I2C-Bus angesteuert.
  • die Pins RX (Recei­ver = Emp­fän­ger) und TX (Trans­mit­ter = Sen­der) wer­den für die Kom­mu­ni­ka­ti­on mit dem Com­pu­ter über die USB-Schnitt­stel­le ver­wen­det. Sie kön­nen nur dann als digi­ta­le Ein- oder Aus­gän­ge ver­wen­det wer­den, wenn der Ardui­no über eine exter­ne Strom­zu­fuhr betrie­ben wird.

Board instal­lie­ren

  • Icon für den Board­ver­wal­ter ankli­cken oder Werk­zeu­ge-> Board -> Boardverwalter
  • nach dem SAMD Board suchen
  • Board instal­lie­ren

Blue­tooth LE

Das Pro­gramm

Zunächst musst du die Biblio­thek Ardui­no­BLE installieren:

# include "ArduinoBLE.h"

/* 
  eindeutige  UUID bestimmen: 
  https://www.guidgenerator.com/online-guid-generator.aspx
  https://www.uuidgenerator.net/
  BLERead | BLEWrite | BLENotify
  -> schreiben, lesen, Info
*/

// Name BLE-Service
BLEService LEDSchalten("19b10000-e8f2-537e-4f6c-d104768a1214");

BLEUnsignedCharCharacteristic Auswahl("19b10000-e8f2-537e-4f6c-d104768a1214", BLERead | BLEWrite | BLENotify);

// LED an Pin 18
int LED = 18;

void setup()
{
  Serial.begin(9600);

  // auf serielle Verbindung warten
  while (!Serial);
  delay(1000);

  // pinMode festlegen
  pinMode(LED_BUILTIN, OUTPUT);
 
  // BLE starten
  if (!BLE.begin()) Serial.println("Bluetooth-Modul konnte nicht gestartet werden!");
  else Serial.println("Bluetooth-Modul erfolgreich gestartet!");

  // Name festlegen (wird in der App angezeigt) und den Service (LEDSchalten) zuweisen
  BLE.setLocalName("LED schalten");
  BLE.setAdvertisedService(LEDSchalten);

  // Auswahl als Platzhalter für den in der App gewählten Wert
  LEDSchalten.addCharacteristic(Auswahl);

  // Service LEDSchalten hinzufügen
  BLE.addService(LEDSchalten);

  // Startwert für die Kommunikation schreiben
  Auswahl.writeValue(0);

  // Zuweisung starten
  BLE.advertise();
}

void loop()
{
  // auf die Verbindung zu Geräten warten
  BLEDevice Verbindung = BLE.central();

  // wenn der ESP32 mit einem Gerät verbunden ist ...
  if (Verbindung)
  {
    Serial.println("Verbunden ... ");

    // solange der Controller mit einem Gerät verbunden ist ...
    while (Verbindung.connected())
    {

      if (Auswahl.written())
      {
        // LED einschalten
        if (Auswahl.value() == '1')
        {
          Serial.print(char(Auswahl.value()));
          Serial.println(" -> LED ein");
          digitalWrite(LED_BUILTIN, HIGH);
        }

        // LED ausschalten
        if (Auswahl.value() == '0')
        {
          Serial.print(char(Auswahl.value()));
          Serial.println(F(" -> LED aus"));
          digitalWrite(LED_BUILTIN, LOW);
        }    
      }
    }
  }
}

Smart­phone-Apps

BLE Ter­mi­nal

Blue­tooth­LE

WiFi

#include "WiFiNINA.h"

// WiFi-Daten
char Router[] = "Router_SSID";
char Passwort[] = "xxxxxxx";

// Minimum/Maximum der Zufallszahlen
const byte Minimum = 1;
const byte Maximum = 49;

WiFiServer WiFiServer(80);
WiFiClient WiFiClient;

void setup() 
{
  Serial.begin(9600);

  // auf serielle Verbindung warten
  while (!Serial) ;
  delay(500);

  // WiFi starten
  WiFi.begin(Router, Passwort);

  // Verbindung herstellen
  while (WiFi.status() != WL_CONNECTED) 
  {
    delay(200);
    Serial.print(".");
  }

  // SSID des Routers anzeigen
  Serial.println();
  Serial.print("Verbunden mit ");
  Serial.println(WiFi.SSID());

  // IP anzeigen
  Serial.println(WiFi.localIP());

  // Webserver starten
  WiFiServer.begin();

  // IP des Servers/des verbunden Computers anzeigen
  Serial.print("Server: ");
  Serial.println(WiFi.SSID());

  // IP des Arduinos anzeigen
  Serial.print("IP Adresse Arduino DHCP: ");
  Serial.println(WiFi.localIP());

  // Zufallsgenerator mit dem Signal an A0 starten
  randomSeed(analogRead(A0));
}

void loop() 
{
  // auf WiFiClienten warten ...
  WiFiClient = WiFiServer.available();
  if (WiFiClient) 
  {
    // Seite aufbauen wenn SeiteAufbauen true ist
    boolean SeiteAufbauen = true;

    // solange der WiFiClient verbunden ist ...
    while (WiFiClient.connected()) 
    {
      if (WiFiClient.available()) 
      {
        // Anforderung vom WiFiClienten lesen ...
        char Zeichen = WiFiClient.read();

        // wenn als Zeichen neue Zeile (\n) übergeben wird
        // SeiteAufbauen true ist -> Seite anzeigen
        if (Zeichen == '\n' && SeiteAufbauen) 
        {
          /*
              HTML-Seite aufbauen
              die folgenden Anweisungen müssen
              mit print oder println gesendet werden
              println "verschönert" den Quelltext
              (erzeugt einen Zeilenumbruch im Quelltext)
          */
          WiFiClient.println("HTTP/1.1 200 OK");
          WiFiClient.println("Content-type:text/html");

          // Leerzeile zwingend erforderlich
          WiFiClient.println();
          WiFiClient.println("<!doctype html>");
          WiFiClient.println("<html>");
          WiFiClient.println("<body>");

          // <h2> Überschrift H2
          WiFiClient.println("<h2>Zufallszahlen</h2>");

          // <hr> horizontale Linie
          WiFiClient.println("<hr>");

          // Zufallszahlen anzeigen
          for (int i = 0; i < 6; i++) 
          {
            int Zahl = random(Minimum, Maximum);
            WiFiClient.println(Zahl);
            WiFiClient.println(" ");
          }

          WiFiClient.print("<hr>");

          // IPs anzeigen
          WiFiClient.print("Eigene IP-Adresse: ");
          WiFiClient.print(WiFiClient.remoteIP());
          WiFiClient.print("</b>");
          WiFiClient.print("<br>IP-Adresse Arduino: ");
          WiFiClient.print(WiFi.localIP());
          WiFiClient.println("</body>");
          WiFiClient.println("</html>");

          // HTTP-Antwort endet mit neuer Zeile
          WiFiClient.println();

          // Seite vollständig geladen -> loop verlassen
          break;
        }
        // neue Zeile -> SeiteAufbauen auf true setzen
        if (Zeichen == '\n') SeiteAufbauen = true;

        // die aktuelle Zeile enthält ein Zeichen
        else if (Zeichen != '\r') SeiteAufbauen = false;
      }
    }
    delay(1);

    WiFiClient.stop();
  }
}

Letzte Aktualisierung: 6. Okt 2024 @ 9:25