|
Rucni profilometer(defektoskop) 1.0
Modul pro mereni profilu kol draznich vozidel
|
Rucni defektoskop, rizeni a mereni. ...
#include <Arduino.h>#include <WiFi.h>#include <AsyncTCP.h>#include <ESPAsyncWebServer.h>#include "SPIFFS.h"#include "AsyncJson.h"#include "ArduinoJson.h"#include <SPI.h>#include <SD.h>#include "config.h"#include "ADS1X15.h"#include "FastAccelStepper.h"#include "time.h"#include <vector>
Datové struktury | |
| struct | ESPConfig |
| Struktura pro konfiguraci WiFi připojení ESP32. ... | |
| struct | Measurement |
| Struktura pro uložení jedné měřicí sady dat. ... | |
Definice maker | |
| #define | UART_BAUD 115200 |
| Rychlost sériové linky pro UART komunikaci. | |
| #define | PIN_DTR 25 |
| Pin DTR (Data Terminal Ready) modulu SIM7000G. | |
| #define | PIN_TX 27 |
| UART TX pin směrem k SIM7000G. | |
| #define | PIN_RX 26 |
| UART RX pin z modulu SIM7000G. | |
| #define | PWR_PIN 4 |
| Pin pro zapnutí napájení modulu. | |
| #define | SD_MISO 2 |
| SPI MISO pin pro SD kartu. | |
| #define | SD_MOSI 15 |
| SPI MOSI pin pro SD kartu. | |
| #define | SD_SCLK 14 |
| SPI hodinový pin pro SD kartu. | |
| #define | SD_CS 13 |
| SPI chip select pin pro SD kartu. | |
| #define | LED_PIN 12 |
| Indikační LED pin. | |
| #define | LDPin 33 |
| Pin pro ovladani laseru. | |
Funkce | |
| ADS1115 | ADS (0x48) |
| AsyncWebServer | server (80) |
| HTTP server běžící na portu 80. | |
| AsyncWebSocket | ws ("/ws") |
WebSocket server na cestě /ws. | |
| void | onWsEvent (AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) |
| Obsluha událostí WebSocket serveru. | |
| void | espConfig () |
| Načte konfiguraci zařízení ze souboru espconfig.txt uloženého ve SPIFFS. | |
| void | saveESPConfig () |
Uloží aktuální konfiguraci zařízení do souboru espconfig.txt ve SPIFFS. | |
| void | setupWifi () |
| Inicializuje WiFi připojení podle uložené konfigurace. | |
| void | httpConfig () |
| Inicializuje a konfiguruje HTTP server a WebSocket na ESP zařízení. | |
| void | debug (String debugMessage) |
| Odesílá ladicí zprávu všem připojeným klientům přes WebSocket. | |
| void | copyFile (const char *oldFileName, const char *newFileName) |
| Zkopíruje obsah jednoho souboru na SD kartě do druhého. | |
| float | vypocetHodnoty (int ref1, int ref2, int adc1, int adc2, float X, float Y, float Z) |
| Vypočítá hodnotu na základě referenčních a ADC vstupů a zadaných parametrů. | |
| float | vypocitejY (float x) |
| Vypočítá hodnotu y na základě polynomu 6. | |
| bool | isValidFileName (String filename) |
| Ověří, zda je název souboru platný pro další zpracování. | |
| void | dataCalculate () |
| Provádí výpočty a analýzu naměřených dat uložených v globálním vektoru MeasurementData. | |
| void | sendChunkData () |
| Odesílá data ze souboru /data.csv po částech (chunkech) přes WebSocket. | |
| void | measure2 (int steeps, int motorSpeed, int motorAccel) |
| Provede měření během pohybu krokového motoru. | |
| void | messageHandler (String msg) |
| Zpracovává přijaté JSON zprávy a vykonává příslušné příkazy. | |
| void | setup () |
| Inicializuje hardware a konfiguraci systému při spuštění zařízení. | |
| void | loop () |
| Hlavní smyčka programu, která zpracovává příchozí zprávy, odesílá data a provádí výpočty. | |
Proměnné | |
| int | order = 6 |
| Počet řádu použité interpolace. | |
| double | coeffs [7] |
| Pole koeficientů interpolace. | |
| const char * | ntpServer = "pool.ntp.org" |
| Adresa NTP serveru pro synchronizaci času. | |
| const long | gmtOffset_sec = 3600 |
| Časový posun vůči UTC v sekundách. | |
| const int | daylightOffset_sec = 3600 |
| Posun pro letní čas v sekundách. | |
| AsyncWebSocketClient * | globalClient = NULL |
| Ukazatel na aktivního WebSocket klienta. | |
| unsigned long | previousMillis = 0 |
| Čas posledního odeslání zprávy (v milisekundách). | |
| const long | interval = 1000 |
| Interval v milisekundách pro periodické úlohy (např. | |
| bool | newMessageHandle = false |
| Příznak, zda byla přijata nová zpráva přes WebSocket. | |
| bool | sendChunkDataBool = false |
| Příznak pro odeslání dat po částech (chunked). | |
| bool | calculateData = false |
| Příznak, zda je požadováno přepočítání dat. | |
| String | newMessage = "" |
| Uchovává text nové příchozí zprávy z WebSocketu. | |
| ESPConfig | espconfig |
| Globální proměnná uchovávající konfiguraci WiFi pro ESP32. | |
| std::vector< Measurement > | MeasurementData |
Vektor všech naměřených hodnot typu Measurement. | |
| const char * | ssid = "SensTrain" |
| const char * | password = "sensTrain" |
| const int | chunkSize = 20 |
| Počet položek odesílaných najednou v rámci jednoho datového bloku (chunku). | |
| bool | adcReady = false |
| Příznak dostupnosti dat z ADC (analogově-digitálního převodníku). | |
| bool | rtcReady = false |
| Příznak úspěšné inicializace nebo synchronizace RTC (Real-Time Clock). | |
| bool | sdReady = false |
| Příznak úspěšné inicializace SD karty. | |
Nastaveni krokoveho motoru | |
Konfigurace krokoveho motoru. | |
| #define | dirPinStepper 18 |
| pin direction krokoveho motoru. | |
| #define | enablePinStepper 32 |
| enable pin krokoveho motoru. | |
| #define | stepPinStepper 19 |
| step pin krokoveho motoru. | |
| #define | DRIVER_TYPE DRIVER_RMT |
| Typ použitého driveru pro krokový motor. | |
| FastAccelStepperEngine | engine = FastAccelStepperEngine() |
| Instance motorového enginu pro řízení krokového motoru. | |
| FastAccelStepper * | stepper = NULL |
| Ukazatel na krokový motor. | |
| const uint8_t | CPU_CORE = 1 |
| Číslo CPU jádra, na kterém poběží interní task knihovny. | |
Rucni defektoskop, rizeni a mereni.
Tento soubor obsahuje funkce pro práci s profilometrem, ovladani krokoveho motoru, mereni externiho adc...
| #define dirPinStepper 18 |
pin direction krokoveho motoru.
| #define DRIVER_TYPE DRIVER_RMT |
Typ použitého driveru pro krokový motor.
DRIVER_RMT využívá RMT (Remote Control) periférii ESP32, která je velmi přesná a vhodná pro řízení krokových motorů s vysokým časovým rozlišením.
| #define enablePinStepper 32 |
enable pin krokoveho motoru.
| #define LDPin 33 |
Pin pro ovladani laseru.
| #define LED_PIN 12 |
Indikační LED pin.
| #define PIN_DTR 25 |
Pin DTR (Data Terminal Ready) modulu SIM7000G.
| #define PIN_RX 26 |
UART RX pin z modulu SIM7000G.
| #define PIN_TX 27 |
UART TX pin směrem k SIM7000G.
| #define PWR_PIN 4 |
Pin pro zapnutí napájení modulu.
| #define SD_CS 13 |
SPI chip select pin pro SD kartu.
| #define SD_MISO 2 |
SPI MISO pin pro SD kartu.
| #define SD_MOSI 15 |
SPI MOSI pin pro SD kartu.
| #define SD_SCLK 14 |
SPI hodinový pin pro SD kartu.
| #define stepPinStepper 19 |
step pin krokoveho motoru.
| #define UART_BAUD 115200 |
Rychlost sériové linky pro UART komunikaci.
| ADS1115 ADS | ( | 0x48 | ) |
| void copyFile | ( | const char * | oldFileName, |
| const char * | newFileName | ||
| ) |
Zkopíruje obsah jednoho souboru na SD kartě do druhého.
Funkce otevře zdrojový soubor ve čtecím režimu a cílový soubor v režimu zápisu. Postupně čte data ze zdrojového souboru a zapisuje je do cílového souboru. Nakonec oba soubory uzavře.
| oldFileName | Cesta k původnímu (zdrojovému) souboru, který má být kopírován. |
| newFileName | Cesta k novému (cílovému) souboru, do kterého se má zkopírovat obsah. |
| void dataCalculate | ( | ) |
Provádí výpočty a analýzu naměřených dat uložených v globálním vektoru MeasurementData.
Funkce nejprve smaže starý soubor /data.csv, pokud existuje, a otevře nový soubor pro zápis. Následně iteruje přes všechny záznamy v MeasurementData, přepočítá hodnoty X a Y pomocí funkcí vypocetHodnoty a vypocitejY a uloží je do CSV souboru spolu s hodnotami ADC.
Poté vypočítá několik klíčových bodů (P1 až P5) na základě naměřených dat a parametrů, použije lineární interpolaci a hledání nejbližších hodnot, vyčistí vektor MeasurementData a zavře soubor.
Výsledné hodnoty a body jsou odeslány přes websocket jako JSON zprávy.
| void debug | ( | String | debugMessage | ) |
Odesílá ladicí zprávu všem připojeným klientům přes WebSocket.
Funkce vytvoří JSON objekt s klíči:
"command" – obsahuje hodnotu "debug""message" – obsahuje text předaný jako vstupní parametr debugMessagePoté serializuje objekt do textové podoby a rozešle všem připojeným klientům prostřednictvím ws.textAll().
| debugMessage | Text ladicí zprávy, která má být odeslána klientům. |
ws) je předem inicializovaný a aktivní.| void espConfig | ( | ) |
Načte konfiguraci zařízení ze souboru espconfig.txt uloženého ve SPIFFS.
Tato funkce otevře JSON soubor /espconfig.txt ve SPIFFS a načte z něj konfiguraci do globálních struktur espconfig, devel, coeffs a lparams.
Používá knihovnu ArduinoJson pro deserializaci JSON dokumentu a kopírování hodnot.
Očekávaná struktura JSON dokumentu:
strlcpy a .as<>().| void httpConfig | ( | ) |
Inicializuje a konfiguruje HTTP server a WebSocket na ESP zařízení.
Tato funkce nastavuje:
ws.onEvent(onWsEvent)/download, který umožňuje stáhnout CSV soubory ze SD kartySoubory jsou načítány z interního SPIFFS souborového systému nebo z SD karty v případě stahování.
Každá route definuje konkrétní cestu (URI) a typ požadavku (např. HTTP_GET), a vrací odpovídající soubor se správným MIME typem.
setup().| bool isValidFileName | ( | String | filename | ) |
Ověří, zda je název souboru platný pro další zpracování.
Tato funkce kontroluje, zda název souboru:
Používá se k filtrování relevantních souborů při načítání obsahu SD karty.
| filename | Název souboru jako String, který se má ověřit. |
true, pokud je název platný; jinak false. | void loop | ( | ) |
Hlavní smyčka programu, která zpracovává příchozí zprávy, odesílá data a provádí výpočty.
Funkce loop() pravidelně kontroluje a zpracovává:
Dále kontroluje časový interval a v pravidelných intervalech ověřuje stav připojení klienta a stav základních komponent (ADC, RTC, SD karta). Pokud některá komponenta není připravena, odešle chybovou zprávu přes WebSocket. Pokud není připojen žádný klient, vypíše to do sériové konzole.
| void measure2 | ( | int | steeps, |
| int | motorSpeed, | ||
| int | motorAccel | ||
| ) |
Provede měření během pohybu krokového motoru.
Funkce spustí krokový motor na zadaný počet kroků s definovanou rychlostí a akcelerací. Během pohybu opakovaně čte hodnoty z ADC kanálů a aktuální pozici motoru, přičemž tyto hodnoty ukládá do globálního vektoru MeasurementData jako objekty typu Measurement. Po dokončení pohybu motor vrátí zpět na výchozí pozici.
| steeps | Počet kroků, o které se má motor pohnout. |
| motorSpeed | Rychlost motoru v krocích za sekundu. |
| motorAccel | Akcelerace motoru v krocích za sekundu na druhou. |
| void messageHandler | ( | String | msg | ) |
Zpracovává přijaté JSON zprávy a vykonává příslušné příkazy.
Funkce přijímá řetězec JSON zprávy, deserializuje ji a podle hodnoty klíče "command" provádí různé akce, například spuštění měření, čtení a zápis konfigurace, kalibraci nebo restart ESP modulu.
Podporované příkazy zahrnují mimo jiné:
| msg | Řetězec obsahující JSON zprávu s příkazem a případnými parametry. |
| void onWsEvent | ( | AsyncWebSocket * | server, |
| AsyncWebSocketClient * | client, | ||
| AwsEventType | type, | ||
| void * | arg, | ||
| uint8_t * | data, | ||
| size_t | len | ||
| ) |
Obsluha událostí WebSocket serveru.
Tato funkce je volána při různých událostech WebSocketu, jako je připojení klienta, odpojení, příjem dat, chybové stavy nebo ping/pong komunikace.
| server | Ukazatel na instanci WebSocket serveru. |
| client | Ukazatel na připojeného klienta, který událost vyvolal. |
| type | Typ události (např. připojení, odpojení, data, chyba...). |
| arg | Dodatečný argument, jehož význam závisí na typu události. |
| data | Ukazatel na přijatá data (např. textová nebo binární zpráva). |
| len | Délka přijatých dat v bajtech. |
WS_EVT_CONNECT) je klient registrován a odpoví se pingem.WS_EVT_DISCONNECT) je klient odregistrován.WS_EVT_ERROR) se vypíše chybový kód a zpráva.pong zprávy (WS_EVT_PONG) se vypíše její obsah.WS_EVT_DATA) se zpráva zkompletuje a uloží do newMessage, přičemž se nastaví příznak newMessageHandle pro další zpracování.Serial.printf() pro ladicí výstup. Textové zprávy se ukládají jako String, binární jsou konvertovány na hex.| void saveESPConfig | ( | ) |
Uloží aktuální konfiguraci zařízení do souboru espconfig.txt ve SPIFFS.
Tato funkce vytvoří nový JSON dokument pomocí knihovny ArduinoJson, do kterého uloží aktuální hodnoty z globálních struktur espconfig, devel, coeffs a lparams. Následně tento JSON dokument serializuje a uloží do souboru ve SPIFFS.
JSON dokument bude mít následující strukturu:
| void sendChunkData | ( | ) |
Odesílá data ze souboru /data.csv po částech (chunkech) přes WebSocket.
Funkce čte CSV soubor po řádcích, zpracovává data a balí je do JSON zpráv, které postupně odesílá přes websocket všem připojeným klientům. Data jsou odesílána v blocích velikosti definované chunkSize. Po odeslání každého bloku je JSON dokument vyčištěn a připraven pro další blok.
Formát odesílaných dat v JSON:
| AsyncWebServer server | ( | 80 | ) |
HTTP server běžící na portu 80.
Používá se k obsluze webového rozhraní – např. pro statické soubory nebo REST API. Spolupracuje s AsyncWebSocket.
| void setup | ( | ) |
Inicializuje hardware a konfiguraci systému při spuštění zařízení.
Funkce setup() provádí následující kroky:
Pokud nastane chyba při některé inicializaci (např. SPIFFS, ADS, SD karta), vypíše chybové hlášení do sériové konzole.
| void setupWifi | ( | ) |
Inicializuje WiFi připojení podle uložené konfigurace.
Tato funkce rozhoduje, zda má být zařízení spuštěno v režimu Access Point (AP), klientském režimu (STA - Station), nebo ve výchozím nouzovém režimu AP, pokud konfigurace neodpovídá známým hodnotám.
espconfig.wifimode == "AP", zařízení vytvoří vlastní WiFi síť.espconfig.wifimode == "STA", zařízení se pokusí připojit k existující síti.wifimode neplatná, spustí se výchozí AP režim s předdefinovaným SSID a heslem.Serial), včetně IP adresy zařízení.| float vypocetHodnoty | ( | int | ref1, |
| int | ref2, | ||
| int | adc1, | ||
| int | adc2, | ||
| float | X, | ||
| float | Y, | ||
| float | Z | ||
| ) |
Vypočítá hodnotu na základě referenčních a ADC vstupů a zadaných parametrů.
Funkce provádí matematický výpočet pomocí vstupních rozdílů mezi referenčními hodnotami a skutečně naměřenými ADC hodnotami. Na základě těchto rozdílů a souřadnic X, Y, Z provádí výpočet podle specifického vzorce. Pokud dojde k dělení nulou, vrací 0.0.
| ref1 | Referenční hodnota 1. |
| ref2 | Referenční hodnota 2. |
| adc1 | Naměřená hodnota z ADC kanálu 1. |
| adc2 | Naměřená hodnota z ADC kanálu 2. |
| X | Parametr X . |
| Y | Parametr Y . |
| Z | Parametr Z přepočtový faktor. |
float. Vrací 0.0 při dělení nulou. | float vypocitejY | ( | float | x | ) |
Vypočítá hodnotu y na základě polynomu 6.
řádu.
Funkce počítá hodnotu y jako výsledek dosazení hodnoty x do polynomu 6. stupně se zadanými koeficienty uloženými v poli coeffs. Koeficienty se předpokládají ve formátu:
y = c₀·x⁶ + c₁·x⁵ + c₂·x⁴ + c₃·x³ + c₄·x² + c₅·x + c₆
| x | Hodnota proměnné, pro kterou se má hodnota polynomu spočítat. |
float.coeffs musí obsahovat přesně 7 prvků (c₀ až c₆), jinak může dojít k chybě. | AsyncWebSocket ws | ( | "/ws" | ) |
WebSocket server na cestě /ws.
Umožňuje obousměrnou komunikaci mezi ESP32 a webovým klientem pomocí WebSocket protokolu.
| bool adcReady = false |
Příznak dostupnosti dat z ADC (analogově-digitálního převodníku).
Nastavuje se na true, když je ADC uspesne nastaveno. Pouziva se pro oznameni chyby ADC.
| bool calculateData = false |
Příznak, zda je požadováno přepočítání dat.
Nastane po konci mereni profilometru.
| const int chunkSize = 20 |
Počet položek odesílaných najednou v rámci jednoho datového bloku (chunku).
Používá se při sekvenčním odesílání větších datových struktur (např. JSON pole) přes WebSocket.
| double coeffs[7] |
Pole koeficientů interpolace.
Používá se pro výpočty při zpracování namerenych hodnot. Velikost pole by měla odpovídat hodnotě order + 1.
| const uint8_t CPU_CORE = 1 |
Číslo CPU jádra, na kterém poběží interní task knihovny.
ESP32 má dvě jádra:
0 – primární jádro, běží zde WiFi/Bluetooth stack (nepreferováno pro časově citlivé úlohy)1 – sekundární jádro, vhodné pro real-time úlohy (např. řízení motoru) | const int daylightOffset_sec = 3600 |
Posun pro letní čas v sekundách.
Například v případě letního času (CEST) je přidáno dalších +3600 sekund. Pokud se letní čas nepoužívá, nastav na 0.
| FastAccelStepperEngine engine = FastAccelStepperEngine() |
Instance motorového enginu pro řízení krokového motoru.
Tato instance slouží ke správě a inicializaci FastAccelStepper objektů.
| ESPConfig espconfig |
Globální proměnná uchovávající konfiguraci WiFi pro ESP32.
| AsyncWebSocketClient* globalClient = NULL |
Ukazatel na aktivního WebSocket klienta.
Používá se pro odesílání zpráv konkrétnímu připojenému klientovi. Pokud není nikdo připojen, hodnota je NULL.
| const long gmtOffset_sec = 3600 |
Časový posun vůči UTC v sekundách.
Pro středoevropský čas (CET) je hodnota +3600 (tj. UTC+1).
| const long interval = 1000 |
Interval v milisekundách pro periodické úlohy (např.
odesílání dat).
Výchozí hodnota je 1000 ms (tj. 1 sekunda).
| std::vector<Measurement> MeasurementData |
Vektor všech naměřených hodnot typu Measurement.
Používá se pro uchování průběhu měřeni.
| String newMessage = "" |
Uchovává text nové příchozí zprávy z WebSocketu.
Obsah zprávy se může dále zpracovávat nebo interpretovat jako JSON.
| bool newMessageHandle = false |
Příznak, zda byla přijata nová zpráva přes WebSocket.
Nastavuje se na true při přijetí zprávy a zpracovává se v hlavní smyčce.
| const char* ntpServer = "pool.ntp.org" |
Adresa NTP serveru pro synchronizaci času.
Používá se k získání aktuálního UTC času přes internet. Standardní veřejný NTP pool: https://www.pool.ntp.org
| int order = 6 |
Počet řádu použité interpolace.
| const char* password = "sensTrain" |
| unsigned long previousMillis = 0 |
Čas posledního odeslání zprávy (v milisekundách).
Používá se pro řízení periodického odesílání zpráv v intervalu.
| bool rtcReady = false |
Příznak úspěšné inicializace nebo synchronizace RTC (Real-Time Clock).
Pokud je true, je dostupný RTC modul. Pouziva se pro oznameni nefunkcniho RTC modulu.
| bool sdReady = false |
Příznak úspěšné inicializace SD karty.
Je-li true, je SD karta pripraena k pouziti. Pouziva se pro oznameni nefunkcnosti SD karty.
| bool sendChunkDataBool = false |
Příznak pro odeslání dat po částech (chunked).
Pokud je nastaveno na true, bude spuštěno sekvenční odesílání většího množství dat.
| const char* ssid = "SensTrain" |
| FastAccelStepper* stepper = NULL |
Ukazatel na krokový motor.
Ukazatel bude později inicializován voláním engine.stepperConnectToPin(...).