Zeit speichern

Hallo Zusammen

Ich habe ein Problem und komme einfach nicht weiter. Es geht um folgenden Code:

#include <SPI.h>        

#include <ESP8266WiFi.h>
#include <WiFiUDP.h>
#include <WiFiClient.h> 
#include <ESP8266WebServer.h>
 #include <time.h> 

IPAddress ip(192,168,2,1);  //Node static IP
IPAddress gateway(192,168,2,1);
IPAddress subnet(255,255,255,0);

IPAddress ip2(192,168,1,100);  //Node static IP
IPAddress gateway2(192,168,1,1);
IPAddress subnet2(255,255,255,0);

/* Set these to your desired credentials. */
const char *ssid = "Gabriel";
const char *password = "Gabriel123";

const char* ssid2     = "WLAN-Nesslau";
const char* password2 = "axuncowoinne";

char *stringOne;

WiFiUDP Udp;
WiFiUDP Udp2;
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; 
char packetBuffer2[UDP_TX_PACKET_MAX_SIZE];//buffer to hold incoming packet,
ESP8266WebServer server(80);

/* Just a little test message.  Go to http://192.168.4.1 in a web browser
 * connected to this access point to see it.
 */
void handleRoot() {
  char temp[1000];

 snprintf ( temp, 1000, 

"<html>\
  <head>\
    <meta http-equiv='refresh' content='3'>\
    <title>ESP8266 Demo</title>\
    <style>\
      body { background-color: #F7FF00; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
    </style>\
  </head>\
  <body>\
    <h1>Hello from ESP8266!</h1>\
    <p>SSID: %s</p>\
    <p>Passwort: %s</p>\
    <p>Temperatur: %s Grad</p>\
    <p>Feuchtigkeit: %s %</p>\
    <p>Zeit: %s </p>\
    <div style=\"width:180px;height:180px; border: 1px solid black;\">\
         <a href=\"http://alarm.meteocentrale.ch/index.html\" alt=\"Aktuelle Unwetterwarnungen für die Schweiz\" title=\"Aktuelle Unwetterwarnungen für die Schweiz\">\
           <img src=\"http://alarm.meteocentrale.ch/images/map/schweiz_preview.png\"> \
         </a>\
    </div>\
  </body>\
</html>",

      ssid, password, packetBuffer, packetBuffer2, stringOne 
   );
   server.send ( 200, "text/html", temp );
}

void setup() {
   Serial.begin(115200); 
   Serial.setDebugOutput(true); 
   
    WiFi.softAP(ssid, password);
   WiFi.softAPConfig(ip, gateway, subnet);
   WiFi.begin ( ssid2, password2 );
   WiFi.config(ip2, gateway2, subnet2);
  Serial.println();
  Serial.print("Configuring access point...");
  /* You can remove the password parameter if you want the AP to be open. */
 

  server.on("/", handleRoot);



  
  server.begin();
  Serial.println("HTTP server started");
  WiFi.mode(WIFI_AP_STA);
   Udp.begin(8888);
   Udp2.begin(8889);


 configTime(2 * 3600, 0, "ntp-public.uit.no"); 
   Serial.println("\nWaiting for time"); 
   while (!time(nullptr)) { 
     delay(3000);
     Serial.print(".");  
   } 
   Serial.println(""); 
} 

void loop() {
  
   int packetSize = Udp.parsePacket();
  if(packetSize)
  {
     for(int i=0;i<UDP_TX_PACKET_MAX_SIZE;i++) packetBuffer[i] = 0;
    Serial.print("Received packet of size ");
    Serial.println(packetSize);
    Serial.print("From ");
    IPAddress remote = Udp.remoteIP();
    for (int i =0; i < 4; i++)
    {
      Serial.print(remote[i], DEC);
      if (i < 3)
      {
        Serial.print(".");
      }
    }
    Serial.print(", port ");
    Serial.println(Udp.remotePort());

    // read the packet into packetBufffer
    Udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);
    Serial.println("Contents:");
    Serial.println(packetBuffer);
    Serial.println(stringOne);
    
}

 int packetSize2 = Udp2.parsePacket();
  if(packetSize2)
  {
     for(int i=0;i<UDP_TX_PACKET_MAX_SIZE;i++) packetBuffer2[i] = 0;
    Serial.print("Received packet of size ");
    Serial.println(packetSize2);
    Serial.print("From ");
    IPAddress remote = Udp2.remoteIP();
    for (int i =0; i < 4; i++)
    {
      Serial.print(remote[i], DEC);
      if (i < 3)
      {
        Serial.print(".");
      }
    }
    Serial.print(", port ");
    Serial.println(Udp2.remotePort());

    // read the packet into packetBufffer
    Udp2.read(packetBuffer2,UDP_TX_PACKET_MAX_SIZE);
    Serial.println("Contents:");
    Serial.println(packetBuffer2);
    Serial.println(stringOne);
  
    
}



server.handleClient();
   time_t now = time(nullptr); 
  stringOne = ctime(&now); 
}

Nun will ich die Zeit speichern und anschliessend anzeigen, wann die letzten Daten angekommen sind. Also habe ich das eingefügt:

Oberhalb vom Setup:

char *stringTwo;

char *stringThree;

stringTwo = stringOne;
Serial.println(stringTwo);

stringThree= stringOne;
Serial.println(stringThree);[/code]

=

#include <SPI.h>        

#include <ESP8266WiFi.h>
#include <WiFiUDP.h>
#include <WiFiClient.h> 
#include <ESP8266WebServer.h>
 #include <time.h> 

IPAddress ip(192,168,2,1);  //Node static IP
IPAddress gateway(192,168,2,1);
IPAddress subnet(255,255,255,0);

IPAddress ip2(192,168,1,100);  //Node static IP
IPAddress gateway2(192,168,1,1);
IPAddress subnet2(255,255,255,0);

/* Set these to your desired credentials. */
const char *ssid = "Gabriel";
const char *password = "Gabriel123";

const char* ssid2     = "WLAN-Nesslau";
const char* password2 = "axuncowoinne";

char *stringOne;

char *stringTwo;

char *stringThree;

WiFiUDP Udp;
WiFiUDP Udp2;
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; 
char packetBuffer2[UDP_TX_PACKET_MAX_SIZE];//buffer to hold incoming packet,
ESP8266WebServer server(80);

/* Just a little test message.  Go to http://192.168.4.1 in a web browser
 * connected to this access point to see it.
 */
void handleRoot() {
  char temp[1000];

 snprintf ( temp, 1000, 

"<html>\
  <head>\
    <meta http-equiv='refresh' content='3'>\
    <title>ESP8266 Demo</title>\
    <style>\
      body { background-color: #F7FF00; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
    </style>\
  </head>\
  <body>\
    <h1>Hello from ESP8266!</h1>\
    <p>SSID: %s</p>\
    <p>Passwort: %s</p>\
    <p>Temperatur: %s Grad</p>\
    <p>Feuchtigkeit: %s %</p>\
    <p>Zeit: %s </p>\
    <div style=\"width:180px;height:180px; border: 1px solid black;\">\
         <a href=\"http://alarm.meteocentrale.ch/index.html\" alt=\"Aktuelle Unwetterwarnungen für die Schweiz\" title=\"Aktuelle Unwetterwarnungen für die Schweiz\">\
           <img src=\"http://alarm.meteocentrale.ch/images/map/schweiz_preview.png\"> \
         </a>\
    </div>\
  </body>\
</html>",

      ssid, password, packetBuffer, packetBuffer2, stringOne 
   );
   server.send ( 200, "text/html", temp );
}

void setup() {
   Serial.begin(115200); 
   Serial.setDebugOutput(true); 
   
    WiFi.softAP(ssid, password);
   WiFi.softAPConfig(ip, gateway, subnet);
   WiFi.begin ( ssid2, password2 );
   WiFi.config(ip2, gateway2, subnet2);
  Serial.println();
  Serial.print("Configuring access point...");
  /* You can remove the password parameter if you want the AP to be open. */
 

  server.on("/", handleRoot);



  
  server.begin();
  Serial.println("HTTP server started");
  WiFi.mode(WIFI_AP_STA);
   Udp.begin(8888);
   Udp2.begin(8889);


 configTime(2 * 3600, 0, "ntp-public.uit.no"); 
   Serial.println("\nWaiting for time"); 
   while (!time(nullptr)) { 
     delay(3000);
     Serial.print(".");  
   } 
   Serial.println(""); 
} 

void loop() {
  
   int packetSize = Udp.parsePacket();
  if(packetSize)
  {
     for(int i=0;i<UDP_TX_PACKET_MAX_SIZE;i++) packetBuffer[i] = 0;
    Serial.print("Received packet of size ");
    Serial.println(packetSize);
    Serial.print("From ");
    IPAddress remote = Udp.remoteIP();
    for (int i =0; i < 4; i++)
    {
      Serial.print(remote[i], DEC);
      if (i < 3)
      {
        Serial.print(".");
      }
    }
    Serial.print(", port ");
    Serial.println(Udp.remotePort());

    // read the packet into packetBufffer
    Udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);
    Serial.println("Contents:");
    Serial.println(packetBuffer);
    Serial.println(stringOne);
    stringTwo = stringOne;
    Serial.println(stringTwo);

    
}

 int packetSize2 = Udp2.parsePacket();
  if(packetSize2)
  {
     for(int i=0;i<UDP_TX_PACKET_MAX_SIZE;i++) packetBuffer2[i] = 0;
    Serial.print("Received packet of size ");
    Serial.println(packetSize2);
    Serial.print("From ");
    IPAddress remote = Udp2.remoteIP();
    for (int i =0; i < 4; i++)
    {
      Serial.print(remote[i], DEC);
      if (i < 3)
      {
        Serial.print(".");
      }
    }
    Serial.print(", port ");
    Serial.println(Udp2.remotePort());

    // read the packet into packetBufffer
    Udp2.read(packetBuffer2,UDP_TX_PACKET_MAX_SIZE);
    Serial.println("Contents:");
    Serial.println(packetBuffer2);
    Serial.println(stringOne);
    stringThree= stringOne;
    Serial.println(stringThree);
  
    
}



server.handleClient();
   time_t now = time(nullptr); 
  stringOne = ctime(&now); 
}

Aber anstatt die Zeit zu speichern, zählt die Zeit immer weiter. D.h wenn ich ein Datenpaket um 15:30 Uhr sende und um 16.00 Uhr in den Serialmonitor schaue, steht dort 16:00 Uhr. Kann mir jemand helfen?

Du verwechselst das Feld mit seinem Zeiger. Bei char *stringThree; gibt das Sternchen an, daß es sich um einen Zeiger handelt.

Zeiger (Pointer)

Lösungsansatz:
Die Standard-Bibliothek <string.h>

Standard C library for AVR-GCC

Komme irgendwie nicht weiter...
Wenn ich das * wegnehme bekomme ich folgende Meldung:

sketch_aug12a:132: error: invalid conversion from 'char*' to 'char' [-fpermissive]

stringTwo = stringOne;

^

sketch_aug12a:162: error: invalid conversion from 'char*' to 'char' [-fpermissive]

stringThree = stringOne;

^

char Text1[] = "Hokus Pokus";
char* stringOne; // ist ein Zeiger auf einen Text.

StringOne = Text1; // zeigt jetzt auf Text1
Text1[0] = 'L'; // Text1 fängt jetzt mit dem Buchstaben 'L' an  

Serial.println(StringOne); // liefert natürlich "Lokus Pokus", was denn sonst.

Aber bei deinem Code ist es genau umgekehrt:

Du versuchst einen vorher definierten Textabschnitt in einen Zeiger umzuwandeln. Ich muss ein sich ständig wechselnder Zeiger (Zeit) (NTP) in einen normalen char umwandeln.

Hallo,
das könnte so gehen…
int Sekunde;
int Minute;
int Stunde;

char Zeit[9];
String AufzeichnungZeit;

dann kommt Deine ZeitAusgabe, z.B.

Sekunde = (((Sekunde & 0b11110000)>>4)*10 + (Sekunde & 0b00001111)); // BCD/DEZ
Minute = (((Minute & 0b11110000)>>4)*10 + (Minute & 0b00001111));
Stunde = (((Stunde & 0b00110000)>>4)*10 + (Stunde & 0b00001111)); //BCD/DEZ - 24:00 Format

keine Ahnung, was für ein Format Deine Zeit hat.

dann

snprintf(Zeit,sizeof(Zeit),"%02d:%02d.%02d",Stunde,Minute,Sekunde);// String ganze Zeit

wenn dann der Zeitstempel gesetzt werden soll,

mZeit = Zeit;

Gruß und Spaß
Andreas

Du versuchst einen vorher definierten Textabschnitt in einen Zeiger umzuwandeln. Ich muss ein sich ständig wechselnder Zeiger (Zeit) (NTP) in einen normalen char umwandeln.

Nicht ganz:

www.cplusplus.com/reference/ctime/ctime/:
The returned value points to an internal array whose validity or value may be altered by any subsequent call to asctime or ctime.

Also: Immer wenn ductime(now)aufrufst, wird dein einziger Speicher hierfür überschrieben.

Es ist übrigens einfacher/besser, sich nur das altetime_t nowzu merken, anstelle einen String, den du erst mit   strcpy zwischenspeichern müsstest.

arduino_weather:
Nun will ich die Zeit speichern
...
Aber anstatt die Zeit zu speichern, zählt die Zeit immer weiter.

stringTwo = stringOne;
stringThree= stringOne;

Alle drei Zeiger zeigen nun auf dasselbe Textfeld. Damit hast Du einen Text, den Text also nicht dupliziert.

Das zeigt auch das Beispiel aus #3, das ich etwas erweitert habe:

 char Text[] = "Hokus Pokus";
  char* StringOne; // ist ein Zeiger auf einen Text.
  char* StringTwo; // ist ein Zeiger auf einen Text.
  StringOne = Text; // zeigt jetzt auf Text
  StringTwo = Text; // zeigt jetzt auf Text
  Serial.println(StringOne); // liefert "Hokus Pokus".
  Serial.println(StringTwo); // liefert auch "Hokus Pokus", da es auf denselben Text zeigt.

  Text[0] = 'L'; // Text fängt jetzt mit dem Buchstaben 'L' an

  Serial.println();
  Serial.println(StringOne); // liefert "Lokus Pokus".
  Serial.println(StringTwo); // liefert auch "Lokus Pokus".

Für eine Kopie benötigst Du ein zweites Feld:

 char Text1[] = "Hokus Pokus";
  char Text2[20];
  for(byte j=0;j<sizeof(Text1);j++){
    Text2[j]=Text1[j];
  }
  Serial.println(Text1); // liefert "Hokus Pokus".
  Serial.println(Text2); // liefert auch "Hokus Pokus", da kopiert.

  Text1[0] = 'L'; // Text fängt jetzt mit dem Buchstaben 'L' an

  Serial.println();
  Serial.println(Text1); // liefert "Lokus Pokus".
  Serial.println(Text2); // liefert "Hokus Pokus", da unveraendert.

Fällt der Groschen?

for(byte j=0;j<sizeof(Text1);j++){
    Text2[j]=Text1[j];

Für sowas nimmt man strcpy(), strncpy() oder strlcpy()

Serenifly:
Für sowas nimmt man strcpy(), strncpy() oder strlcpy()

Da es nicht um elegantes Programmieren sondern um Verständnis geht, habe ich ganz bewußt statt auf eine Bibliotheksfunktion lieber auf die einfache Zuweisung Text2[j]=Text1[j]; gesetzt.

Auch wenn es in meinem Standard-C-Buch nicht beschrieben ist, würde ich doch zu strlcpy() tendieren. :slight_smile: