Programation modulaire et fonction

Bonjour a tous,

J’essaye de réaliser des jeux sur un écran Oled et je suis en train de me faire des nœuds avec la programmation modulaire.

Mon code est plus complexe, c’est juste une simplification qui résume bien mes problèmes.

Le but, un bouton poussoir incrémente un compteur et l’affiche sur l’écran.

Le .ino:

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "globals.h"
#include "display.h"

void setup(){
  Serial.begin(9600);
  pinMode(switchPin, INPUT_PULLUP);
}

void loop(){
  switchValue=(digitalRead(switchPin)==LOW);
  displayTxt();
}

display.cpp:

#include "Arduino.h"

extern boolean switchValue;
extern const byte counterSize;
extern byte counter[counterSize];

void displayTxt(){
  if (switchValue==HIGH){
    counter[counterSize]++;
    Serial.println(counter[counterSize]);

    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(25,12);
    display.println(counter[counterSize]);
    display.display();
  }
}

display.h:

void displayTxt();

globals.h:

//Oled screen
#define OLED_MOSI   9
#define OLED_CLK   10
#define OLED_DC    11
#define OLED_CS    12
#define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

//Variables
const byte switchPin=5;
boolean switchValue=0;
const byte counterSize=1;
byte counter[counterSize];

Il y a plusieurs problèmes :

  • diplay & white ne sont pas déclarer dans display.cpp
  • counter n’est pas déclarer dans display.cpp

Pouvez vous me mettre sur la piste ?

Merci

Regardez le mot clé [

extern

](La programmation modulaire - Apprenez à programmer en C ! - OpenClassrooms)

Pour la variable counter :
Si je la retire du fichier globals.h et que je la défini dans le display.cpp donc sans “extern”, ça marche mais je sais pas pourquoi.

Elle est défini dans dans globals, elle devrait etre vu dans display,…, commes les autres.

Pour white :
Si j’insère les librairies de l 'écran dans display.cpp, white est reconnu.

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Pour display:
Pas encore trouvé

Je sèche complètement.

Pour moi placer #include “globales.h” dans les .cpp devrait permettre à tous les fichiers de voir les variables…

J arrive pas à saisir mon erreur, pouvez vous m aider.

Merci

Bonjour a tous,

Je suis toujours en galère sur la programmation modulaire.

J’ai ce programme (non modulaire), qui affiche une variable sur un écran :

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SPI.h>
#include <Wire.h>

#define OLED_MOSI   9
#define OLED_CLK   10
#define OLED_DC    11
#define OLED_CS    12
#define OLED_RESET 13

const byte counter=5;

Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

void setup(){
  display.begin(SSD1306_SWITCHCAPVCC);
}

void loop(){
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(25,12);
  display.println(counter);
  display.display();
}

Je souhaite le rendre modulaire, pour commencer, uniquement transférer les variables dans un .h
donc :

#include "global.h"

void setup(){
  display.begin(SSD1306_SWITCHCAPVCC);
}

void loop(){
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(25,12);
  display.println(counter);
  display.display();
}

et :

#include "Arduino.h"

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SPI.h>
#include <Wire.h>

#define OLED_MOSI   9
#define OLED_CLK   10
#define OLED_DC    11
#define OLED_CS    12
#define OLED_RESET 13

const byte counter=5;

Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

voici les erreurs :

In file included from sketch_dec10e.ino:1:
global.h:16: error: ‘Adafruit_SSD1306’ does not name a type
sketch_dec10e.ino: In function ‘void setup()’:
sketch_dec10e:4: error: ‘display’ was not declared in this scope
sketch_dec10e:4: error: ‘SSD1306_SWITCHCAPVCC’ was not declared in this scope
sketch_dec10e.ino: In function ‘void loop()’:
sketch_dec10e:8: error: ‘display’ was not declared in this scope
sketch_dec10e:10: error: ‘WHITE’ was not declared in this scope

j’arrive pas a comprendre pourquoi ça déconne ?

Merci

Tenez voici un petit exemple avec des PROGMEM, des structures et qui montre comment structurer les #include et les extern (et qui affiche le tout sur la console à 115200 bauds)

En PJ car il y a 3 fichiers:

le .ino qui est le programme, qui inclus un .h dans lequel on a déclaré des éléments structurants et les variables externes et enfin un .cpp qui définit et initialise les variables en question

le .ino et le .cpp importent le .h qui est la référence des choses à connaître

exempleExtern.zip (1.95 KB)

Merci

Je ce message d'erreur sur ton fichier:

In file included from exempleExtern.ino:1:
varglob.h:8: error: use of enum 'situation_t' without previous declaration
varglob.h:8: error: expected unqualified-id before ':' token
varglob.h:15: error: 'situation_t' does not name a type
exempleExtern.ino: In function 'void setup()':
exempleExtern:17: error: 'const struct person_t' has no member named 'situation'

C'est normal, ou j'ai un problème de version de IDE Arduino, je suis en 1.0.6

Bizarre - oui je suis à la dernière dernière version du compilateur (et suis sur Mac)

T'as pas d'erreur chez toi ?

Tous mes soucis pourrais venir du fait que j'ai un vieux IDE ? Ça te parait crédible ?

J'ai vieux Mac de 2007 et l'IDE 1.0.6

Merci

aucun soucis chez moi, mais dernière version de OSX et dernière version de l’IDE (sur un Mac de 2012 de mémoire)

Il se peut que vous n’ayez pas le bon compilateur en effet