Aide avant achat

Ce n'ai pas pour un éclairage mon programme.

Car j'utilise déjà un boitier babyfish.

Voir mon aquarium: http://www.aquariophilie.org/forum/viewtopic.php?f=33&t=89534

Mon but avec l'arduino c'est de:

-Alimenter/couper la diffusion de CO2 -Alimenter/couper la ventilation de mes led et du boitier indépendamment -Couper les alim de mes leds (car avec babyfish il y a une rémanence de courant qui fait que les leds meme à 0 sont allumé légèrement).

Le tout géré avec l'heure.

Pour le changement d'état relai en effet donc:

const int output = 49; boolean etat49 = 0; etc....

pinMode(49, OUTPUT); etc....

if (hour == 9 && minute == 30 && second == 00) etat49=1; digitalWrite(49,etat49);

if (hour == 19 && minute == 0 && second == 00) etat49=0; digitalWrite(49,etat49);

etc...etc...

Oui si les relais fonctionnent à la meme heure je peut faire:

if (hour == 9 && minute == 30 && second == 00) etat48=1; etat49=1; digitalWrite(48,etat48); digitalWrite(49,etat49); etc...

if (hour == 19 && minute == 0 && second == 00) etat48=0; etat49=0; digitalWrite(48,etat48); digitalWrite(49,etat49); etc....

Tu peux peut-être essayé cette librairie.

pour tester!

Salut

Pour gérer un programmateur horaire, il y a bien plus simple et moins sujet à soucis de mise au point, bug etc.

Par exemple, qu’est-ce qui se passe avec ton code, si ton arduino démarre en milieu de journée (genre suite à une micro coupure électrique) ?

Oublions nos pauvres neurones humains qui raisonnent en heure/minute/seconde, et mettons nous un instant à la place d’un arduino. Enfin, façon de parler.

Bref tout ça pour dire : il vaut mieux gérer le temps dans le programme, avec autre chose que heure minute seconde.

Par exemple, utilise un entier pour y stocker le nombre de minutes écoulées depuis minuit.
Sa plage de valeur va donc être de 0 à 1439

Cela peut donner un code du style

const int heure_debut = 9;
const int minute_debut = 30;

const int heure_fin = 21;
const int minute_fin = 15;

const int horaire_debut = heure_debut * 60 + minute_debut;
const int horaire_fin = heure_fin * 60 + minute_fin;

...

int etat_led = 0;

...

loop()
{
...
  int horaire = heure_ds1307 * 60 + minute_ds1307;

  if ((horaire_debut <= horaire) && (horaire <= horaire_fin)
  {
    if (etat_led == 0)
    {
       AllumerLed();
       etat_led = 1;
    }
  }
  else
  {
    if (etat_led != 0)
    {
       EteindreLed();
       etat_led = 0;
    }
  }

...
}

+1 pour Bricoleau.

Par contre l’égalité n’est pas nécessaire ici :

if ((horaire_debut < horaire) && (horaire < horaire_fin))

:stuck_out_tongue:

Presque !!

Disons que quand l’humain moyen dit “la lumière doit s’allumer à telle heure et s’éteindre à telle heure”, le code associé serait :

  if ((horaire_debut <= horaire) && (horaire < horaire_fin))

;D

:grinning:

Bonsoir, Il te faut une instance RTC. Regarde l'exemple suivant et tu trouveras tes oublis. @+

Powac powac , un aspirine garçon.

Je suis perdu la :(

En tout cas merci de votre aide :)

Re, Où se situe ton problème ?

Mon problème c'est que je vois ce que je veux faire, j'arrive a voir la façon de faire, mais je n'arrive pas à le faire (le programmer quoi).

Je n'arrive pas a mettre tous les bouts ensembles.

Re, Juste une petite précision lorsque tu écris :

if (hour == 9 && minute == 30 && second == 00)
  etat49=!etat49; // inverse l'état du relais
   digitalWrite(49,etat49); // met la broche de commande dans l'état voulu

Il n'y a que la ligne qui suit ton if qui est exécutée lorsque la condition est vrai. Pour que les deux lignes soient exécutées il faut :

if (hour == 9 && minute == 30 && second == 00){
  etat49=!etat49; // inverse l'état du relais
   digitalWrite(49,etat49); // met la broche de commande dans l'état voulu
}

Les parenthèses sont obligatoires. @+

Donc voici un essai:

#include "Wire.h"

#define DS1307_ADDRESS 0x68

byte zero = 0x00; //workaround for issue #527
  // déclarations faites en tête pour être globales
  int second;
  int minute;
  int hour;
  int weekDay;
  int monthDay;
  int month;
  int year;
  
  // tes déclarations
  
    const int output = 30;
  boolean etat30 = 0;  
    const int output = 31;
  boolean etat31 = 0;  
    const int output = 32;
  boolean etat32 = 0;  
    const int output = 33;
  boolean etat33 = 0;  
    const int output = 34;
  boolean etat34 = 0;  
    const int output = 35;
  boolean etat35 = 0;  
    const int output = 36;
  boolean etat36 = 0;  
    const int output = 37;
  boolean etat37 = 0;
  
   
//-------------------------------------    
void setup()
{

  Wire.begin();
  Serial.begin(9600);
  //setDateTime(); //ligne a décommenter pour mise à l'heure
  pinMode(30, OUTPUT); //diffusion co2
  pinMode(31, OUTPUT); //led 6500K
  pinMode(32, OUTPUT); //led 4300K
  pinMode(33, OUTPUT); //led bleu
  pinMode(34, OUTPUT); //ventilateur 1
  pinMode(35, OUTPUT); //ventilateur 2
  pinMode(36, OUTPUT);
  pinMode(37, OUTPUT);

}
//-------------------------------------
void loop()
{
  // lancement de la lecture de l'heure
  printDate();
  
  // ton programme
  
  // diffusion co2
   if (hour == 9 && minute == 00 && second == 00)
  etat30=1; 
   digitalWrite(30,etat30); 
  
  if (hour == 18 && minute == 0 && second == 00)
  etat30=0; 
  digitalWrite(30,etat30);
  
  //led 6500K
   if (hour == 9 && minute == 45 && second == 00)
  etat31=1; 
   digitalWrite(31,etat31); 
  
  if (hour == 19 && minute == 0 && second == 00)
  etat31=0; 
  digitalWrite(31,etat31);
  
  //led 4300K
  if (hour == 8 && minute == 30 && second == 00)
  etat32=1; 
   digitalWrite(32,etat32); 
  
  if (hour == 20 && minute == 30 && second == 00)
  etat32=0; 
  digitalWrite(32,etat32);
  
  //led bleu
  if (hour == 7 && minute == 30 && second == 00)
  etat33=1; 
   digitalWrite(33,etat33); 
  
  if (hour == 22 && minute == 30 && second == 00)
  etat33=0; 
  digitalWrite(33,etat33);
  
  //ventilateur 1  
  if (hour == 8 && minute == 30 && second == 00)
  etat34=1; 
   digitalWrite(34,etat34); 
  
  if (hour == 21 && minute == 0 && second == 00)
  etat34=0; 
  digitalWrite(34,etat34);
  
  //ventilateur 2
  if (hour == 7 && minute == 00 && second == 00)
  etat35=1; 
   digitalWrite(35,etat35); 
  
  if (hour == 23 && minute == 0 && second == 00)
  etat35=0; 
  digitalWrite(35,etat35);
   
  
  
}
//-------------------------------------

void //setDateTime()
{
  // modifié en supprimant les déclarations car faites en tête pour être globales
  byte second =      00; //0-59
  byte minute =      22; //0-59
  byte hour =        22; //0-23
  byte weekDay =     3; //1-7
  byte monthDay =    17; //1-31
  byte month =       12; //1-12
  byte year  =       14; //0-99
  
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero); //stop Oscillator
  Wire.write(decToBcd(second));
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));
  Wire.write(decToBcd(weekDay));
  Wire.write(decToBcd(monthDay));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));
  Wire.write(zero); //start
  Wire.endTransmission();
}
//-------------------------------------
byte decToBcd(byte val)
{
// Convert normal decimal numbers to binary coded decimal
  return ( (val/10*16) + (val%10) );
}

byte bcdToDec(byte val)  {
// Convert binary coded decimal to normal decimal numbers
  return ( (val/16*10) + (val%16) );
}
//-------------------------------------
void printDate()
{
  // Reset the register pointer
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);
  Wire.endTransmission();
  Wire.requestFrom(DS1307_ADDRESS, 7);

  // modifié en supprimant les déclarations car faites en tête pour être globales
  second = bcdToDec(Wire.read());
  minute = bcdToDec(Wire.read());
  hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
  weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
  monthDay = bcdToDec(Wire.read());
  month = bcdToDec(Wire.read());
  year = bcdToDec(Wire.read());

  //print the date EG   3/1/11 23:59:59
  Serial.print(month);
  Serial.print("/");
  Serial.print(monthDay);
  Serial.print("/");
  Serial.print(year);
  Serial.print(" ");
  Serial.print(hour);
  Serial.print(":");
  Serial.print(minute);
  Serial.print(":");
  Serial.println(second);
}

Donc, je n’arrive pas à compiler. Une erreur sur les constante

This report would have more information with
“Show verbose output during compilation”
enabled in File > Preferences.
Arduino: 1.0.6 (Windows 7), Board: “Arduino Mega (ATmega1280)”
test1:18: error: expected unqualified-id before ‘{’ token
test1.ino: In function ‘void loop()’:
test1:65: error: ‘etat30’ was not declared in this scope
test1:66: error: ‘etat30’ was not declared in this scope
test1:74: error: ‘etat31’ was not declared in this scope
test1:75: error: ‘etat31’ was not declared in this scope
test1:83: error: ‘etat32’ was not declared in this scope
test1:84: error: ‘etat32’ was not declared in this scope
test1:92: error: ‘etat33’ was not declared in this scope
test1:93: error: ‘etat33’ was not declared in this scope
test1:101: error: ‘etat34’ was not declared in this scope
test1:102: error: ‘etat34’ was not declared in this scope
test1:110: error: ‘etat35’ was not declared in this scope
test1:111: error: ‘etat35’ was not declared in this scope
test1.ino: At global scope:
test1:123: error: expected unqualified-id before ‘{’ token

Je verrais par la suite l’exemple avec :

const int heure_debut = 9;
const int minute_debut = 30;

const int heure_fin = 21;
const int minute_fin = 15;

const int horaire_debut = heure_debut * 60 + minute_debut;
const int horaire_fin = heure_fin * 60 + minute_fin;

int etat_led = 0;

loop()
{

int horaire = heure_ds1307 * 60 + minute_ds1307;

if ((horaire_debut <= horaire) && (horaire <= horaire_fin)
{
if (etat_led == 0)
{
AllumerLed();
etat_led = 1;
}
}
else
{
if (etat_led != 0)
{
EteindreLed();
etat_led = 0;
}
}

Car la je comprend pas comment faire avec plusieurs heures de réglages différentes.

Re, Dans ton soft tu ne peux pas déclarer 8 fois la même constante, elles ont forcément des noms différents.

const int output = 30;
  boolean etat30 = 0; 
    const int output = 31;
  boolean etat31 = 0; 
    const int output = 32;
  boolean etat32 = 0; 
    const int output = 33;
  boolean etat33 = 0; 
    const int output = 34;
  boolean etat34 = 0; 
    const int output = 35;
  boolean etat35 = 0; 
    const int output = 36;
  boolean etat36 = 0; 
    const int output = 37;
  boolean etat37 = 0

En plus cette syntaxe n'est pas admise :

void //setDateTime()

Pour que cela soit plus clair et simple pour tout le monde, il faut mettre le soft entre balises code (voir icône feuille texte avec le signe plus). @+

Ok c’est bon.

const int output1 = 30;
boolean etat30 = 0;
const int output2 = 31;
boolean etat31 = 0;
const int output3 = 32;
boolean etat32 = 0;
const int output4 = 33;
boolean etat33 = 0;
const int output5 = 34;
boolean etat34 = 0;
const int output6 = 35;
boolean etat35 = 0;
const int output7 = 36;
boolean etat36 = 0;
const int output8 = 37;
boolean etat37 = 0;

J’ai supprimé les // et ca compile.

Je testerai pour voir déjà. :slight_smile:

Merci.

désolé, moi qui t'ai induit d'erreur pour le coup de la constante output....

tu peux virer toutes les lignes

" const int output = "

elles sont de plus inutiles...

@+

PS : sympa ton bac ! ;)

Bah si je les enlèves, la ca compile plus:

This report would have more information with "Show verbose output during compilation" enabled in File > Preferences. Arduino: 1.0.6 (Windows 7), Board: "Arduino Mega (ATmega1280)" test2ok.ino: In function 'void loop()': test2ok:43: error: 'etat30' was not declared in this scope test2ok:44: error: 'etat30' was not declared in this scope test2ok:52: error: 'etat31' was not declared in this scope test2ok:53: error: 'etat31' was not declared in this scope test2ok:61: error: 'etat32' was not declared in this scope test2ok:62: error: 'etat32' was not declared in this scope test2ok:70: error: 'etat33' was not declared in this scope test2ok:71: error: 'etat33' was not declared in this scope test2ok:79: error: 'etat34' was not declared in this scope test2ok:80: error: 'etat34' was not declared in this scope test2ok:88: error: 'etat35' was not declared in this scope test2ok:89: error: 'etat35' was not declared in this scope

Merci du compliment pour mon bac :)

Tu n'aurais pas fait un "nettoyage" un peu trop expéditif par hasard ?

je parlais de remplacer ces lignes

  const int output1 = 30;
boolean etat30 = 0;  
  const int output2 = 31;
boolean etat31 = 0;  
  const int output3 = 32;
boolean etat32 = 0;  
  const int output4 = 33;
boolean etat33 = 0;  
  const int output5 = 34;
boolean etat34 = 0;  
  const int output6 = 35;
boolean etat35 = 0;  
  const int output7 = 36;
boolean etat36 = 0;  
  const int output8 = 37;
boolean etat37 = 0;

par celles-ci

  boolean etat30 = 0; 
  boolean etat31 = 0; 
  boolean etat32 = 0; 
  boolean etat33 = 0; 
  boolean etat34 = 0; 
  boolean etat35 = 0; 
  boolean etat36 = 0; 
  boolean etat37 = 0;

C'est bon ;)

Bon, je fais un test donc, une fois dans le arduino, quand je fais le motoring, il y a un rafraichissement rapide de l'heure (ca rafraichi tous les 1/4 de seconde environ), je pense que sait du au 9600 baud.