Boucle while pb mise a jour variable c++

Récupérer appuie bouton dans une boucle while

a marqué ce sujet comme résolu.

Bonjour ,

Je cale sur ce problème.

Je voudrais mettre à jour des variables objet mais qui utilise un variable globale dans ça méthode et cela ne fonctionne pas.
Concrètement j’ai besoin de récupérer l’appuie d’un bouton voici le code .

Ino:

/*
    Name:       reveil_matin.ino
    Created:  05/12/2019 13:07:16
    Author:     Marycha
*/

#include <RTClib.h>
#include <LiquidCrystal_I2C.h>

#include"display_lcd.h"
#include"switch.h"

#define ADRR_LCD 0x3F
#define PIN_SWITCH_ALRM 2
#define PIN_SWICTH_BLUE 3
#define PIN_SWITCH_WHITE 4
#define PIN_SWITCH_BLACK 5
#define PIN_SWITCH_YELLOW 6



// The setup() function runs once each time the micro-controller starts


Screen Lcd(ADRR_LCD, 16, 2);
Switch switch_lever(PIN_SWITCH_ALRM);
PushButton blue_bttn(PIN_SWICTH_BLUE), yelw_bttn(PIN_SWITCH_YELLOW), wht_bttn(PIN_SWITCH_WHITE), blk_bttn(PIN_SWITCH_BLACK);
RTC_DS1307 Rtc ;

// prototype
struct NewSettingValue
{
    int year;
    int day;
    int day_of_week;
    int month;
    int hours;
    int min;
};

void alarm_shut_down();
NewSettingValue setting_hours(DateTime* date, PushButton* btt_blue, PushButton* btt_yel, PushButton* btt_blk);

void setup()
{
    // initiaisation des objets
    Lcd.init();
    switch_lever.init();
    blue_bttn.init();
    yelw_bttn.init();
    wht_bttn.init();
    blk_bttn.init();

    Rtc.begin();
    Serial.begin(9600);


    // Mise a l'heure du module rtc 
   Rtc.adjust(DateTime(__DATE__,__TIME__));

    // interruption de l'alarme 
    attachInterrupt(0,alarm_shut_down,RISING);
}

void loop()
{
  DateTime now = Rtc.now();
  Lcd.display_home(&now, switch_lever.ctl_state());
  if (wht_bttn.long_push().action)
  {
      setting_hours(&now);
  }
 
  
}

void alarm_shut_down()
{
    switch_lever.state = false;
}

NewSettingValue setting_hours(DateTime* date)
{
    NewSettingValue new_value;
    Lcd.clear();
    while (!blk_bttn.state)
    {
        Serial.println(blk_bttn.long_push().action);
        Lcd.display_set_hour(date->hour() + blue_bttn.long_push().increment, date->minute() + yelw_bttn.long_push().increment, date->second());

    }
    Lcd.clear();
}

puis le module des boutons en commençant par le .h:

#ifndef SWITCH_H_
#define SWITCH_H_

#define DELAY_PUSH 500

/*
    module implemente les fonctions de chaque bouton 

*/

static unsigned long PREVIOUS_MLLS_BTTN = 0;

class Switch
{
public:
    Switch(int pin);
    void init();
    volatile bool state;
    bool ctl_state();
    

protected:
     int  swicth_pin;

private:



};



class PushButton : public Switch
{
public:
    PushButton(int pin);
    struct Command
    {
        bool action = false;
        int increment = 0;
    };
    Command long_push();

protected:

    

private:
    

};


#endif

et le .cpp

#include "switch.h"
#include "arduino.h"

Switch::Switch(int pin )
{
    swicth_pin = pin;
}
    

void Switch::init()
{
    pinMode(swicth_pin, INPUT);
    
}

bool Switch::ctl_state()
{
    if (digitalRead(swicth_pin))
    {
        state = false;
    }
    else
    {
        state = true;
    }
 return state;
}

PushButton::PushButton(int pin) : Switch(pin)
{

}



PushButton::Command PushButton::long_push()
{
    Command order;
    ctl_state();
    unsigned long current_millis = millis();
    if (state == true && current_millis - PREVIOUS_MLLS_BTTN >= DELAY_PUSH)
    {
        order.action = true;
        order.increment = 1;

        if (current_millis - PREVIOUS_MLLS_BTTN >= DELAY_PUSH + 2000)
        {
            order.increment = 5;
            if (current_millis - PREVIOUS_MLLS_BTTN >= DELAY_PUSH + 5000)
            {
                order.increment = 10;
            }
        }
    }
    else if (state == false)
    {
        PREVIOUS_MLLS_BTTN = current_millis;
        order.action = false;
        order.increment = 0;
    }
    return order;
}

Je pense que c’est la variable PREVIOUS_MLLS_BTTN qui ne ce mets pas a jour du coup je pense que mets condition sont toujours fausse .

Merci

+0 -0

Franchement ton code est un peu galère à lire !

Je pense que tu as consciences qu’il y a plein de trucs à revoir pour obtenir un truc propre. Je comprend pas trop pourquoi PREVIOUS_MILLS_BTTN est global. Pas de global dans un .h aussi, ça ne fait généralement pas ce que tu veux.

Pour ton problème, je ne vois pas de problème de réactualisation de PREVIOUS_MLLS_BTTN. Pour moi, ça, ça marche (même si dans loop tu n’auras pas accès à cette variable, comme je l’ai dis, pas de global dans un .h, ça ne fait pas ce que tu crois). Je peux me planter mais à priori je pense que ça marche.

Par contre :

PushButton::Command PushButton::long_push() {
    Command order;
    ctl_state();
    unsigned long current_millis = millis();
    if (state == true && current_millis - PREVIOUS_MLLS_BTTN >= DELAY_PUSH)
    {
        order.action = true;
        order.increment = 1;

        if (current_millis - PREVIOUS_MLLS_BTTN >= DELAY_PUSH + 2000)
        {
            order.increment = 5;
            if (current_millis - PREVIOUS_MLLS_BTTN >= DELAY_PUSH + 5000)
            {
                order.increment = 10;
            }
        }
    }
    else if (state == false)
    {
        PREVIOUS_MLLS_BTTN = current_millis;
        order.action = false;
        order.increment = 0;
    }
    return order;
}

Là, je vois une erreur, c’est que tu retournes order alors que c’est une variable locale. Quand tu là retournes, sa durée de vie est finie. Donc elle est détruite et donc ce n’est plus valide.

Pas du tout ! Elle est biensûr copié car c’est un structure ! J’avais un noeud à la place de la tête.

+0 -0

ha ! je ne m’en était pas rendu compte :euh: Du coup merci d’avoir quand même fait l’effort.

Je sais qu’il y a des choses pas élégante mais pour le moment je n’ai pas trouvé de solution différente. ( mais je ne pensais pas non plus qu’il y en avais autant :o )

Je ne suis pas contre que tu me dise se qu’il faut revoir je suis prêt à refaire pour améliorer.

Déjà je vais commencer par éliminer mes globale dans les .h ( et oui j’ai pas tout mis mais j’en ai aussi dans le module de mon écran )

Je pense avoir une piste, Vu que j’ai voulu faire un code non bloquant mes variables des boutons se mettent à jour continuellement du coup pendant que j’appuie sur un bouton et que plus loin je teste un autre bouton qui lui n’est pas appuyer, je réinitialise ma variable d’état. Il va falloir que je revoie plein de choses

+0 -0

Pour l’instant, vu que tu utilises une globale tu ne peux utiliser qu’un bouton !

Tu en déclares plusieurs mais tu ne dois te servir que d’un à la fois ! Sinon, ça bug.
J’ai supposé que tu en avais conscience vu que tu n’utilisais justement qu’un bouton.

+0 -0

Là, je vois une erreur, c’est que tu retournes order alors que c’est une variable locale. Quand tu là retournes, sa durée de vie est finie. Donc elle est détruite et donc ce n’est plus valide.

ache

Non, il fait un retour par valeur tout va bien, la structure est copyable

Le mot clef constexpr n’existe pas sur l’arduino ? histoire de remplacer les define, sinon c’est pas grave

Pour le code en lui-même, je regarderais plus tard, je voulais juste que ce malentendu ne se répande pas trop

+0 -0

Là, je vois une erreur, c’est que tu retournes order alors que c’est une variable locale. Quand tu là retournes, sa durée de vie est finie. Donc elle est détruite et donc ce n’est plus valide.

ache

Non, il fait un retour par valeur tout va bien, la structure est copyable

O_o Effectivement ! Mais ou avais-je la tête ! >_<"

+0 -0

Le mot clef constexpr n’existe pas sur l’arduino ? histoire de remplacer les define

romantik

J’ai vu que visual me proposé cette modification mais je n’ai pas testé voir si l ide arduino l accepte et je ne connait pas non plus les conséquences pour moi les define était mieux

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte