Projet aquarium (un de plus)

effectivement ça rend bien! tu utilise la lib utft ? car sinon tu peut peut'etre te cree une fonction adapter de : drawbitmap ,qui lit un tableau de donné sur SD ; comme les donné d'image stocké en flash et tu charge , mais attention au temps de chargement qui risque d'etre long.

PS: on voit un petit trait noir en desous de tes logo c'est voulu ?

bon j'étais pas parti sur la bonne voie

donc en effet je vais repartir sur une lecture via la SD, cela ne fonctionnais pas sur ma SD de 16GO du coup j'ai retrouvé une vieille vieille vieille sd de 512Mo et la magique cela fonctionne et je peux lire des raw.

donc oui j'utiliserai les lib UTFT, donc je vais utiliser les fonction permettant de lire des raw, et cela va surement un peu ramer a l'ouverture des menu, mais bon, le but est d'avoir aussi une belle interface qui donne envi... et si cela met 2s pour ouvrir une image c'est pas grave.

donc je vais pouvoir revenir sur mon interface de base et cela sera plus sympa visuellement

maintenant plus que refaire tout le code lol

heureusement que c'est juste le début

aller me voila reparti de 0 mais cela fonctionne bien

remarquez qu'il n'y a rien non plus lol. mais j'ai la base de présentation qui est bonne et lu via une sd donc maintenant je peux enfin attaquer les menus

Questions aquariophiles :

En ce qui concerne la température, tu ne prévois rien de plus que des relevés réguliers avec alertes associées ? Aucune action de pilotage des équipements chauffants ?

Pour les changements d'eau, tu restes sur du manuel ?

que donne ton temps de chargement depuis la SD ? et quelle taille d'ecran a tu finalement utilisé?

Bricoleau : pour la température je pense gerer la mise en/hors tension du chauffage, avec un écartype réglable par l’utilisateur, sinon cela va pas arreter de mettre en marche et arreter le relais. donc par exemple si tu depasse de 1 degrés en plus ou moins on met en tension ou hors tension le chauffage.
pour le moment pas de pilotage d’eau, j’ai pas les capacités chez moi de le faire en automatique.

Heloderma-Kris : j’ai pris un 3.2 pouces, et le temps de chargement d’une image de fond est de 2 à 3s.

j’ai pas eu beaucoup de temps a travaillé sur le projet mais j’ai commencé a bosser les menu…

pour le moment je fais a moitié du code et a moitié de la récupe de code sur le web que je modifie suivant mes envie.
bref rien de glorieux et surtout je n’arrive pas a comprendre pourquoi je n’arrive pas a me servir de mon touch (lui fonctionne parfaitement avec les exemples existant)

voici mon code

// JEFFDUINO 1.03
// 1.02 version avec menu venant de la SD
// 1.03 création des menus



#include <tinyFAT.h> // Librairie gestion SD
#include <UTFT.h> // Librairie gestion ecran TFT
#include <UTFT_tinyFAT.h> // Librairie gestion SD
#include <UTouch.h> // Librairie gestion touch
#include <Arduino.h> 

// déclaration de la typo
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
UTFT         myGLCD(ITDB32S, 38, 39, 40, 41);  
UTouch      myTouch(6,5,4,3,2);	
UTFT_tinyFAT myFiles(&myGLCD);
byte selecteurPage=0;

// fonction de detection des zone de clics
// on defini la fonction testTouche qui est definie en bolean donc elle renvoie une variable de type booleene donc soit faux : false soit vrai: true:
boolean TestTouche( int zoneX, int zoneY,int Longueur,int hauteur)
{
   int X, Y,testX,testY; 
    
    boolean reponse=false;
    if (myTouch.dataAvailable())// dataAvailable() est une fonction de la lib Utouch.h
    {
        myTouch.read();// read() est une fonction de la lib Utouch.h
        X=myTouch.getX(), Y=myTouch.getY();// getX et getY() sont des fonction de la lib Utouch.h
        //---- vérifie si appui sur la touche "+" ---------
        testX=abs(X-(zoneX+Longueur/2)); // calcul valeur absolue de l'écart de X touchpad à ZoneX centre trouche
        testY=abs(Y-(zoneY+hauteur/2)); // calcul valeur absolue de l'écart de Y touchpad à ZoneY centre trouche

        if (testX<Longueur/2 && testY<hauteur/2)
         {reponse= true;}
        else
         {reponse=false;}
    }
    return reponse;
}


// debut programmation



void setup()
{
  
  myGLCD.InitLCD(LANDSCAPE);
  myGLCD.clrScr();
  file.initFAT();
  myGLCD.setColor(255,255,255);
  myGLCD.setBackColor(0,0,0);
  myGLCD.setFont(BigFont);
  myTouch.InitTouch();								 
  myTouch.setPrecision(PREC_MEDIUM);	
  file.initFAT(SPISPEED_HIGH);
}

void loop()
{
    switch(selecteurPage){case 1:Home();break;
                          case 2:menu();break;
                          case 3:menu_ph();break;
                          case 4:menu_temp();break;
                          case 5:menu_lum();break;
                          case 6:menu_nour();break;
                          case 7:menu_reglage();break;
                          case 8:menu_reglage1();break;
                          case 9:menu_pompe();break;
                          default:Home();break; 
                        }
}
 void Home()
 { 
 myFiles.loadBitmap(0, 0, 318, 238, "MENU.RAW");
 myGLCD.print("12H01", 120, 20);
 myGLCD.setColor(0,0,0);
  myGLCD.setBackColor(255,255,255);
  myGLCD.print("100%", 56, 100);
  myGLCD.print("Off", 218, 100);
  myGLCD.print("27.2", 56, 160);
  myGLCD.print("6.8", 218, 160);
  myGLCD.setBackColor(88,88,91);
   myGLCD.setColor(255,255,255);
   myGLCD.setFont(SmallFont);
  myGLCD.print("25-12-2015", 225, 217);

  if (TestTouche(30, 30,0,210)){selecteurPage =2;}

 while(1) {};
}

void menu()
{
  myGLCD.print("menu complet", 150, 0);
   while(1) {};
}

void menu_ph()
{
  myGLCD.print("menu complet", 150, 0);
   while(1) {};
}

void menu_temp()
{
  myGLCD.print("menu complet", 150, 0);
   while(1) {};
}

void menu_lum()
{
  myGLCD.print("menu complet", 150, 0);
   while(1) {};
}

void menu_nour()
{
  myGLCD.print("menu complet", 150, 0);
   while(1) {};
}

void menu_reglage()
{
  myGLCD.print("menu complet", 150, 0);
   while(1) {};
}

void menu_reglage1()
{
  myGLCD.print("menu complet", 150, 0);
   while(1) {};
}

void menu_pompe()
{
  myGLCD.print("menu complet", 150, 0);
   while(1) {};
}

Mon code n’est pas très beau non plus mais je me fais la main aussi dessus. donc soyez indulgeant ^^

donc si vous aviez des idées.

a mon avis il doit pas marché tres bien ton code tu a des boucle while(1){}; partout du coup le programe tourne en boucle indefiniment vire le while . ou alors j'ai rien compris :grin:

Ben oui il marche pas bien lol

Par contre si j'enlève le While jai surtout l'écran qui se reaffiche en continue

Je ne pense pas qu'il soit bon du tout Je tâtonne enormement pour comprendre le principe de prog sous arduino ;)

Donc c'est plutôt pour montrer le chemin que je prend Si tu me dis que cest franchement pas la bonne méthode je referai autrement (si tu peux m'aiguiller je prend aussi ;) )

si tu te met des retour sur le Serial tu vera que a la fin de ta page principale apres avoir tester l'apuis sur ta touche et bien tu ne sort plus de la boucle while . ce n'est donc pas la bonne methode . voici une astuce: tu va cree une vriable globale de type

boolean affichage=false;

en suite a l'interieur de chaqu'une de tes page tu va cree un controle avec un switch

swich( affichage){

case 0: 
// toute les instruction que tu ne cherche a afiché qu'une fois 
// arriere plan, bouton, intitulé de variable , etc
affichage=true;// on passe a true pour ignoré ces instruction a la prochaine boucle
break;
case 1:
//ici on teste l'apuis sur les bouton
//on afiche les variable qui change en dinamique
break;
}

et derniere astuce , quand tu fait un apuis sur une touche pour changer de page tu repasse affichage a false comme ça la prochaine page lira toute les instruction a sont premier passa et ferra les teste au prochain.

il faut garder a l'esprit que le programe est une boucle infini ( sauf si tu lui colle un while(1) :grin: ) donc il peut etre decouper de façon a ignoré selon les passage dans la boucle certaine action

Jazznet: Bricoleau : pour la température je pense gerer la mise en/hors tension du chauffage, avec un écartype réglable par l'utilisateur, sinon cela va pas arreter de mettre en marche et arreter le relais. donc par exemple si tu depasse de 1 degrés en plus ou moins on met en tension ou hors tension le chauffage. pour le moment pas de pilotage d'eau, j'ai pas les capacités chez moi de le faire en automatique.

Juste pour partager quelques idées :

Nos chauffages pour aquarium intègrent déjà un thermostat réglable. Le désactiver revient à le régler à une température supérieure, et prendre la main depuis un arduino + relais.

De mon côté, j'ai plus confiance dans la fiabilité du thermostat embarqué sur du matos qui a fait ses preuves, que dans celle d'un montage DIY. Ceci étant dit, "plus confiance" ne veut pas dire "totale confiance". N'importe quel aquariophile expérimenté peut confirmer qu'un chauffage qui reste bloqué en position marche, cela peut arriver (avec bouillabaisse à la clé).

C'est pour cela que de mon côté, l'arduino ne gère qu'une coupure de sécurité, avec alerte associée. Cette coupure est réglée à un seuil supérieur à la température normale de l'aquarium, qui reste réglée sur le thermostat du chauffage.

En option : j'ai prévu de couper le chauffage en heures pleines EDF, tant que la température de l'aquarium est supérieure à un seuil bas.

Enfin, sans automatiser les changements d'eau, j'ai quand même ajouté un capteur de niveau dans le bac, qui permet à l'arduino de détecter que je suis en train de changer une partie de l'eau manuellement, couper automatiquement pompe et chauffage, enregistrer les dates / heures de changement d'eau, et accessoirement de se rappeler à mon bon souvenir si cela fait trop longtemps que je ne l'ai pas fait.

Et j'oubliais : comme l'arduino n'intervient qu'en second niveau pour le contrôle du chauffage, j'ai aussi ajouté un capteur de courant ACS712 près des relais. Cela permet d'enregistrer les mises en route / arrêts du chauffage dans une log, et même de déterminer la puissance de chauffe engagée (l'arduino indique si le chauffage branché est un 50W, 100W, 200W ou 300W).

Bonjour , pour moi j'ai mis deux chauffage à thermostat intégrés a moitié puissance que celle recommandé.. comme ça si un se bloque enclenché , la t° monte pas trop et si un ne s'enclenche pas l'autre chauffe quand même... ça coute un peu plus cher ; mais comme je suis en récifal on prend plus de précautions

merci pour toutes ses info,

cela donne pas mal d'idée.

Pour le moment je me met tout sous le coude, et je vais simplement essayer de creer un noyaux fonctionnel, aprés je ferait les fonctions avec les sugestions qui me paraisse s'adapter au mieux avec mes besoins (tres relatif puisque perso)...

mais c'est pas gagner, je sais que je commence avec un gros projet en connaissant peut de la prog sous arduino :/

Heloderma-kris

Bon je pense a voir compris la partie switch maintenant c'est la fonction de touch qui m’embête :/

Je vais potasser pour comprendre ce qui ne va pas

quest ce qui te pose probléme ? e peut detailer si tu as besoin!

Je sais pas j’ai aucun retour sur mon code (enfin repris surtout sur le web, mais a lire cela parait plutot cohérent, mais vu mon niveau je but bêtement)

voici le code actuel, apres je pense que je suis vraiment a l’arrache et que je ne met pas les truc au bon emplacement…

dur dur de débuter :-[

// JEFFDUINO 1.04
// 1.02 version avec menu venant de la SD
// 1.03 création des menus sans switch
// 1.04 création des menus avec switch non fonctionnel


#include <tinyFAT.h> // Librairie gestion SD
#include <UTFT.h> // Librairie gestion ecran TFT
#include <UTFT_tinyFAT.h> // Librairie gestion SD
#include <UTouch.h> // Librairie gestion touch
#include <Arduino.h> 

// déclaration de la typo
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
UTFT         myGLCD(ITDB32S, 38, 39, 40, 41);  
UTouch      myTouch(6,5,4,3,2);	
UTFT_tinyFAT myFiles(&myGLCD);
byte selecteurPage=0;
boolean affichage=false;

// fonction de detection des zone de clics
// on defini la fonction testTouche qui est definie en bolean donc elle renvoie une variable de type booleene donc soit faux : false soit vrai: true:
boolean TestTouche(int zoneX, int zoneY,int Longueur,int hauteur)
{
   int X, Y,testX,testY; 
    
    boolean reponse=false;
    if (myTouch.dataAvailable())// dataAvailable() est une fonction de la lib Utouch.h
    {
        myTouch.read();// read() est une fonction de la lib Utouch.h
        X=myTouch.getX(), Y=myTouch.getY();// getX et getY() sont des fonction de la lib Utouch.h
        //---- vérifie si appui sur la touche "+" ---------
        testX=abs(X-(zoneX+Longueur/2)); // calcul valeur absolue de l'écart de X touchpad à ZoneX centre trouche
        testY=abs(Y-(zoneY+hauteur/2)); // calcul valeur absolue de l'écart de Y touchpad à ZoneY centre trouche

        if (testX<Longueur/2 && testY<hauteur/2)
         {reponse= true;}
        else
         {reponse=false;}
    }
    return reponse;
}


// debut programmation



void setup()
{
  
  myGLCD.InitLCD(LANDSCAPE);
  myGLCD.clrScr();
  file.initFAT();

  myTouch.InitTouch();								 
  myTouch.setPrecision(PREC_LOW);	
  file.initFAT(SPISPEED_HIGH);
}

void loop()
{
  
    switch(selecteurPage){case 1:Home();break;
                          case 2:menu();break;
                          case 3:menu_ph();break;
                          case 4:menu_temp();break;
                          case 5:menu_lum();break;
                          case 6:menu_nour();break;
                          case 7:menu_reglage();break;
                          case 8:menu_reglage1();break;
                          case 9:menu_pompe();break;
                          default:Home();break; 
                        }
}
 void Home()
 { 
   switch(affichage){
     
     case 0: 
     // logo demarrage
          myFiles.loadBitmap(100, 70, 123, 104, "AQUAPLAN.RAW");
  delay(2000);
// arriere plan, bouton, intitulé de variable , etc
myFiles.loadBitmap(0, 0, 318, 238, "MENU0.RAW");

affichage=true;// on passe a true pour ignoré ces instruction a la prochaine boucle
break;
case 1:
//ici on teste l'apuis sur les bouton et on part sur le menu
 if (TestTouche(320, 240,0,0)){
 affichage=true;
 myGLCD.clrScr();
 selecteurPage =2;
 }
 
//on afiche les variable qui change en dynamique pour le moment cela restera en dur
  myGLCD.setColor(255,255,255);
  myGLCD.setBackColor(0,0,0);
  myGLCD.setFont(BigFont);
  myGLCD.print("12H01", 120, 20);
 myGLCD.setColor(0,0,0);
  myGLCD.setBackColor(255,255,255);
  myGLCD.print("100%", 56, 100);
  myGLCD.print("Off", 218, 100);
  myGLCD.print("27.2", 56, 160);
  myGLCD.print("6.8", 218, 160);
  myGLCD.setBackColor(88,88,91);
   myGLCD.setColor(255,255,255);
   myGLCD.setFont(SmallFont);
  myGLCD.print("25-12-2015", 225, 217);
break;
}
 
}

void menu()
{affichage=false;
     switch(affichage){
     
     case 0: 
// arriere plan, bouton, intitulé de variable , etc
myFiles.loadBitmap(0, 0, 318, 238, "MENU1.RAW");

affichage=true;// on passe a true pour ignoré ces instruction a la prochaine boucle
break;
case 1:
//ici on teste l'apuis sur les bouton
 if (TestTouche(30, 30,0,210)){selecteurPage =2;}
//on afiche les variable qui change en dinamique
  myGLCD.print("menu complet", 150, 0);
   break;
}
}

void menu_ph()
{
     switch(affichage){
     
     case 0: 
// arriere plan, bouton, intitulé de variable , etc
myFiles.loadBitmap(0, 0, 318, 238, "MENU.RAW");

affichage=true;// on passe a true pour ignoré ces instruction a la prochaine boucle
break;
case 1:
//ici on teste l'apuis sur les bouton
 if (TestTouche(30, 30,0,210)){selecteurPage =2;}
//on afiche les variable qui change en dinamique
  myGLCD.print("menu complet", 150, 0);
   break;
}
}




void menu_temp()
{
     switch(affichage){
     
     case 0: 
// arriere plan, bouton, intitulé de variable , etc
myFiles.loadBitmap(0, 0, 318, 238, "MENU.RAW");

affichage=true;// on passe a true pour ignoré ces instruction a la prochaine boucle
break;
case 1:
//ici on teste l'apuis sur les bouton
 if (TestTouche(30, 30,0,210)){selecteurPage =2;}
//on afiche les variable qui change en dinamique
  myGLCD.print("menu complet", 150, 0);
   break;
}
}

void menu_lum()
{
     switch(affichage){
     
     case 0: 
// arriere plan, bouton, intitulé de variable , etc
myFiles.loadBitmap(0, 0, 318, 238, "MENU.RAW");

affichage=true;// on passe a true pour ignoré ces instruction a la prochaine boucle
break;
case 1:
//ici on teste l'apuis sur les bouton
 if (TestTouche(30, 30,0,210)){selecteurPage =2;}
//on afiche les variable qui change en dinamique
  myGLCD.print("menu complet", 150, 0);
   break;
}
}



void menu_nour()
{
     switch(affichage){
     
     case 0: 
// arriere plan, bouton, intitulé de variable , etc
myFiles.loadBitmap(0, 0, 318, 238, "MENU.RAW");

affichage=true;// on passe a true pour ignoré ces instruction a la prochaine boucle
break;
case 1:
//ici on teste l'apuis sur les bouton
 if (TestTouche(30, 30,0,210)){selecteurPage =2;}
//on afiche les variable qui change en dinamique
  myGLCD.print("menu complet", 150, 0);
   break;
}
}
 

void menu_reglage()
{
     switch(affichage){
     
     case 0: 
// arriere plan, bouton, intitulé de variable , etc
myFiles.loadBitmap(0, 0, 318, 238, "MENU.RAW");

affichage=true;// on passe a true pour ignoré ces instruction a la prochaine boucle
break;
case 1:
  myGLCD.print("menu reglage", 150, 0);
   break;
}
}

void menu_reglage1()
{
     switch(affichage){
     
     case 0: 
// arriere plan, bouton, intitulé de variable , etc
myFiles.loadBitmap(0, 0, 318, 238, "MENU.RAW");

affichage=true;// on passe a true pour ignoré ces instruction a la prochaine boucle
break;
case 1:
  myGLCD.print("menu reglage1", 150, 0);
   break;
}
}

void menu_pompe()
{
     switch(affichage){
     
     case 0: 
// arriere plan, bouton, intitulé de variable , etc
myFiles.loadBitmap(0, 0, 318, 238, "MENU.RAW");

affichage=true;// on passe a true pour ignoré ces instruction a la prochaine boucle
break;
case 1:
  myGLCD.print("menu affichage", 150, 0);
   break;
}
}

laise moi deviner , lorsque tu est dans home et que tu clique sur ton bouton ton ecran s'eface mais lorsque tu arrive sur ton menu tu charge et recharge le bitmap et ta touche ne marche pas!

aller voic qui devrai te débloqué ! :grin:

void Home()
{ 
  switch(affichage){

  case 0: 
    // logo demarrage
    myFiles.loadBitmap(100, 70, 123, 104, "AQUAPLAN.RAW");
    delay(2000);
    // arriere plan, bouton, intitulé de variable , etc
    myFiles.loadBitmap(0, 0, 318, 238, "MENU0.RAW");
    affichage=true;// on passe a true pour ignoré ces instruction a la prochaine boucle
    break;
    /* jusque la pas de souci*/
  case 1:
    //ici on teste l'apuis sur les bouton et on part sur le menu
    if (TestTouche(320, 240,0,0)){
      affichage=true;//-----> tu doit passe a false comme sa lors de la prochaine boucle que tu soit dans homme ou autre tu affichera tou!
      myGLCD.clrScr();
      selecteurPage =2;
    }

    //on afiche les variable qui change en dynamique pour le moment cela restera en dur
    myGLCD.setColor(255,255,255);
    myGLCD.setBackColor(0,0,0);
    myGLCD.setFont(BigFont);
    myGLCD.print("12H01", 120, 20);
    myGLCD.setColor(0,0,0);
    myGLCD.setBackColor(255,255,255);
    myGLCD.print("100%", 56, 100);
    myGLCD.print("Off", 218, 100);
    myGLCD.print("27.2", 56, 160);
    myGLCD.print("6.8", 218, 160);
    myGLCD.setBackColor(88,88,91);
    myGLCD.setColor(255,255,255);
    myGLCD.setFont(SmallFont);
    myGLCD.print("25-12-2015", 225, 217);
    break;
  }

}

void menu()
{
  affichage=false;//------------> grosiere erreur car si tu affect en debut de fonction false a chaque tour tu ne tracera que la case 0 jamais 1
  //                              c'est dans la fonction d'avant qu'il faut changer avant d'arivé ici!
  switch(affichage){

  case 0: 
    // arriere plan, bouton, intitulé de variable , etc
    myFiles.loadBitmap(0, 0, 318, 238, "MENU1.RAW");
    affichage=true;// on passe a true pour ignoré ces instruction a la prochaine boucle
    break;
  case 1:
    //ici on teste l'apuis sur les bouton
    if (TestTouche(30, 30,0,210)){
      selecteurPage =2;
    }
    //on afiche les variable qui change en dinamique
    myGLCD.print("menu complet", 150, 0);
    break;
  }
}

Merciiiii

T'es un as.

Bon plus qu'à bien comprendre ce que tu as fais pour pas etre con mais cela marche ^^

Maintenant a moi de faire l'interface complet Et après je rentre les fonctions des différents modules ^^ Le premier sera l'heure ^^

Bonjour , je suis en train de faire un peu le même projet mais moins compliqué , pour l'instant juste la gestion des pompes par arduino avec écran tactile 3.2". J'attend tes prochaines interventions pour l'affichage de l'heure car la je suis un peu bloqué.. Merci