Upravená krabička pro meteostanici s radiačním štítem s ESP32-C3/ESP8266 a senzorem SEN55

Článek by se mohl jmenovat „Jak jsem vymazlil vymazlenou 3D tištěnou krabičku s radiačním štítem pro meteostanici pro senzor SEN5x a řídící desku Air Board“.
A přesně to by vystihlo mé úsilí. Tuto krabičku jsem totiž vylepšil o prostor pro baterii 18650 s JST konektorem, přidal otvory pro vedení kabelů a externí anténu a také jsem přidal ke stávajícímu uchycení řídící desky AirBoard s ESP8266 navíc Meteo Mini s ESP32-C3, která je dostupná ve variantě s PCB anténou nebo právě s externí anténou přes IPEX konektor.

Původní krabička (psal jsem o ní tady) je skvělá – to bezesporu, ale tak jako u všech projektů se vždycky najde někdo (tady jsem to byl já 😀 ), který si řekne „hm, potřeboval bych tuhle drobnost, a pak tuhle“. A tak jsem se do toho dal.

Upozornění: nejsem žádný expert na návrh 3D modelů pro tisk na 3D tiskárně. Úpravy jsem dělal v Tinkercad, protože s ničím lepším neumím a na ty moje mini úpravy to zatím stačilo.

Moje potřeby:

– Použití MeteoMini místo AirBoard (oboje laskakit.cz). MeteoMini je založený na modulu s ESP32-C3, který je buď osazen PCB anténou nebo IPEX konektorem – a to pro umístění na zahradě potřebuji. Díky IPEX konektoru mohu přidat externí anténu a zlepšit tak dosah. Wi-Fi.

– napájení ze solárního panelu – obě desky, AirBoard i Meteo Mini mají možnost připojení solárního panelu s maximálním napětím 8V (do tohoto maxima musí být uvažována i hodnota napětí ze solárního panelu naprázdno, tedy v případě, kdy baterie bude plně nabitá a ze soláru nebude odebírán téměř žádný proud – napětí ze soláru je pak vyšší než je jmenovité).

– použití čidla SEN5x, v mém případě SEN55 – tady je menší nevýhoda při použití Meteo Mini místo AirBoard. AirBoard má osazený zvyšující měnič z napětí baterky na 5V, které SEN5x potřebuje pro napájení.
Při použití Meteo Mini je ale potřeba trochu bastlení – přidat externí měnič z bateriového napětí na 5V. Měnič bude fungovat i v případě, že jej budete napájet z uŠup konektoru (3.3V) na 5V.
Já zvolil zvýšení napětí přímo z baterie z důvodu, že má zvyšující měnič vyšší účinnost.
Můj návrh měniče prodává laskakit https://www.laskakit.cz/laskakit-bat-boost-menic-5v-0-6a-dio6605b/ a já použil přesně tento.

– krabičku jsem přimontoval k sušáku na prádlo, který má čtvercovou konstrukci s rozměry 42x42mm

3D tisk

Původní model krabičky najdete tady. Moje upravená verze se skladá ze 4 částí – hlavní část, kam se přišroubuje AirBoard s ESP8266 nebo Meteo Mini s ESP32-C3, dále radiační štít, který chrání před ohřátím senzorů uvnitř krabičky, spodní část (upravený model už má otvor pro vedení kabelu z externího čidla mimo krabičku ve spodní části), kam se umístí baterie 18650 a nakonec držák na konstrukci sušáku.
Můj upravený model najdete na https://www.printables.com/model/1338580-krabicka-s-radiacnim-stitem-pro-meteostanice-laska

Materiál doporučuji: PETG, PC-ABS, ASA (ano, PETG opravdu vydrží jak v zimě, tak i v létě).
Perimetry: 3 nebo 4
Podpory: všude
Profil: 0.2mm STRUCTURAL (Prusa Slicer)

Hardware

Využil jsem součástky z e-shopu laskakit. Důvodem je velmi nízká vlastní spotřeba jejich desek a navíc jsou desky předpřipravené právě pro použití například jako meteostanice.

Baterie 18650 s JST konektorem – https://www.laskakit.cz/geb-li-ion-baterie-1×18650-1s1p-3-7v-3200mah/

AirBoard (nepoužitý, protože ESP8266 modul nemá možnost připojit externí anténu) – https://www.laskakit.cz/laskakit-airboard-8266-deska-pro-mereni-kvality-vzduchu/

(Použitý) Meteo Mini s ESP32-C3 ve verzi s IPEX konektorem pro externí anténu – https://www.laskakit.cz/laskakit-meteo-mini/

Zvyšující měnič na 5V (Meteo Mini nemá zvyšující měnič na 5V, které by SEN55 napájelo, AirBoard ano. Bohužel AirBoard zase neumožňuje připojení externí antény, která je pro mě důležitější) – https://www.laskakit.cz/laskakit-bat-boost-menic-5v-0-6a-dio6605b/

SEN55 – https://www.laskakit.cz/senserion-sen55-sdn-t-opticky-senzor-kvality-ovzdusi/ použít ale můžete levnější variantu SEN54 (ta nemá měření VOC a NOX, které ve venkovním prostředí stejně nemá smysl použít) – https://www.laskakit.cz/senserion-sen54-sdn-t–opticky-senzor-kvality-ovzdusi/
Kód je pro oba typy stejný.

Upozornění: SEN5x není určen pro měření venku! Ale funguje to, cena je přijatelná a tak to používám už několik let 🙂

Propojovací kabel, který jsem ustřihl a část, která je pro AirBoard jsem zapájel přímo na Meteo Mini – https://www.laskakit.cz/laskakit-airboard-propojovaci-kabel-pro-senserion-sen5x-opticky-senzor-kvality-ovzdusi/

Zapojení:
Napájení z baterie jsem připojil na vstup zvyšujícího měniče, výstup ze zvyšujícího měniče pak na napájení SEN5x.
Zem jsem propojil dohromady. Vstup SEL jsem připojil ke GND (důležité!).
SDA na pin 19, SCL na pin 18 a vstup EN zvyšujícího měniče na GPIO5.

Externí anténa a pigtail – https://www.laskakit.cz/antena-5dbi-19cm-2-4g-bila/, https://www.laskakit.cz/pigtail-mhf3-ipex3-sma-female–kabel-1-15mm–15cm/

Software

Pro mou potřebu měřím teplotu 2x – jednou skrze SEN55 uvnitř krabičky, podruhé pomocí čidla SHT40, které jsem umístil vespod 3D tištěné krabičky – abych měl porovnání hodnot přes celý rok.
Třetím měřeným údajem, který se posílá je PM10 ze SEN5x (SEN54 nebo SEN55).
Všechny dostupné údaje jsou odeslány na Seriový port, vybraná data pak na server TMEP.cz, kde nastavení je následující:
GUID1: teplota
GUID2: teplotaSHT
GUID3: PM10
TMEP.cz se stará o ukládání dat, vizualizaci na webu i prostřednictvím mobilní aplikace.
Samozřejmě kód i nastavení serveru můžete upravit dle svých potřeb – chcete raději teplotu, vlhkost a PM? Není problém 🙂

/*
 * Kód pro MeteoMini a SEN5x
 * Naměřené hodnoty jsou odesílány na Serial Monitor a na TMEP.cz.
 *
 * Potřebné knihovny:
 * https://github.com/Sensirion/arduino-i2c-sen5x
 * https://github.com/adafruit/Adafruit_SHT4X
 * https://github.com/madhephaestus/ESP32AnalogRead
 * 
 * ESP32 knihovna: v2
 *
 * chiptron 2025
 */

// --- Knihovny ---
#include <WiFi.h>
#include <SensirionI2CSen5x.h>
#include <Wire.h>
#include <ESP32AnalogRead.h>
#include <HTTPClient.h>
#include "Adafruit_SHT4x.h"

// --- Konstanty a globální proměnné ---
#define SEN5xGPIO 5                  // Pin pro řízení měniče, který napájí SEN5x
#define sleepTimeSec 900             // Spánkový interval v sekundách

SensirionI2CSen5x sen5x;             // Objekt pro SEN5x
Adafruit_SHT4x sht4 = Adafruit_SHT4x(); // Objekt pro SHT4x

ESP32AnalogRead adc;                 // Pro čtení napětí baterie
float vBat = 0.0;                    // Napětí baterie

// Adresa serveru a GUIDy pro TMEP.cz
String serverName = ""; // vyplňte váš server name
String GUID1 = "teplota";
String GUID2 = "teplotaSHT";
String GUID3 = "PM10";

// Proměnné pro chyby
uint16_t error;
char errorMessage[256];

// WiFi přihlašovací údaje
const char* ssid = "SSID";
const char* password = "PASSWORD";

// --- Funkce setup ---
void setup() {
  Serial.begin(115200);
  Wire.begin(19, 18);                // Nastavení I2C pinů
  pinMode(SEN5xGPIO, OUTPUT);
  digitalWrite(SEN5xGPIO, HIGH);     // Zapnutí SEN5x
  delay(500);

  // --- Inicializace SEN5x ---
  sen5x.begin(Wire);
  float tempOffset = 0.0;
  error = sen5x.setTemperatureOffsetSimple(tempOffset);
  if (error) {
    Serial.print("Chyba při nastavování offsetu teploty: ");
    errorToString(error, errorMessage, 256);
    Serial.println(errorMessage);

    digitalWrite(SEN5xGPIO, LOW);
    delay(500);
    Serial.flush();
    esp_sleep_enable_timer_wakeup(sleepTimeSec * 1000000);
    esp_deep_sleep_start();
  } else {
    Serial.print("Offset teploty nastaven na ");
    Serial.print(tempOffset);
    Serial.println(" °C (pouze SEN54/SEN55)");
  }

  // Spuštění měření SEN5x
  error = sen5x.startMeasurement();
  if (error) {
    Serial.print("Chyba při spuštění měření: ");
    errorToString(error, errorMessage, 256);
    Serial.println(errorMessage);

    digitalWrite(SEN5xGPIO, LOW);
    delay(500);
    Serial.flush();
    esp_sleep_enable_timer_wakeup(sleepTimeSec * 1000000);
    esp_deep_sleep_start();
  }

  // --- Inicializace ADC ---
  adc.attach(0);

  // --- Připojení k WiFi ---
  WiFi.begin(ssid, password);
  Serial.println("Připojování k WiFi...");
  uint8_t pokusy = 0;
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    pokusy++; // 10 pokusů o připojení, jinak se uspí
    if (pokusy > 10) {
      digitalWrite(SEN5xGPIO, LOW);
      delay(500);
      Serial.flush();
      esp_sleep_enable_timer_wakeup(sleepTimeSec * 1000000);
      esp_deep_sleep_start();
    }
  }
  Serial.println();
  Serial.print("Připojeno, IP adresa: ");
  Serial.println(WiFi.localIP());
}

// --- Hlavní smyčka ---
void loop() {
  // --- Čtení hodnot ze SEN5x ---
  float pm1_0, pm2_5, pm4_0, pm10_0;
  float humidity, temperature, vocIndex, noxIndex;

  // Čekání na validní data ze senzoru
  while ((isnan(pm10_0) || pm10_0 == 0.0) || (isnan(temperature) || temperature == 0.0)) {
    sen5x.readMeasuredValues(pm1_0, pm2_5, pm4_0, pm10_0, humidity, temperature, vocIndex, noxIndex);
    Serial.println("Čekám na data ze SEN5x...");
    delay(1000);
  }
  // Pro jistotu ještě 2x přečteme data
  for (uint8_t i = 0; i < 2; i++) {
    sen5x.readMeasuredValues(pm1_0, pm2_5, pm4_0, pm10_0, humidity, temperature, vocIndex, noxIndex);
    delay(1000);
  }

  // --- Čtení hodnot ze SHT4x ---
  float tempSHT = 0.0;
  int humSHT = 0;
  if (!sht4.begin()) {
    Serial.println("SHT4x nenalezen - není připojen nebo zkontrolujte zapojení.");
  } else {
    Serial.println("SHT4x nalezen.");
    sht4.setPrecision(SHT4X_LOW_PRECISION); // Nastavení přesnosti
    sht4.setHeater(SHT4X_NO_HEATER);        // Vypnutí ohřevu

    sensors_event_t hum, temp;
    sht4.getEvent(&hum, &temp);

    tempSHT = temp.temperature;
    humSHT = hum.relative_humidity;

    Serial.print("Teplota SHT4x: "); Serial.println(tempSHT);
    Serial.print("Vlhkost SHT4x: "); Serial.println(humSHT);
  }

  // --- Čtení napětí baterie ---
  vBat = adc.readVoltage() * 1.769387755; // Korekce podle děliče (R2=320k, R1=100k)

  // --- Výpis hodnot na Serial Monitor ze SEN5x ---
  Serial.print("Teplota: "); Serial.println(temperature);
  Serial.print("Vlhkost: "); Serial.println(humidity);
  Serial.print("PM2.5: "); Serial.println(pm2_5);
  Serial.print("PM10: "); Serial.println(pm10_0);
  Serial.print("Napětí: "); Serial.println(vBat);

  // --- Odeslání dat na TMEP.cz ---
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    // Sestavení URL s hodnotami
    String serverPath = serverName + GUID1 + "=" + temperature + "&" +
                        GUID2 + "=" + tempSHT + "&" +
                        GUID3 + "=" + pm10_0 + "&v=" + vBat;

    http.begin(serverPath.c_str());
    int httpResponseCode = http.GET();

    if (httpResponseCode > 0) {
      Serial.print("HTTP odpověď: ");
      Serial.println(httpResponseCode);
      String payload = http.getString();
      Serial.println(payload);
    } else {
      Serial.print("Chyba HTTP: ");
      Serial.println(httpResponseCode);
    }
    http.end();
  } else {
    Serial.println("Wi-Fi odpojeno");
  }

  // --- Uvedení zařízení do spánku ---
  digitalWrite(SEN5xGPIO, LOW); // Vypnutí SEN5x
  delay(1000);
  Serial.flush();
  esp_sleep_enable_timer_wakeup(sleepTimeSec * 1000000);
  esp_deep_sleep_start();
}

Co dodělat

Chtěl bych přidat ke krabičce miniaturní radiační štít pro externí SHT40, který bych přilepil naspod krabičky, kde jsem přidal otvory. SHT40 by tak bylo kryto solárním panelem, 3D tištěnou krabičkou a navíc vlastním radiačním štítem.

Pár fotek na závěr

Sdílejte článek:
Ukaž světu,
že jsi Maker!
Koupit tričko
Kafe pro Chiptrona
Dodej energii dalšímu článku

Související články

Hledání vhodného projektu, který by pomohl při vysvětlování základních pojmů a principů nemusí být jednoduché.

Postavil jsem další monitor vzduchu, měří 6 parametrů, není vidět, dělá dvojnásobnou radost a složil jsem to z téměř šuplíkových zásob.

3D tištěná krabička plná senzorů

3D tištěná krabička, kterou na stěně snadno přehlédnete, je plná nejrůznějších senzorů pro měření kvality vzduchu. Uvnitř této nenápadné krabičky se ale skrývají senzory, které měří teplotu, vlhkost vzduchu, koncentrace CO2, ale nechybí ani údaje VOC a NOx indexu kvality…

Hlídat si kvalitu vzduchu v okolí, ve kterém žiji není nic nenormálního.

Trendy