diff --git a/Mk2_3phase_RFdatalog_temp/Readme.md b/Mk2_3phase_RFdatalog_temp/Readme.md index 4a6c094c..e1442482 100644 --- a/Mk2_3phase_RFdatalog_temp/Readme.md +++ b/Mk2_3phase_RFdatalog_temp/Readme.md @@ -2,6 +2,15 @@ Ce programme doit être utilisé avec l’IDE Arduino et/ou d’autres IDE de développement comme VSCode + PlatformIO. +- [Utilisation avec Arduino IDE](#utilisation-avec-arduino-ide) +- [Utilisation avec Visual Studio Code](#utilisation-avec-visual-studio-code) +- [Aperçu rapide des fichiers](#aperçu-rapide-des-fichiers) +- [Étalonnage du routeur](#étalonnage-du-routeur) +- [Configuration du programme](#configuration-du-programme) + - [Configuration des sorties TRIAC](#configuration-des-sorties-triac) + - [Configuration des sorties relais tout-ou-rien](#configuration-des-sorties-relais-tout-ou-rien) + - [Principe de fonctionnement](#principe-de-fonctionnement) + # Utilisation avec Arduino IDE Vous devrez télécharger et installer la version la plus récente de l'[Arduino IDE](https://www.arduino.cc/en/software). @@ -15,7 +24,7 @@ Veuillez rechercher le fichier '**platform.txt**' situé dans le chemin d’inst Pour **Windows**, typiquement, vous trouverez le fichier dans '**C:\Program Files (x86)\Arduino\hardware\arduino\avr**' et/ou dans '**%LOCALAPPDATA%\Arduino15\packages\arduino\hardware\avr\x.y.z**' où 'x.y.z' est la version du package **Arduino AVR Boards**. -Vous pouvez aussi taper cette commande dans un Powershell : `Get-Childitem –Path C:\ -Include platform.txt -Recurse -ErrorAction SilentlyContinue`. Cela peut prendre quelques secondes/minutes jusqu’à ce que le fichier soit trouvé. +Vous pouvez aussi taper cette commande dans un Powershell : `Get-Childitem –Path C:\ -Include platform.txt -Recurse -ErrorAction SilentlyContinue`. Cela peut prendre quelques secondes/minutes jusqu’à ce que le fichier soit trouvé. Pour **Linux**, si vous utilisez le paquet AppImage, vous trouverez ce fichier dans '**~/.arduino15/packages/arduino/hardware/avr/1.8.6**'. Vous pouvez exécuter `find / -name platform.txt 2>/dev/null` au cas où l’emplacement aurait été modifié. @@ -26,33 +35,99 @@ Si votre IDE Arduino a été ouvert, veuillez fermer toutes les instances et l # Utilisation avec Visual Studio Code -Vous devrez installer des extensions supplémentaires. Les extensions les plus populaires et les plus utilisées pour ce travail sont '*Arduino*' et '*Platform IO*'. +Vous devrez installer des extensions supplémentaires. +Les extensions les plus populaires et les plus utilisées pour ce travail sont '*Arduino*' et '*Platform IO*'. # Aperçu rapide des fichiers -- **Mk2_3phase_RFdatalog_temp.ino** : Ce fichier est nécessaire pour l’IDE Arduino -- **calibration.h** : contient les paramètres d’étalonnage -- **config.h** : les préférences de l’utilisateur sont stockées ici (affectation des broches, fonctionnalités, ...) -- **config_system.h** : constantes système rarement modifiées -- **constants.h** : quelques constantes - *ne pas modifier* -- **debug.h** : Quelques macros pour la sortie série et le débogage -- **dualtariff.h** : définitions de la fonction double tarif -- **main.cpp** : code source principal -- **main.h** : prototypes de fonctions -- **movingAvg.h** : code source pour la moyenne glissante -- **processing.cpp** : code source du moteur de traitement -- **processing.h** : prototypes de fonctions du moteur de traitement -- **Readme.fr.md** : ce fichier -- **types.h** : définitions des types, ... -- **type_traits.h** : quelques trucs STL qui ne sont pas encore disponibles dans le paquet avr -- **type_traits** : contient des patrons STL manquants -- **utils_relay.h** : code source de la fonctionnalité *diversion par relais* -- **utils_rf.h** : code source de la fonction *RF* -- **utils_temp.h** : code source de la fonctionnalité *Température* -- **utils.h** : fonctions d’aide et trucs divers -- **validation.h** : validation des paramètres, ce code n’est exécuté qu’au moment de la compilation ! -- **platformio.ini** : paramètres PlatformIO -- **inject_sketch_name.py** : script d'aide pour PlatformIO -- **Doxyfile** : paramètre pour Doxygen (documentation du code) - -L’utilisateur final ne doit éditer QUE les fichiers **calibration.h** et **config.h**. \ No newline at end of file +- **Mk2_3phase_RFdatalog_temp.ino** : Ce fichier est nécessaire pour l’IDE Arduino +- **calibration.h** : contient les paramètres d’étalonnage +- **config.h** : les préférences de l’utilisateur sont stockées ici (affectation des broches, fonctionnalités, …) +- **config_system.h** : constantes système rarement modifiées +- **constants.h** : quelques constantes - *ne pas modifier* +- **debug.h** : Quelques macros pour la sortie série et le débogage +- **dualtariff.h** : définitions de la fonction double tarif +- **main.cpp** : code source principal +- **main.h** : prototypes de fonctions +- **movingAvg.h** : code source pour la moyenne glissante +- **processing.cpp** : code source du moteur de traitement +- **processing.h** : prototypes de fonctions du moteur de traitement +- **Readme.fr.md** : ce fichier +- **types.h** : définitions des types, … +- **type_traits.h** : quelques trucs STL qui ne sont pas encore disponibles dans le paquet avr +- **type_traits** : contient des patrons STL manquants +- **utils_relay.h** : code source de la fonctionnalité *diversion par relais* +- **utils_rf.h** : code source de la fonction *RF* +- **utils_temp.h** : code source de la fonctionnalité *Température* +- **utils.h** : fonctions d’aide et trucs divers +- **validation.h** : validation des paramètres, ce code n’est exécuté qu’au moment de la compilation ! +- **platformio.ini** : paramètres PlatformIO +- **inject_sketch_name.py** : script d'aide pour PlatformIO +- **Doxyfile** : paramètre pour Doxygen (documentation du code) + +L’utilisateur final ne doit éditer QUE les fichiers **calibration.h** et **config.h**. + +# Étalonnage du routeur +Les valeurs d'étalonnage se trouvent dans le fichier **calibration.h**. +Il s'agit de la ligne : +```cpp +inline constexpr float f_powerCal[NO_OF_PHASES]{ 0.05000F, 0.05000F, 0.05000F }; +``` + +Ces valeurs par défaut doivent être déterminées pour assurer un fonctionnement optimal du routeur. + +# Configuration du programme + +D'une manière générale, la configuration d'une fonctionnalité nécessite 2 changements au moins : +- activation de la fonctionnalité en question +- configuration de la fonctionnalité en question + +La pertinence de l'ensemble est validée lors de la compilation. Ainsi, si par mégarde, une *pin* est allouée 2 fois par exemple, le compilateur émettra une erreur. + +## Configuration des sorties TRIAC +Il faudra dans un 1er temps définir le nombre de sortie TRIAC. +```cpp +inline constexpr uint8_t NO_OF_DUMPLOADS{ 2 }; +``` + +Ensuite, il faudra assigner les *pins* correspondantes ainsi que l'ordre des priorités au démarrage. +```cpp +inline constexpr uint8_t physicalLoadPin[NO_OF_DUMPLOADS]{ 5, 7 }; +inline constexpr uint8_t loadPrioritiesAtStartup[NO_OF_DUMPLOADS]{ 0, 1 }; +``` + +## Configuration des sorties relais tout-ou-rien +Les sorties relais tout-ou-rien permettent d'alimenter des appareils qui contiennent de l'électronique (pompe à chaleur, …). + +Pour chaque relais, il faut définir 5 paramètres : +- numéro de pin sur laquelle est branché le relais +- seuil de surplus avant mise en route (par défaut **1000 W**) +- seuil d'import avant arrêt (par défaut **200 W**) +- durée de fonctionnement minimale en minutes (par défaut **5 mn**) +- durée d'arrêt minimale en minutes (par défaut **5 mn**). + +```cpp +inline constexpr RelayEngine relays{ { { 4, 1000, 200, 10, 10 } } }; +``` +Cette ligne définit ainsi un relais câblé sur la pin **4**, qui se déclenchera à partir de **1000 W**, et qui s'arrêtera à partir de **200 W** d'import et donc le temps de fonctionnement mais aussi d'arrêt sera de **10 mn**. + +Si plusieurs relais sont présents, on listera tout simplement les configurations de chaque relais de cette façon : +```cpp +inline constexpr RelayEngine relays{ { { 4, 1000, 200, 10, 10 }, + { 3, 1500, 250, 5, 15 } } }; +``` + +### Principe de fonctionnement +Les valeurs de surplus ainsi que d'import sont calculées selon une moyenne mobile pondérée exponentiellement (EWMA pour Exponentially Weighted Moving Average). +Par défaut, cette moyenne prend en compte une fenêtre d'environ 10 mn. +Il est possible de la rallonger mais aussi de la raccourcir. +Pour des raisons de performances de l'Arduino, la durée choisie sera arrondie à une durée proche qui permettra de faire les calculs sans impacter les performances du routeur. + +Si l'utilisateur souhaite plutôt une fenêtre de 15 mn, il suffira d'écrire : +```cpp +inline constexpr RelayEngine relays{ 15_i, { { 3, 1000, 200, 1, 1 } } }; +``` +**_Note_** +Attention au suffixe '**_i**' ! + +*doc non finie* \ No newline at end of file diff --git a/Mk2_3phase_RFdatalog_temp/config.h b/Mk2_3phase_RFdatalog_temp/config.h index 4be178cf..5ca9894a 100644 --- a/Mk2_3phase_RFdatalog_temp/config.h +++ b/Mk2_3phase_RFdatalog_temp/config.h @@ -51,7 +51,7 @@ inline constexpr bool OVERRIDE_PIN_PRESENT{ false }; /**< set #endif inline constexpr bool WATCHDOG_PIN_PRESENT{ false }; /**< set it to 'true' if there's a watch led */ -inline constexpr bool RELAY_DIVERSION{ false }; /**< set it to 'true' if a relay is used for diversion */ +inline constexpr bool RELAY_DIVERSION{ true }; /**< set it to 'true' if a relay is used for diversion */ inline constexpr bool DUAL_TARIFF{ false }; /**< set it to 'true' if there's a dual tariff each day AND the router is connected to the billing meter */ // ----------- Pinout assignments ----------- @@ -84,7 +84,7 @@ inline constexpr uint8_t watchDogPin{ 0xff }; /**< watch dog LED */ inline constexpr uint8_t tempSensorPin{ 0xff }; /**< for 3-phase PCB, sensor pin */ -inline constexpr RelayEngine relays{ { { 0xff, 1000, 200, 1, 1 } } }; /**< config for relay diversion, see class definition for defaults and advanced options */ +inline constexpr RelayEngine relays{ 15_i, { { 3, 1000, 200, 1, 1 } } }; /**< config for relay diversion, see class definition for defaults and advanced options */ //static_assert(myRelayArray.get_relay< 0 >().get_pin() == 2); //static_assert(myRelayArray.get_relay< 1 >().get_pin() == 4); diff --git a/Mk2_3phase_RFdatalog_temp/type_traits/integral_constant.hpp b/Mk2_3phase_RFdatalog_temp/type_traits/integral_constant.hpp index 632d3d97..bd49d2e0 100644 --- a/Mk2_3phase_RFdatalog_temp/type_traits/integral_constant.hpp +++ b/Mk2_3phase_RFdatalog_temp/type_traits/integral_constant.hpp @@ -7,8 +7,18 @@ template< typename T, T v > struct integral_constant { - static const T value = v; + static constexpr T value = v; + using value_type = T; + using type = integral_constant; // using injected-class-name + constexpr operator value_type() const noexcept + { + return value; + } + constexpr value_type operator()() const noexcept + { + return value; + } // since c++14 }; typedef integral_constant< bool, true > true_type; -typedef integral_constant< bool, false > false_type; \ No newline at end of file +typedef integral_constant< bool, false > false_type; diff --git a/Mk2_3phase_RFdatalog_temp/types.h b/Mk2_3phase_RFdatalog_temp/types.h index 2787ac6b..48479946 100644 --- a/Mk2_3phase_RFdatalog_temp/types.h +++ b/Mk2_3phase_RFdatalog_temp/types.h @@ -88,4 +88,23 @@ template< typename _Tp > constexpr size_t size(const _Tp (& /*__array*/)[0]) noe return 0; } +template< class... Ts > +constexpr uint8_t ival(Ts... Vs) +{ + char vals[sizeof...(Vs)] = { Vs... }; + uint8_t result = 0; + for (uint8_t i = 0; i < sizeof...(Vs); i++) + { + result *= 10; + result += vals[i] - '0'; + } + return result; +} + +template< char... Vs > +constexpr integral_constant< uint8_t, ival(Vs...) > operator""_i() +{ + return {}; +} + #endif // _TYPES_H diff --git a/Mk2_3phase_RFdatalog_temp/utils_relay.h b/Mk2_3phase_RFdatalog_temp/utils_relay.h index 6f1937b3..1d907648 100644 --- a/Mk2_3phase_RFdatalog_temp/utils_relay.h +++ b/Mk2_3phase_RFdatalog_temp/utils_relay.h @@ -241,8 +241,8 @@ class relayOutput /** * @brief This class implements the relay management engine * - * @tparam N The number of relays to be used * @tparam D The duration in minutes of the sliding average + * @tparam N The number of relays to be used */ template< uint8_t N, uint8_t D = 10 > class RelayEngine @@ -257,6 +257,12 @@ class RelayEngine { } + constexpr RelayEngine(integral_constant< uint8_t, D > ic, const relayOutput (&ref)[N]) + : relay(ref) + { + } + + constexpr auto get_size() const { return N; @@ -377,7 +383,7 @@ template< uint8_t N, uint8_t D > void RelayEngine< N, D >::inc_duration() const relay[--idx].inc_duration(); } while (idx); - if (settle_change > 0) + if (settle_change) { --settle_change; } diff --git a/PVRouter-3-phase.code-workspace b/PVRouter-3-phase.code-workspace index 7a76bec6..2deb094a 100644 --- a/PVRouter-3-phase.code-workspace +++ b/PVRouter-3-phase.code-workspace @@ -22,7 +22,8 @@ ], "settings": { "files.associations": { - "xtr1common": "cpp" + "xtr1common": "cpp", + "new": "cpp" } } } \ No newline at end of file