[Conseil] Arduino Uno programme basé sur l'heure

Bonjour,

Je suis en Terminale STI2D Energie et Environnement et je cherche actuellement à développer un programme pour un projet.

Je m'explique : l'arduino Uno, que j'utilise, sera branché à un appareil et aura pour but de faire en sorte que celui ci utilise tanto la batterie, tanto l'alimentation 230V pour fonctionner. Et mon objectif est de pouvoir programmer à quel jour et quelle heure passer de l'un à l'autre.

Donc le programme consisterait à obtenir la date et l'heure, puis selon la date et l'heure, obtenues, désactiverait l'alimentation par secteur pour que la batterie prenne le relais, mais lorsque l'alimentation par secteur se réactive, la batterie doit se recharger pendant un certain temps.

Je ne demande à personne d'écrire tout le programme ou quoi que ce soit, mais j'aimerais avoir des pistes à suivre, car concrètement... je suis complétement bloqué vu que je suis totalement débutant sur arduino.

Merci d'avance pour vos réponses. :blush:

Montre-nous déjà ce que tu as.

Galang:
Bonjour,
Je ne demande à personne d'écrire tout le programme ou quoi que ce soit, mais j'aimerais avoir des pistes à suivre

Bonjour,
C'est un bon départ, qui nous convient parfaitement.

Galang:
. je suis complétement bloqué vu que je suis totalement débutant sur arduino.

Utilise le même principe que quand tu cherche une soluce pour un jeu video : Google (Il existe aussi Qwant, Exaleed, Ixquick, etc )

Le fait de travailler avec une carte Arduino est secondaire, cela ne demande que juste quelques fonctions à découvrir. Tout est expliqué ici : http://arduino.cc/en/Reference/HomePage

Ce qui compte c'est :

  • comprendre le fonctionnement d'un micro-controleur.
  • acquérir de bonnes notions de C, pas besoin d'être un grand programmeur mais connaitre au minimum des notions universelles comme comment on choisi le type pour les variables, comment on fait des tests, des boucles, etc.
  • se renseigner sur ce qui existe en terme de cartes d'extensions.

Pour cela il existe des sites incontournables :
openclassroom --> cours sur le C, C++ et sur l'arduino.
http://fr.openclassrooms.com/sciences/electronique/cours
mon-club-electronique --> cours sur Arduino , nombreux exemples et découverte de cartes d'extensions.
http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ATELIERS

et un super tutorial que ce soit pour le "C" ou pour des exemples d'utilisation de shield (cartes d'extensions) :
http://eskimon.fr/wp-content/plugins/filedownload/download.php/?path=http://eskimon.fr/public/ebook/Arduino_-_Premiers_pas_en_informatique_embarquee.pdf&type=&referer=/ebook-tutoriel-arduino

Pour ton projet pour le Bac, un mot clé:
RTC (Real Time Clock)

/* Includes */
#include <SPI.h>
#include <SD.h>
 
/* Taille du buffer */
const byte BUFFER_SIZE = 32;
 
/* Variables d'exemple qui seront chargé depuis le fichier de configuration */
int lundi_matin_debut = 0; 
int lundi_matin_fin = 0; 
int lundi_midi_debut = 0; 
int lundi_midi_fin = 0;
int lundi_apres_midi_debut = 0; 
int lundi_apres_midi_fin = 0;
int mardi_matin_debut = 0;
int mardi_matin_fin = 0;
etc
int relais = 3; 
int heure = 1;
int jour = 5; 
 
/* setup() */
void setup() {
  
  /* déclaration du relais comme une sortie*/
   pinMode(relais, OUTPUT);
 
  /* Déclare le buffer qui stockera une ligne du fichier, ainsi que les deux pointeurs key et value */
  char buffer[BUFFER_SIZE], *key, *value;
 
  /* Déclare l'itérateur et le compteur de lignes */
  byte i, buffer_lenght, line_counter = 0;
 
  /* Initialise le port série */
  Serial.begin(9600);
  Serial.println("Exemple de chargement d'un fichier horaire de box");
 
  /* Initialise la carte SD */
  pinMode(10, OUTPUT);
  if (!SD.begin(4)) { // Gère les erreurs
    Serial.println("Erreur de carte SD !");
    for(;;);
  }
 
  /* Ouvre le  fichier de configuration */
  File config_file = SD.open("nouveau.txt", FILE_READ);
  if(!config_file) { // Gère les erreurs
    Serial.println("Erreur d'ouverture du fichier !");
    for(;;);
  }
 
  /* Tant que non fin de fichier */
  while(config_file.available() > 0 ){
 
    /* Récupère une ligne entière dans le buffer */
    i = 0;
    while((buffer[i++] = config_file.read()) != '\n') {
 
      /* Si la ligne dépasse la taille du buffer */
      if(i == BUFFER_SIZE) {
 
        /* On finit de lire la ligne mais sans stocker les données */
        while(config_file.read() != '\n');
        break; // Et on arrête la lecture de cette ligne
      }
    }
 
    /* On garde de côté le nombre de char stocké dans le buffer */
    buffer_lenght = i;
 
    /* Gestion des lignes trop grande */
    if(i == BUFFER_SIZE) {
      Serial.print("Ligne trop longue à la ligne ");
      Serial.println(line_counter, DEC);
    }
 
    /* Finalise la chaine de caractéres ASCIIZ en supprimant le \n au passage */
    buffer[--i] = '\0';
 
    /* Incrémente le compteur de lignes */
    ++line_counter;
 
    /* Ignore les lignes vides ou les lignes de commentaires */
    if(buffer[0] == '\0' || buffer[0] == '#') continue;
       
    /* Cherche l'emplacement de la clef en ignorant les espaces et les tabulations en début de ligne */
    i = 0;
    while(buffer[i] == ' ' || buffer[i] == '\t') {
      if(++i == buffer_lenght) break;
    }
    if(i == buffer_lenght) continue;
    key = &buffer[i];
 
    /* Cherche l'emplacement du séparateur = en ignorant les espaces et les tabulations âpres la clef */
    while(buffer[i] != '=') {
 
      /* Ignore les espaces et les tabulations */
      if(buffer[i] == ' ' || buffer[i] == '\t') buffer[i] = '\0';
         
      if(++i == buffer_lenght) {
        Serial.print("Ligne mal forme a la ligne ");
        Serial.println(line_counter, DEC);
        break; // Ignore les lignes mal formé
      }
    }
    if(i == buffer_lenght) continue; // Gère les lignes mal formé
 
    /* Transforme le séparateur = en \0 et continue */
    buffer[i++] = '\0';
 
    /* Cherche l'emplacement de la valeur en ignorant les espaces et les tabulations âpres le séparateur */
    while(buffer[i] == ' ' || buffer[i] == '\t') {
      if(++i == buffer_lenght) {
        Serial.print("Ligne mal forme a la ligne ");
        Serial.println(line_counter, DEC);
        break; // Ignore les lignes mal formé
      }
    }
    if(i == buffer_lenght) continue; // Gère les lignes mal formé
    value = &buffer[i];
 
    /* Transforme les données texte en valeur utilisable */
    /* C'est ce morceaux de code qu'il vous faudra adapter pour votre application <span class="wp-smiley emoji emoji-wink" title=";)">;)</span> */
    if(strcmp(key, "lundi matin_debut") == 0) {
      lundi matin_debut = atoi(value);
    }
    if(strcmp(key, "lundi matin_fin") == 0) {
      lundi matin_fin = atoi(value);
    } 
   if(strcmp(key, "lundi midi_debut") == 0) {
      lundi midi_debut = atoi(value);
    }
    if(strcmp(key, "lundi midi_fin") == 0) {
      lundi midi_fin = atoi(value);
    }
    if(strcmp(key, "lundi apres midi_debut") == 0) {
      lundi apres midi_debut = atoi(value);
    }
    if(strcmp(key, "lundi apres midi_fin") == 0) {
      lundi apres midi_fin = atoi(value);
    }
    else if(strcmp(key, "mardi_debut") == 0) {
      mardi_debut = atoi(value);
    }
    if(strcmp(key, "mardi_fin") == 0) {
      mardi_fin = atoi(value);
    }
    else if(strcmp(key, "mercredi_debut") == 0) {
      mercredi_debut = atoi(value);
    }
   if(strcmp(key, "mercredi_fin") == 0) {
      mercredi_fin = atoi(value);
    }
     else if(strcmp(key, "jeudi_debut") == 0) {
      jeudi_debut = atoi(value);
    }
    if(strcmp(key, "jeudi_fin") == 0) {
      jeudi_fin = atoi(value);
    }
    else if(strcmp(key, "vendredi_debut") == 0) {
      vendredi_debut = atoi(value);
    }
   if(strcmp(key, "vendredi_fin") == 0) {
      vendredi_fin = atoi(value);
   }
    else if(strcmp(key, "samedi_debut") == 0) {
      samedi_debut = atoi(value);
    }
    if(strcmp(key, "samedi_fin") == 0) {
      samedi_fin = atoi(value);
    }
    else if(strcmp(key, "dimanche_debut") == 0) {
      dimanche_debut = atoi(value);
    }
   if(strcmp(key, "dimanche_fin") == 0) {
      dimanche_fin = atoi(value);
    }
    else { // Default
      Serial.print("Clef inconnu ");
      Serial.println(key);
    }
 
  }
 
  config_file.close();
 
  Serial.println("Plages horaires memorisees sur la carte SD dans le fichier nouveau.txt");
  Serial.print("Lundi :  ");  Serial.print(lundi_debut);  Serial.print(" heure - "); Serial.println(lundi_fin); Serial.println(" heure.");
  Serial.print("Mardi :  ");  Serial.print(mardi_debut);  Serial.print(" heure - "); Serial.println(mardi_fin); Serial.println(" heure.");
  Serial.print("Mercredi :  ");  Serial.print(mercredi_debut);  Serial.print(" heure - "); Serial.println(mercredi_fin); Serial.println(" heure.");
  Serial.print("Jeudi :  ");  Serial.print(jeudi_debut);  Serial.print(" heure - "); Serial.println(jeudi_fin); Serial.println(" heure.");
  Serial.print("Vendredi :  ");  Serial.print(vendredi_debut);  Serial.print(" heure - "); Serial.println(vendredi_fin); Serial.println(" heure.");
  Serial.print("Samedi :  ");  Serial.print(samedi_debut);  Serial.print(" heure - "); Serial.println(samedi_fin); Serial.println(" heure.");
  Serial.print("Dimanche :  ");  Serial.print(dimanche_debut);  Serial.print(" heure - "); Serial.println(dimanche_fin); Serial.println(" heure.");
 
  
  switch (jour) {

    case 2:       //nous sommes lundi
      Serial.print("Bonjour nous sommes Lundi.");Serial.print(" Il est "); Serial.print(heure); Serial.print(" heure. ");      
      if(heure>lundi_debut && heure<lundi_fin) {
        digitalWrite(relais,HIGH);
        Serial.println("La box est sous tension");
      } 
      else  {
        Serial.println("La box est hors tension");       
        digitalWrite(relais,LOW);
      }
      break;
      
   case 3:       //nous sommes mardi
      Serial.print("Bonjour nous sommes Mardi. "); Serial.print(" Il est "); Serial.print(heure); Serial.print(" heure. ");      
      if(heure>mardi_debut && heure<mardi_fin) {
        digitalWrite(relais,HIGH);
        Serial.println("La box est sous tension");
      } 
      else  {
        Serial.println("La box est hors tension");       
        digitalWrite(relais,LOW);
      }
      break;
etc


  }
  
}
 
/* loop() */
void loop() {

}

Voila ce que j'ai pu faire pour le moment mais je ne suis pas sur que cela répondre vraiment à mon problème.

Merci de ta réponse 68tjs, je sais déjà faire une grande partie, là je finis de mettre les else if, etc, mais mon problème est d'intégrer la batterie, switcher avec l'alim pour que la batterie prenne la relève et que la batterie se recharge un certain temps quand l'alim' s'active.
J'ai déjà tout le matériel, le tout est de comprendre comment le programmer dans les détails. :disappointed_relieved:

Xavier t'as écrit :

Montre-nous déjà ce que tu as.

Cela concerne aussi le matériel.
Si tu veux être efficace et rapide, le temps passe très vite, il faut donner toutes les informations.

Une liste du matériel avec les liens pour trouver leur caractéristiques est ESSENTIELLE.

Edit : un schéma synoptique est aussi nécessaire.

Voilà les caractéristiques du matériel dont je dispose.

Arduino Uno :
http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.MaterielUno

Tinkerkit Sensor Shield :
http://www.conrad.fr/ce/fr/product/095061/Module-Tinkerkit-sensor-shield-Arduino-T020010

Arduino Ethernet Shield :
http://boutique.semageek.com/fr/33-arduino-uno-ethernet-sans-poe-et-usb2serial.html

Je n'ai pas de schéma synoptique (à vrai dire, j'en ai jamais fait :cold_sweat:)

L'Arduino compte seulement le temps écoulé depuis sa dernière mise sous tension.
Pour connaitre la vraie date et l'heure exacte, il faut rajouter un module "real time clock" (DS1302 par exemple).

Le shield Ethernet n'est pas nécessaire.

Il faudra un relais 2 voies (avec optocouplage, diode de protection).

Fait un dessin de ton montage pour y voir plus clair.

Punaise, ce que ça coûte chèr ces Tinkerkit Sensor Shield pour au final ne pas servir à grand chose