problème fusion 2 programmes

Bonjour à tous,

J’ai actuellement un problème lors de la fusion de 2 programmes fonctionnels répertoriés ci-dessous. Lorsque je fusionne les 2, je peux toujours lire et afficher les données du GPS, cependant, la valeur de la photorésistance reste bloquée à 990 quelque soit la luminosité.
Pourriez-vous me montrer comment faire svp ? je ne peux vous afficher le code final car manque de place >:(
Merci d’avance ! :slight_smile:

  • Le 1er programme est un programme qui récupère la luminosité grâce à une photorésistance pour ensuite commander (allumer/éteindre) une lumière (en 230V) via un optocoupleur
int photocellPin = A4; // the cell and 10K pulldown are connected to A4
int photocellReading; // the analog reading from the analog resistor divider
int BL = 10; //pin retroéclairage

void setup(void) {
  // We'll send debugging information via the Serial monitor
  Serial.begin(9600);
  pinMode(BL, OUTPUT);   // sets the pin as output
  pinMode(12, OUTPUT);  //Sortie pour la commande lumière
}

void loop(void) {
  photocellReading = analogRead(photocellPin);
  Serial.print("Analog reading = ");
  Serial.print(photocellReading); // the raw analog reading
  // We'll have a few threshholds, qualitatively determined
  if (photocellReading < 10) {
    Serial.println("MODE nuit");
  } else if (photocellReading < 200) {
    Serial.println("MODE nuit");
  } else if (photocellReading < 500) {
    Serial.println("MODE jour");
    digitalWrite(12, HIGH);  //allumer la lumière
  } else if (photocellReading > 750) {
    Serial.println("MODE jour");
    digitalWrite(12, LOW);  //éteindre la lumière
  } else {
    Serial.println("MODE pleine journee");
  }
  delay(700);

  analogWrite(BL, map(photocellReading, 500, 1000, 0, 255));  // analogRead values go from 0 to 1023, analogWrite values from 0 to 255

  
}
  • Le 2ème programme récupère des données par un GPS pour ensuite les afficher sur mon écran TFT (heure, date, longitude et latitude)
/*-----------TFT--------------*/
#include <Adafruit_GFX.h>
#include <Adafruit_TFTLCD.h>
#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4
Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

/*-----------GPS--------------*/
#include <SoftwareSerial.h>
#include <TinyGPS.h>
TinyGPS gps;
SoftwareSerial ss(11, 13); //TX = 11 & RX = 13
static void smartdelay(unsigned long ms);
static void print_float(float val, float invalid, int len, int prec);
static void print_int(unsigned long val, unsigned long invalid, int len);
static void print_date(TinyGPS &gps);
static void print_str(const char *str, int len);


void setup()
{
/*-----------GPS--------------*/
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);
  Serial.begin(9600);
  Serial.print("Latitude  Longitude     Time      Date");
  ss.begin(9600);

/*-----------TFT--------------*/

  tft.reset();
  uint16_t identifier = tft.readID();
  tft.begin(identifier);
}

void loop()
{
  /*-----------TFT--------------*/
  tft.setRotation(3);
  tft.fillScreen(Pink);
  tft.setCursor(0, 0);
  tft.setTextColor(BLACK);  tft.setTextSize(1);
  
  /*-----------GPS--------------*/
  float flat, flon;
  unsigned long date, time;
  gps.f_get_position(&flat, &flon);
  print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 10, 6);
  print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 11, 6);
  print_date(gps);
  Serial.println();

  smartdelay(700);
}


/*-----------GPS--------------*/
static void smartdelay(unsigned long ms)
{
  unsigned long start = millis();
  do 
  {
    while (ss.available())
      gps.encode(ss.read());
  } while (millis() - start < ms);
}

static void print_float(float val, float invalid, int len, int prec)
{
  if (val == invalid)
  {
    while (len-- > 1)
    Serial.print('*');
    Serial.print(' ');
    tft.print('*');
    tft.print(' ');
  }
  else
  {
    Serial.print(val, prec);
    tft.print(val, prec);
    int vi = abs((int)val);
    int flen = prec + (val < 0.0 ? 2 : 1); // . and -
    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
    for (int i=flen; i<len; ++i)
    Serial.print(' ');
    tft.print(' ');
  }
  smartdelay(0);
}

static void print_date(TinyGPS &gps)
{
  int year;
  byte month, day, hour, minute, second;
  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second);
    
    char sa[32];
    char sz[32];
    
    sprintf(sa, "%02d:%02d:%02d ",hour+2, minute, second);
    sprintf(sz, "%02d/%02d/%02d ",day, month, year);
    
    tft.setCursor(40, 80);
    tft.setTextColor(CYAN);
    tft.setTextSize(5);
    Serial.print(sa);
    tft.print(sa);
    
    tft.setCursor(70, 140);
    tft.setTextColor(WHITE);
    tft.setTextSize(3);
    Serial.print(sz);
    tft.print(sz);

  smartdelay(0);
}

1) Rechercher les conflits en vérifiant : - les mêmes pins ne sont pas utilisées par les deux programmes - que les même interruption ne sont pas utilisées par les deux programmes - détecter tous les conflits matériels - que les mêmes noms de variable ou de fonction ne sont pas utilisés dans les deux programmes et faire les changements en conséquence

2) écrire la nouvelle fonction setup() Faire les mêmes contrôles de recherche de conflit. Supprimer toutes les lignes redondantes.

3) écrire la nouvelle fonction loop() Faire les mêmes contrôles de recherche de conflit

Je ne suis pas entré dans le détail des programmes à joindre mais j'aurais tendance à utiliser une structure hiérarchique en transférant le contenu de chaque ancienne fonction loop() dans une nouvelle fonction et d'appeler ces fonctions à partir de la fonction loop() du nouveau programme. Sauf s'il y a interaction entre les deux programmes et dans ce cas AMHA le mieux est de tout réécrire et repartant sur une base propre..

Bonsoir,

Merci pour votre aide, il s'agissait d'une même pin utilisé dans chacun des 2 programmes ! Après correction, tout fonctionne à merveille !

A bientôt :-)