Hi,
nach dem ich endlich für das eine Problem eine Lösung gefunden habe tut sich schon das nächste auf.
Dieses mal versuche ich den packetBuffer zu zerlegen momentan erstmal in float.
so sieht der Code aus:
int packetSize = Udp.parsePacket();
if (packetSize) {
int len = Udp.read(packetBuffer, 255);
if (len > 0) packetBuffer[len-1] = 0;
Serial.print("Empfangen(IP/Size/Data): ");
Serial.print(Udp.remoteIP());Serial.print(" / ");
Serial.print(packetSize);Serial.print(" / ");
Serial.println(packetBuffer);
und das war mein Gedanke dazu:
float value1 = atof(strtok(packetBuffer, "!"));
float value2 = atof(strtok(NULL, "!"));
Serial.println(value1);
Serial.println(value2);
funktioniert nur leider nicht kann mir einer Bitte weiterhelfen.
combie
September 4, 2018, 8:53pm
2
Es ist dir vielleicht egal, wie es gesendet wird....
Aber sich dann auf eine Empfangsmethode festzulegen, empfinde ich als arg seltsam.
Vergleichbar:
Mache die Rechnung nicht ohne den Wirt.
combie:
Es ist dir vielleicht egal, wie es gesendet wird....
Aber sich dann auf eine Empfangsmethode festzulegen, empfinde ich als arg seltsam.
Vergleichbar:
Mache die Rechnung nicht ohne den Wirt.
Sry die Frage verstehe ich nicht...
wenn du den code vom Clienten sehen will das wäre der
char Test[7];
dtostrf(Temp, 5, 2, Test);
//Senden
Udp.beginPacket(ipServidor,9999);
char buf[20]; unsigned long testID = millis(); sprintf(buf, "%lu", testID);
Udp.write(buf);
Udp.write("!");
Udp.write(Test);
Udp.write("\r\n");
Udp.endPacket();
Serial.print("enviando: ");Serial.println(buf);
delay(10);
Mit den nicht kompilierbaren Codeteilen kann man so nicht viel sagen, nur das du annimmst, in buf steht eine Zahl (von millis) aber ich sehe weder eine zweite Zahl noch ein zweites ! in buf
Ok dann nochmal von vorne:
Master:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
WiFiUDP Udp;
char packetBuffer[255];
unsigned int localPort = 9999;
const char * ssid = "+++++";
const char * password = "++++++";
void setup() {
Serial.begin(115200);
WiFi.softAP(ssid, password);
Udp.begin(localPort);
}
void loop() {
int packetSize = Udp.parsePacket();
if (packetSize) {
int len = Udp.read(packetBuffer, 255);
if (len > 0) packetBuffer[len-1] = 0;
Serial.print("Empfangen(IP/Size/Data): ");
Serial.print(Udp.remoteIP());Serial.print(" / ");
Serial.print(packetSize);Serial.print(" / ");
Serial.println(packetBuffer);
Serial.println(packetBuffer);
Udp.beginPacket(Udp.remoteIP(),Udp.remotePort());
Udp.write("recived: ");
Udp.write(packetBuffer);
Udp.write("\r\n");
Udp.endPacket();
}
//Klappt nicht
//float value1 = atof(strtok(packetBuffer, "!"));
//float value2 = atof(strtok(NULL, "!"));
//Serial.println(value1);
//Serial.println(value2);
}
Client:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
WiFiUDP Udp;
const char * ssid = "#########";
const char * password = "##########";
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Zum Temp auslesen
float rawADC;
float logRt, Rt, Temp;
float R = 100; // Festwiderstand
float c1 = 2.204153124e-03; // berechnete Steinhart-Hart Koeffizienten aus datenblatt mit Thermister calculator errechnet
float c2 = 2.459100717e-04; //
float c3 = 1.782179510e-07; //
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Temp auslesen ende
char packetBuffer[255];
unsigned int localPort = 9999;
IPAddress ipServidor(192, 168, 4, 1);
IPAddress ipCliente(192, 168, 4, 10);
IPAddress Subnet(255, 255, 255, 0);
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
WiFi.mode(WIFI_STA); // so dass es nur STA ist und IP 192.168.4.1 nicht erzeugt
WiFi.config(ipCliente, ipServidor, Subnet);
Udp.begin(localPort);
}
void loop()
{
senden();
thermistor();
}
void thermistor()
{
rawADC = 0;
for (int i = 0; i < 1024; i++) // Mittelwert & Oversampling
{
rawADC += analogRead(0);
}
rawADC = (rawADC / 1024);
Rt = R * ( rawADC / ( 1023.0 - rawADC )); // NTC-Widerstand berechnen
// Steinhart-Hart Gleichung für Temperaturverlauf NTC
logRt = log(Rt);
Temp = ( 1.0 / (c1 + c2 * logRt + c3 * logRt * logRt * logRt ) );
Temp = Temp - 263.15; // von Kelvin nach Grad Celsius
Serial.print(Temp, 2); // Messwert direkt
Serial.println(" Grad Celsius");
}
void senden()
{
unsigned long Tiempo_Envio = millis();
char Test[7];
dtostrf(Temp, 5, 2, Test);
//Senden
Udp.beginPacket(ipServidor,9999);
char buf[20]; unsigned long testID = millis(); sprintf(buf, "%lu", testID);
Udp.write(buf);
Udp.write("!");
Udp.write(Test);
Udp.write("\r\n");
Udp.endPacket();
Serial.print("enviando: ");Serial.println(buf);
delay(10); // um Ihnen Zeit zu geben, die Antwort auf die vorherige Sendung zu erhalten
//Empfangen
int packetSize = Udp.parsePacket();
if (packetSize) {
int len = Udp.read(packetBuffer, 255);
if (len > 0) packetBuffer[len-1] = 0;
Serial.print("RECIBIDO(IP/Port/Size/Datos): ");
Serial.print(Udp.remoteIP());Serial.print(" / ");
Serial.print(Udp.remotePort()); Serial.print(" / ");
Serial.print(packetSize);Serial.print(" / ");
Serial.println(packetBuffer);
}
Serial.println("");
delay(1000);
}
gesendet wird Buf "!" als Trennzeichen und Test beides sind Zahlen und ich möchte sie gerne Trennen und in float speichern.
Und wenn wir schon beim Thema sind noch eine weitere Frage ist es möglich noch weitere udp Clienten zuzufügen?
Kommt das überhaupt richtig an?
Du hast gar nicht zwei Floats. Sondern einmal unsigned long und einmal float. Für ersteres brauchst du strtoul()