Delay() versus millis()
13 berichten
• Pagina 1 van 2 • 1, 2
Delay() versus millis()
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
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
Re: Delay() versus millis()
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.
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.
Re: Delay() versus millis()
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
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
Re: Delay() versus millis()
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 (bijna dan).
Blink Without Delay: https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay.
En de rest volgt als vanzelf (bijna dan).
Re: Delay() versus millis()
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
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
Re: Delay() versus millis()
Hoi Koepel,
Hier het script met html webpage.
Met vriendelijke groet,
ilioSS
Nu de webpage
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>
Re: Delay() versus millis()
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:
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:
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;
}
Re: Delay() versus millis()
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
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
Re: Delay() versus millis()
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
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
Re: Delay() versus millis()
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.
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");
}
13 berichten
• Pagina 1 van 2 • 1, 2
Wie is er online?
Gebruikers in dit forum: azbiyemutuzi en 37 gasten