Delay() versus millis()

Arduino specifieke Software
Berichten: 78
Geregistreerd: 03 Okt 2014, 17:16

Delay() versus millis()

Berichtdoor ilioSS » 22 Jun 2020, 22:44

Recentelijk iets gelezen mbt het gebruik van delay().

Dit heeft mijn aandacht omdat delay() niet altijd nodig is en gebruikt word om processor acties af te wachten en/of
Sensor data uit te lezen.
Dit geeft wisselende resultaten tijdens het runnen van een programma.

Hopelijk geeft het gebruik van millis() een beter resultaat? Processor blijft lopen.

Wat doet delay() met het programma?l Is dit iets als NOP in assembler?l
NOP IS GEEN BEWERING IN DE PROCESSOR DACHT IK. Oeps alles hoofdletter.
Delay() stopt die de processor is dat het euvel?

Graag de link naar je artikel kan ik het lezen.
Btw je artikel op github mbt timers is helpfull. De one shot heb ik nodig.
Om bij een puls data voor een x tijd weg te schrijven.

Graag je reactie.
Mvrgr ilioSS

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Delay() versus millis()

Berichtdoor Koepel » 22 Jun 2020, 23:19

Je bedoelt "fun with millis()" : https://github.com/Koepel/Fun_with_millis.

In de delay() functie zit er een programma-lus die wacht. Pas als dat afgelopen is, dan komt de Arduino uit de delay() functie en kan weer verder gaan met de rest van de sketch. De microcontroller gaat niet in slaap-stand, en gaat niet in de wacht, maar zit in een programma-lus totdat eindelijk de delay over is.
De interrupts werken wel tijdens een delay(), dus er kan iets ontvangen worden via de seriële RX input en nog een paar andere interrupt-dingen werken ook.

De functie millis() geeft het aantal milliseconden sinds het starten van de Arduino. Dat is op zich niet heel interessant, maar daarmee is code te maken die steeds kijkt naar de tijd (met millis) kijkt en iets doet als het daarvoor de tijd is. Dat bleek heel mooi te gebruiken, vooral in de Arduino omgeving.

Stel je voor dat je een ledje laat knipperen. Een delay() zorgt voor 100% belasting. Dus een sketch met delay() is 100% bezig en er is 0% om iets anders te doen. Een sketch met millis() vraagt steeds de millis() waarde op en zet af en toe de led aan en uit. Dat stelt weinig voor en zorgt amper voor een belasting, dus hou je meer dan 99% over voor andere dingen.

Berichten: 78
Geregistreerd: 03 Okt 2014, 17:16

Re: Delay() versus millis()

Berichtdoor ilioSS » 23 Jun 2020, 07:30

Hallo koepel,
Ja het is fun met millis().
Goede tips en voorbeelden.
Had je nog iets van een verklarende text?
Mij staat bij dat je tot bloedens toe zat te typen en men het nog niet snapt.
In ieder geval bedankt voor je reactie.

Mvrgr ilioSS

Ps ik laat wel ff weten of de one shot werkt

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Delay() versus millis()

Berichtdoor Koepel » 23 Jun 2020, 10:45

Verklarende tekst bij die voorbeelden ? Het zijn eenvoudige dingen, als vervolg op de Blink Without Delay.
Blink Without Delay: https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay.
En de rest volgt als vanzelf :lol: (bijna dan).

Berichten: 78
Geregistreerd: 03 Okt 2014, 17:16

Re: Delay() versus millis()

Berichtdoor ilioSS » 23 Jun 2020, 11:05

Hallo Koepel,

Net de one-shot ingebouwd. Uiteindelijk werkt het zoals ik wil.
Nog wel ff puzzelen mbt weer uit zetten van de timer op de juiste plek.
Graag wat opbouwende tipe mbt programmeren.
Ik probeer al netjes te documenteren en structuur aan te brengen.
Ook het gebruik van functies daar zie ik het voordeel wel van in.
Hartelijk dank voor je fun met millis()
Met vriendelijke groet,
ilioSS

ps: script volgt

Berichten: 78
Geregistreerd: 03 Okt 2014, 17:16

Re: Delay() versus millis()

Berichtdoor ilioSS » 23 Jun 2020, 17:07

Hoi Koepel,

Hier het script met html webpage.

Met vriendelijke groet,
ilioSS
Code: Alles selecteren
/*
 *
 *                  File:  ESP32-ADXL345-SD-send-email-oneshot-ota_01
 *                         OTA implementeren
 *                         
 */

 // ***************  AsyncWebserver *******************
 #include <AsyncEventSource.h>
 #include <ESPAsyncWebServer.h>
 #include <AsyncTCP.h>
 #include "ESP32_MailClient.h"
 
 //****************  WIFI *****************************
 #include <WiFi.h>
 #include <WiFiUdp.h>                                   // nodig voor de tijd NTP
 AsyncWebServer server(80);

 //**************** TIME ******************************
 #include <time.h>
 long timezone = 1;
 byte daysavetime = 1;

 //**************** SPIFFS ****************************
 #include <SPIFFS.h>                                    // SPIFFS file flashen

 //**************** ESPmDNS  **************************
 #include <ESPmDNS.h>

 //**************** FS  *******************************
 #include <FS.h>
 #include <FSImpl.h>
 #include <vfs_api.h>
 File fsUploadFile;                                    // a File variable to temporarily store the received file

//****************  OTA ******************************
#include <ArduinoOTA.h>                 // Over the air programming

 const char* ssid     = "xx";              // Replace with your network credentials
 const char* password = "xx";

 //******************* ADXL345 *************************
 #include <Adafruit_Sensor.h>
 #include <Adafruit_ADXL345_U.h>
 Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);
 #define X_HIGH  0.5
 #define X_LOW  -0.5
 #define Y_HIGH  0.5
 #define Y_LOW  -0.5
 #define Z_LOW -11.05
 #define Z_HIGH  -7.05
 #define ALARM_LED  3
 #define Send_Email 2 // is output

 // To send Email using Gmail use port 465 (SSL) and SMTP Server smtp.gmail.com
 // YOU MUST ENABLE less secure app option https://myaccount.google.com/lesssecureapps?pli=1
 #define emailSenderAccount    "xx"
 #define emailSenderPassword   "xx"
 #define smtpServer            "smtp.gmail.com"
 #define smtpServerPort        465
 #define emailSubject          "[ALERT] ESP32 Temperature"

 String inputMessage = "xx";       // Default Recipient Email Address
 String enableEmailChecked = "checked";
 String inputMessage2 = "true";
 String inputMessage3 = "25.0";                         // Default Threshold Tril Value
 String lastTemperature;

 String X_value;
 String Y_value;
 String Z_value;
 byte tril_state = 0;
 
 // *************** SD   ******************************
 #include <SD.h>
 #include <SPI.h>
 #define CS_PIN 2                                      // chipselect pin gedefinieerd SD card

 const int ledPin = 13;                                // Set LED GPIO13 
 String ledState;                                      // Stores LED state

 String yy;
 String mm;
 String dd;
 String hr;
 String mi;
 String se;

 String dataMessage;                                   // met gegevens om te loggen
 String headerMessage;                                 // file header met colom gegevens datum, tijd, tempbi,hum,press,tempbu


 unsigned long previousMillis = 0;                     // tbv sensor gegevens wegschrijven
 long interval = 120000;                               //  tbv sensor data wegschrijven
 unsigned long previousMillisLog = 0;
 const unsigned long intervalLog = 10000;
 bool enabledLog = 0;
 
 // *************** ADXL345 ***************************
 String getX_value() {                                // Variable to store the HTTP request String header;
  sensors_event_t event;
  accel.getEvent(&event);
  float x_value = event.acceleration.x;
  String X_value;
  X_value = String(x_value);
  return String(X_value);
 }
 String getY_value() {
  sensors_event_t event;
  accel.getEvent(&event);
  float y_value = event.acceleration.y;
   String Y_value;
   Y_value = String(y_value);
  return String(Y_value);
 }
 String getZ_value() {
  sensors_event_t event;
  accel.getEvent(&event);
  float z_value = event.acceleration.z;
  String Z_value;
  Z_value = String(z_value);
  return (Z_value);
 }

 //**************** LED  etc.**************************
 String processor(const String& var){                    // Replaces placeholder with LED state value
  Serial.println(var);
  if(var == "STATE"){                                    // var in index.html page (id)
    if(digitalRead(ledPin)){
      ledState = "ON";
    }
    else{
      ledState = "OFF";
    }
    Serial.print(ledState);
    return ledState;
  }
  else if (var == "XVALUE"){                            // var in index.html page (id)
    return getX_value();                                //
  }
  else if (var == "YVALUE"){                            // var in index.html page (id)
    return getY_value();
  }
  else if (var == "ZVALUE"){                           // var in index.html page (id)
    return getZ_value();
  }
 else if(var == "EMAIL_INPUT"){
    return inputMessage;
  }
 else  if(var == "ENABLE_EMAIL"){
    return enableEmailChecked;
  }
  if(var == "THRESHOLD"){
    return inputMessage3;
  }
   return String();
 }


 bool emailSent = false;                                 // Flag variable to keep track if email notification was sent or not

 const char* PARAM_INPUT_1 = "email_input";              // email adress to send to
 const char* PARAM_INPUT_2 = "enable_email_input";       // vinkje send or no send
 const char* PARAM_INPUT_3 = "threshold_input";          // threshold waarde

 //************************** VOIDS ***************************************

 void AlarmTril(int x_value, int y_value, int z_value, int tril_state)
 {
  digitalWrite(ALARM_LED, tril_state ? HIGH : LOW);
  if(tril_state){
  Serial.println("***********TRIL ALARM*********");
  Serial.println("Send email");}
  else {
  Serial.println("Alles ok");
  Serial.println("Geen email");
   }
 }

 void initSD() {
    SD.begin(2);
    Serial.print("Initializing SD card...");
    if (!SD.begin(2))
     {     
     Serial.println("Card failed, or not present");    // see if the card is present and can be initialized:
     while (1) ;                                       // don't do anything more:  nu mag door ook als er geen kaart is
     }
    Serial.println("card initialized.");
    delay(10);
    Serial.println("\r\n");
  }

 void startWIFI() {                                     // Connect to Wi-Fi
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);  {
        while (WiFi.waitForConnectResult() != WL_CONNECTED) {  // while (WiFi.status() != WL_CONNECTED)
        delay(1000);
        }
        Serial.println("Connecting to WiFi..");
        Serial.println(WiFi.localIP());              // Print ESP32 Local IP Address
        Serial.println("Ready");
        Serial.print("IP address: ");
        Serial.println(WiFi.localIP());
   }
 }

 void startmDNS() {
    if (!MDNS.begin("esp32")) {
    Serial.println("Error setting up MDNS responder!");
    while(1) {
    delay(100);
    }
 }
    Serial.println("mDNS responder started");
    server.begin();                                  // Start TCP (HTTP) server
    Serial.println("TCP server started");
    MDNS.addService("http", "tcp", 80);              // Add service to MDNS-SD
 }

 void appendFile(fs::FS &fs, const char * path, const char * message) {  // Append data to the SD card (DON'T MODIFY THIS FUNCTION)
    Serial.println("");
    Serial.printf("Appending to file: %s\n", path);
    File file = fs.open(path, FILE_APPEND);
    if(!file) {
        Serial.println("Failed to open file for appending");
        return;
         }
       if(file.print(message)) {
         Serial.println("Message");
         Serial.print(dataMessage.c_str());
         Serial.println("Appended");
      } else {
        Serial.println("Append failed");
    }
    file.close();
  }

 void writeFile(fs::FS &fs, const char * path, const char * message) {  // Write to the SD card (DON'T MODIFY THIS FUNCTION)
    Serial.printf("Writing file: %s\n", path);
    File file = fs.open(path, FILE_WRITE);
    if(!file) {
        Serial.println("Failed to open file for writing");
        return;
         }
       if(file.print(message)) {
         Serial.println("File written");
      } else {
        Serial.println("Write failed");
     }
    file.close();
  }
 
 void getTime()  {
   Serial.println("Contacting Time Server");
  configTime(3600*timezone, daysavetime*3600, "pool.ntp.org");
//   configTime(3600*timezone, daysavetime*3600, "time.nist.gov", "0.pool.ntp.org", "1.pool.ntp.org");
   struct tm tmstruct;
  delay(200);
   
   tmstruct.tm_year = 0;
   getLocalTime(&tmstruct, 5000);
   Serial.printf("\nNow is : %d-%02d-%02d %02d:%02d:%02d\n",(tmstruct.tm_year)+1900,( tmstruct.tm_mon)+1, tmstruct.tm_mday,tmstruct.tm_hour , tmstruct.tm_min, tmstruct.tm_sec);
   Serial.println("");
      yy = (tmstruct.tm_year)+1900;
      mm = ( tmstruct.tm_mon)+1;
      dd = tmstruct.tm_mday;
      hr = (tmstruct.tm_hour);
      mi = (tmstruct.tm_min);
      se = (tmstruct.tm_sec);
  }

 void startOTA(){
     ArduinoOTA
    .onStart([]() {
      String type;
      if (ArduinoOTA.getCommand() == U_FLASH)
        type = "sketch";
      else                                         // U_SPIFFS
        type = "filesystem";
        Serial.println("Start updating " + type);  // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
    })
    .onEnd([]() {
      Serial.println("\nEnd");
    })
    .onProgress([](unsigned int progress, unsigned int total) {
      Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
    })
    .onError([](ota_error_t error) {
      Serial.printf("Error[%u]: ", error);
      if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
      else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
      else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
      else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
      else if (error == OTA_END_ERROR) Serial.println("End Failed");
    });
    ArduinoOTA.begin();
    Serial.println("Ready");
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
 }



 
 SMTPData smtpData;                         // The Email Sending data object contains config and data to send


 //**************** SET-UP ****************************
 void setup(){
 Serial.begin(115200);
 pinMode(ledPin, OUTPUT);               //  bool status;
 pinMode(2, OUTPUT);                    // SD card
 SPI.begin();

 Serial.println("Accelerometer Test"); Serial.println("");
   
  if(!accel.begin()) /* Initialise the sensor */
  {
       Serial.println("Ooops, no ADXL345 detected ... Check your wiring!");
    while(1);
  }
  accel.setRange(ADXL345_RANGE_2_G);
  sensors_event_t event;
  accel.getEvent(&event);

 startWIFI();
 getTime();
 initSD();
  startOTA();


  if(!SPIFFS.begin()){                                                    // Initialize SPIFFS
    Serial.println("An Error has occurred while mounting SPIFFS");
    return;
  }

  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){            // Route for root / web page
    request->send(SPIFFS, "/index.html", String(), false, processor);
  });
 
  server.on("/favicon.ico", HTTP_GET, [](AsyncWebServerRequest *request){ //  was    /favicon.ico
    request->send(SPIFFS, "/favicon.png", "image/png");
  });
 
  server.on("/style.css", HTTP_GET, [](AsyncWebServerRequest *request){   // Route to load style.css file
    request->send(SPIFFS, "/style.css", "text/css");
  });
 
  server.on("/on", HTTP_GET, [](AsyncWebServerRequest *request){          // Route to set GPIO to HIGH
    digitalWrite(ledPin, HIGH);   
    request->send(SPIFFS, "/index.html", String(), false, processor);
  });
 
  server.on("/off", HTTP_GET, [](AsyncWebServerRequest *request){          // Route to set GPIO to LOW
    digitalWrite(ledPin, LOW);   
    request->send(SPIFFS, "/index.html", String(), false, processor);
  });

  server.on("/temperature", HTTP_GET, [](AsyncWebServerRequest *request){  // Route to the BME Temperature
    request->send_P(200, "text/plain", getX_value().c_str());
  });
 
  server.on("/humidity", HTTP_GET, [](AsyncWebServerRequest *request){     // Route to the BME Humidity
    request->send_P(200, "text/plain", getY_value().c_str());
  });
 
  server.on("/pressure", HTTP_GET, [](AsyncWebServerRequest *request){     // Route to the BME Pressure
    request->send_P(200, "text/plain", getZ_value().c_str());
  });
  server.on("/get", HTTP_GET, [] (AsyncWebServerRequest *request) {          // GET email_input value on <ESP_IP>/get?email_input=<inputMessage>
   
    if (request->hasParam(PARAM_INPUT_1)) {
      inputMessage = request->getParam(PARAM_INPUT_1)->value();              // GET enable_email_input value on <ESP_IP>/get?enable_email_input=<inputMessage2>
          if (request->hasParam(PARAM_INPUT_2)) {
            inputMessage2 = request->getParam(PARAM_INPUT_2)->value();
            enableEmailChecked = "checked";
      }
      else {
        inputMessage2 = "false";
        enableEmailChecked = "";
      }
       if (request->hasParam(PARAM_INPUT_3)) {                                      // GET threshold_input value on <ESP_IP>/get?threshold_input=<inputMessage3>
        inputMessage3 = request->getParam(PARAM_INPUT_3)->value();
      }
    }
    else {
      inputMessage = "No message sent";
    }
    Serial.println(inputMessage);   // email adres
    Serial.println(inputMessage2);  // vinkje
    Serial.println(inputMessage3);  // threshold waarde
    request->send(200, "text/html", "HTTP GET request sent to your ESP.<br><a href=\"/\">Return to Home Page</a>");
  });

   server.begin();                                                          // Start server
  }
 

 //****************  LOOP  ****************************
 void loop(){
 ArduinoOTA.handle();
 
    getTime();                    // tijd ophalen
    sensors_event_t event;        // Get a new sensor event
    accel.getEvent(&event);

 
  Serial.print("X: "); Serial.print(event.acceleration.x); Serial.print("  ");     /* Display the results (acceleration is measured in m/s^2) */
  Serial.print("Y: "); Serial.print(event.acceleration.y); Serial.print("  ");
  Serial.print("Z: "); Serial.print(event.acceleration.z); Serial.print("  ");
  Serial.println("m/s^2 ");

 

  float x_value = event.acceleration.x; // int
  String X_value;                       // String
  X_value = String(x_value);
  float y_value = event.acceleration.y;
  String Y_value;
  Y_value = String(y_value);
  float z_value = event.acceleration.z;
  String Z_value;
  Z_value = String(z_value);

  switch (tril_state)                                       //   SWITCH TRIL routine gebruikt
 {
  case 0:
     if ((x_value >= X_HIGH || x_value <= X_LOW) || (y_value >= Y_HIGH || y_value <= Y_LOW) || (z_value >= Z_HIGH || z_value <= Z_LOW))
     tril_state = 1;                                         // Schakelaar voor LED sturen ALARM
     AlarmTril(x_value, y_value, z_value, tril_state);
   break;
   
  case 1:
   if ((x_value < X_HIGH && x_value > X_LOW) && (y_value < Y_HIGH && y_value > Y_LOW) && (z_value < Z_HIGH && z_value > Z_LOW))
     tril_state = 0;
     AlarmTril(x_value, y_value, z_value, tril_state); 
     break;
     
 }


 
       
    String path = "/" + mm + "-" + dd + ".csv";                     // format maand dag
    headerMessage = "Tijd, X_value,Y_value,Z_value\n";              // tijd,x, y, z
    dataMessage = String(hr) + ":" + String(mi) + ":" + String(se) + "," + String(X_value) + "," + String(Y_value) + "," + String(Z_value) + "\r\n";  // uur:minuut:sec,temperature, humidity, pressure, tempbu
    File file = SD.open(path.c_str());
     if(!file) {
     Serial.println("File doens't exist");
     Serial.println("Creating file...");
     writeFile(SD, path.c_str(), headerMessage.c_str());
    }
    else {
    Serial.println("File already exists"); 
    }
    file.close();
      if (dd != dd) {                 
     writeFile(SD, path.c_str(), headerMessage.c_str());       // nieuwe dag nieuwe file
      }
    unsigned long currentMillis = millis();
      if (currentMillis - previousMillis > interval) {  // loggen
       appendFile(SD, path.c_str(), dataMessage.c_str());      // SD loggen van data in file
       previousMillis = currentMillis;
      }
     
  unsigned long currentMillisLog = millis();     
 if(tril_state)
 {
   previousMillisLog = currentMillisLog;
  enabledLog = 1;
  }
 
 if(enabledLog)
 {
  if(currentMillisLog - previousMillisLog < intervalLog)
  Serial.println("********************LOGGEN***********************");
  appendFile(SD, path.c_str(), dataMessage.c_str());      // SD loggen van data in file
  }
  if (currentMillisLog-previousMillisLog>intervalLog){
   enabledLog = 0;
    }
     
     
 if (tril_state && inputMessage2== "true") {
      String emailMessage = String("Very shocky ") ;
 
      if(sendEmailNotification(emailMessage)) {
        Serial.println(emailMessage);
        emailSent = false;
      }
      else {
        Serial.println("Email failed to send");
      }
    }
  }


 bool sendEmailNotification(String emailMessage){
  // Set the SMTP Server Email host, port, account and password
  smtpData.setLogin(smtpServer, smtpServerPort, emailSenderAccount, emailSenderPassword);

  // For library version 1.2.0 and later which STARTTLS protocol was supported,the STARTTLS will be
  // enabled automatically when port 587 was used, or enable it manually using setSTARTTLS function.
  //smtpData.setSTARTTLS(true);

    smtpData.setSender("ESP32", emailSenderAccount);// Set the sender name and Email
    smtpData.setPriority("High");                    // Set Email priority or importance High, Normal, Low or 1 to 5 (1 is highest)
    smtpData.setSubject(emailSubject);               // Set the subject
    smtpData.setMessage(emailMessage, true);         // Set the message with HTML format
    smtpData.addRecipient(inputMessage);             // Add recipients
    smtpData.setSendCallback(sendCallback);
     if (!MailClient.sendMail(smtpData)) {            // Start sending Email, can be set callback function to track the status
       Serial.println("Error sending Email, " + MailClient.smtpErrorReason());
       return false;
  }
   smtpData.empty();                // Clear all data from Email object to free memory
   return true;

  }

 
 // Callback function to get the Email sending status
 void sendCallback(SendStatus msg) {
  // Print the current status
  Serial.println(msg.info());

  // Do something when complete
  if (msg.success()) {
    Serial.println("----------------");
   }
 }
 


Nu de webpage
Code: Alles selecteren
<!DOCTYPE html>
<!--
   File; ESP32-ADXL345-SD-send-email-one-shot-werkt_12
-->
<html>
<head>
  <title>Theo,s ADXL345 Web server</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="image/icon" href="favicon.png:,">
  <link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
  <h1>Theo,s ADXL345 Web server</h1>
 
  <p>
    <span class="sensor-labels">X value</span>
    <span id="X_value">%XVALUE%</span>
    <sup class="units">m/s^2</sup>
  </p>
  <p>
    <span class="sensor-labels">Y value</span>
    <span id="Y_value">%YVALUE%</span>
    <sup class="units">m/s^2</sup>
  </p>
  <p>
    <span class="sensor-labels">Z value</span>
    <span id="Z_value">%ZVALUE%</span>
    <sup class="units">m/s^2</sup>
  </p>
 <p>GPIO state<strong> %STATE%</strong></p>
  <p>
    <a href="/on"><button class="button">ON</button></a>
    <a href="/off"><button class="button button2">OFF</button></a>
  </p>
  </body>
<script>
  setInterval(function ( ) {
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
      if (this.readyState == 4 && this.status == 200) {
        document.getElementById("X_value").innerHTML = this.responseText;
      }
    };
    xhttp.open("GET", "/X_value", true);
    xhttp.send();
  }, 10000 ) ;

  setInterval(function ( ) {
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
      if (this.readyState == 4 && this.status == 200) {
        document.getElementById("Y_value").innerHTML = this.responseText;
      }
    };
    xhttp.open("GET", "/Y_value", true);
    xhttp.send();
  }, 10000 ) ;
 
  setInterval(function ( ) {
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
      if (this.readyState == 4 && this.status == 200) {
        document.getElementById("Z_value").innerHTML = this.responseText;
      }
    };
    xhttp.open("GET", "/Z_value", true);
    xhttp.send();
  }, 10000 ) ;
</script>
<body>
  <h2>AARDSHOCK DETECTOR</h2>
  <h3>%SHOCK% Meting LOOPT</h3>
  <h2>ESP Email Notification</h2>
  <form action="/get">
    Email Address <input type="email" name="email_input" value="%EMAIL_INPUT%" required><br>
    Enable Email Notification <input type="checkbox" name="enable_email_input" value="true" %ENABLE_EMAIL%><br>
    Richter getal <input type="number" step="0.1" name="threshold_input" value="%THRESHOLD%" required><br>
    <input type="submit" value="Submit">
  </form>
</body>


</html>
<!DOCTYPE html>
<!--
   File; ESP32-ADXL345-SD-send-email-one-shot-werkt_12
-->
<html>
<head>
  <title>Theo,s ADXL345 Web server</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="image/icon" href="favicon.png:,">
  <link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
  <h1>Theo,s ADXL345 Web server</h1>
 
  <p>
    <span class="sensor-labels">X value</span>
    <span id="X_value">%XVALUE%</span>
    <sup class="units">m/s^2</sup>
  </p>
  <p>
    <span class="sensor-labels">Y value</span>
    <span id="Y_value">%YVALUE%</span>
    <sup class="units">m/s^2</sup>
  </p>
  <p>
    <span class="sensor-labels">Z value</span>
    <span id="Z_value">%ZVALUE%</span>
    <sup class="units">m/s^2</sup>
  </p>
 <p>GPIO state<strong> %STATE%</strong></p>
  <p>
    <a href="/on"><button class="button">ON</button></a>
    <a href="/off"><button class="button button2">OFF</button></a>
  </p>
  </body>
<script>
  setInterval(function ( ) {
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
      if (this.readyState == 4 && this.status == 200) {
        document.getElementById("X_value").innerHTML = this.responseText;
      }
    };
    xhttp.open("GET", "/X_value", true);
    xhttp.send();
  }, 10000 ) ;

  setInterval(function ( ) {
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
      if (this.readyState == 4 && this.status == 200) {
        document.getElementById("Y_value").innerHTML = this.responseText;
      }
    };
    xhttp.open("GET", "/Y_value", true);
    xhttp.send();
  }, 10000 ) ;
 
  setInterval(function ( ) {
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
      if (this.readyState == 4 && this.status == 200) {
        document.getElementById("Z_value").innerHTML = this.responseText;
      }
    };
    xhttp.open("GET", "/Z_value", true);
    xhttp.send();
  }, 10000 ) ;
</script>
<body>
  <h2>AARDSHOCK DETECTOR</h2>
  <h3>%SHOCK% Meting LOOPT</h3>
  <h2>ESP Email Notification</h2>
  <form action="/get">
    Email Address <input type="email" name="email_input" value="%EMAIL_INPUT%" required><br>
    Enable Email Notification <input type="checkbox" name="enable_email_input" value="true" %ENABLE_EMAIL%><br>
    Richter getal <input type="number" step="0.1" name="threshold_input" value="%THRESHOLD%" required><br>
    <input type="submit" value="Submit">
  </form>
</body>


</html>


Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Delay() versus millis()

Berichtdoor Koepel » 23 Jun 2020, 20:28

Ik zie nog geen one-shot-timer, omdat ik vastloop met "tril_state".
Het is een 'byte', een 'int', een globale variabele, een parameter, je gebruikt het als logische 'bool' en als de waarde 0 en 1.
Is dat iets dat actief is of niet ? Dan ligt het voor de hand om daar een 'bool' variabele van te maken die 'true' of 'false' kan zijn.

Dit wordt nooit geldig:
Code: Alles selecteren
  if (dd != dd)


Je doet heel veel in de loop(). Ik bedoel: je doet heel veel iedere keer als de loop() draait. Normaal gesproken bepaal je zelf hoe vaak je iets wilt doen met zo'n Blink-Without-Delay millis-timer.
Ga je in de loop() naar een bestand schrijven ? En als de loop() honderden keren per seconde wordt uitgevoerd ? Hetzelfde voor de vele Serial.print() in de loop().

Je hoeft maar één 'currentMillis' te gebruiken, maar iedere millis-timer heeft wel een eigen 'previousMillis' nodig.

Dit stukje begrijp ik niet, ik weet eigenlijk niet wat je wilt doen:
Code: Alles selecteren
 
  unsigned long currentMillisLog = millis();
  if (tril_state)
  {
    previousMillisLog = currentMillisLog;
    enabledLog = 1;
  }

  if (enabledLog)
  {
    if (currentMillisLog - previousMillisLog < intervalLog)
      Serial.println("********************LOGGEN***********************");
    appendFile(SD, path.c_str(), dataMessage.c_str());      // SD loggen van data in file
  }
  if (currentMillisLog - previousMillisLog > intervalLog)
  {
    enabledLog = 0;
  }

Berichten: 78
Geregistreerd: 03 Okt 2014, 17:16

Re: Delay() versus millis()

Berichtdoor ilioSS » 23 Jun 2020, 21:17

Hallo Koepel,
Bedankt voor je reactie. Dit gaat ergens over.
if(dd!=dd) snap ik ook niet. Is fout. Merkwaardig want dit zit er in om per dag een nieuwe file te maken. Dat werkt?
Puntje om naar te kijken.
Het stukje dat jij niet begrijpt is de timer aangestuurd door de tril_state. De timer zit er in om 10 sec. Data naar de SD weg te schrijven. De tril_state is dan allang weer weg. Dit werkt naar verwachting. Jouw opmerking met de currentMillis zal ik ook naar kijken. Mijn gedachte is elke timer zijn eigen variabel.
Serial.print vaak gebruikt ter controle en blijven vaak staan in het script. Opschonen.
Jij zegt maak meer gebruik van functies?


Een lege void loop() is het streven.???

De bedoeling is een hoge data dichtheid bij alarm tril_state.

Dus werk aan het winkeltje.

Hartelijk dank.
Ik kom terug met mijn aanpassingen.

Met vriendelijke groet,
ilioSS

Berichten: 78
Geregistreerd: 03 Okt 2014, 17:16

Re: Delay() versus millis()

Berichtdoor ilioSS » 24 Jun 2020, 17:28

Hallo Koepel,
Vandaag gekeken naar het script.
Eerst de if(dd!=dd) lijkt vreemd maar het is om te kijken of er een dag wissel is om 00.00 uur.
dd is een string dus als dd string is not eqeal dan nieuwe file aanmaken. Hangt ervan af waar deze vergelijking staat natuurlijk.
Het werkt want ik krijg elke dag keurig een nieuwe file.
Al met al kom ik nu ook vreemde dingentegen mbt de SD card afhandeling er zijn twee functies die de file weg schrijven
Daar moeten nog verder in duiken.
Iets van,
checkFile()
Is datum veranderd of is er geen file
Maak een file
Anders is er een file en append to the file

Het houd me bezig.
Groet,
ilioSS

Ps. In algemene zin wat zijn de oorzaken de esp32 en esp8266 crashen af en toe (chinese meuk) dat wel

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Delay() versus millis()

Berichtdoor Koepel » 25 Jun 2020, 01:32

De if(dd!=dd) gaat echt niet werken.
Het is een String object en de tekst die binnenin dat object zit wordt vergeleken met zichzelf. Dat is altijd aan elkaar gelijk.
Je hebt het gevuld daarvoor met: dd = tmstruct.tm_mday;. Dat is wat er in staat.

Code: Alles selecteren
int getal = 3;
if ( getal != getal)
{
  Serial.println( "Succes, we zijn een parallel universum binnengegaan");
}

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: azbiyemutuzi en 37 gasten