Gestion d'un Spa/Jacuzzi via un Arduino = SpaDuino ou JakUino

Salut la compagnie je vais vous raconter une histoire
j'avais envie d'avoir un spa à la maison,
et en traînant sur le boncoin,
j'en ai trouvé un,
youpi
mais y'avait tout plein de truc a refaire dessus

  • la structure,
  • les roulements du moteur,
  • des pieces en plastique introuvable a refaire,
  • le cablage de la carte de gestion electronique a revoir,
  • bref plein de truc

et voila tout est fait il est fonctionnel, et efficace, bref il masse.

Mais voila j'aime pas la gestion fermé du programmateur et je veux devenir libre de ce que j'ai....

Donc on va virer tout ca et y mettre un Arduino

Spa/Jacuzzi + Arduino = SpaDuino ou JakUino

J'ai acheté

Voila pour la presentation du matos
je reviendrais pour vous présenter comment je compte raccorder l'ensemble et a quoi servent tout les éléments.

Je continue le projet, j'ai monté les cartes sur un support qui ira dans une grosse boite etanche, voila le montage

une plus proche pour voir les elements

et une de l'afficheur 4x20

Donc j'ai reussi a gerer l'affichage de l'afficheur en lui demandant de donner l'heure et de m'afficher la temperature, j'arrive aussi et sans difficulté à commander les differents relais, je peux meme commander les relais via mon smartphone grace au module Bluethoot.

Ca avance doucement mais surement.

bonjour,
un copain m'a demandé hier pour réparer le sien, tu pourrais faire une photo des cartes de controle du tiens et la marque?
des fois que ca soit les même.
pour le code, je vais le faire, mais avec une gestion de la puissance et non par relais.

Voici une photo de la carte de controle :

C'est un spa deux places de forme triangulaire de marque americaine.

Apres un spa c'est un spa, c'est à dire une baignoire avec des buses d'eaux et d'air, et un ou deux moteur pour faire fonctionner des pompes à eau, une resistance, et un bulleur, plus deux/trois lampes et une sonde de temperature.... tu vire l'electronique et tu installes un arduino.

PAr contre quand tu dit

infobarquee:
...pour le code, je vais le faire, mais avec une gestion de la puissance et non par relais.

tu peux détailler un peut plus ton concept?

sur le sien, avant qu'il ne tombe en panne, on pouvait régler la puissance des bulleurs et des jets.
je n'ai pas encore vu les cartes, mais à mon avis, il doit y avoir des mosfets ou un truc de ce genre.

Voila plusieurs semaines que je bosse dessus, et la le code commence a etre abouti, mais j'ai due suivre la formation arduino sur openclassrooms qui est tres bien.

Je vous publie le code en version 1.00, il gere :

  • le controle de la temperature de l'eau
  • les modes de marche forcée des pompes a eaux, bulleur, et eclairage interieur du Spa
  • les mises en marche automatique des éclairages exterieures
  • le programme d'aeration de l'eau 3x par jour
  • la communication se fait avec une telecommande infrarouge
  • création d'un menu pour initialiser les dates de nettoyage du filtre
  • sécurisation pour empêcher la mise en marche en simultané de la petite vitesse Pompe et la grande vitesse
  • les modes de marches automatique de la filtration de l'eau
  • affichage de l'alerte pour le nettoyage du filtre

Il me reste a faire :

  • création des programmes de massage personnalisé (Rien de compliqué)
  • la gestion complète du spa via interface bluethoot (on verra ca à la fin...)
  • et d'autres petits trucs
  • ajouter un interrupteur crépusculaire pour le démarrage de l’éclairage automatique

Voir le fichier joint

SpaDuino-v1_00.ino (15.9 KB)

Alors le projet avance je publierais prochainement le code en version 1.02 (reglages de quelques defauts de fonctionnement et nouvelles fonctionnalités de la gestion du Spa)

En attendant je publie quelques documents techniques :


Vous retrouverez en pièce jointe les fichiers PDF des deux documents

SpaDuino organigramme.pdf (27.5 KB)

spaduino - Shema de puissance.pdf (38.1 KB)

Bonjour nikus972,

J'ai fait exactement le même projet que toi sauf l'horloge qui est une DS1307. Je pilote mon spa avec une télécommande IR ou via une application que j'ai réalisée sur Android avec AppInventor et le tout communique parfaitement.Tout cela suite au "fumage" du boitier de commande qui a pris l'eau".
Beau travail.

merci pour le commentaire, mon projet n'est pas encore fini car il manque toute la partie communication via le telephone, a ce sujet pourrais tu m'aider le moment venu, car je souhaite dabord finir le code entier et ensuite ajouter cette gestion.
Je vais aussi changer la carte arduino normal par une nano arduino pour gagner en place.

LA DS1307 gere t'elle les jours de la semaine aussi?

Bonsoir,

nikus972:
....
LA DS1307 gere t'elle les jours de la semaine aussi?

oui, de 0 à 6 en circulaire

exemple

lors de la mise à l'heure, faire un choix, puis la rtc incrémente de 1 chaque jour, le lendemain du 6 étant 0

Oui la DS1307 gère les jours de la semaine, j'utilise la bibliothèque RTClib.h. Par contre elle a une fâcheuse tendance à se décaler dans le temps, alors à chaque connexion avec le téléphone, je fais une synchro horaire avec lui.

J'utilise la télécommande pour les fonctions de base aux quelles tout le monde à accès (bulles, jets de massage, lumière) et tout ce qui est réglages (mise en route du chauffage, réglage température) se fait à partir du téléphone et dans un menu "secret".

Pour ma part, j'ai pris une méga pour ses 4 ports série.

Je pourrais t'aider ou te conseiller car j'ai pas mal galéré sur la partie Bluetooth et sur le programme Android.

papybricol:
Bonsoir,
oui, de 0 à 6 en circulaire

exemple

lors de la mise à l'heure, faire un choix, puis la rtc incrémente de 1 chaque jour, le lendemain du 6 étant 0

Merci Papybricol je vais regarder ça pour un autre projet

McGiver_13:
Oui la DS1307 gère les jours de la semaine, j'utilise la bibliothèque RTClib.h. Par contre elle a une fâcheuse tendance à se décaler dans le temps, alors à chaque connexion avec le téléphone, je fais une synchro horaire avec lui.

J'utilise la télécommande pour les fonctions de base aux quelles tout le monde à accès (bulles, jets de massage, lumière) et tout ce qui est réglages (mise en route du chauffage, réglage température) se fait à partir du téléphone et dans un menu "secret".

Pour ma part, j'ai pris une méga pour ses 4 ports série.

Je pourrais t'aider ou te conseiller car j'ai pas mal galéré sur la partie Bluetooth et sur le programme Android.

et c'est bien la le problème de la précision sur mon autre projet, mais c'est pas trop grave car ce sera un projet temporaire, j'en parlerais plus tard.

c'est quoi l'avantage d'avoir 4 ports série (je suis débutant dans ce monde d'Arduino)

et merci pour les futurs conseilles je ne manquerais pas de t’interpeller.

Voila le code en version 1.1 est fini, au menu :

  • correction de petit bug
  • prise de température dans un sous programme
  • réalisation du programme de massage 1
  • possibilité d'annuler le programme de massage en appuyant sur le bouton 0
  • possibilité d’éteindre le retro-eclairage de l'ecran via le menu
  • plus quelques petites améliorations

Autre point j'ai débranché la carte Arduino classique pour installer une Arduino NANO, et bien ca marche du tonnerre, par contre je ne sais pas comment l’intégrer/fixer sur la plaque, si vous avez des idées je suis peneur

SpaDuino-v1_1.ino (21.3 KB)

Bonjour NIKUS972 ; bravo pour ton projet déjà bien abouti , quelques petites choses me paraissent à ajuster :

Chauffage 3kw + pompe 2,2kw soit 5200 W sous 240v = 21 ampères , et je note que ton disjoncteur fait seulement 16 A ......

Attention aussi à ton relais qui pilote ta résistance il doit supporter 12.5 Ampères donc il doit avoir un pouvoir de coupure d'au moins 16A.

En électromécanique lorsque l'on utilise une résistance chauffante on prend l'habitude d'utiliser deux contacts de relais à fermeture( avec deux relais différents) , de cette façons la résistance ne risque pas de rester en fonction si les contacts du relais reste collés .

Bonne continuation.

Étant très curieux, j'ai regardé ton programme et j'ai vu que pour prendre la température c'est une sacré galère. J'utilise la même sonde que toi mais avec la bibliothèque <DallasTemperature.h> et <OneWire.h> qui simplifie pas mal la vie pour ce que je voulais faire, sans forcement une très grande précision.
La prise de température tien en 2 lignes :

sensors.requestTemperatures(); // Prise température
float tempeau = (sensors.getTempCByIndex(0)); // tempeau prend la valeur du sensors

le résultat est directement en degré Celsius.
A+

ARTNOW:
Bonjour NIKUS972 ; bravo pour ton projet déjà bien abouti , quelques petites choses me paraissent à ajuster :

Chauffage 3kw + pompe 2,2kw soit 5200 W sous 240v = 21 ampères , et je note que ton disjoncteur fait seulement 16 A ......

Attention aussi à ton relais qui pilote ta résistance il doit supporter 12.5 Ampères donc il doit avoir un pouvoir de coupure d'au moins 16A.

En électromécanique lorsque l'on utilise une résistance chauffante on prend l'habitude d'utiliser deux contacts de relais à fermeture( avec deux relais différents) , de cette façons la résistance ne risque pas de rester en fonction si les contacts du relais reste collés .

Bonne continuation.

Oui je m'en doutais mais pour le moment la resistance n'est pas encore acheté vu que celle d'origine est morte et il se peut que j'en achete une moins puissante, car l'eau de mon spa est naturellement à 32°c.
Cependant ta remarque avec 2 contacts plutot qu'un n'est pas tombé dans l'oreille d'un sourd, et comme j'avais un relay de libre j'ai ajouté la modif dans le programme, Merci.

McGiver_13:
Étant très curieux, j'ai regardé ton programme et j'ai vu que pour prendre la température c'est une sacré galère. J'utilise la même sonde que toi mais avec la bibliothèque <DallasTemperature.h> et <OneWire.h> qui simplifie pas mal la vie pour ce que je voulais faire, sans forcement une très grande précision.
La prise de température tien en 2 lignes :

sensors.requestTemperatures(); // Prise température
float tempeau = (sensors.getTempCByIndex(0)); // tempeau prend la valeur du sensors

le résultat est directement en degré Celsius.
A+

En un mot PARFAIT et j'en rajoute un deuxième MERCI, cependant le code généré est plus gros de 1000octets mais c'est pas grave car c'est plus lisible.

Donc vos deux remarques sont dans la version 1.4 du programme téléchargeable en pièce jointe.

version 1.4 :

  • correction de petit bug
  • simplification de la prise de température
  • commande de la résistance de chauffage par deux contacts
  • affichage de la version du programme dans le menu 6
  • plus quelques petits nettoyage du code

Par contre j'ai DEUX questions
Comment fixer proprement l'arduino Nano sur ma plaque?
Pour la gestion des massages, j'ai une grosse question :

Dans mon code lorsque j'appuie sur la touche 1 de la telecommande alors que je suis dans la loop(), je vais dans un sous programme qui gere le cycle du massage (PompeGV pendant 15mn et bulleur 45s tout les 3mn)
Une fois fini il sort et retourne dans la loop()

Si je cree d'autre programme de massage, commandé par la touche 2 ou 3 de la telecommande, je vais juste changer la duree du cycle ainsi que celle du bulleur, mais le probleme c'est que je n'arrive pas a inclure les variables dans le sous programme du massage, il me dit qu'il ne sont pas défini dans le scope.

En fait je vais vous mettre un bout du code que je pense etre bon mais celui ci ne marche pas...

int //creation des variables
	dureeMassage,
	dureeBulleurMarche,
	dureeBulleurArret,
	consigneTemperatureProgMass

void setup () {}

void loop () {

if (irrecv.decode(&results)) { //attente de l'arrivé d'un signal de la telecommande
	if (results.value==0xFD00FF){ 	//Touche 1 programmeMassage1
			//programmation des durées des variables
			dureeMassage=15;  		//temps en minute
			dureeBulleurMarche=45; 		//temps en second
			dureeBulleurArret=3; 		//temps en minute
			consigneTemperatureProgMass=35; //temperature du chauffage pour le programmeMassage1
		programmeMassage();} //lancement du programme de massage

	if (results.value==0xFD807F){ 	//Touche 2 programmeMassage2
			//programmation des durées des variables
			dureeMassage=10,		//temps en minute
			dureeBulleurMarche=15, 		//temps en second
			dureeBulleurArret=1, 		//temps en minute
			consigneTemperatureProgMass=38; //temperature du chauffage pour le programmeMassage2
		programmeMassage();} //lancement du programme de massage
}
}

void programmeMassage(){ //programme de massage
	//mise à l'arret des actionneurs phase de sécurité
    digitalWrite(pompePV, HIGH); //arret de la pompePV
    digitalWrite(pompeGV, HIGH); //arret de la pompeGV
    digitalWrite(bulleur, HIGH); //arret du bulleur
    digitalWrite(resistance1, HIGH); //arret de la resistance
    digitalWrite(resistance2, HIGH); //arret de la resistance

  DateTime now = horloge.now(); //mise à l'heure
  DateTime debutMassage, finMassage, bulleurOn, bulleurOff; //creation des variables heures
	//parametrage des variables heures
  	debutMassage=now;
  	finMassage = (now + TimeSpan(0,0,dureeMassage,0));
  	bulleurOn =(now + TimeSpan(0,0,dureeBulleurArret,0));
  	bulleurOff =now;

  delay(200);

while(true)  //Boucle pour realiser le programme du massage
  {
    temperature(); //prise de temperature
    
    //gestion des actionneurs
    digitalWrite(pompeGV,LOW); //mise en marche pompeGV

    //CHAUFFAGE
    if(celsiusNet  <= consigneTemperatureProgMass1-1){ //Mise en marche du chauffage -1° pour eviter les etats indecis
    digitalWrite(resistance1, LOW);
    digitalWrite(resistance2, LOW);}

    if(celsiusNet  >= consigneTemperatureProgMass1+1){ //Mise en arret du chauffage +1° pour eviter les etats indecis
    digitalWrite(resistance1 , HIGH);
    digitalWrite(resistance2 , HIGH);}

    //Mise en marche du bulleur
    if (now.minute()==bulleurOn.minute() && now.second()==bulleurOn.second()) {
      digitalWrite(bulleur,LOW);
      bulleurOff = (now + TimeSpan(0,0,0,dureeBulleurMarche)); //programmation de l'heure d'arret du bulleur
      }
    //Mise à l'arret du bulleur
    if (now.minute()==bulleurOff.minute() && now.second()==bulleurOff.second()) {
      digitalWrite(bulleur,HIGH);
      bulleurOn = (now + TimeSpan(0,0,dureeBulleurArret,0)); //programmation de l'heure de depart du bulleur
      }
    //Les modes d'Arret du programmeMassage1
    // Par le temps finMassage
    if (finMassage.minute()==now.minute() && finMassage.second()==now.second() ) {
        digitalWrite(pompeGV,HIGH); securiteGV=0;
        digitalWrite(resistance1, HIGH);
        digitalWrite(resistance2, HIGH);
        digitalWrite(bulleur,HIGH);
        lcd_4x20.clear();
        break;
      }
      //Par la telecommande touche 0
      if (irrecv.decode(&results)){
        if (results.value==0xFDB04F) { //annuler appuie 0
        delay(100);
        irrecv.resume();
        lcd_4x20.clear();
        digitalWrite(pompeGV,HIGH); securiteGV=0;
        digitalWrite(resistance1 ,HIGH);
        digitalWrite(resistance2 ,HIGH);
        digitalWrite(bulleur,HIGH);
        break;
        }
        if (results.value==0xFFFFFFFF) { //nettoyage bug
        debugInit();}
      }

      delay(10);
    }
return;
}

SpaDuino-v1_4.ino (20.8 KB)

Bonjour,
Un petit peu d'absence suite à un déplacement professionnel !!!

Au sujet de la fixation de l'arduino, j'ai acheté un petit coffret électrique prévu pour deux ou trois disjoncteurs. L'écran LCD 16 x 2 se positionne très bien par l’intérieur et fait pile poil la largeur de l'emplacement des disjoncteurs, je l'ai protégé par une petite plaque en plexi.
J'ai fixé tous mes modules ( RTC, Bluetooth, IR) à l’intérieur du coffret et j'ai refait la plaque arrière, celle d'origine ne me convenait pas, pour y fixer l'aduino, le tout avec du bon scotch double face, c'est nickel.

A+

McGiver_13:
Bonjour,
Un petit peu d'absence suite à un déplacement professionnel !!!

Au sujet de la fixation de l'arduino, j'ai acheté un petit coffret électrique prévu pour deux ou trois disjoncteurs. L'écran LCD 16 x 2 se positionne très bien par l’intérieur et fait pile poil la largeur de l'emplacement des disjoncteurs, je l'ai protégé par une petite plaque en plexi.
J'ai fixé tous mes modules ( RTC, Bluetooth, IR) à l’intérieur du coffret et j'ai refait la plaque arrière, celle d'origine ne me convenait pas, pour y fixer l'aduino, le tout avec du bon scotch double face, c'est nickel.

A+

J'ai deja une boite de prevue etanche

et une plaque noir celle de la photo, mon probleme c'est que j'ai changé l'arduino UNO par un arduino NANO, et c'est pas tres pratique a fixer, donc je voudrais des retours d'experience sur le sujet.

Bon j'ai trouvé pour fixer mon arduino nano, la solution est tres simple :

En plus l'avantage c'est que si je doit mettre à jour le programme pour modification il me suffit de debrancher uniquement l'arduino, et pas me pointer avec le pc pres du spa et de transferer le programme avec le cable de 15cm de long

ARTNOW:
Bonjour NIKUS972 ; bravo pour ton projet déjà bien abouti , quelques petites choses me paraissent à ajuster :

Chauffage 3kw + pompe 2,2kw soit 5200 W sous 240v = 21 ampères , et je note que ton disjoncteur fait seulement 16 A ......

Attention aussi à ton relais qui pilote ta résistance il doit supporter 12.5 Ampères donc il doit avoir un pouvoir de coupure d'au moins 16A.

En électromécanique lorsque l'on utilise une résistance chauffante on prend l'habitude d'utiliser deux contacts de relais à fermeture( avec deux relais différents) , de cette façons la résistance ne risque pas de rester en fonction si les contacts du relais reste collés .

Bonne continuation.

Et bien MERCI mon ami
pourquoi merci et bien je pensais que ma resistance etait HS et apres analyse de ta réflexion, j'ai regardé comment etait alimenté ma resistance. Le systeme d'origine utilise aussi 2 relais, et bien y'en avait un qui etait HS je l'ai donc shunté (provisoirement) et bien ca MARCHE ma resistance CHAUFFE.

Donc pas besoin d'acheter une résistance neuve