Pages: 1 [2] 3   Go Down
Author Topic: Problème compteur (compte plusieurs fois)  (Read 1973 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 0
Posts: 348
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Première amélioration que je vais essayé d'apporter c'est de transformer le delay() en millis.


Je dois cogiter un peu, mais ça doit être possible
Logged

France
Offline Offline
Newbie
*
Karma: 0
Posts: 34
delay(60000);
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Faudrais déjà m'expliquer l'utilité du delay ici, surtout lorsque celui-ci fait une seconde entière :

Quote
if (now.dayOfWeek() == 1 && now.hour() == 12 && now.minute() == 40 && now.second() == 58 ) {
  //EEPROM_writeAnything (0,compteurequipe);
 lcd.setCursor (15,4);
 lcd.print (compteurequipe);
 delay (1000);
 lcd.setCursor (10,2);
 lcd.print ("         ");
 compteurequipe = 0;
 digitalWrite (Ledrouge, HIGH);
« Last Edit: May 18, 2013, 07:03:22 am by BananaFanatics » Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 348
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

C'est pour éviter qu'un 0 s'affiche à la place du compte de la journée. J'ai peur que si je ne le mette pas, comme on demarre à 58 secondes, qu'il remette à 0 le compteur.


Je peux l'effacer sans problème ? ce serait ça qui me bloque tout ?
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 348
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bon j'ai enlevé tous les delay(), dans le doute, on verra si les comptes s'effacent ou pas.

Je peux encore modifier l'horloge pour déclencher à 59 au lieu de 58.
Logged

France
Offline Offline
Newbie
*
Karma: 0
Posts: 34
delay(60000);
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

C'est pas forcément ces delays là qui bloquent ton programme parce que ils ne surviennent qu'à des moments précis et rares. Par contre si tu mets une pièce exactement à ce moment là elle ne sera pas comptée donc il est préférable de se débarrasser des delays.
Sinon au début du programme:
Code:
const int inter=9;
// [...]
pinMode (inter, OUTPUT);
digitalWrite (inter,HIGH);
// [...]
if (digitalRead (inter)==LOW) {
 [...]
}
else () {
[...]
}
inter ne pourras jamais être à l'état bas si tu le mets en sortie à l'état haut.
C'est surement une simple étourderie et tu devais surement vouloir le mettre en entrée.
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 348
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Là il fonctionne sans problème, lorsque je le bascule, j'ai bien ma première partie de programme qui s'active.

ça vient peut-être du branchement.



Mais si ça pose problème je peux inverser et le mettre en LOW
Logged

France
Offline Offline
Newbie
*
Karma: 0
Posts: 34
delay(60000);
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

C'est plutôt :
Code:
pinMode (inter, INPUT);

Qu'il faut mettre à la place de :
Code:
pinMode (inter, OUTPUT);

Car si tu raccorde la broche à la masse tu risque de griller la sortie si celle-ci est paramétrée en sortie, alors qu'en entrée y'a pas de problèmes.
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 348
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok je corrige ça de suite.


Merci
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 348
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Est-ce que le fait d'avoir l'affichage de la sate et de l'heure avec visualisation des secondes + le comptage, pourraient entrainer un problème mémoire et faire planter l'Arduino ?


Car lorsque le programme tourne, si je prends juste les secondes, ça passe par exemple de 1 à 3 secondes, de 3 à 4 puis 4 à 6 etc...


On sent que ce n'est pas fluide ça bloque un peu. Hier je me suis dit, donc ça pourrait être un problème avec les delay qui me ralentisse le programme, une fois débloquer, le programme mouline pour revenir.


Seulement sans aucun delay(), ça a planter quand même au bout de 5h...


Donc il faut croire que ce n'est pas ça.


L'idée serait donc de mettre l'horloge sur l'interrupteur, je verrai alors si l'heure est ok en actionnant l'inter. Etant donné que l'heure n'est pas primordial, le plus important c'est que le compteur (enfin les 2 compteurs) soit bien affiché sur le LCD 4 lignes.

Bref c'est un peu la misère, surtout que j'ai le même programme qui lui n'a pas d'horloge et là je n'ai aucun plantage.
Logged

France
Offline Offline
Newbie
*
Karma: 0
Posts: 34
delay(60000);
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quel est la taille du lcd ?
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 348
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

C'est un 20 x 4


Donc 4 lignes

1ère ligne la date et l'heure
2e ligne la quantité total
3e ligne la quantité en cours
4e ligne la quantité en fin de journée


Le fait que la date et l'heure soit rafraichi chaque seconde ne pose pas de problème au processeur ?


J'ai pour idée de ne plus l'afficher en direct, juste avec l'interrupteur pour vérifier de temps à autre que l'heure est toujours ok.
Logged

France
Offline Offline
Newbie
*
Karma: 0
Posts: 34
delay(60000);
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pourrais-tu essayer ce code ?:

Code:
#include <Wire.h>
#include <LiquidCrystal.h>
#include "RTClib.h"

RTC_DS1307 RTC;


const int Ledverte=8;
const int Ledrouge=7;
const int photoIR=A0;
const int inter=9;
const int RVar=A3;
const int RVartemps=A4;

static unsigned long int compteur = 0;
static unsigned long int compteurequipe = 0;


boolean compte = false ;
boolean busy = 0;


float potard;
float potard2;
float mesure;
float mesure2;


int mesureIR=0;
int mesureBrute=0;
int mesureBrute2=0;
int seuil=potard;

LiquidCrystal lcd(12, 11, 5, 4, 3, 6);


void setup() {
 
  pinMode (Ledverte, OUTPUT);
  pinMode (Ledrouge, OUTPUT);
 
  pinMode (inter, INPUT);
 
  digitalWrite (inter,HIGH);
 
    Serial.begin(57600);
    Wire.begin();
    RTC.begin();
    lcd.begin(20,4);
 
 
}

//************************** FUNCTIONS *************************
void ledRougeLow() {
  lcd.setCursor (14,3);
   lcd.print ("------");
  lcd.setCursor (14,4);
   lcd.print ("------");
 digitalWrite (Ledrouge, LOW);
}
void dayEvent() {
 lcd.setCursor (15,4);
 lcd.print (compteurequipe);
 // delay (1000);
 lcd.setCursor (10,2);
 lcd.print ("         ");
 compteurequipe = 0;
 digitalWrite (Ledrouge, HIGH);
}

//*************************** LOOP *****************************
void loop() {
 
 
  //RTC.adjust(DateTime(__DATE__, __TIME__));

 DateTime now = RTC.now();


  if (digitalRead (inter)==LOW) {
   
  //DateTime now = RTC.now();
  lcd.home ();
  lcd.print (now.day()/10,DEC);
  lcd.print (now.day()%10,DEC);
  lcd.print("/");
  lcd.print (now.month()/10,DEC);
  lcd.print (now.month()%10,DEC);
  lcd.print("/");
  lcd.print (now.year(),DEC);
  lcd.print("  ");
  lcd.print (now.hour()/10,DEC);
  lcd.print (now.hour()%10,DEC);
  lcd.print(":");
  lcd.print(now.minute()/10, DEC);
  lcd.print(now.minute()%10, DEC);
  lcd.print(":");
  lcd.print(now.second()/10, DEC);
  lcd.print(now.second()%10, DEC);
   
  lcd.setCursor(0,1);
  lcd.print ("                    ");
  lcd.setCursor(0,2);
  lcd.print ("                    ");
  lcd.setCursor(0,2);
  lcd.print ("S:");
  lcd.setCursor(0,3);
  lcd.print ("                    ");
  lcd.setCursor(0,3);
  lcd.print ("T:");
  lcd.setCursor(4,3);

  mesureBrute=analogRead(RVar);
  mesure=map(mesureBrute,0,1023,0.0,700.5);
  potard=mesure;
  lcd.setCursor(3,2);
  lcd.print(potard,0);
 
  mesureBrute2=analogRead(RVartemps);
  mesure2=map(mesureBrute,0,1023,0.0,1800.5);
  potard2=mesure2;
  lcd.setCursor(3,3);
  lcd.print(potard2,0);
   
  }

  else {
   
 
  mesureBrute=analogRead(RVar);
  mesure=map(mesureBrute,0,1023,0.0,700.5);
  potard=mesure;
 
  mesureBrute2=analogRead(RVartemps);
  mesure2=map(mesureBrute,0,1023,0.0,1800.5);
  potard2=mesure2;

    mesureIR=analogRead(photoIR);
    if ((mesureIR < potard) && (busy == 0)) {
      digitalWrite (Ledverte, HIGH);
      busy = 1;
     
      if (compte==false){
        compte=true;
        lcd.setCursor(0,1);
        lcd.print("Total prod :");
        lcd.print (compteur);
        lcd.setCursor(0,2);
        lcd.print("En cours :");
        lcd.print(compteurequipe);
        lcd.setCursor(0,3);
        lcd.print("Total equipe : ");
        compteur++;
        compteurequipe++;
      //  delay (potard2);
        compte = false;
 
        }
   
    else {
      digitalWrite(Ledverte,LOW);
     
      }
    }
   
    if ((mesureIR < potard) && (busy == 1)){
      mesureIR = analogRead(photoIR);
      if (mesureIR > potard) {
        busy = 0;
      }
    }
 
   
   
switch (now.dayOfWeek() ){
  case 1:
  if (now.hour() == 12 && now.minute() == 40 && now.second() == 58) {
    dayEvent();
  }
  if (now.hour() == 12 && now.minute() == 59 && now.second() == 58 ) {
    ledRougeLow();
  }
  if (now.hour() == 20 && now.minute() == 58 && now.second() == 58) {
    dayEvent();
  }
  if (now.hour() == 20 && now.minute() == 59 && now.second() == 58 ) {
    ledRougeLow();
  }
  case 2:
  if (now.hour() == 12 && now.minute() == 40 && now.second() == 58) {
    dayEvent();
  }
  if (now.hour() == 12 && now.minute() == 59 && now.second() == 58 ) {
    ledRougeLow();
  }
  if (now.hour() == 20 && now.minute() == 58 && now.second() == 58) {
    dayEvent();
  }
  if (now.hour() == 20 && now.minute() == 59 && now.second() == 58 ) {
    ledRougeLow();
  }
  case 3:
  if (now.hour() == 12 && now.minute() == 40 && now.second() == 58) {
    dayEvent();
  }
  if (now.hour() == 12 && now.minute() == 59 && now.second() == 58 ) {
    ledRougeLow();
  }
  if (now.hour() == 20 && now.minute() == 58 && now.second() == 58) {
    dayEvent();
  }
  if (now.hour() == 20 && now.minute() == 59 && now.second() == 58 ) {
    ledRougeLow();
  }
  case 4:
  if (now.hour() == 12 && now.minute() == 40 && now.second() == 58) {
    dayEvent();
  }
  if (now.hour() == 12 && now.minute() == 59 && now.second() == 58 ) {
    ledRougeLow();
  }
  if (now.hour() == 20 && now.minute() == 58 && now.second() == 58) {
    dayEvent();
  }
  if (now.hour() == 20 && now.minute() == 59 && now.second() == 58 ) {
    ledRougeLow();
  }
  case 5:
  if (now.hour() == 12 && now.minute() == 40 && now.second() == 58) {
    dayEvent();
  }
  if (now.hour() == 12 && now.minute() == 59 && now.second() == 58 ) {
    ledRougeLow();
  }
  if (now.hour() == 20 && now.minute() == 58 && now.second() == 58) {
    dayEvent();
  }
  if (now.hour() == 20 && now.minute() == 59 && now.second() == 58 ) {
    ledRougeLow();
  }
  case 6:
  if (now.hour() == 12 && now.minute() == 40 && now.second() == 58) {
    dayEvent();
  }
  if (now.hour() == 12 && now.minute() == 59 && now.second() == 58 ) {
    ledRougeLow();
  }
  if (now.hour() == 20 && now.minute() == 58 && now.second() == 58) {
    dayEvent();
  }
  if (now.hour() == 20 && now.minute() == 59 && now.second() == 58 ) {
    ledRougeLow();
  }
  case 7:
  if (now.hour() == 12 && now.minute() == 40 && now.second() == 58) {
    dayEvent();
  }
  if (now.hour() == 12 && now.minute() == 59 && now.second() == 58 ) {
    ledRougeLow();
  }
  if (now.hour() == 20 && now.minute() == 58 && now.second() == 58) {
    dayEvent();
  }
  if (now.hour() == 20 && now.minute() == 59 && now.second() == 58 ) {
    ledRougeLow();
  }
}

  }
  }
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 348
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je te remercie de te donner autant de mal pour mon problème.

Je ne peux pas tester avant mardi matin. Je m'en occupe aussitôt et je te tiens au courant dans la foulé.


Je te remercie vraiment beaucoup, car je n'en vois pas le bout du tout.


Merci encore et je te tiens au courant, je vais profiter des deux jours qui viennent pour analyser le code.


Logged

France
Offline Offline
Newbie
*
Karma: 0
Posts: 34
delay(60000);
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je ne peux pas te garantir que cela combleras tes problèmes mais la réactivité générale du système devrais être augmentée.
J'ai également fixé quelques petits oublis comme la commande lcd.begin(20,4) ou un espace dans le lcd.print pour effacer l'affichage précèdent.
Quand à la commande do...while, je l'est remplacé par une boucle if qui empêche le système de se bloquer momentanément quand une pièce est mise.
Enfin, les évènements horaires ont été simplifiés avec un switch case et un appel d'une fonction, au lieu de réécrire la fonction à chaque fois.

En espérant que ton système se comporte mieux.
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 348
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je vois que c'est du travail de pro, mais je vais bien étudier le code, afin justement que cet exemple me serve à m'améliorer.


 smiley-wink
Logged

Pages: 1 [2] 3   Go Up
Jump to: