librairie Time + relays

Salut,

Je précise d'adbord que suis un gros gros newbie en arduino !
Je suis en train de rassembler des morceaux de code pour mon système de contrôle de ma culture hydroponique de piments (et uniquement des piments ! Non je ne fais pas pousser de plantes illégales!).
Pour commencer je voudrais contrôler des relais en fonction de l'heure de la journée, par exemple de 8h à 19h le relais de la lampe de doit être High.
Pour avoir l'heure j'utilise la librairie time + processing pour envoyer l'heure (Time Library, Timekeeping and Time/Date Manipulation on Teensy : "TimeSerial example program")
Jusque là je crois que j'y arrive !
C'est simplement pour la fonction if…else que je n'y arrive pas…
j'ai mis ça :

  if (hour() > 8  &  hour() < 19)
{
   digitalWrite( relay1, HIGH );
}
else
{
   digitalWrite( relay1, LOW );
}

Mais j'ai l'impression que ça met laisse toujours en HIGH peut importe ce que je met comme heure…

je me permet de vous mettre tout mon code … c'est peut parce que je l'ai mis au mauvais endroit…

/* 
 * TimeSerial.pde
 * D'abord il faut mettre l'arduino à l'heure en utilisant un sketch processing qui envoi dans le serial l'heure unix ! 
 */ 
 
#include <Time.h>  


#define relay1        7    // définir la pin 7 comme relay 1 
#define TIME_HEADER  "T"   // Header tag for serial time sync message
#define TIME_REQUEST  7    // ASCII bell character requests a time sync message 

void setup()  {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  pinMode(relay1, OUTPUT);    
  setSyncProvider( requestSync);  //set function to call when sync required
  Serial.println("Waiting for sync message");
}

void loop(){    
  if (Serial.available()) {
    processSyncMessage();
  }
  if (timeStatus()!= timeNotSet) {
    digitalClockDisplay();  
  }
  if (timeStatus() == timeSet) {
    digitalWrite(13, HIGH); // LED on if synced
  } else {
    digitalWrite(13, LOW);  // LED off if needs refresh
  }
  
  if (hour() > 14  &  hour() < 19)
{
   digitalWrite( relay1, HIGH );
}
else
{
   digitalWrite( relay1, LOW );
}
  
  delay(1000);
}

void digitalClockDisplay(){
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(" ");
  Serial.print(month());
  Serial.print(" ");
  Serial.print(year()); 
  Serial.println(); 
}

void printDigits(int digits){
  // utility function for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}


void processSyncMessage() {
  unsigned long pctime;
  const unsigned long DEFAULT_TIME = 1357041600; // Jan 1 2013

  if(Serial.find(TIME_HEADER)) {
     pctime = Serial.parseInt();
     if( pctime >= DEFAULT_TIME) { // check the integer is a valid time (greater than Jan 1 2013)
       setTime(pctime); // Sync Arduino clock to the time received on the serial port
     }
  }
}

time_t requestSync()
{
  Serial.write(TIME_REQUEST);  
  return 0; // the time will be sent later in response to serial mesg
}

et je précise ma façon de faire pour processing au cas où c'est là que je ferais une erreur : j'upload mon code sur arduino, puis je lance le programme processing identique à l'exemple de la librairie et je clic sur la fenêtre java qui s'affiche.

Merci d'avance pour vos conseils !

J'ai continué à chercher en attendant une réponse, j'ai trouvé découvert la librairie timealarms et j'ai essayer de coupler les deux codes pour allumer une led à une heure précise, mais ça ne marche toujours pas…
Je vous met mon code :

/* 
 * TimeSerial.pde
 * example code illustrating Time library set through serial port messages.
 *
 * Messages consist of the letter T followed by ten digit time (as seconds since Jan 1 1970)
 * you can send the text on the next line using Serial Monitor to set the clock to noon Jan 1 2013
 T1357041600  
 *
 * A Processing example sketch to automatically send the messages is inclided in the download
 * On Linux, you can use "date +T%s > /dev/ttyACM0" (UTC time zone)
 */ 
 
 /*
 * TimeAlarmExample.pde
 *
 * This example calls alarm functions at 8:30 am and at 5:45 pm (17:45)
 * and simulates turning lights on at night and off in the morning
 * A weekly timer is set for Saturdays at 8:30:30
 *
 * A timer is called every 15 seconds
 * Another timer is called once only after 10 seconds
 *
 * At startup the time is set to Jan 1 2011  8:29 am
 */
 
 
 
#include <Time.h>  
#include <TimeAlarms.h>

#define TIME_HEADER  "T"   // Header tag for serial time sync message
#define TIME_REQUEST  7    // ASCII bell character requests a time sync message 

int led = 7;    // led branchée sur port 7

void setup()  {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  setSyncProvider( requestSync);  //set function to call when sync required
  Serial.println("Waiting for sync message");
  
    // create the alarms 
  Alarm.alarmRepeat(16,14,0, MorningAlarm);  // 8:30am every day
  Alarm.alarmRepeat(16,15,0, EveningAlarm);  // 5:45pm every day 


  
    pinMode(led, OUTPUT);     // la led est un output 
  
}

void loop(){    
  if (Serial.available()) {
    processSyncMessage();
  }
  if (timeStatus()!= timeNotSet) {
    digitalClockDisplay();  
  }
  if (timeStatus() == timeSet) {
    digitalWrite(13, HIGH); // LED on if synced
  } else {
    digitalWrite(13, LOW);  // LED off if needs refresh
  }
  delay(1000);
    pinMode(led, OUTPUT);     

}

// functions to be called when an alarm triggers:
void MorningAlarm(){
  Serial.println("Alarm: - turn lights on");    
    digitalWrite(led, HIGH); 
  
}

void EveningAlarm(){
  Serial.println("Alarm: - turn lights off");       
  digitalWrite(led, LOW);   
}


void digitalClockDisplay(){
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(" ");
  Serial.print(month());
  Serial.print(" ");
  Serial.print(year()); 
  Serial.println(); 
}

void printDigits(int digits){
  // utility function for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}


void processSyncMessage() {
  unsigned long pctime;
  const unsigned long DEFAULT_TIME = 1357041600; // Jan 1 2013

  if(Serial.find(TIME_HEADER)) {
     pctime = Serial.parseInt();
     if( pctime >= DEFAULT_TIME) { // check the integer is a valid time (greater than Jan 1 2013)
       setTime(pctime); // Sync Arduino clock to the time received on the serial port
     }
  }
}

time_t requestSync()
{
  Serial.write(TIME_REQUEST);  
  return 0; // the time will be sent later in response to serial mesg
}

Je ne sais pas si je me plante au niveau du code arduino ou si c'est la synchronisation de l'heure via processing qui ne marche pas…
(pourtant ma led 13 s'allume bien donc ça veut dire que c'est synchronisé…)

J'espère que quelqu'un pourra m'aider :slight_smile:

Yep!

...
if (timeStatus()!= timeNotSet) {
    digitalClockDisplay();  
  }
  if (timeStatus() == timeSet)
...

Grosso modo tu dis 2 fois la même chose ici. Si le status est différent de "non paramétré" (!=), Si le status est équivalent à paramétrer.

Si l'horologe n'est pas à jour, on fait une requête de mise à jour : requestsync.et ensuite on écoute le port série pour le message de retour.

if (timeStatus()== timeNotSet) {
requestsync; processSyncMessage();
}

Vérifies ton code en ajoutant 2 println pour l'heure et les minutes. Tu as définis une constante (const unsigned long DEFAULT_TIME = 1357041600;) qui naturellement fait que tes conditions suivantes sont vraies.

@+

Zoroastre.

Salut Zoro!

Merci pour ta réponse ! En fait cette partie c'est l'exemple qu'il y a avec la librairie Time quand tu la télécharges sur le site arduino. C'est vrai qu'en voyant cette partie je me suis aussi dit que c'était la même chose, mais bon comme c'est l'exemple j'ai supposé que c'était correct. Du coup j'ai tout réécrit à ma sauce et ça marche ! Par contre j'utilise juste une fonction if pour l'heure, parce que je n'arrive pas à utiliser la libraire timeAlarms…

Est-ce qu'il y a quelque chose que je pourrais améliorer dans mon code ?

#include <Time.h>  

#define TIME_HEADER  "T"   // Header tag for serial time sync message
#define TIME_REQUEST  7    // ASCII bell character requests a time sync message 

int led = 7;    // led branchée sur port 7

void setup()  {
  
  Serial.begin(9600);       // ouvrir le port série
  
  pinMode(13, OUTPUT);      // déclarer 13 comme sortie
  pinMode(led, OUTPUT);     // la led est un output 
  
}

void loop(){    
  
  if (timeStatus()== timeNotSet)   {       // si l'heure n'est pas réglée, ou si la synchro a échouée
    processSyncMessage();                 // afficher la fonction de synchronisation
    Serial.println("il est quelle heure ?");    
    digitalWrite(13, LOW);                // LED 13 éteinte 
   }
  
  else {     // si l'heure est réglée :
    digitalClockDisplay();             // afficher l'heure...
    digitalWrite(13, HIGH);            // ... et LED 13 allumée 
    
    if (hour() == 9 & minute() == 5 ) {
       digitalWrite(led, HIGH); 
     } 
     else {
       digitalWrite(led, LOW); 
     }   
   } 
     

   
  delay(1000);              
  
    }
    


void digitalClockDisplay(){
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(" ");
  Serial.print(month());
  Serial.print(" ");
  Serial.print(year()); 
  Serial.println(); 
}

void printDigits(int digits){
  // utility function for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}


void processSyncMessage() {
  unsigned long pctime;
  const unsigned long DEFAULT_TIME = 1357041600; // Jan 1 2013

  if(Serial.find(TIME_HEADER)) {
     pctime = Serial.parseInt();
     if( pctime >= DEFAULT_TIME) { // check the integer is a valid time (greater than Jan 1 2013)
       setTime(pctime); // Sync Arduino clock to the time received on the serial port
     }
  }
}

J'ai une autre petite question :
Avec le code précédent, dès que j'ouvre le moniteur série sur arduino IDE l'heure se dérègle, même si je l'ai déjà synchronisée via processing.
Du coup je ne peux pas vérifier sur le moniteur série l'heure que j'ai enregistrée via processing. Qu'est-ce que je dois modifier dans mon code ?

merci :slight_smile:

Yep!

J'ai survolé ton code, il a l'air bon à première vue.

Pour ton conflit sur le port série, je te recommande de ne travailler qu'avec Processing ou tout autre langage qui te convient le mieux (Python, perl, c++, etc). Tu écoutes les infos qui te sont retournés par la carte, les fait apparaitre dans un moniteur et lorsque tu as un 'T', qui correspond à une demande de synchro de l'heure, tu l'excécute (cette partie là tu connais).

Il y a de nombreux exemple sur internet. Je te laisse te débrouiller seul.

@+

Zoroastre.