ESP32 / ESP8266: Exécutez la tâche quotidienne à un moment précis (Arduino IDE)

ESP32 / ESP8266: Exécutez la tâche quotidienne à un moment précis (Arduino IDE)

Dans ce guide, nous vous montrerons comment obtenir la date et l’heure à l’aide de l’ESP32 ou de l’ESP8266 pour exécuter une ou plusieurs tâches chaque jour à un moment exact. Pour cette application, vos cartes ESP auront l’heure à l’aide du protocole de temps de réseau (NTP), ils doivent donc être connectés à Internet. Les cartes ESP seront programmées à l’aide d’Arduino IDE.

ESP32 ESP8266 NODEMCU Exécutez la tâche quotidienne à un moment précis Arduino IDE

Condition préalable

Avant de procéder, assurez-vous que le module complémentaire ESP32 ou ESP8266 est installé dans Arduino IDE:

Pour ce tutoriel, vous n’avez besoin que d’une carte ESP32 ou d’une carte ESP8266:

NTP (Network Time Protocol)

Pour obtenir une trace du temps, nous utiliserons NTP. NTP signifie Network Time Protocol et il s’agit d’un protocole de mise en réseau pour la synchronisation d’horloge entre les systèmes informatiques. En d’autres termes, il est utilisé pour synchroniser les temps d’horloge informatique dans un réseau.

Il existe des serveurs NTP comme pool.ntp.org que n’importe qui peut utiliser pour demander le temps en tant que client. Dans ce cas, l’ESP32 / ESP8266 est un client NTP qui demande le temps d’un serveur NTP (pool.ntp.org).

NTP Network Time Protocole ESP32 Demande et date

Si vous souhaitez en savoir plus sur l’interaction client-serveur NTP avec les cartes ESP, vous pouvez lire les guides suivants:

Pour ce guide, vous utiliserez la bibliothèque Time.h par défaut fournie avec le framework Arduino afin que vous n’ayez pas besoin d’installer des bibliothèques supplémentaires.

ESP32 / ESP8266 Exécutez la tâche quotidienne à un moment précis – code

Pour obtenir la date et l’heure avec les cartes ESP, vous n’avez pas besoin d’installer de bibliothèques. Vous incluez simplement la bibliothèque Time.h dans votre code.

Le code suivant obtient la date et l’heure du serveur NTP, imprime les résultats sur le moniteur série et vérifie si la tâche quotidienne s’est exécutée ou non.

/*  
  Rui Santos & Sara Santos - Raspberryme.com
  https://Raspberryme.com/esp32-esp8266-run-daily-task/
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
#include 
#if defined(ESP32)
  #include 
#elif defined(ESP8266)
  #include 
#endif
#include 

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

// Timezone string for your region, example: https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
const char* timezone = "WET0WEST,M3.5.0/1,M10.5.0"; // WET0WEST,M3.5.0/1,M10.5.0 = Europe/Lisbon

// Time that the daily task runs in 24 hour format
const int taskHour = 16;   // Hour example in 24 hour format: 16 = 4 PM
const int taskMinute = 5;  // 5 minutes

// Store the day when the task last ran to ensure it only runs once per day
int lastRunDay = -1;

unsigned long lastNTPUpdate = 0; // Timestamp for the last NTP sync
const unsigned long ntpSyncInterval = 30 * 60 * 1000; // Sync every 30 minutes (in ms)

void syncTime() {
  Serial.print("Synchronizing time with NTP server...");
  configTime(0, 0, "pool.ntp.org", "time.nist.gov"); // UTC offset set to 0
  time_t now = time(nullptr);
  while (now < 24 * 3600) { // Wait until time is valid
    delay(100);
    now = time(nullptr);
  }
  Serial.println(" Time synchronized!");
  
  // Set timezone
  setenv("TZ", timezone, 1);
  tzset();

  lastNTPUpdate = millis(); // Record the time of the last sync
}

void setup() {
  Serial.begin(115200);
  
  // Connect to Wi-Fi
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected.");

  syncTime();
}

void loop() {
  time_t now = time(nullptr);
  struct tm timeinfo;
  localtime_r(&now, &timeinfo);

  // Current time and date
  Serial.printf("Current time: %02d:%02d:%02d, Date: %04d-%02d-%02d\n",
              timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec,
              timeinfo.tm_year + 1900, timeinfo.tm_mon + 1, timeinfo.tm_mday);

  // Check if it's time to run the daily task
  if (timeinfo.tm_hour == taskHour && timeinfo.tm_min == taskMinute && lastRunDay != timeinfo.tm_mday) {
    dailyTask();
    // Set the day to ensure it only runs once per day
    lastRunDay = timeinfo.tm_mday;
  }

  // Resynchronize with NTP every 30 minutes
  if (millis() - lastNTPUpdate > ntpSyncInterval) {
    syncTime();
  }

  delay(1000); // Run loop every second
}

void dailyTask() {
  Serial.println("#########\nDoing daily task...\n#########");
  // ENTER YOUR TASK HERE
}

Afficher le code brut

Comment fonctionne le code

Jetons un coup d’œil au code pour voir comment cela fonctionne. Tout d’abord, incluez les bibliothèques pour se connecter au Wi-Fi et obtenir du temps.

#include 
#if defined(ESP32)
  #include 
#elif defined(ESP8266)
  #include 
#endif
#include 

Définition du SSID et du mot de passe

Tapez vos informations d’identification réseau dans les variables suivantes, afin que l’ESP32 / ESP8266 soit en mesure d’établir une connexion Internet et d’obtenir la date et l’heure du serveur NTP.

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

Définir la variable du fuseau horaire

Ensuite, vous devez définir la variable du fuseau horaire pour récupérer l’heure correcte pour votre emplacement.

const char* timezone = "WET0WEST,M3.5.0/1,M10.5.0";

Par exemple, je vis à Porto. Le fuseau horaire est l’Europe / Lisbonne. Dans la liste des variables de chaîne de fuseau horaire, je vois que la variable de chaîne de fuseau horaire pour mon emplacement est Wet0west, M3.5.0 / 1, M10.5.0. Vous pouvez consulter une liste des variables de chaîne de fuseau horaire ici.

Réglez l’heure et la minute que la tâche fonctionne

Réglez l’heure et la minute que vous souhaitez que votre tâche quotidienne fonctionne. Le temps pour la tâche quotidienne est défini en format 24 heures sur 24.Ir le réglage de la tâche à 16 se réfère à 16 h.

const int taskHour = 16;
const int taskMinute = 5;

Autres variables

Stockez le jour où la tâche s’est déroulée pour s’assurer qu’elle ne fonctionne qu’une fois par jour:

int lastRunDay = -1;

Timestamp pour la dernière synchronisation NTP et à quelle fréquence vous souhaitez synchroniser votre temps avec le serveur NTP:

unsigned long lastNTPUpdate = 0;
const unsigned long ntpSyncInterval = 30 * 60 * 1000; // Sync every 30 minutes (in ms)

installation()

Dans la configuration (), vous initialisez la communication série au taux BAUD 115200 pour imprimer les résultats:

Serial.begin(115200);

Ces lignes suivantes connectent la carte ESP à votre routeur pour établir une connexion Internet.

// Connect to Wi-Fi
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
  delay(500);
  Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected.");

Enfin, appelez la fonction Synctime () pour synchroniser votre carte avec le serveur NTP.

syncTime();

symbtime ()

La fonction synitime () se connecte au serveur NTP, récupère la date et l’heure et met à jour l’heure avec le fuseau horaire correct défini précédemment.

void syncTime() {
  Serial.print("Synchronizing time with NTP server...");
  configTime(0, 0, "pool.ntp.org", "time.nist.gov"); // UTC offset set to 0
  time_t now = time(nullptr);
  while (now < 24 * 3600) { // Wait until time is valid
    delay(100);
    now = time(nullptr);
  }
  Serial.println(" Time synchronized!");
  
  // Set timezone
  setenv("TZ", timezone, 1);
  tzset();

  lastNTPUpdate = millis(); // Record the time of the last sync
}

boucle()

Dans la boucle (), nous préparons les variables d’heure et de date. Nous imprimons également les variables du moniteur en série à des fins de débogage:

time_t now = time(nullptr);
struct tm timeinfo;
localtime_r(&now, &timeinfo);

// Current time and date
Serial.printf("Current time: %02d:%02d:%02d, Date: %04d-%02d-%02d\n",
                     timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec,
                     timeinfo.tm_year + 1900, timeinfo.tm_mon + 1, timeinfo.tm_mday);

Cette partie du code vérifie s’il est exact pour exécuter la tâche quotidienne:

if (timeinfo.tm_hour == taskHour && timeinfo.tm_min == taskMinute && lastRunDay != timeinfo.tm_mday) {
  dailyTask();
  // Set the day to ensure it only runs once per day
  lastRunDay = timeinfo.tm_mday;
}

Enfin, vérifiez si 30 minutes se sont écoulées, si c’est vrai, il est nécessaire de synchroniser l’heure. Nous ajoutons également un retard pour exécuter la boucle à chaque seconde.

// Resynchronize with NTP every 30 minutes
if (millis() - lastNTPUpdate > ntpSyncInterval) {
  syncTime();
}

delay(1000);  // Run loop every second

DailyTask ()

Vous pouvez modifier la fonction DailyTask () pour ajouter le code souhaité pour votre projet qui s’exécute à l’heure spécifiée:

void dailyTask() {
  Serial.println("#########\nDoing daily task...\n#########");
  // ENTER YOUR TASK HERE
}

Remarque: Vous pouvez appliquer la même logique à l’aide d’un module RTC externe si vous n’avez pas accès à Internet ou si vous ne souhaitez pas compter sur l’horloge interne ESP32 / ESP8266. Vous pouvez utiliser un module RTC DS3231 ou DS1307.

Démonstration

À l’heure actuelle, le code n’imprime qu’un message dans le moniteur série Arduino IDE lorsque la tâche s’exécute. Vous devez modifier le code pour effectuer toute autre tâche utile. Voici un exemple de la façon dont il devrait ressembler:

ESP32 ESP8266 NODEMCU RUNE TAGDE DAVID

ESP32 / ESP8266 Exécutez plusieurs tâches quotidiennes – Code

Sur la base de l’exemple précédent, vous pouvez dupliquer certaines sections du code pour exécuter plusieurs tâches quotidiennes à un moment précis de la journée. Fondamentalement, vous ajoutez deux fois cible et vérifiez si chaque tâche a déjà exécuté pour le jour en cours en utilisant deux variables. Voici l’exemple complet:

/*  
  Rui Santos & Sara Santos - Raspberryme.com
  https://Raspberryme.com/esp32-esp8266-run-daily-task/
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
#include 
#if defined(ESP32)
  #include 
#elif defined(ESP8266)
  #include 
#endif
#include 

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

// Timezone string for your region, example: https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
const char* timezone = "WET0WEST,M3.5.0/1,M10.5.0"; // WET0WEST,M3.5.0/1,M10.5.0 = Europe/Lisbon

// Time that the daily task runs in 24 hour format
const int task1Hour = 8;    // Task 1 at 8:15 AM
const int task1Minute = 15;

const int task2Hour = 18;   // Task 2 at 6:45 PM
const int task2Minute = 45;
  
// Store the day when the task last ran to ensure it only runs once per day
int lastRunDayTask1 = -1;
int lastRunDayTask2 = -1;

unsigned long lastNTPUpdate = 0; // Timestamp for the last NTP sync
const unsigned long ntpSyncInterval = 30 * 60 * 1000; // Sync every 30 minutes (in ms)

void syncTime() {
  Serial.print("Synchronizing time with NTP server...");
  configTime(0, 0, "pool.ntp.org", "time.nist.gov"); // UTC offset set to 0
  time_t now = time(nullptr);
  while (now < 24 * 3600) { // Wait until time is valid
    delay(100);
    now = time(nullptr);
  }
  Serial.println(" Time synchronized!");
  
  // Set timezone
  setenv("TZ", timezone, 1);
  tzset();

  lastNTPUpdate = millis(); // Record the time of the last sync
}

void setup() {
  Serial.begin(115200);
  
  // Connect to Wi-Fi
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected.");

  syncTime();
}

void loop() {
  time_t now = time(nullptr);
  struct tm timeinfo;
  localtime_r(&now, &timeinfo);

  // Current time and date
  Serial.printf("Current time: %02d:%02d:%02d, Date: %04d-%02d-%02d\n",
              timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec,
              timeinfo.tm_year + 1900, timeinfo.tm_mon + 1, timeinfo.tm_mday);

  // Check if it's time to run the daily task #1
  if (timeinfo.tm_hour == task1Hour && timeinfo.tm_min == task1Minute && lastRunDayTask1 != timeinfo.tm_mday) {
    dailyTask1();
    // Set the day to ensure it only runs once per day
    lastRunDayTask1 = timeinfo.tm_mday;
  }

  // Check if it's time to run the daily task #2
  if (timeinfo.tm_hour == task2Hour && timeinfo.tm_min == task2Minute && lastRunDayTask2 != timeinfo.tm_mday) {
    dailyTask2();
    // Set the day to ensure it only runs once per day
    lastRunDayTask2 = timeinfo.tm_mday;
  }

  // Resynchronize with NTP every 30 minutes
  if (millis() - lastNTPUpdate > ntpSyncInterval) {
    syncTime();
  }

  delay(1000); // Run loop every second
}

void dailyTask1() {
  Serial.println("#########\nDoing daily task #1...\n#########");
  // ENTER YOUR TASK HERE
}

void dailyTask2() {
  Serial.println("#########\nDoing daily task #2...\n#########");
  // ENTER YOUR TASK HERE
}

Afficher le code brut

N’oubliez pas d’insérer vos informations d’identification de réseau, le fuseau horaire, le temps des tâches souhaité et modifiez les fonctions DailyTask pour exécuter votre tâche quotidienne. Par défaut, avec ce nouveau code, vous aurez une tâche n ° 1 en cours d’exécution à 8 h 15 et la tâche n ° 2 à 18 h 45.

Emballage

Ce guide rapide vous a appris à créer un code simple qui peut exécuter une ou plusieurs tâches avec vos cartes ESP à l’heure souhaitée.

Nous espérons que vous avez trouvé ce tutoriel utile. Nous avons d’autres tutoriels liés au temps que vous pourriez aimer:

En savoir plus sur l’ESP32 avec nos ressources:

Merci d’avoir lu.

Cette vidéo vous emmène dans l’histoire de Raspberry Pi :

Youtube video