#include <WiFi.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* plcIp = "10.13.37.1";
const uint16_t port = 2000;
WiFiClient client;
unsigned long lastAttempt = 0;
// Definizione della struttura dati per evitare errori di allineamento
#pragma pack(push, 1)
struct Payload {
uint8_t header; // Es. 0x02 (Start)
int16_t valore1; // Intero a 16 bit
uint16_t valore2; // Intero senza segno
uint8_t footer; // Es. 0x03 (End)
};
#pragma pack(pop)
Payload datiInviati;
// Funzione per invertire i byte (da Little-Endian a Big-Endian)
int16_t swapInt16(int16_t val) {
return (val << 8) | ((val >> 8) & 0xFF);
}
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
// Inizializziamo i dati fissi
datiInviati.header = 0x02;
datiInviati.footer = 0x03;
}
void loop() {
if (WiFi.status() != WL_CONNECTED) return;
if (!client.connected()) {
if (millis() - lastAttempt > 5000) {
lastAttempt = millis();
client.connect(plcIp, port);
}
} else {
// PREPARAZIONE DATI
int16_t letturaAnalogica = (int16_t)analogRead(34);
// TRUCCO: Invertiamo i byte prima di spedire per il PLC Siemens
datiInviati.valore1 = swapInt16(letturaAnalogica);
datiInviati.valore2 = swapInt16(1234); // Valore costante di prova
// INVIO DEL BUFFER GREZZO
client.write((const uint8_t*)&datiInviati, sizeof(datiInviati));
Serial.println("Buffer inviato correttamente al PLC");
delay(1000);
}
}