Close

Arduino IoT Cloud meteostanice s OLED

Meteostanice s Arduino Cloud a Nano 33 IoT

Svět IoT (Internet of Things) je všude kolem nás a Arduino IoT Cloud nabízí kutilům možnost ovládat jejich zařízení kdykoliv a odkudkoliv na profesionální úrovni. O Arduino online nástrojích jsme si již v minulosti psali, teď se ale zdá, že to už opravdu bude stát za to.

S Arduino IoT Cloud můžete pomocí prohlížeče internetu dálkově ovládat nebo sledovat chod programu vašeho zařízení. V článku si ukážeme jednoduchou meteostanici s Arduino NANO 33 IoT, zobrazením dat na OLED a posíláním do IoT Cloud. Na závěr vyzkoušíme ovládání vašeho zařízení hlasem pomocí asistenta Alexa od Amazonu.

Měříme teplotu, tlak a vlhkost

Pro seznámení s Arduino Cloud jsem zvolil konstrukci jednoduché meteostanice postavené ze dvou mikropočítačů Arduino Nano 33 IoT. K prvnímu mikropočítači je přes sběrnici I2C připojen senzor BME280 pro měření teploty, tlaku a vlhkosti. K druhému mikropočítači je pomocí I2C připojen malý grafický OLED displej 0,96“, který měřené hodnoty zobrazuje. Zapojení je jednoduché a patrné z obrázků níže. Stačí propojit piny VCC, GND, SCL a SDA. Pin VCC je výstup +3V3 z Arduina. Oba mikropočítače se po zapnutí připojí ke cloudu pomocí WiFi sítě a sdílí měřené hodnoty. Při napájení Arduina 5 V do pinu VIN je potřeba počítat se střední hodnotou odebíraného proudu asi 75 mA, při zvýšení napájecího napětí na 18 V hodnota proudu klesne na 25 mA.

Zařízení Meteo_Senzor napájené z power banky 5 V
Zařízení Meteo_Senzor napájené z power banky 5 V
Zařízení Meteo_OLED napájené z alkalické baterie 9 V
Zařízení Meteo_OLED napájené z alkalické baterie 9 V

Mikropočítač Arduino Nano 33 IoT

Arduino Nano 33 IoT je mnohoúčelový mikropočítač vybavený gyroskopem, akcelerometrem, WiFi, Bluetooth, RTC a spínaným zdrojem v rozsahu vstupního napětí 5-18 V. Zapojením pinů je téměř shodné s původním Arduino Nano (DIL 30), ale napětí I/O obvodů je pouhých 3,3 V s maximální proudem výstupu 7 mA. Mikropočítač používá 32bitový procesor ARM SAMD21 Cortex-M0+ na frekvenci 48 MHz s 256 kB paměti SRAM a 1 MB paměti Flash. Díky integrovanému radiovému modulu uBlox NINA-W102 a kryptografickému čipu ATECC608A je ideální pro konstrukce zařízení IoT. Dokumentaci mikropočítače včetně schéma zapojení najdete třeba zde. Všestranné Arduino Nano 33 IoT je pro použití s IoT Cloud ideální.

Arduino IoT Cloud

Nano 33 IoT je jeden z mnoha mikropočítačů, který můžete programovat online pomocí webové aplikace Arduino IoT Cloud. Podrobný návod, jak pracovat s touto aplikací najdete třeba zde. Prostředí Arduino IoT Cloud je intuitivní a samo vás navede, co je potřeba udělat. Po nutné registraci a instalaci Arduino Create Agent lze pomocí USB připojit váš mikropočítač a začít vytvářet vlastní IoT projekt.

Každý nový uživatel má automaticky nastaven bezplatný plán, který umožňuje vytvořit až dvě IoT zařízení (Things) a využívat až 5 proměnných (Variables), pomocí kterých můžete svůj mikropočítač dálkově sledovat nebo ovládat. Nastudujte si omezení a možnosti rozšíření vašeho plánu. V záložce Thinks-Setup zadáte název svého nového zařízení, k němu přiřadíte a pojmenujete mikropočítač (Device), vytvoříte cloud proměnné a zadáte parametry WiFi sítě, ke které se mikropočítač připojí po zapnutí napájení.

Nastavení cloud proměnných meteostanice jsem vložil do úvodní poznámky programu. V záložce Thinks-Sketch dopíšete vaši část řídícího programu (viz výpis níže), který nakonec nahrajete do mikropočítače. Chod programu můžete sledovat pomocí sériového monitoru webové aplikace. Již vytvořené cloud proměnné se v programu znovu nedeklarují. Řídící panel svého nového zařízení si vytvoříte v záložce Dashboards. Samostatně lze navrhnout panel pro mobilní nebo desktopovou aplikaci. K sestavení řídícího panelu použijte nabídku Widgets. Jde například o tlačítka, přepínače, kontrolky nebo jiné grafické zobrazení hodnot proměnných. Prvky řídícího panelu se nakonec propojí s programem v mikropočítači pomocí vytvořených cloud proměnných.

Seznam vytvořených zařízení v Arduino IoT Cloud
Seznam vytvořených zařízení v Arduino IoT Cloud
Příklad řídícího panelu webové aplikace Arduino IoT Cloud
Příklad řídícího panelu webové aplikace Arduino IoT Cloud

Přístup z mobilu pomocí aplikace Arduino IoT Cloud Remote

Pro rychlý přístup k vašemu řídícímu panelu z mobilního telefonu si naistalujte aplikaci Arduino IoT Cloud Remote.

Podrobný záznam teploty za 24 hodin
Podrobný záznam teploty za 24 hodin

Ovládání Nano 33 IoT pomocí hlasového asistenta Alexa

Pro zpestření jsem v zařízení Meteo_Senzor vytvořil navíc proměnnou teplota_alexa, která je v cloudu deklarována jako Alexa kompatibilní proměnná a umožňuje čtení hodnoty pomocí hlasového asistenta Alexa od Amazonu. Zde je ovšem nutné do aplikace Alexa přidat Arduino dovednosti (Skill) a potom v záložce zařízení (Devices) vyhledat nová zařízení (Discover Devices). O to samé můžete Alexu požádat slovně v angličtině. Alexa by měla najít nové zařízení pro měření teploty, které si pak zařadíte do konkrétní místnosti. Potom už jen stačí Alexu požádat, aby vám řekla, jaká je teplota v konkrétní místnosti.

Mobilní aplikace Alexa
Mobilní aplikace Alexa

Program v Meteo_Senzor (Device_1)

/*
  Nastavení cloud proměnných pro zařízení Meteo_Senzor:
  teplota, Float (Basic types), Read only, Variable update periodically 1 s
  teplota_alexa, CloudTemperatureSensor (Alexa compatible), Read only, Variable update periodically 1 s
  tlak, Float (Basic types), Read only, Variable update periodically 1 s
  vlhkost, Int (Basic types), Read only, Variable update periodically 1 s
*/
#include "thingProperties.h" // Parametry definované v Arduino IoT Cloud
#include <Adafruit_BME280.h>
Adafruit_BME280 bme;
float teplota_predchozi = 0;
float tlak_predchozi = 0;
int vlhkost_predchozi = 0;

void setup() {
  Serial.begin(9600);
  bme.begin(0x76); // I2C adresa čidla 0x76
  delay (100);
  initProperties(); // Parametry definované v Arduino IoT Cloud
  ArduinoCloud.begin(ArduinoIoTPreferredConnection); // Připojení k Arduino IoT Cloud
  setDebugMessageLevel(2); // Nastavení důležitosti výpisu zpráv na sérový monitor
  ArduinoCloud.printDebugInfo();
}

void loop() {
  ArduinoCloud.update();
  delay (1000);
  teplota = round (10 * bme.readTemperature()) / 10; // Převod na jedno desetinné místo
  teplota_alexa = teplota;
  delay (100);
  tlak = round (bme.readPressure() / 10) / 10; // Převod na jedno desetinné místo a hPa
  delay (100);
  vlhkost = bme.readHumidity();
  delay (100);
  if (tlak_predchozi != tlak or teplota_predchozi != teplota or vlhkost != vlhkost_predchozi) {
    Serial.print(teplota, 1); Serial.print(" °C ");
    Serial.print(tlak, 1); Serial.print(" hPa ");
    Serial.print(vlhkost, 1); Serial.println(" %");
    teplota_predchozi = teplota;
    tlak_predchozi = tlak;
    vlhkost_predchozi = vlhkost;
  }
}

Program v Meteo_OLED (Device_2)

/*
  Nastavení cloud proměnných pro zařízení Meteo_OLED:
  teplota, Float (Basic types), Read/Write, Variable update on change, In sync with Meteo_Senzor
  tlak, Float (Basic types), Read/Write, Variable update on change, In sync with Meteo_Senzor
  vlhkost, Int (Basic types); Read/Write, Variable update on change, In sync with Meteo_Senzor
*/
#include <Adafruit_SSD1306.h>
#include "thingProperties.h" // Parametry definované v Arduino IoT Cloud
Adafruit_SSD1306 display(128, 64, &Wire, -1); // OLED šířka, výška

void setup() {
  Serial.begin(9600);
  initProperties();
  ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  setDebugMessageLevel(2);
  ArduinoCloud.printDebugInfo();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Interní zdroj 3V3, I2C adresa OLED
  display.setTextColor(SSD1306_WHITE); // Nastav bílý text na černém pozadí
  display.cp437(true); // Použij znakovou sadu CP437
  aktualizuj_OLED ();
}

void loop() {
  ArduinoCloud.update();
  delay (1000);
}

void onTeplotaChange()  { // Při změně teploty
  aktualizuj_OLED ();
}

void onTlakChange()  { // Při změně tlaku
  aktualizuj_OLED ();
}

void onVlhkostChange()  { // Při změně vlhkosti
  aktualizuj_OLED ();
}

void aktualizuj_OLED () {
  display.setTextSize(2); // Nastav velikost textu
  display.clearDisplay(); // Smaž displej
  display.setCursor(0, 0); // Nastav počáteční pozici kurzoru
  display.print("T="); display.print(teplota, 1); display.print(" ");
  display.print(char(248)); display.println("C");
  display.print("P="); display.print(tlak, 0); display.println(" hPa");
  display.print("RH="); display.print(vlhkost); display.println(" %");
  display.setTextSize(1); // Nastav velikost textu
  if (ArduinoCloud.connected()) display.println("CLOUD - SPOJENO");
  else display.println("CLOUD - NESPOJENO");
  display.display();
}

Jiří Martinek, OK1FCB
Latest posts by Jiří Martinek, OK1FCB (see all)

Napsat komentář