Étape 5: panneau solaire suivi – SKETCH ARDUINO
Écriture d’un programme pour l’Arduino a été une nouvelle expérience pour moi. Gâté par Windows/Linux et même Android qui n’ont fondamentalement aucune limite de mémoire que je rencontrerai très bientôt des problèmes avec le code très limitée et la variable spatiale sur les planches de l’Arduino. L’Arduino Yun offre seulement 28 627 octets pour le code et 2560 octets pour les variables globales.
Ce que j’ai appris vite, c’est que je peux utiliser la mémoire de code vers le haut à 99,9 %, mais si j’utilise plus de 60 % de la mémoire pour les variables globales le croquis était ne fonctionne plus fiable. Je pense que le code de sous-jacente (bootloader,...) nécessite quelques variables globales d’int espace mémoire. J’ai donc dû optimiser mon code et limiter l’utilisation des variables globales autant que possibles. Pour le code lui-même, j’ai divisé le sketch Arduino en plusieurs fichiers. J’ai essayé de commenter le code aussi bien que possible, il devrait donc être explicite.
Les noms des fichiers suivent un schéma spécifique. Le compilateur pour le croquis requiert que les sous-fonctions utilisées doivent être déclarées avant d’être utilisées. Les noms de fichiers sont donc SKETCHNAME_index_MODUL. Avec l’index, je reçois des fichiers à compiler dans l’ordre correct.
SPMONITOR_A_DEFINITIONS
Dans la première partie, tous les fichiers externes nécessaires pour les différentes fonctions sont incluses.
Valeurs d’étalonnage :
Ces valeurs sont essentielles pour les mesures. Ces valeurs sont fonction des capteurs CT utilisés, tolérances des résistances utilisées et de condensateurs et d’autres choses. Pour obtenir ces valeurs correctes, j’ai renforcé plusieurs fois avec le guide de l’étalonnage des blocs de construction OpenEnergyMonitor Procédure d’étalonnage. Jusqu'à ce que vous avez les valeurs correctes ici toutes vos mesures sera plus ou moins merde ! Pour permettre l’étalonnage sans écrire un script spécial, j’ai inclus un mode « calibration » dans l’application Android. En activant le mode étalonnage les applications Android extrait les données de l’Arduino toutes les 10 secondes et affiche des informations sur le facteur de puissance, puissance réelle et apparente et tension mesurée. Les valeurs d’étalonnage peuvent être modifiés jusqu'à ce que les valeurs soient comme prévu (par exemple, facteur de puissance proche de 1.o).
Les autres variables globales sont bien commenté.
SPMONITOR_B_UTILS
Ce module contient 2 fonctions permettant de mémoriser les valeurs enregistrées.
GetTimeStamp() String retourne la date et l’heure du système. Pour l’obtenir, nous utilisons la fonction de « pont » « .run » pour exécuter une commande sur le côté de Linux et de recevoir la sortie sur le « pont ».
La possibilité de lancer des commandes et des scripts sur un shell Linux étend les fonctionnalités de la carte Arduino. Plutôt que les problèmes d’ajouter des fonctions complexes dans l’espace du programme limité du régulateur AVR, ils peuvent être déléguées à la partie Linux.
saveData Sub () utilise les fonctions de "pont" aussi bien pour écrire les données recueillies dans une base de données, envoyer à un service web de nuage et le stocker pour faciliter l’accès du côté de Linux.
Les mesures sont effectuées à chaque seconde, mais les valeurs sont stockées uniquement chaque minute. Les valeurs mesurées sont stockés dans un accumulateur. La partie code
calcule la moyenne des mesures effectués depuis la dernière sauvegarde des valeurs.
La partie code
stocke les valeurs mesurées sur le processeur de Linux en utilisant une structure clé/valeur. Ces structure peut être récupérés sous forme de chaîne JSON par simple appel « http://IPADDRESS//data/get ». (L’adresse IP est l’adresse IP attribuée à l’Arduino Yun). Les données ressemble à :
Vous pouvez voir les données que nous avons mis avec la partie de code ci-dessus dans cette chaîne JSON.
La valeur de L, S et C est actualisée chaque minute et utilisée pour mettre à jour l’interface utilisateur dans l’application Android. Le c, cv, cr... les valeurs sont mises à jour après chaque cycle de mesure (~ 1 s) et peuvent être utilisés pendant le mode de calibration. Ils apparaissent ainsi sur l’interface utilisateur de l’application Android. La partie suivante du code
utilise la fonction de « pont » « .runShellCommand » pour écrire les valeurs mesurées dans la base de données Sqlite. A partir de là, ils peuvent être récupérés sur le réseau local avec le script query.php.
Et la dernière partie de code
utilise aussi bien la fonction de « pont » « .runShellCommand » pour envoyer les données à un service web de nuage. Ce nuage de service web emoncms.org propose (pour le moment pour libre) la possibilité de stocker les données des capteurs et de les visualiser sur le web. Vérifiez leur service, ils sont alimentés par OpenEnergyMonitor !
J’ai ajouté une des options de visualisation dans les images ci-dessus. Vous pouvez voir les données de consommation/production réelle de ma maison dans l’application My solaire de emoncms.org.
SPMONITOR_C_LIGHTSENSOR
Ce module gère le capteur de lumière. La communication avec le capteur de lumière se faite dans les bibliothèques Adafruit_Sensor et Adafruit_TSL2561_U. Ces bibliothèques sont disponibles en open source de Adafruit, le fabricant du module capteur de lumière.
Sub configureSensor () lance la fonction automatique de gamme de la cellule photoélectrique et il définit l’intégration à la valeur la plus élevée.
Sub readLux () initie une mesure du module de capteur de lumière. Pour s’adapter à différentes intensités lumineuses, il est nécessaire d’adapter le temps d’intégration du capteur. Initialement, le capteur est réglé pour le temps d’intégration plus élevé qui est le meilleur dans les situations de faible luminosité. Mais si la lumière devient plus lumineuse, le capteur va saturer et il est nécessaire de passer à un temps plus court de l’intégration. Le capteur offre 3 fois d’intégration différentes. La partie code
lit une valeur dans le capteur. Si le capteur fournit une valeur, le code passe un temps d’intégration plus élevé.
Mais si le capteur est déjà saturé, nous abaisser le temps d’intégration et réessayez de lire à partir du capteur
Cette boucle se répète 5 fois pour s’adapter à des situations de lumière.
SPMONITOR_X_MEASUREMENT
Ce module contient les routines de mesure du capteur CT. La mesure directe du courant et la tension se faite par la bibliothèque d’emonLib. EmonLib est une bibliothèque open source fournie par OpenEnergyMonitor.
void getCTValues (int index) appelle emonLib pour lancer la mesure de courant, de tension et de calcul de puissance et facteur de puissance. L’index de paramètre détermine le capteur qui doit être lu. indice = 0 commence une mesure du capteur CT attachée au câble panneau solaire, 1 commence une mesure du capteur CT attachée à la ligne d’alimentation principale.
Les valeurs recueillies sont ensuite stockés dans un accumulateur. À l’heure actuelle, le système est en mesure de faire une mesure autour de chaque seconde. Les valeurs stockées dans l’accumulateur sont utilisées pour calculer une valeur moyenne avant d’enregistrer les valeurs dans la base de données, ce qui se fait toutes les 60 secondes.
Dans la nuit le panneau solaire ne produit pas de puissance, mais c’est en utilisant un petit courant de veille. Nous éliminons ce courant en veille avec le code
De cette façon nous nous assurons que nous n’enregistrons pas d’une production d’énergie non existant au cours de la nuit.
Les valeurs mesurées sont ensuite enregistrés du côté de Linux avec la fonction « Bridge.put » comme une structure clé/valeur. Les clés sont créées en utilisant le préfixe s pour les valeurs du capteur solaire et le c de préfixe pour les valeurs de la sonde de la ligne principale.
SPMONITOR_Z_LOOP
Il s’agit de la boucle principale de programmes. Il s’exécute tout le temps. À l’intérieur de la boucle, nous utilisons la fonction millis() pour initier des mesures et enregistrement des valeurs dans des fréquences spécifiques.
Au moment où la mesure est lancée chaque seconde. Ceci est possible car le capteur de lumière n’est pas encore utilisé. Une fois que la cellule photoélectrique est fixée la fréquence de la mesure doit être réduite, comme la routine pour la mesure de lumière peut prendre plus que les pires cas 2 secondes.
Ce code appelle les fonctions de mesure pour les capteurs de CT et le capteur de lumière. Le cycle de mesure est visualisé par une LED sur la protection de connexion du capteur.
Le code suivant appelle la fonction pour enregistrer les valeurs dans la base de chaque minute :
Et enfin, nous avons une partie de code pour communiquer directement sur le réseau local avec un PC ou un appareil Android. Quand j’ai commencé avec l’application, j’ai essayé d’avoir tout communication traitées au sein de ce code Arduino, mais en raison des limitations de mémoire, j’ai réalisé que ce n’était pas possible. À la fin il y a donc une seule fonction à gauche ici. Comme la plupart des pièces de communication sont déléguées directement à la partie de Linux de la carte Arduino uniquement la fonction de rapport d’État est traitée ici.
Le statut peut être demande par n’importe quel navigateur ou une application en appelant simplement http://IPADDRESS/arduino/e
La réponse est
F est la fréquence de mesure, V est la valeur d’étalonnage tension, C1 et C2 sont les valeurs d’étalonnage de capteur CT.
Cette fonction va être utilisée par l’application Android pour trouver le dispositif de l’Arduino sur le réseau local.
SPMONITOR_Y_SETUP
Cette routine est appelée une fois après une réinitialisation de la carte Arduino. Il contient les routines d’initialisation pour la communication réseau et des capteurs 1 – configurer le port pour le témoin d’activité
2-initialisation de la communication réseau et l’accès au système de fichiers Linux.
3 – l’initialisation de la lumière et les capteurs de CT
4-initialisation de la minuterie et le chien de garde
Concernant le chien de garde, vous pouvez le voir
fréquemment dans le code source. Avec l’aide de l’organisme de surveillance je m’assure que lorsque le programme se bloque n’importe où que plus tard au bout de 8 secondes, une réinitialisation de la carte Arduino est initiée. Ceci s’assure que le programme peut fonctionner sans surveillance pendant une longue période.
Ceci termine la description succincte du code source Arduino. Pour voir tous les détails, consultez mon dépôt sur Github où vous pouvez trouver le code source complet.