diff --git a/README.md b/README.md index a65b9ed..75d850c 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,5 @@ -# rocket_motor_thrust_meter +# Rocket Motor Thrust Meter +Thrust meter for meassuring thrust of custom rocket motors + +![rocket_motor_thrust_meter](sources/rocket_motor_thrust_meter.jpg) diff --git a/main.ino b/main.ino new file mode 100755 index 0000000..fd8bbaf --- /dev/null +++ b/main.ino @@ -0,0 +1,140 @@ +/* + +Use following command to receive the data + +socat -u UDP-RECVFROM:9998,fork - + +Format of the data is a CSV deliminated by ; + +counter, voltage, wifi strength + +*/ + +#include +#include +#include + +// ---------------- USER CONFIG ---------------- +const char* WIFI_SSID = "control-tower-24"; +const char* WIFI_PASSWORD = "expaexpa"; + +// Destination for UDP packets +const char* UDP_TARGET_IP = "192.168.1.255"; // <-- change to your receiver's IP +const uint16_t UDP_TARGET_PORT = 9998; + +// How often to read + send (ms) +const unsigned long SEND_INTERVAL_MS = 100; + +// Arduino AD 24-bit převodník s 2 kanály + +// piny pro připojení SCK a DT z modulu +int pSCK = 7; +int pDT = 4; + +WiFiUDP udp; + +// definování různých nastavení kanálů a jejich zesílení +#define kanal_A_zesil_128 1 +#define kanal_B_zesil_32 2 +#define kanal_A_zesil_64 3 + +unsigned long lastSendTime = 0; + +void connectWiFi() { + Serial.print("Connecting to WiFi"); + WiFi.setTxPower(WIFI_POWER_19_5dBm); + WiFi.setSleep(false); + WiFi.setAutoReconnect(true); + WiFi.persistent(true); // saves credentials to flash, faster reconnect + WiFi.mode(WIFI_STA); + WiFi.begin(WIFI_SSID, WIFI_PASSWORD); + + while (WiFi.status() != WL_CONNECTED) { + delay(400); + Serial.print("."); + } + + Serial.println(); + Serial.print("WiFi connected. IP address: "); + Serial.println(WiFi.localIP()); +} + +void setup() +{ + // nastavení pinů modulu jako výstup a vstup + pinMode(pSCK, OUTPUT); + pinMode(pDT, INPUT); + // komunikace přes sériovou linku rychlostí 9600 baud + Serial.begin(9600); + // probuzení modulu z power-down módu + digitalWrite(pSCK, LOW); + + connectWiFi(); + + // spuštění prvního měření pro nastavení měřícího kanálu + spusteniMereni(kanal_A_zesil_64); +} + +long counter = 0; + +void loop() +{ + // Reconnect WiFi if dropped + if (WiFi.status() != WL_CONNECTED) { + connectWiFi(); + } + + unsigned long now = millis(); + if (now - lastSendTime >= SEND_INTERVAL_MS) { + lastSendTime = now; + + long rssi = WiFi.RSSI(); // dBm + long odpor = spusteniMereni(kanal_A_zesil_64); + + // Build payload: counter;temperature;pressure;rssi\n + char payload[64]; + snprintf(payload, sizeof(payload), "%ld;%ld;%ld\n", counter, odpor, rssi); + + counter = counter + 1; + + Serial.print("Sending UDP packet: "); + Serial.println(payload); + + udp.beginPacket(UDP_TARGET_IP, UDP_TARGET_PORT); + udp.print(payload); + udp.endPacket(); + } +} + +// vytvoření funkce pro měření z nastaveného kanálu +long spusteniMereni(byte mericiMod) +{ + byte index; + long vysledekMereni = 0L; + // načtení 24-bit dat z modulu + while(digitalRead(pDT)); + for (index = 0; index < 24; index++) + { + digitalWrite(pSCK, HIGH); + vysledekMereni = (vysledekMereni << 1) | digitalRead(pDT); + digitalWrite(pSCK, LOW); + } + // nastavení měřícího módu + for (index = 0; index < mericiMod; index++) + { + digitalWrite(pSCK, HIGH); + digitalWrite(pSCK, LOW); + } + // konverze z 24-bit dvojdoplňkového čísla + // na 32-bit znaménkové číslo + if (vysledekMereni >= 0x800000) + vysledekMereni = vysledekMereni | 0xFF000000L; + // přepočet výsledku na mikrovolty podle zvoleného + // kanálu a zesílení + switch(mericiMod) { + case 1: vysledekMereni = vysledekMereni/128/2; break; + case 2: vysledekMereni = vysledekMereni/32/2; break; + case 3: vysledekMereni = vysledekMereni/64/2; break; + } + return vysledekMereni ; +} \ No newline at end of file diff --git a/sources/rocket_motor_thrust_meter.jpg b/sources/rocket_motor_thrust_meter.jpg new file mode 100644 index 0000000..c565c02 Binary files /dev/null and b/sources/rocket_motor_thrust_meter.jpg differ