Pages: [1]   Go Down
Author Topic: [RESOLU] Problème de déclaration  (Read 611 times)
0 Members and 1 Guest are viewing this topic.
Moselle (FR)
Offline Offline
Edison Member
*
Karma: 16
Posts: 1237
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,
J'ai fait un programme pour faire clignoter plusieurs leds "simultanément" sur un PCF8574.
Le programme s'appuie sur la library de Skywodd et une adaptation de la librairy de Simon Monk.
Dans mon répertoire programme j'ai les fichiers suivants :
- trucMachin.ino
- PCF8474.h, PCF8574.cpp et PCInt.h (librairy Skywodd)
- PCF8574Timer.h et PCF8574.cpp (adaptation soft Simon Monk)
- Event.h et Even.cpp (utiliser par PCF8574Timer)
Lorsque je détecte une interruption provenant d'une touche liée au PCF8574, j'arrive à faire clignoter une led affecter à une sortie de la carte arduino UNO.
Je souhaite faire dans un premier temps faire clignoter une led affectée à une sortie du PCF8574 (j'ai déjà subit énormément d'insultes de la part du compilateur mais je ne suis pas rancurier).
Je bloque sur le point suivant :

Dans PCF8574Timer.cpp, je voudrais remplacer :
Code:
digitalWrite(pin, startingValue);
par
Code:
expander.digitalWrite(pin, startingValue);

Malgré de nombreuses tentatives, je ne vois pas ce qu'il faut faire comme déclaration pour que expander.digitalWrite(....); soit pris en compte.

Mon programme trucMachin.ino :
Code:
/**
 * This demo code demonstrate all functionnalities of the PCF8574 library.
 * PCF8574 pins map :
 * 7: led
 */

/* Dependencies */
#include <Wire.h>    // Required for I2C communication
#include "PCF8574.h" // Required for PCF8574
#include "PCF8574Timer.h"  //adaptation du soft de Simon Monk

#define ledPin 12

/** PCF8574 instance */
PCF8574 expander;

/** Timer instance */
PCF8574Timer t;

/** setup() */
void setup() {
  /* Start I2C bus and PCF8574 instance */
  expander.begin(0x20);
  
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);  
  
  /* Setup some PCF8574 pins for demo */
  expander.pinMode(7, OUTPUT);
  expander.pinMode(3, INPUT_PULLUP);
  expander.digitalWrite(7, HIGH);
  
  /* Enable PCF8574 interrupts, use pin D8 as "INT" pin and ISRgateway() as callback function */
  expander.enableInterrupt(2, ISRgateway);
  
  /* Attach a software interrupt on pin 3 of the PCF8574 */
  expander.attachInterrupt(3, ISRdemo, FALLING);
}

/** This function will be called each time the state of a pin of the PCF8574 change */
void ISRgateway() {
  expander.checkForInterrupt();
}

/** This function will be called each time the button on pin 3 is pressed (LOW-to-HIGH transition) */
void ISRdemo() {
  /* ledPin flashes 5 times */
  t.oscillate(ledPin, 200, LOW, 5);
}

void loop() {
  t.update();
}
PCF8574Timer.h
Code:
/*  * * * * * * * * * * * * * * * * * * * * * * * * * * *
 Code by Simon Monk
 http://www.simonmonk.org

Adaptation du code de Simon Monk

* * * * * * * * * * * * * * * * * * * * * * * * * * * * */

#ifndef PCF8574Timer_h
#define PCF8574Timer_h

#include <inttypes.h>
#include "Event.h"

#define MAX_NUMBER_OF_EVENTS (10)

#define TIMER_NOT_AN_EVENT (-2)
#define NO_TIMER_AVAILABLE (-1)

class PCF8574Timer
{

public:
  PCF8574Timer(void);

  int8_t oscillate(uint8_t pin, unsigned long period, uint8_t startingValue, int repeatCount);
    void update(void);

protected:
  Event _events[MAX_NUMBER_OF_EVENTS];
  int8_t findFreeEventIndex(void);

};

#endif
PCF8574Timer.cpp
Code:
/* Inspired by the library Simon Monk */
/*  * * * * * * * * * * * * * * * * * * * * * * * * * * *

 Code by Simon Monk
 http://www.simonmonk.org

Adaptation du code de Simon Monk

* * * * * * * * * * * * * * * * * * * * * * * * * * * * */

// For Arduino 1.0 and earlier
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif

#include "PCF8574Timer.h"

PCF8574Timer::PCF8574Timer(void)
{
}

int8_t PCF8574Timer::oscillate(uint8_t pin, unsigned long period, uint8_t startingValue, int repeatCount)
{
int8_t i = findFreeEventIndex();
if (i == NO_TIMER_AVAILABLE) return NO_TIMER_AVAILABLE;

_events[i].eventType = EVENT_OSCILLATE;
_events[i].pin = pin;
_events[i].period = period;
_events[i].pinState = startingValue;
digitalWrite(pin, startingValue);  //<<<<<<<<<***********************************
_events[i].repeatCount = repeatCount * 2; // full cycles not transitions
_events[i].lastEventTime = millis();
_events[i].count = 0;
return i;
}

void PCF8574Timer::update(void)
{
for (int8_t i = 0; i < MAX_NUMBER_OF_EVENTS; i++)
{
if (_events[i].eventType != EVENT_NONE)
{
_events[i].update();
}
}
}

int8_t PCF8574Timer::findFreeEventIndex(void)
{
for (int8_t i = 0; i < MAX_NUMBER_OF_EVENTS; i++)
{
if (_events[i].eventType == EVENT_NONE)
{
return i;
}
}
return NO_TIMER_AVAILABLE;
}
« Last Edit: September 21, 2013, 01:18:54 am by icare » Logged

2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

Moselle (FR)
Offline Offline
Edison Member
*
Karma: 16
Posts: 1237
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonsoir,
Lorsque je fais dans PCF8574Timer.cpp :
Code:
expander.digitalWrite(pin, startingValue);
J'ai le message d'erreur :
PCF8574Timer.cpp:73: error: 'expander' was not declared in this scope

et pour :
Code:
::expander.digitalWrite(pin, startingValue);
J'ai le même message d'erreur
Logged

2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

France
Offline Offline
Faraday Member
**
Karma: 36
Posts: 3420
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Les 2 classes n'ont pas connaissance l'une de l'autre.
Il me semble que seule une classe qui hériterait des deux ou plutôt une classe PCF8574Timer qui serait dérivée de la classe PCF8574 pourrait faire ce que tu as en tête.
Logged

Moselle (FR)
Offline Offline
Edison Member
*
Karma: 16
Posts: 1237
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonsoir,
Merci fdufnews pour ta réponse, elle ne règle pas mon pb mais me fait progresser  smiley-twist
Les 2 classes n'ont pas connaissance l'une de l'autre.
Il me semble que seule une classe qui hériterait des deux ou plutôt une classe PCF8574Timer qui serait dérivée de la classe PCF8574 pourrait faire ce que tu as en tête.
Je n'ai plus de problème avec PCF8574Timer qui vient de se faire manger par PCF8574.
Par contre, il me reste toujours un problème d'appel de méthode d'une class à partir d'une autre class.
J'ai 2 class dans un même fichier (je sais ce n'est pas bien)
Code:
class Event{
   public:
      ......
      ......
      ......
      void update();
      ......
      ......
      ......
};
class PCF8574{
   public:
      ......
      ......
      ......
      void digitalWrite(.......);
      ......
      ......
      ......
protected:
      ......
      ......
};

update() de Event doit accéder à digitalWrite(.......) de PCF8574, mais comment faire cet appel ?
Logged

2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

France
Offline Offline
Faraday Member
**
Karma: 36
Posts: 3420
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

C'est la même chose que ta précédente question.
Mettre 2 classes dans un même fichier ne les fait pas se connaitre mutuellement.
Pour qu'une classe puisse utiliser les ressources d'une autre il faut :
  - soit que l'une dérive de l'autre et ainsi hérite des ses propriétés et méthodes
  - soit qu'elle instancie un objet de la classe en question et ainsi puisse appeler les classes et les méthodes de l'objet
Logged

Moselle (FR)
Offline Offline
Edison Member
*
Karma: 16
Posts: 1237
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,
Merci pour la réponse, je vais voir comment faire.
Toute cette terminologie me déroute un peu smiley-sad
Logged

2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

Moselle (FR)
Offline Offline
Edison Member
*
Karma: 16
Posts: 1237
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonsoir,
J'ai trouvé une solution à mon problème, ce n'est pas très jolie mais ça fonctionne.
Je suis reparti de mes fichiers de départ, c'est à dire :
- trucMachin.ino
- PCF8474.h, PCF8574.cpp et PCInt.h (librairy Skywodd)
- PCF8574Timer.h et PCF8574.cpp (adaptation soft Simon Monk)
- Event.h et Even.cpp (utiliser par PCF8574Timer)
Dans Event.cpp et PCF8574.cpp, on a la ligne suivante :
Code:
digitalWrite(pin, value);
qui commande les pins de la carte Arduino et je voulais la remplacer par :
Code:
expander.digitalWrite(pin, value);
Comme je n'y arrivait pas (certainement par manque de connaissance), j'ai remplacé dans Event.cpp et PCF8574.cpp digitalWrite(pin, value) par :
Code:
Interface(pin, value);
Et dans trucMachin.ino j'ai rajouté la fonction suivante :
Code:
void Interface(uint8_t pin, uint8_t Value){
  expander.digitalWrite(pin, Value);
}
et en créant un fichier trucMachin.h
Code:
void Interface(uint8_t pin, uint8_t Value);
plus, bien sur :
Code:
#include "trucMachin.h"
dans Event.cpp et PCF8574.cpp
Il y a surement plus simple, plus propre et plus général
Qu'en pensez-vous ?
Logged

2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

Pages: [1]   Go Up
Jump to: