DIY Stacja pogodowa Z ESP32 — Esp32 C6 simulation

An interactive Esp32 C6 circuit simulation you can run free in your browser on Velxio, by kshyhoo.

Components

Sketch code

// STACJA POGODOWA - ESP32-C6 (VELXIO)
// Wzorowane na sprawdzonej, dzialajacej wersji z Wokwi:
//  - globalny HTTPClient http; (nie tworzony na nowo w kazdym wywolaniu)
//  - odczyt strumieniowy zamiast http.getString() (mniej alokacji na stercie)
//  - wysylka HTTP na osobnym zadaniu (sendTask)
//  - heap_caps_check_integrity_all() do wczesnego wykrywania korupcji sterty
//  - WiFi.begin(ssid, pass, wifiChannel) NIE POMINIETE
//
// UWAGA: ESP32-C6 ma JEDEN rdzen - sendTask dzieli rdzen 0 z loop()
// przez preemptywny scheduler. Cale I2C w jednym zadaniu = jeden punkt
// dostepu do magistrali, brak przeplatania transakcji miedzy kontekstami.
//
// Kazdy czujnik probkowany niezaleznie; brak jednego NIE blokuje reszty.
// NAN = "brak wiarygodnej probki" -> w URL poleci "nan" -> floatval() w
// PHP zamieni na 0.0 (bezpieczne dla json_encode).
//
// Podzial rol miedzy czujnikami (bez duplikacji funkcji):
//   AS5600      (0x36, I2C) - kat obrotu choragiewki WZGLEDEM OBUDOWY stacji
//   BMM150      (0x13, I2C) - azymut magnetyczny SAMEJ STACJI (kalibracja/Polnoc)
//                              -> suma AS5600 + BMM150 = prawdziwy kierunek wiatru
//   BME280      (0x76, I2C) - temperatura, wilgotnosc, cisnienie (JEDYNE zrodlo)
//   TSL2561     (0x29, I2C) - naslonecznienie (Lux)
//   Water Level (0x77+0x78, I2C, 2x ATtiny1616) - poziom deszczowki w zbiorniku
//   GUVA-S12D   (analog, pin 4) - indeks UV
//   Anemometr   (open-collector, pin 5) - predkosc wiatru (impulsy)
//   D7S         (0x55, I2C) - wibracje/sejsmika: intensity (SI) + PGA
#include <WiFi.h>
#include <Wire.h>
#include <math.h>  // fabs()
#include <HTTPClient.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <Adafruit_TSL2561_U.h>
#include "bmm150.h"
#include "bmm150_defs.h"

const char* ssid = "Velxio-GUEST";
const char* pass = "";
const int wifiChannel = 6;  // wymuszony kanal - pomija skanowanie sieci
HTTPClient http;

const char* serverURL = "http://kshyhoo.eu/weather/update.php";
// Prosty "sekret" chroniacy endpoint przed przypadkowym albo zlosliwym nadpisaniem danych przez kogos innego, kto zgadnie adres URL. Musi byc identyczny z wartoscia sprawdzana w update.php
const char* apiToken = "kshyhoo";
const unsigned long sendInterval = 5000;  // co ile ms wysylac dane
// GLOBALNE ZMIENNE STANU (aktualizowane WYLACZNIE w sendTask)
float angleDeg = NAN;           // kat choragiewki z AS5600 (0-360)
float stationHeadingDeg = NAN;  // azymut stacji z BMM150 (0-360)
float windDeg = NAN;            // prawdziwy kierunek wiatru (0-360)
float bmeTempC = NAN;
float bmePressureHpa = NAN;
float bmeHumidityPct = NAN;
float lightLux = NAN;
float uvIndex = NAN;
float waterLvl = NAN;    // poziom wody [cm]
float d7sSi = NAN;       // intensywnosc wibracji [SI]
float d7sPga = NAN;      // przyspieszenie chwilowe PGA [m/s^2]
float windSpeedMps = 0;  // predkosc wiatru z impulsow (liczona w loop)

#define SDA_PIN 23
#define SCL_PIN 22
// KIERUNEK WIATRU (AS5600)
#define WIND_I2C_AD

More projects by kshyhoo