Effectuer une action toutes les 10min

Bonjour, j'ai chercher et je n'ai rien trouver de correspondant.
Donc dans mon programme j'ai un afficheur, qui m'affiche diverses informations (date/heure, temperature, humidité) et sous certaine condition il doit afficher (ouvrir ou fermer store), sauf que cette affichage et donc le verif des condition se fait a chaque secondes car il y a delay(1000) sur l'affichage des infos. et j'aimerais qu'il fasse cette verif de condition et l'affichage (ouverture ou fermeture) toutes les 10min.
Merci

#include <Wire.h>
#include <RTClib.h>
#include "rgb_lcd.h"
#include <math.h>


rgb_lcd lcd;

const int colorR = 100;
const int colorG = 150;
const int colorB = 255;

int a;
float temperature;
int B=3435;                  //B value of the thermistor
float resistance;

int c;
float eau;                 
float resistance2;

RTC_DS1307 RTC;

void setup() {
  Wire.begin();
  RTC.begin();
  lcd.begin(16, 2);
  lcd.setRGB(colorR, colorG, colorB);
}

void loop() {
  DateTime now = RTC.now();
  
 
  lcd.setCursor(0, 1);
  lcd.print(now.hour());
  lcd.print(":");
  if (now.minute() < 10) {
    lcd.print("0");
  }
  lcd.print(now.minute());
  lcd.print(":");
  if (now.second() < 10) {
    lcd.print("0");
  }
  lcd.print(now.second());
  
  
  
  lcd.setCursor(0, 0); 
  lcd.print(now.day()); 
  lcd.print("/"); 

  switch (now.month()) {
  case 1:
    lcd.print("01");
    break;
  case 2:
    lcd.print("02");
    break;
  case 3:
    lcd.print("03");
    break;
  case 4:
    lcd.print("04");
    break;
  case 5:
    lcd.print("05");
    break;
  case 6:
    lcd.print("06");
    break;
  case 7:
    lcd.print("07");
    break;
  case 8:
    lcd.print("08");
    break;
  case 9:
    lcd.print("09");
    break;
  case 10:
    lcd.print("10");
    break;
  case 11:
    lcd.print("11");
    break;
  case 12:
    lcd.print("12");
    break;
  }
  lcd.print("/"); 
  lcd.print(now.year()); 
  
  
  {
    a=analogRead(1);
    resistance=(float)(1023-a)*10000/a; //get the resistance of the sensor;
    temperature=1/(log(resistance/10000)/B+1/298.15)-273.15;//convert to temperature via datasheet ;
    lcd.setCursor(11, 0);
    lcd.print((char)223);
    lcd.print("C:");
    lcd.println(temperature);
}
{
    c=analogRead(0);
    resistance2=(float)(1023-c)*10000/c; //get the resistance of the sensor;
    lcd.setCursor(10, 1);
    lcd.print("H:");
    lcd.println(c);
    
}
delay(1000);
 lcd.clear();
 StoreStatue(now);

}
 void StoreStatue(DateTime now) {
   
     
   if (c < 200)
   {
     lcd.setCursor(0, 0);
     lcd.print("fermer store");
     }
   
  else if ((temperature > 15) && ((now.hour() >= 18) || (now.hour() <= 11)))
   {
     lcd.setCursor(0, 0);
     lcd.print("fermer sotre");  
   }
   
   else if ((temperature > 15 ) && ((now.month() <= 4) || (now.month() >= 10)))
   {
     lcd.setCursor(0, 0);
     lcd.print("fermer store");
   }
   
else
{
  lcd.setCursor(0, 0);
  lcd.print("ouvrir store");  
}
delay(1000);
lcd.clear();
 }

Tu veux tout faire toutes les 10 minutes, ou bien une partie du programme toutes les 10 minutes et le reste à une cadence plus élevée ?

le principe de base : http://arduino.cc/en/Tutorial/BlinkWithoutDelay

3Sigma:
Tu veux tout faire toutes les 10 minutes, ou bien une partie du programme toutes les 10 minutes et le reste à une cadence plus élevée ?

Effectuer le Void storestatue toutes les 10min et le reste a l'intervalle de base cad avec le delay(1000)

merci je vais voir les deux liens

edit : Christian sur le lien que tu m'a envoyer, est il possible de remplacer millis par delay? je comprend pas trop la difference entre les deux

Bonjour,

timoth31:
edit : Christian sur le lien que tu m'a envoyer, est il possible de remplacer millis par delay? je comprend pas trop la difference entre les deux

Delay() est une action bloquante (le micro-contrôleur ne fait rien d'autre qu'attendre que cela se passe) par contre avec millis() le contrôle du delai se fait différemment sans bloquer le micro-contrôleur.

j'ai juste a remplacer tout mes delay? ou y'a d'autre manip a faire pour passer en millis?

timoth31:

3Sigma:
Tu veux tout faire toutes les 10 minutes, ou bien une partie du programme toutes les 10 minutes et le reste à une cadence plus élevée ?

Effectuer le Void storestatue toutes les 10min et le reste a l'intervalle de base cad avec le delay(1000)

Tu peux aussi exécuter une partie du code sur interruption temporelle. Personnellement j'utiliser FlexiTimer2 (Arduino Playground - HomePage)

Dans le micro-controleur il existe une zone indépendante de la zone des registres utilisés pour la programmation : la zone des compteurs (Timers).
Ces compteurs tournent tranquillement indépendamment de la programmation qui ne peut que les lancer, les arrêter, changer ou lire quelques registres pour des comparaisons. C'est de la pure électronique numérique câblée en dur donc non reconfigurable.

La fonction delay() bloque le programme, elle fait une vraie pause.
La fonction millis() se contente de lire l'état du compteur du timer0, ce qui ne prend qu'un tout petit nombre de cycles horloge.
Par contre c'est à toi de gérer son exploitation et pour cela voir l'exemple blink_without_delay.

apparement ce n'est pas compatible avec UNO, desolé j'avais oublier de preciser que je bosse la dessus

apparement ce n'est pas compatible avec UNO, desolé j'avais oublier de preciser que je bosse la dessus

Peut-tu préciser ta pensée car il y a plusieurs réponses qui se sont croisées.

68tjs:
Dans le micro-controleur il existe une zone indépendante de la zone des registres utilisés pour la programmation : la zone des compteurs (Timers).
Ces compteurs tournent tranquillement indépendamment de la programmation qui ne peut que les lancer, les arrêter, changer ou lire quelques registres pour des comparaisons. C'est de la pure électronique numérique câblée en dur donc non reconfigurable.

La fonction delay() bloque le programme, elle fait une vraie pause.
La fonction millis() se contente de lire l'état du compteur du timer0, ce qui ne prend qu'un tout petit nombre de cycles horloge.
Par contre c'est à toi de gérer son exploitation et pour cela voir l'exemple blink_without_delay.

merci je vais essayer avec ca alors, parce que jusque la j'ai cette erreur
C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino/Arduino.h: In function 'void StoreStatue(DateTime)':
C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino/Arduino.h:105: error: too many arguments to function 'long unsigned int millis()'
Programme_final_et_void_essai:167: error: at this point in file

68tjs:

apparement ce n'est pas compatible avec UNO, desolé j'avais oublier de preciser que je bosse la dessus

Peut-tu préciser ta pensée car il y a plusieurs réponses qui se sont croisées.

Le sur la page du flexi il est mit les noms des systemes compatibles et UNO n'y est pas. donc est ce que c'est quand meme utilisable sans trop de modif (je debute)

Ca marche sur Uno (ATmega328 ).

Je ne connais pas la page "du flexi" mais ce qu'il est possible de dire c'est qu'UNO n'est pas un système c'est le nom commercial d'une carte comprenant un micro-controleur.

Ce qui est important de noter c'est la référence du micro-controleur de la carte UNO :
Fabricant : Atmel
Référence du micro : ATMega328p

j'utilise une grove, j'ai aucune autre info sur le boitier ni la carte. et c'est mon prof qui a tout les papier

j'arrive pas a voir sir ca marche, car du coup je n'ai plus l'action qui s'affiche (j'ai regler millis pour 30sec au lieu de 10min)

et je ne sais pas du tout ou placer ca, ni si il y a des reglages a faire sur cette partie
unsigned long currentMillis = millis();

if(currentMillis - previousMillis > interval) {

previousMillis = currentMillis;

Personne? :frowning:

http://playground.arduino.cc/Main/MsTimer2

Permet de générer une It avec un intervalle que tu définis.
En gros tu l'initialises à 1000 ms pour avoir une interruption pour tes actions toutes les secondes. Et pour tes actions toutes les 10 mins, ce n'est pas compliqué, tu prends une variables globals (un int) que tu incrémentes à chaque fois que tu rentres dans ton vecteur d'interruption . Et quand ce compteur représente tes 10 minutes tu passes a flag a 1 pour qu'il soit traité dans ta boucle loop.
Évidement faudras pas oublier de remettre à 0 ton compteur et ton flag dans le traitement de l'action des 10 minutes .

Simple et efficace.

Utilises le lien en haut pour comprendre comment utilise la fonction.
C'est vraiment très très basique.

Bon courage

clément

Bonjour les coains,
Pour chronométer des délais très importants sans ralentir la boucle de base il me semble que le plus simple consiste à utiliser l'heure système. Voici un exemple simple de programme qui fait tourner la boucle de base au maximum de rapidité, et déclenche une action toutes les dix minutes. J'ai placé le délai en paramètre #define, on peut ainsi tester pour 5 secondes par exemple et en vérifier le comportement plus rapidement.
Comme action symbolique toutes les dix minutes (Ou tout autre délai) je me contente de faite afficher le temps écoulé depuis le dernier RESET sur le µP.

#define TEMPO 600 // Dix minutes = 600 secondes.
// Variables globales.
unsigned long DUREE_ECOULEE, TOP_CHRONO;

void setup(){ Serial.begin(115200); TOP_CHRONO = millis()/1000;}

void loop(){
  Traiter_toutes_les_dix_minutes(); }
   
void Traiter_toutes_les_dix_minutes() {
 DUREE_ECOULEE = (millis()/1000) - TOP_CHRONO;
 if (DUREE_ECOULEE == TEMPO)
    { Serial.print("Heure systeme = "); Serial.println(millis()/1000);
      TOP_CHRONO = millis()/1000;} }

Sur le plan rapidité une IT est bien plus optimisée.
Et puis rappelons que le processeur de la UNO est un proc 8bits, donc du unsigned long en comparaison ça fais beaucoup d'assembleur comparé à une interruption matérielle + sauvegarde des registres + jump.

Moi j'aime bien les IT :stuck_out_tongue:

Au final il y a plusieurs solutions, à toi de choisir en fonction des autres actions de ton programme.