add persistant solution for restart and comment
This commit is contained in:
parent
d886bce090
commit
44872fc71e
|
@ -48,6 +48,15 @@ void initSensors(DHT *sensors, int number);
|
||||||
void readSensors(DHT sensors[], float temp[], float hum[], int number);
|
void readSensors(DHT sensors[], float temp[], float hum[], int number);
|
||||||
void sleep();
|
void sleep();
|
||||||
std::tuple<int, int, int> getDate();
|
std::tuple<int, int, int> getDate();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief hgfhdjskl
|
||||||
|
*
|
||||||
|
* @param txt testetest
|
||||||
|
* @param temp dqsdzfs
|
||||||
|
* @param hum
|
||||||
|
* @param number vdsvsvsvs
|
||||||
|
*/
|
||||||
void writeMsg(char *txt, float *temp, float *hum, int number);
|
void writeMsg(char *txt, float *temp, float *hum, int number);
|
||||||
|
|
||||||
//timeClient.getEpochTime().toCharArray(date, 50); = convertir un string en char
|
//timeClient.getEpochTime().toCharArray(date, 50); = convertir un string en char
|
||||||
|
|
168
src/main.cpp
168
src/main.cpp
|
@ -1,11 +1,16 @@
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "NTPClient.h"
|
#include "NTPClient.h"
|
||||||
|
//#include "Effortless_SPIFFS.h"
|
||||||
//#include "driver/"
|
//#include "driver/"
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
#include <nvs_flash.h>
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
|
||||||
|
#define STORAGE_NAMESPACE "storage"
|
||||||
|
#define RESTART 1
|
||||||
|
#define REFRESHMEMBOOT 0
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
@ -13,11 +18,71 @@ DHT sensors[SENSORS_NUMBER] = {DHT(04, DHT22), DHT(18, DHT22), DHT(05, DHT22), D
|
||||||
float temp[SENSORS_NUMBER];
|
float temp[SENSORS_NUMBER];
|
||||||
float hum[SENSORS_NUMBER];
|
float hum[SENSORS_NUMBER];
|
||||||
|
|
||||||
|
Pangodream_18650_CL Battery(ADC_PIN, CONV_FACTOR, READS);
|
||||||
WiFiClient WifiClient;
|
WiFiClient WifiClient;
|
||||||
PubSubClient MqttClient(WifiClient);
|
PubSubClient MqttClient(WifiClient);
|
||||||
WiFiUDP NtpUDP;
|
WiFiUDP NtpUDP;
|
||||||
NTPClient TimeClient(NtpUDP, "europe.pool.ntp.org", 7200, 60000); // 7200 = 2 * 3600 sec pour le décalage horaire
|
|
||||||
Pangodream_18650_CL Battery(ADC_PIN, CONV_FACTOR, READS);
|
/**
|
||||||
|
* @brief create NTP profile for frenchs users
|
||||||
|
*
|
||||||
|
* @param NtpUDP: Protocole use
|
||||||
|
*
|
||||||
|
* @param "europe.pool.ntp.org": serve target
|
||||||
|
*
|
||||||
|
* @param 7200: jet lag europe time from France (2 * 3600 sec)
|
||||||
|
*/
|
||||||
|
NTPClient TimeClient(NtpUDP, "europe.pool.ntp.org", 7200, 60000);
|
||||||
|
|
||||||
|
//-------------------- CONDITION --------------------//
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Time hour for restart or time for refresh restart persistant mem
|
||||||
|
*
|
||||||
|
* @param hours
|
||||||
|
* @param restart bool at true for restart or at false for resfresh memory
|
||||||
|
* @return true right hour for restart or refresh
|
||||||
|
* @return false bad hour for restart or refresh
|
||||||
|
*/
|
||||||
|
bool ishour(int hours, bool restart){
|
||||||
|
if (restart){
|
||||||
|
return hours <= (2 * TIME_TO_SLEEP) / 3600;
|
||||||
|
}
|
||||||
|
// Then refresh time
|
||||||
|
return (hours > (2 * TIME_TO_SLEEP) / 3600) && (hours <= (4 * TIME_TO_SLEEP) / 3600);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Time minute for restart or time for refresh restart persistant mem
|
||||||
|
*
|
||||||
|
* @param minutes
|
||||||
|
* @param restart bool at true for restart or at false for resfresh memory
|
||||||
|
* @return true right minute for restart or refresh
|
||||||
|
* @return false bad minute for restart or refresh
|
||||||
|
*/
|
||||||
|
bool isminute(int minutes, bool restart){
|
||||||
|
if (restart){
|
||||||
|
return minutes <= ((2 * TIME_TO_SLEEP) % 3600) / 60;
|
||||||
|
}
|
||||||
|
// Then refresh time
|
||||||
|
return (minutes > ((2 * TIME_TO_SLEEP) % 3600)) / 60 && (minutes <= ((4 * TIME_TO_SLEEP) % 3600) / 60);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Time seconde for restart or time for refresh restart persistant mem
|
||||||
|
*
|
||||||
|
* @param secondes
|
||||||
|
* @param restart bool at true for restart or at false for resfresh memory
|
||||||
|
* @return true right secondes for restart or refresh
|
||||||
|
* @return false bad secondes for restart or refresh
|
||||||
|
*/
|
||||||
|
bool issecond(int secondes, bool restart){
|
||||||
|
if (restart){
|
||||||
|
return secondes <= ((2 * TIME_TO_SLEEP) - 1 ) % 60;
|
||||||
|
}
|
||||||
|
// Then refresh time
|
||||||
|
return (secondes > ((2 * TIME_TO_SLEEP) - 1 ) % 60) && (secondes <= ((4 * TIME_TO_SLEEP) - 1 ) % 60);
|
||||||
|
}
|
||||||
|
|
||||||
//-------------------- FONCTIONS --------------------//
|
//-------------------- FONCTIONS --------------------//
|
||||||
|
|
||||||
|
@ -28,6 +93,7 @@ void setupMQTT(const char *address, int port)
|
||||||
MqttClient.setServer(address, port);
|
MqttClient.setServer(address, port);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void setupWIFI(const char *wifi_name, const char *password)
|
void setupWIFI(const char *wifi_name, const char *password)
|
||||||
{
|
{
|
||||||
Serial.println('\n');
|
Serial.println('\n');
|
||||||
|
@ -130,7 +196,7 @@ unsigned long getTime() {
|
||||||
time_t now;
|
time_t now;
|
||||||
struct tm timeinfo;
|
struct tm timeinfo;
|
||||||
if (!getLocalTime(&timeinfo)) {
|
if (!getLocalTime(&timeinfo)) {
|
||||||
//Serial.println("Failed to obtain time");
|
Serial.println("Failed to obtain time");
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
time(&now);
|
time(&now);
|
||||||
|
@ -139,6 +205,7 @@ unsigned long getTime() {
|
||||||
}
|
}
|
||||||
//-------------------- Création de trames --------------------//
|
//-------------------- Création de trames --------------------//
|
||||||
|
|
||||||
|
|
||||||
void writeMessage(char *txt, float *temp, float *hum, int number)
|
void writeMessage(char *txt, float *temp, float *hum, int number)
|
||||||
{
|
{
|
||||||
int chargelvl = Battery.getBatteryChargeLevel();
|
int chargelvl = Battery.getBatteryChargeLevel();
|
||||||
|
@ -171,20 +238,89 @@ void writeMessage(char *txt, float *temp, float *hum, int number)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------- Condition --------------------//
|
/**
|
||||||
|
* @brief read, refresh and return the day boot state
|
||||||
|
*
|
||||||
|
* @return bool at true if the esp was restarted or false if error or not restarted
|
||||||
|
* @inspired of https://github.com/espressif/esp-idf/blob/master/examples/storage/nvs_rw_blob/main/nvs_blob_example_main.c
|
||||||
|
*/
|
||||||
|
bool TestBoot(bool resOrRfsh)
|
||||||
|
{
|
||||||
|
nvs_handle_t my_handle;
|
||||||
|
esp_err_t err;
|
||||||
|
bool booted = false;
|
||||||
|
|
||||||
bool ishour(int hours){
|
// Open
|
||||||
return hours <= (2 * TIME_TO_SLEEP) / 3600;
|
err = nvs_open(STORAGE_NAMESPACE, NVS_READWRITE, &my_handle);
|
||||||
|
if (err != ESP_OK){
|
||||||
|
Serial.println("Erreur open nvs persistant storage");
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isminute(int minutes){
|
/******** Refresh part ********/
|
||||||
return minutes <= ((2 * TIME_TO_SLEEP) % 3600) / 60;
|
|
||||||
|
if(resOrRfsh == REFRESHMEMBOOT){
|
||||||
|
int32_t restart = REFRESHMEMBOOT;
|
||||||
|
err = nvs_set_i32(my_handle, "restart", restart);
|
||||||
|
if (err != ESP_OK) {
|
||||||
|
Serial.println("Erreur write nvs persistant storage");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// Commit written value.
|
||||||
|
// After setting any values, nvs_commit() must be called to ensure changes are written
|
||||||
|
// to flash storage. Implementations may write to storage at other times,
|
||||||
|
// but this is not guaranteed.
|
||||||
|
err = nvs_commit(my_handle);
|
||||||
|
if (err != ESP_OK) return err;
|
||||||
|
// Close
|
||||||
|
nvs_close(my_handle);
|
||||||
|
Serial.println("Refresh memory restart state ");
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool issecond(int secondes){
|
/******** ********/
|
||||||
return secondes <= ((2 * TIME_TO_SLEEP) - 1 ) % 60;
|
|
||||||
|
// Read
|
||||||
|
int32_t restart = 0; // value will default to 0, if not set yet in NVS
|
||||||
|
err = nvs_get_i32(my_handle, "restart", &restart);
|
||||||
|
if (err != ESP_OK && err != ESP_ERR_NVS_NOT_FOUND){
|
||||||
|
Serial.println("Erreur read nvs persistant storage");
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!restart){
|
||||||
|
// Write
|
||||||
|
restart = 1;
|
||||||
|
err = nvs_set_i32(my_handle, "restart", restart);
|
||||||
|
if (err != ESP_OK) {
|
||||||
|
Serial.println("Erreur write nvs persistant storage");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// Commit written value.
|
||||||
|
// After setting any values, nvs_commit() must be called to ensure changes are written
|
||||||
|
// to flash storage. Implementations may write to storage at other times,
|
||||||
|
// but this is not guaranteed.
|
||||||
|
err = nvs_commit(my_handle);
|
||||||
|
if (err != ESP_OK) return err;
|
||||||
|
// Close
|
||||||
|
nvs_close(my_handle);
|
||||||
|
Serial.println("not restart");
|
||||||
|
return false;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// Close
|
||||||
|
nvs_close(my_handle);
|
||||||
|
Serial.println("already restart");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Not needed but finish properly the function */
|
||||||
|
// Close
|
||||||
|
nvs_close(my_handle);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//-------------------- Initialisation --------------------//
|
//-------------------- Initialisation --------------------//
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
|
@ -199,12 +335,20 @@ void setup()
|
||||||
TimeClient.begin();
|
TimeClient.begin();
|
||||||
TimeClient.forceUpdate();
|
TimeClient.forceUpdate();
|
||||||
|
|
||||||
/* Reboot one time per day */
|
|
||||||
int rawtime = (TimeClient.getEpochTime()) % 86400; // 86400 = 60sec*60minutes*24heures
|
int rawtime = (TimeClient.getEpochTime()) % 86400; // 86400 = 60sec*60minutes*24heures
|
||||||
int hours = rawtime / 3600, minutes = (rawtime % 3600) / 60 , secondes = rawtime % 60;
|
int hours = rawtime / 3600, minutes = (rawtime % 3600) / 60 , secondes = rawtime % 60;
|
||||||
|
|
||||||
if( ishour(hours) && isminute(minutes) && issecond(secondes)){
|
if (nvs_flash_init() != ESP_OK){
|
||||||
|
Serial.println("Erreur flash init");
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief restart the ESP if there is the time restart
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
if(ishour(hours,RESTART) && isminute(minutes,RESTART) && issecond(secondes,RESTART) && TestBoot(RESTART)){
|
||||||
ESP.restart();
|
ESP.restart();
|
||||||
|
} else if(ishour(hours,REFRESHMEMBOOT) && isminute(minutes,REFRESHMEMBOOT) && issecond(secondes,REFRESHMEMBOOT)){
|
||||||
|
TestBoot(REFRESHMEMBOOT);
|
||||||
}
|
}
|
||||||
/* ######### test time part #########
|
/* ######### test time part #########
|
||||||
Serial.println('\n');
|
Serial.println('\n');
|
||||||
|
|
Loading…
Reference in a new issue