pour une station météo

Bonjour
je suis sur le projet de faire une station météo avec température intérieur et extérieur et traceur solaire
avec le module NRF24L01en bidirectionnel.
mon problème es, je voudrai envoyer un raz de la température du maxi, mini sur la station extérieur une fois part jour mai cela ne marche pas. je reçois les donnée de l'extérieur qui sont afficher sur l'écran a l'intérieur

voila le code de l'extérieur

                               /* Arduino  Transmitter Code               
                      by Dejan Nedelkovski, www.HowToMechatronics.com 
                  Library: TMRh20/RF24, https://github.com/tmrh20/RF24/ */

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <Servo.h>
#define SEALEVELPRESSURE_HPA (1020.25)
RF24 radio(9, 8); // CE, CSN
const byte address[] [12] = {"00001", "00002"};           

Adafruit_BME280 bme;

// 180 horizontal MAX
Servo horizontal; // horizontal servo
  int servoh = 90;   // 90;     // support servo horizontal

  int servohLimitHigh = 180;           //180
  int servohLimitLow = 20;             //65

// 65 degrer MAX
Servo vertical;   // vertical servo 
  int servov = 90;    //   90;     // support servo vertical

  int servovLimitHigh = 120;            //120
  int servovLimitLow = 20;              //15

// LDR pin connections
//  name  = analogpin;
  int ldrlt = 2; //LDR top left - BOTTOM LEFT    <--- BDG
  int ldrrt = 3; //LDR top rigt - BOTTOM RIGHT 
  int ldrld = 0; //LDR down left - TOP LEFT
  int ldrrd = 1; //ldr down rigt - TOP RIGHT

  float QNH = 1022.67; //Change the "1022.67" to your current sea level barrometric pressure (https://www.wunderground.com)
  const int BME_address = 0x76;
  
  float maxmin;
  float pressure;   
  float temperature;
  float extmin_temp = 100;
  float extmax_temp = -100;
  float extmax_humi = -10;
  float extmin_humi = 110;
  float altimeter;
  float humidity;
  float temp_jour = 0;
  float data[12];   
  char charVal[17];
  
  bool radioNumber = 0;
  bool role = 0;
  
void setup() {
        Serial.begin(9600);
        Serial.println("BMP280/NRF24L01 link");
// servo connections
// name.attacht(pin);
        horizontal.attach(5); 
        vertical.attach(6);
        horizontal.write(180);
        vertical.write(45);
        bme.begin(BME_address);
        radio.begin();
        radio.openWritingPipe(address[ 1 ]);
        radio.openReadingPipe(1,address[ 0 ]);  
        radio.setPALevel(RF24_PA_MIN);
        //radio.startListening();
  if (!bme.begin(0x76)) {
      Serial.println("Could not find a valid BME280 sensor, check wiring!");
      while (1);
      }
}

void loop() 
{ 
//  reception_raz();

  int lt = analogRead(ldrlt);       // top left
  int rt = analogRead(ldrrt);       // top right
  int ld = analogRead(ldrld);       // down left
  int rd = analogRead(ldrrd);       // down rigt
  
  // int dtime = analogRead(4)/20;  // read potentiometers  
  // int tol = analogRead(5)/4;
  int dtime = 10;
  int tol = 50;
  
  int avt = (lt + rt) / 2; // valeur moyenne top
  int avd = (ld + rd) / 2; // valeur moyenne en baisse
  int avl = (lt + ld) / 2; // valeur moyenne restante
  int avr = (rt + rd) / 2; // valeur moyenne à droite

  int dvert = avt - avd; // check the diffirence of up and down
  int dhoriz = avl - avr;// check the diffirence og left and rigt
  
  Serial.print(avt);
  Serial.print(" ");
  Serial.print(avd);
  Serial.print(" ");
  Serial.print(avl);
  Serial.print(" ");
  Serial.print(avr);
  Serial.print("   ");
  Serial.print(dtime);
  Serial.print("   ");
  Serial.print(tol);
  Serial.println(" ");
  
  if (-1*tol > dvert || dvert > tol) // check if the diffirence is in the tolerance else change vertical angle
  {
  if (avt > avd)
  {
    servov = ++servov;
     if (servov > servovLimitHigh) 
     { 
      servov = servovLimitHigh;
     }
  }
  else if (avt < avd)
  {
    servov= --servov;
    if (servov < servovLimitLow)
  {
    servov = servovLimitLow;
  }
  }
  vertical.write(servov);
  }
  
  if (-1*tol > dhoriz || dhoriz > tol) // check if the diffirence is in the tolerance else change horizontal angle
  {
  if (avl > avr)
  {
    servoh = --servoh;
    if (servoh < servohLimitLow)
    {
    servoh = servohLimitLow;
    }
  }
  else if (avl < avr)
  {
    servoh = ++servoh;
     if (servoh > servohLimitHigh)
     {
     servoh = servohLimitHigh;
     }
  }
  else if (avl = avr)
  {
    // nothing
  }
  horizontal.write(servoh);
  }
   delay(dtime);
    
    pressure    = bme.readPressure()/100;  //and conv Pa to hPa
    temperature = bme.readTemperature();
    altimeter   = bme.readAltitude (QNH); //QNH is local sea lev pressure
    humidity    = bme.readHumidity();
 
if(temperature > extmax_temp) {extmax_temp = temperature;}  // set max temperature
if(temperature < extmin_temp) {extmin_temp = temperature;}  // set min temperature

if(humidity > extmax_humi) {extmax_humi = humidity;}  // set max temperature
if(humidity < extmin_humi) {extmin_humi = humidity;}  // set min temperature

    data[0] = pressure;
    data[1] = temperature;
    data[2] = altimeter;
    data[3] = humidity;
    data[4] = extmax_temp;
    data[5] = extmin_temp;
    data[6] = extmax_humi;
    data[7] = extmin_humi;
    data[8] = temp_jour;
 
 //----- display on local monitor: ------------
    Serial.print(data[0]); Serial.print("hPa  ");
    Serial.print(data[1]);
    Serial.write(0xC2);  //send degree symbol
    Serial.write(0xB0);  //send degree symbol
    Serial.print("C   ");  
    Serial.print(data[2]); Serial.println("m");
    Serial.print(data[3]); Serial.println("%");
    Serial.print(data[5]); Serial.println("degre");
    Serial.print(data[4]); Serial.println("degre");
    Serial.print(data[6]); Serial.println("%");
    Serial.print(data[7]); Serial.println("%");

    radio.startListening();
  if (radio.available())                        //nrf24l01 capteur pression reçu
    {  
      radio.read(&data, sizeof(data));
      //while (!radio.available())
       Serial.println("raz temp et humiditer");
    if (temp_jour =1)
    {
       extmax_humi = -10;
       extmin_humi = 110;
       extmin_temp = 100;
       extmax_temp = -100;
       delay(500);
    }
    else
    {
      Serial.println ("Aucune radio disponible");
    }
   }

    delay(5);
  radio.stopListening();
  radio.write(&data, sizeof(data));
 // delay(1000);
}
/*void reception_raz()
 {radio.startListening();
  if (radio.available())                        //nrf24l01 capteur pression reçu
    {  
      radio.read(&data, sizeof(data));
      //while (!radio.available())
       Serial.println("raz temp et humiditer");
    if (temp_jour ==1)
    {
       extmax_humi = -10;
       extmin_humi = 110;
       extmin_temp = 100;
       extmax_temp = -100;
       delay(500);
    }
    else
    {
      Serial.println ("Aucune radio disponible");
    }
   }
 }*/

et voila le fichier de la station intérieur

station_meteo__recepteur_fini_06_bis.ino (29.4 KB)

code de l'intérieur

station_meteo__recepteur_fini_06_bis.ino (29.4 KB)

Déjà, tu as mis l'autre code dans une autre discussion : demande au modo (bouton report to moderator) de joindre les deux fils en un seul, afin que ce soit plus facile à suivre. Merci

Ensuite, les termes 'une fois par jour' supposent que tu es capable de savoir quand on change de jour. Comment veux-tu faire ça ? Si tu veux un peu de précision, tu ne peux pas utiliser l'horloge de l'Arduino. Tu peux utiliser une RTC, un GPS ou lire l'heure sur Internet.

l'autre code je l'ai mis en pièces jointe parce que il es trop volumineux

la RTC es sur la station a l'intérieur
j'ai mis se code pour le raz part jour

{
      DateTime now = rtc.now();
   if (hour()==5 && minute()==36 && second()==00)      //pour remetre a zero le mini maxi chaque jours à 00H40    
    {
      digitalWrite(RF24_CS_PIN, LOW);
      digitalWrite(SDCARD_CS_PIN, HIGH);
      Raz_temperature ();
      radio.write(&data, sizeof(data));
      Serial.print("raz temperature");
      delay (500);
    }
   else
    {
      boucle_pricipale();

et

void Raz_temperature () 
    {
      radio.stopListening();
      temp_jour = data[8];
      temp_jour = 1;

      Serial.println("envoi RAZ");
      radio.write(&data, sizeof(data));
      delay(5);
      min_temp = 100;
      max_temp = -100;
      min_humid = 100;
      max_humid = -100;

Donc c'est la station intérieure qui va détecter le changement de jour et décider du RAZ ?
Il faut alors qu'elle envoie un ordre d'effacement à l'autre station.

Es-tu sûr que cette condition est bien vérifiée ?

   if (hour()==5 && minute()==36 && second()==00)      //pour remetre a zero le mini maxi chaque jours à 00H40

S'il y a des delay qui trainent, il est possible que la RTC soit lue par exemple à 5h35m59s puis à 5h36m01s et que le RAZ ne soit pas envoyé.

Tu devrais utiliser un booléen RAZenvoye qui serait à false tant que l'ordre n'est pas envoyé. Ensuite, si l'heure d'envoi est dépassée et le booléen à false, alors tu envoies l'ordre et tu passes le booléen à true. A minuit, tu le repasses à false.

Au passage, au lieu de tester sur l'heure et les minutes et les secondes, tu devrais utiliser un codage de l'heure qui te rend les tests plus simples. Par exemple, 5h36m00 serait codé 53600. Le code peut aller jusqu'à 235959 donc il faut un unsigned long pour le stocker (ceci si tu veux être précis à la seconde, sinon tu conserves 536 et là un int suffit)

Ainsi tu codes ton heure

int code = hour()*100 + minute();

et tu compares

if (code> 536) { ... }

oui c'est sa la station intérieur qui donne l'ordre du raz.

comment savoir si elle es bien vérifier?, il me mai bien le raz sur la température de l'intérieur

  if (hour()==5 && minute()==36 && second()==00)      //pour remetre a zero le mini maxi chaque jours à 00H40

oui j'ai quelque delay
en effet je peu me passer des secondes je n'es pas besoin d'être aussi precis
je vais essayer de faire se que tu me dit
merci

es que c'est bien comme sa que je doit faire

boolean temp_jour = 0;
 void loop() 
    {
      DateTime now = rtc.now();
      int code = hour()*100 + minute();
   if (code> 2025)    
    {
      digitalWrite(RF24_CS_PIN, LOW);
      digitalWrite(SDCARD_CS_PIN, HIGH);
      Raz_temperature ();
      radio.write(&data, sizeof(data));
      Serial.print("raz temperature");
      delay (500);
    }
   else
    {
      boucle_pricipale();
void Raz_temperature () 
    {
      radio.stopListening();
      temp_jour = data[8];
      temp_jour = 1;

      Serial.println("envoi RAZ");
      radio.write(&data, sizeof(data));
      delay(5);
      min_temp = 100;
      max_temp = -100;
      min_humid = 100;
      max_humid = -100;       
    }
 if (code> 2025)

ça, ça va faire envoyer des RAZ en continu à partir de 20h25. Il faut que tu mettes ton booléen à 1 (ou true) et que tu testes en incluant le booléen :

 if (code> 2025 && !temp_jour) 
  {
   temp_jour = true;
   ...

d'accord donc sa donne sa

 void loop() 
    {
      DateTime now = rtc.now();
      data[8] = temp_jour;
      int code = hour()*100 + minute();
     if (code> 2150 && !temp_jour)
    {
      digitalWrite(RF24_CS_PIN, LOW);
      digitalWrite(SDCARD_CS_PIN, HIGH);

      temp_jour = 1;

      radio.write(&data[8], sizeof(data[8]));
      Serial.print("raz temperature");

pour que je puisse l'envoyer je doit aussi faire sa?

data[8] = temp_jour;
radio.write(&data[8], sizeof(data[8]));

Tu dois lui envoyer un ordre qu'il va comprendre. Par exemple, tu envoies la chaine "RAZ" et le récepteur teste s'il la reçoit et agit en conséquence.
Tu peux aussi lui envoyer un code, genre 999, ou toute autre chose qui t'arrange. L'important c'est que le récepteur sache à quoi s'attendre pour effectuer ce RAZ.

Avec ce que tu fais

data[8] = temp_jour;
...
radio.write(&data[8], sizeof(data[8]));

tu lui envoies le contenu de la variable temp_jour. Est-ce bien ce qu'il faut pour qu'il comprenne qu'il faut faire un RAZ ?

Côté émetteur, pense à remettre ton booléen à 0 à minuit...

J’ai un peu de mal à me concentrer sur le sujet.
Regarde là, Eskimon pourra peut-être t’aider ...
https://eskimon.fr/orthographe&conjugaison

:confused:

je vais arrêter pour se soir
j'ai la tète qui fumer mdr
un grand merci a toi pour cette patience, pour les nuls comme moi, vous faites un travail exceptionnel et je vous félicite pour votre grande patiente.
merci
bonne soirée