Files
2026-07-29 12:52:53 +02:00

140 lines
3.4 KiB
Arduino
Executable File

/*
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 <Wire.h>
#include <WiFi.h>
#include <WiFiUdp.h>
// ---------------- 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 ;
}