circuit énergie

retour

cahier des charges

Pour faire circuler l’eau, il va nous falloir de l’énergie !
– Je souhaite ne pas faire appel à Monsieur EDF.
– Idéalement, le fonctionnement doit être automatisé.
– la quantité d’énergie doit être suffisante pour la « vie » de l’eau (v. circuit de l’eau)

mes choix :

  • Je dispose d’un panneau solaire de 210Wc abîmé (il a reçu un choc), mais il fonctionne encore, bien que diminué.
  • Je choisis de tout faire fonctionner en 12V, il me faut une batterie de ~50Wh. J’ai récupéré une batterie de voiture, batterie de démarrage… Mais ce n’est pas une bonne idée ! Celle-ci va se dégrader très rapidement.
  • Je confie le travail de contrôle de charge à un Victron MPPT 100|15 (une référence en la matière).
    Il fonctionne en 12V ou 24V, et peut accepter 1 ou 2 px solaires.
  • La pompe principale de relevage, doit pouvoir « monter » l’eau à plus de 4m de hauteur et avoir un débit important.
    De préférence pour le silence de fonctionnement, c’est une pompe immergée :
    Pompe de puits profonds 12V 180W Déb.max 6m3/h Hmax=45m
  • Les pompes auxiliaires pour la circulation de l’eau en fond de bac, sont des petites pompes de faible consommation 12V, 0,6A (7,2W) 6L/mn (360L/h) :
    Pompe 6 L pour eau PE3806
    Il y en a 3 : 1 pour amener l’eau et 2 pour la refouler. L’idée est d’assurer que le vidage soit toujours plus rapide que le remplissage
  • Pour piloter le fonctionnement des pompes, je confie le job à un tout petit contrôleur :
    PYBStick Lite 26
    C’est un micro-contrôleur très peu onéreux qui se programme en Python,
    programme python : v. en fin d’article ou téléchargeable ici.
  • Autres composants :
    – régulateur de tension 5V : https://www.gotronic.fr/art-regulateur-5-v-d24v50f5-25330.htm
    – volt/ampère mètre : https://www.gotronic.fr/art-module-volt-amperemetre-vam10010-28672.htm
    – onduleur 220V (optionnel) : https://www.amazon.fr/onduleur-12v-220v/s?k=onduleur+12v+220v
    concernant l’onduleur, comme il ne s’agit pas d’injecter le courant sur le secteur, un simple convertisseur sinusoïdale pourra suffire à faire fonctionner épisodiquement un appareil en 230V, comme : une lampe, un outil, un chargeur, etc…
    Attention quand même à la consommation de l’appareil.
    Attention aussi à la forme (approchante) de la sinusoïde créée, qui peut ne pas convenir à certains appareils.
    Pour ce qui me concerne, j’ai récupérer un vieil onduleur pour PC (batterie HS).

retour


Programme « main.py » (8Ko)

"""
PYBstick 26 lite - Contrôle des pompes de circulation d'eau de la serre
		S.P. juin 2021 - v1 : version intégrant le contrôle de la pompe de relevage
		S.P. août 2021 - v2 : version intégrant le contrôle de la pompe du bac à marée
		
La pompe est déclenchée périodiquement selon un cycle déterminé (réglable par le programme),
sous condition que la tension de batterie soit suffisante. (valeur de seuil réglable par programme).
 - La sortie S12 est utilisée pour fermer un relais 12v, via un 2N2222 en collecteur ouvert.
 - la sortie S18 est utilisée pour piloter la pompe du bac à marée via un 2N2222 en collecteur ouvert 
 - La broche S19 est utilisée en entrée analogique pour lire une tension limitée à 3v3 (réglage par potentiomètre)représentant 16v sur la batterie.
tableau des équivalences :
bat.	  mesure	anal.
14,5	: 2,999		3712
14	: 2,898		3584
13,5	: 2,801		3456
13	: 2,701		3328 seuil de la pompe principale
12,5	: 2,592		3200	
12	: 2,486		3072 seuil de la pompe du bac à marée
11,5	: 2,393		2944
11	: 2,288		2816
- Le poussoir "user switch" du PYBstick est utilisé pour agir manuellement sur la pompe de relevage.
- Les LEDs
 : verte:  allumée pour indiquer le fonctionnement normal du contrôleur.
 : orange: pour indiquer le fonctionnement de la pompe
 : rouge:  indique que la pompe ne démarre pas à cause de la tension trop basse de la batterie 
"""
import pyb
#import os, sys
#import csv
from pyb import LED, Switch
from pyb import ADC
from pyb import delay
#from pwm import *
import time
from time import sleep

ledRouge   = LED(1)
ledVert    = LED(2)
ledOrange  = LED(3)
ledBleu    = LED(4)
bouton  = Switch()

# Déclaration et initialisation des broches
# Contrôle d'un relais branché sur le S12
RELAY_PIN = pyb.Pin.board.S12										# broche 12
relais    = pyb.Pin( RELAY_PIN, pyb.Pin.OUT_PP )
relais.low()
# Contrôle de la pompe du bac à marée sur le S18
PMPBM_PIN = pyb.Pin.board.S18										# broche 18
pmpbm     = pyb.Pin( PMPBM_PIN, pyb.Pin.OUT_PP )	# déclaration de la S18
pmpbm.low()
# 1ère lecture de la tension de batterie sur S19
tensionBat = pyb.ADC(pyb.Pin.board.S19)						# broche 19
	# valeur de la tension de batterie [de 0 à 3v3max (c.à d. : 0 à 16vmax réels)] converti en 2^12(4096)

######## les réglages sont ici ########
# les délais exprimés en ms
PMPREL_TIME 	  =  900000 # (15mn)durée de fonctionnement de la pompe de relevage
PMPBM_TIME        = 1500000 # (25mn)durée de fonctionnement de la pompe du bac à marée 
CYCLE_TIME_PMPBM  = 1800000 # (30mn)durée du cycle de la pompe du bac à marée 
CYCLE_TIME_COURT  = 1800000 # si la tension de batterie est > SEUIL, on utilise ce temps d'attente 
CYCLE_TIME_LONG   = 3600000 # (60mn)durée totale du cycle
# les seuils de tension
# 128 représente ~ 1/2v - la chute de tension est d'~1v quand la pompe fonctionne
SEUIL_PMP   = 3328 # ~13v0 - valeur en dessous de laquelle la pompe ne démarrera pas
SEUIL_PMPBM = 3123 # ~12v2 - tension en dessous de laquelle la pompe du bac à marée ne démarre pas
# je positionne l'hystérésis à ~1v2, soit : 310
HYSTERESIS  = 310 # ~1v2 - hystérésis pour éviter le "pompage" de la pompe ;)
# si la pompe démarre, 12v4 seront nécessaire à son fonctionnement pour ce cycle

#------------ procédures -------------
def RelayOn(pON):	# contrôle de la pompe
	consigne = SEUIL_PMP-HYSTERESIS*(pON) # l'hystérésis est retiré si la pompe fonctionne
	if tensionBat.read() > consigne:      # vérifie la tension de batterie
		relais.high()
		ledOrange.on()	# pompe en route
		pmpON = 1	# indicateur
	else:
		ledRouge.on()	# indique que la pompe n'a pas démarrée à cause de la val. trop basse de la tension de bat.
		
def RelayOff(pON):
	relais.low()		# pompe arrêtée
	pmpON = 0		# indicateur
	ledOrange.off()
	ledRouge.off()

#------------ Initialisation -------------
Tcycle_on  = CYCLE_TIME_COURT	# au démarrage on attend un délai court
PmpRel_on = 0  			# Temps d'activation pompe à "0", pompe arrêtée
pmpON = 0			# la pompe est réputée arrêtée au démarrage du programme
PmpBM_on  = PMPBM_TIME		# La pompe du bac à marée est démarrée
pmpBM_CYCLE = CYCLE_TIME_PMPBM	# son propre cycle est lancé
consigne = SEUIL_PMP		# la consigne initialisée à la valeur du seuil

ledVert.on()	# voyant ledVert allumé : fonctionnement OK
etatBouton = False		# initialisation du bouton

#------------ PROGRAMME PRINCIPAL ------------
								#--------------------------#
while True:	# BOUCLE DE FONCTIONNEMENT #
								#--------------------------#
# Gestion du bouton
	if bouton.value():	# lecture du bouton
		if not(etatBouton):	  # activation ou arrêt de la pompe par appui du bouton
			etatBouton = True # évite les boucles sur le bouton
			if PmpRel_on == 0: # si la pompe est arrêtée on procède au démarrage
				PmpRel_on = PMPREL_TIME	# démarrage de la pompe en donnant la durée de fonctionnement
				if tensionBat.read() > consigne: # vérification de la tension de batterie
					Tcycle_on  = CYCLE_TIME_COURT # tension de batterie suffisante : démarrage du cycle en mode court
				else:
					Tcycle_on  = CYCLE_TIME_LONG	# tension de batterie faible : démarrage du cycle en mode long
				consigne = SEUIL_PMP-HYSTERESIS*(pmpON)
				print( 'consigne    : ', consigne)
				print( 'tension bat.: ', tensionBat.read() )
			else:
				PmpRel_on = 0 # sinon arrêt de la pompe (le cycle continu normalement)
				print( 'consigne    : ', consigne) 
				print( 'tension bat.: ', tensionBat.read() )
	else:
		etatBouton = False # ré-initialisation du bouton
		
# Contrôle de la pompe de relevage
	if PmpRel_on > 0: # la pompe fonctionne
		RelayOn(pmpON)
	else:
		RelayOff(pmpON)	# la pompe est arrêtée
	
# Contrôle de la pompe du bac à marée
	if PmpBM_on > 0:	# la pompe fonctionne
		pmpbm.high()	# 
		ledBleu.on()
	else:
		pmpbm.low()	# la pompe est arrêtée
		ledBleu.off()   # Contrôle du délai de cycle
	if Tcycle_on <= 0:	# le cycle précédent est terminé, on en recommence un autre
		PmpRel_on = PMPREL_TIME	# démarrage de la pompe de relevage en début de cycle
		if tensionBat.read() > consigne: # vérification de la tension de batterie
			Tcycle_on = CYCLE_TIME_COURT # tension de batterie suffisante : démarrage du cycle en mode court
		else:
			Tcycle_on = CYCLE_TIME_LONG # tension de batterie faible : démarrage du cycle en mode long
   
# décomptage des temps de cycle 
	Tcycle_on = Tcycle_on - 50 # décomptage du temps de cycle
	if Tcycle_on <= 0:
		Tcycle_on = 0
	PmpRel_on = PmpRel_on - 50 # décomptage temps de fonctionnement de la pompe
	if PmpRel_on <= 0:
		PmpRel_on = 0
		
	pmpBM_CYCLE = pmpBM_CYCLE -50 # décomptage du temps de cycle du bac à marée
	if pmpBM_CYCLE <= 0:
		pmpBM_CYCLE = CYCLE_TIME_PMPBM # ré-initialisation du compteur
		if tensionBat.read() > SEUIL_PMPBM: # re-démarrage de la pompe si tension suffisante
			PmpBM_on  = PMPBM_TIME
	PmpBM_on = PmpBM_on - 50 # décomptage temps de fonctionnement de la pompe du bac à marée
	if PmpBM_on <= 0:
		PmpBM_on = 0 # délais de la boucle de programme
	delay( 50 )	# attente de 50ms avant bouclage du pg
# FIN de PROGRAMME