Gestion énergétique d'un système d'hydroponie : Différence entre versions

Ligne 70 : Ligne 70 :
 
{{ {{tntn|Tuto Step}}
 
{{ {{tntn|Tuto Step}}
 
|Step_Title=Ecriture du programme
 
|Step_Title=Ecriture du programme
|Step_Content=====<u>'''Partie 1: Attribution des variables'''</u>====
+
|Step_Content=<br />
 +
====<u>'''Partie 1: Définition des variables'''</u>====
 
Cette partie consiste à définir les constantes et à nommer les relais.  
 
Cette partie consiste à définir les constantes et à nommer les relais.  
  
La fonction "const int" permet de créer une constante qui sera la valeur lue par le capteur en A0.
+
La fonction <small>"const int"</small> permet de créer une constante qui sera la valeur lue par le capteur en A0.
  
La fonction "int" permet juste de nommer une sortie du relais (par exemple la sortie 2 correspond au ventilateur).
+
La fonction <small>"int"</small> permet juste de nommer une sortie du relais (par exemple la sortie 2 correspond au ventilateur).
  
====<u>'''Partie 2: Initialisation des variables'''</u>====
+
====<u>'''Partie 2: Initialisation du programme'''</u>====
Pour lancer cette partie on utilise la fonction "void setup()" qui sert à initialiser et à définir les valeurs initiales, elle ne sera lu qu'une fois lors de la mise en route du programme.
+
Pour lancer cette partie on utilise la fonction <small>"void setup()"</small> qui sert à initialiser et à définir les valeurs initiales, elle ne sera lu qu'une fois lors de la mise en route du programme.
  
La fonction "Serial.begin" donne le débit de transfert de donnée en caractère par seconde (baud). 9600 est une valeur standard et est largement suffisante pour ce type de programme.
+
La fonction <small>"Serial.begin"</small> donne le débit de transfert de donnée en caractère par seconde (baud). 9600 est une valeur standard et est largement suffisante pour ce type de programme.
  
La fonction "PinMode" configure la broche choisi pour un certain comportement en entrée "INPUT" ou en sortie "OUTPUT" (ici en sortie).  
+
La fonction <small>"pinMode"</small> configure la broche choisi pour un certain comportement en entrée <small>"INPUT"</small> ou en sortie <small>"OUTPUT"</small> (ici en sortie).  
  
La fonction "digitalWrite" permet de donner l'action à faire surla broche choisie avec le "PinMode". Elle mettra donc 5V de tension pour "HIGH" et 0V pour "LOW".
+
La fonction <small>"digitalWrite"</small> permet de donner l'action à faire surla broche choisie avec le <small>"pinMode"</small>. Elle mettra donc 5V de tension pour <small>"HIGH"</small> et 0V pour <small>"LOW"</small>.
  
 
''Par exemple:''  
 
''Par exemple:''  
  
''pinMode(batterie,OUTPUT);''
+
''<small>pinMode(batterie,OUTPUT);</small>''
  
''digitalWrite(batterie, HIGH);''
+
''<small>digitalWrite(batterie, HIGH);</small>''
  
''veut dire: "sur la sortie de la broche nommée "batterie", mettre une tension de 5V"''
+
veut dire: ''"sur la sortie de la broche nommée "batterie", mettre une tension de 5V"''
  
 
Cette parti sert à  
 
Cette parti sert à  
  
 +
<br />
 
====<u>'''Partie 3: Ecriture de la boucle'''</u>====
 
====<u>'''Partie 3: Ecriture de la boucle'''</u>====
Une boucle se démarre avec la fonction "void loop()" qui indique au programme de lire en boucle les instructions qui vont suivre jusqu'à que certaines conditions soient remplies voir indéfiniment.
+
Une boucle se démarre avec la fonction <small>"void loop()"</small> qui indique au programme de lire en boucle les instructions qui vont suivre jusqu'à que certaines conditions soient remplies voir indéfiniment.
  
Le début est assez basique, il s'agit de mettre de la tension alternativement aux bornes de la batterie, des pompes puis du bulleur. Comme dans l'étape précédente ceci se contrôle grâce à la fonction "digitalWrite" en position basse ou haute. La fonction "delay" quand à elle donne le temps en milliseconde pendant lequel le programme restera sur l'indication précédente et donc par extension le temps d'allumage de chaque composant.
+
Le début est assez basique, il s'agit de mettre de la tension alternativement aux bornes de la batterie, des pompes puis du bulleur. Comme dans l'étape précédente ceci se contrôle grâce à la fonction <small>"digitalWrite"</small> en position basse ou haute.  
  
Les 3 premiers paragraphes reviennent donc à ceci: "charger la batterie 5min, puis mettre en marche les pompes à eau 10 min, puis allumer le bulleur 20min".  
+
La fonction <small>"delay"</small> quand à elle donne le temps en milliseconde pendant lequel le programme restera sur l'indication précédente et donc par extension le temps d'allumage de chaque composant.
  
<small>"int sensorVal = analogRead(sensorPin);"</small> demande au programme de lire la valeur sensorPin définie au début et de la nommer sensorVal.  
+
Les 3 premiers paragraphes reviennent donc à ceci: ''"charger la batterie 5min, puis mettre en marche les pompes à eau 10 min, puis allumer le bulleur 20min".''
  
 +
<small>"int sensorVal = analogRead(sensorPin);"</small> demande au programme de lire la valeur <small>"sensorPin"</small> définie au début et de la nommer <small>sensorVal</small>.
 +
 +
S'ensuit deux lignes de calcul permettant de passer de la valeur lue par le capteur à une température en degrés Celsius (°C). La fonction <small>"float"</small> étant simplement un moyen d'obtenir un nombre décimal.
 +
 +
<small>"Serial.print"</small> sert à afficher des données sur l'écran. 
 +
 +
Soit: 
 +
 +
<small>Serial.print("temperature: ");</small>
 +
 +
<small>Serial.print(temperature);</small>
 +
 +
Reviens à afficher le mot <small>"température: "</small> puis la valeur mesurée par le capteur.
 +
 +
Enfin grâce à la fonction "<small>if</small>", on peut donner une condition au programme, si elle est respectée, il exécutera ce qui suit, sinon il recommencera la boucle.
 +
 +
La fin signifie donc : ''"Si la température captée est supérieur à 25°C, allumer le ventilateur pendant 10 minutes, sinon, recommencer la boucle"''
 +
 +
<br />
 
====<u>'''Code complet'''</u>====
 
====<u>'''Code complet'''</u>====
 
<small>const int sensorPin = A0;</small>
 
<small>const int sensorPin = A0;</small>

Version du 30 mai 2019 à 10:17

Tutorial de avatarCyprien Cayla | Catégories : Alimentation, Énergie

Ce tutoriel permet le pilotage d'une plantation hydroponique via un petit système électronique contrôlé par une carte Arduino, de l'assemblage des composants à l'écriture du programme de guidage. Cette installation a été étudiée et documentée lors d'une escale du Nomade des Mers à Taipei (Taïwan) et est dorénavant utilisée pour gérer le système hydroponique du bateau.

Licence : Attribution (CC BY)

Introduction

Cette installation est spécialement utile lorsque l'on dispose d'une source d'énergie limitée ou inconstante car elle permet de répartir l'énergie entre les différents composants en réduisant au maximum les pertes.

On peut ainsi grâce à une certaine alternance:

- Contrôler la température de la pièce grâce au déclenchement ou pas d'un petit ventilateur d’appoint

- Contrôler le fonctionnement des différentes pompes à eau

- Contrôler la charge des batteries afin de stocker l'énergie non utilisée

Matériaux

Les références des composants présentés ici sont donnés à titre d'exemple et peuvent tout à fait être remplacés par d'autre à fonction équivalente.
  • une carte Arduino UNO REV3 A000066
  • un régulateur de charge et de décharge (ex : 4-8V 1A Module de Chargeur Charge Batterie Mini Li-ion USB Arduino TP4056
  • un convertisseur de tension : DC/DC booster MT3608 (composant électrique qui va transformer le 3,7 V des batteries en 5V)
  • un module de 4 relais 5V pour Arduino
  • un domino à 10 connecteurs
  • des fils
  • un truc non identifié
  • 2 batteries 18650, 3.6V
  • 2 supports de batteries 18650
  • un bouton ON/OFF

Outils

Pour le circuit électronique:

- un fer à souder

- du fil d'étain

Pour la programmation:

-le programme Arduino, facilement téléchargeable gratuitement sur le site Arduino (https://www.arduino.cc/en/Main/Software#)


Étape 1 - Conception du circuit électrique

Étape 2 - Ecriture du programme


Partie 1: Définition des variables

Cette partie consiste à définir les constantes et à nommer les relais.

La fonction "const int" permet de créer une constante qui sera la valeur lue par le capteur en A0.

La fonction "int" permet juste de nommer une sortie du relais (par exemple la sortie 2 correspond au ventilateur).

Partie 2: Initialisation du programme

Pour lancer cette partie on utilise la fonction "void setup()" qui sert à initialiser et à définir les valeurs initiales, elle ne sera lu qu'une fois lors de la mise en route du programme.

La fonction "Serial.begin" donne le débit de transfert de donnée en caractère par seconde (baud). 9600 est une valeur standard et est largement suffisante pour ce type de programme.

La fonction "pinMode" configure la broche choisi pour un certain comportement en entrée "INPUT" ou en sortie "OUTPUT" (ici en sortie).

La fonction "digitalWrite" permet de donner l'action à faire surla broche choisie avec le "pinMode". Elle mettra donc 5V de tension pour "HIGH" et 0V pour "LOW".

Par exemple:

pinMode(batterie,OUTPUT);

digitalWrite(batterie, HIGH);

veut dire: "sur la sortie de la broche nommée "batterie", mettre une tension de 5V"

Cette parti sert à


Partie 3: Ecriture de la boucle

Une boucle se démarre avec la fonction "void loop()" qui indique au programme de lire en boucle les instructions qui vont suivre jusqu'à que certaines conditions soient remplies voir indéfiniment.

Le début est assez basique, il s'agit de mettre de la tension alternativement aux bornes de la batterie, des pompes puis du bulleur. Comme dans l'étape précédente ceci se contrôle grâce à la fonction "digitalWrite" en position basse ou haute.

La fonction "delay" quand à elle donne le temps en milliseconde pendant lequel le programme restera sur l'indication précédente et donc par extension le temps d'allumage de chaque composant.

Les 3 premiers paragraphes reviennent donc à ceci: "charger la batterie 5min, puis mettre en marche les pompes à eau 10 min, puis allumer le bulleur 20min".

"int sensorVal = analogRead(sensorPin);" demande au programme de lire la valeur "sensorPin" définie au début et de la nommer sensorVal.

S'ensuit deux lignes de calcul permettant de passer de la valeur lue par le capteur à une température en degrés Celsius (°C). La fonction "float" étant simplement un moyen d'obtenir un nombre décimal.

"Serial.print" sert à afficher des données sur l'écran.

Soit:

Serial.print("temperature: ");

Serial.print(temperature);

Reviens à afficher le mot "température: " puis la valeur mesurée par le capteur.

Enfin grâce à la fonction "if", on peut donner une condition au programme, si elle est respectée, il exécutera ce qui suit, sinon il recommencera la boucle.

La fin signifie donc : "Si la température captée est supérieur à 25°C, allumer le ventilateur pendant 10 minutes, sinon, recommencer la boucle"


Code complet

const int sensorPin = A0;

int batterie = 5;

int hydro = 4;

int bulleur = 3;

int ventilateur = 2;

void setup(){

Serial.begin(9600);

pinMode(batterie,OUTPUT);

digitalWrite(batterie, HIGH);

pinMode(hydro,OUTPUT);

digitalWrite(hydro, HIGH);

pinMode(bulleur,OUTPUT);

digitalWrite(bulleur, HIGH);

pinMode(ventilateur,OUTPUT);

digitalWrite(ventilateur, HIGH);

}

void loop(){

digitalWrite(batterie, LOW);

delay(300000);

digitalWrite(batterie, HIGH);

digitalWrite(hydro, LOW);

delay(600000);

digitalWrite(hydro, HIGH);

digitalWrite(bulleur, LOW);

delay(1200000);

digitalWrite(bulleur, HIGH);

int sensorVal = analogRead(sensorPin);

float voltage = (sensorVal/1024.0)*5.0;

float temperature = (voltage - .5) * 100+35;

Serial.print("temperature: ");

Serial.print(temperature);

if(temperature > 25){

digitalWrite(ventilateur, LOW);

delay(600000);

digitalWrite(ventilateur, HIGH);

}

}
Le moindre point virgule ou la moindre accolade sont importants, veiller à garder l'intégralité du code!


Commentaires

Draft