Projet qui tourne mais pas bien

Bonjour,
j'ai fabriqué une station météo à base de UNO R3, elle est relié à un PC win7 par la liaison série j'ai bricolé un programme (c'est ma première programmation) qui tourne mais qui de temps en temps coupe la transmission des données (obligé de restarter le PC et de recharger le sketch)
je me demande si ma programmation est bien faite dans les règles de l'art ?

#include <RTClib.h>                                   // Librairie du module heure date
#include "DHT.h"                                      // Librairie capteur température humidité
#include "Seeed_BMP280.h"                             // Librairie capteur baromètrique
 
#define DHTPIN A0                                     // Capteur temperature et humidité connecté à la pin A0 
#define DHTTYPE DHT22                                 // definit le type du capteur de temperature et humidite dans la librairie

DHT dht(DHTPIN, DHTTYPE);
BMP280 bmp280;                                        // capteur de pression connecté à I2C

RTC_DS1307 RTC;

int compteurfm = 0;                                   // compteur de fronts montants
float nbrtour = 0;                                    // variable du nombre de tour
float cumul = 0;                                      // variable du cumul des vitesses du vent
float vitessemoy = 0;                                 // variable vitesse moyenne du vent
int vitesseaffiche = 0;                               // variable juste pour avoir un nombre entier
unsigned long compte_temps;                           // variable contenant le temps
int increm_temps = 1;                                 // variable compteur de temps
int jour;                                             // variable du jour
int mois;                                             // variable du mois                                    
int an;                                               // varible de l'annee
int heure;                                            // variable de l'heure
int mn;                                               // variable de minute
char data1[12];
char data2[12];

                                                      // --- temporisation ----
unsigned long lastConnectionTime = 0;                 //Derniere connection au serveur en ms        

const unsigned long postingInterval = 3600000uL;      //délai entre chaque connection en ms (1h)
int direction = A3;                                   //girouette sur entrée analogique 3

void setup () {

Serial.begin(2400);
Serial.println("L'Arduino envoie des données sur le port de COM3");
RTC.begin();
RTC.adjust(DateTime(__DATE__, __TIME__));            //Met à l'heure et date de l'ordinateur le sketch compilé 

pinMode (2, INPUT);
attachInterrupt (0, anemometre, FALLING);             // capteur de fronts descendants
 
bmp280.init(); 
}

void loop () {
 
int h;
float t;
int pressure;
  
DateTime now = RTC.now();
jour=(now.day());
mois=(now.month());
an=(now.year());
heure=(now.hour());
mn=(now.minute());
sprintf(data1,"%04d/%02d/%02d",an,mois,jour);
  
delay(3600000);

  
if((millis() - lastConnectionTime > postingInterval)) {
                                                   // stockage de la derniere connexion au serveur
lastConnectionTime = millis();
cumul = (0.0004396*nbrtour)*11 ;                   // calcul du cumul de la distance totale parcourue en km
vitessemoy = cumul;                                // calcul de vitesse moy du vent en km/h
vitesseaffiche = vitessemoy;                       // c'est juste pour avoir un chiffre rond

Serial.print(data1);
delay(1000);
Serial.print(';');
delay(1000);
sprintf(data2," %02d:%02d",heure,mn);
Serial.print (data2);
delay(1000);
Serial.print ("; ");
delay(1000);    
Serial.print(';');
delay(1000);
Serial.print(" Humid;");
delay(1000); 
Serial.print (h = dht.readHumidity());
delay(1000);
Serial.print(";%");
delay(1000);
Serial.print("; Temp;");
delay(1000); 
Serial.print(t = dht.readTemperature());
delay(1000);
Serial.print(";*C");
delay(1000);
Serial.print("; Vent moy;");
delay(1000); 
Serial.print (vitesseaffiche);                      //  envoie vitesse moy du vent
delay(1000);
Serial.print(";Km/h;");
delay(1000);
int sensorValue = analogRead(direction);            // lit la valeur analogique de la girouette sur la broche A3
                                                    // et met le résultat dans la variable
if ((sensorValue>910) && (sensorValue<1010)) {
    Serial.print("NO;");
    } 
if ((sensorValue>440) && (sensorValue<600)) {
    Serial.print("E;");
    } 
if ((sensorValue>10) && (sensorValue<150)) {
    Serial.print("SE;");
    } 
if ((sensorValue>150) && (sensorValue<270)) {
    Serial.print("S;");
    } 
if ((sensorValue>270) && (sensorValue<440)) {
    Serial.print("SO;");
    } 
if ((sensorValue>600) && (sensorValue<750)) {
    Serial.print("O;");
    } 
if ((sensorValue>750) && (sensorValue<850)) {
    Serial.print("NE;");
    } 
if ((sensorValue>850) && (sensorValue<910)) {
    Serial.print("N;");
    }
delay(1000);
Serial.print(" Pression;");
delay(1000);
Serial.print(pressure = bmp280.getPressure()/100+25);
delay(1000);
Serial.println(";hPa");
            
nbrtour = 0;
  }
}

void anemometre(){
compteurfm++;
if (compteurfm >2){
compteurfm = 0;
   }

if (compteurfm == 2){                               // car 2 fronts descendants = 1 tour
nbrtour++;
   }
}

Merci
Cordialement

première lecture rapide :

RTC.adjust(DateTime(__DATE__, __TIME__));            //Met à l'heure et date de l'ordinateur le sketch compilé

cette ligne ne devrait être utilisée que la première fois, pour mettre à l'heure la RTC, puis ensuite il faudrait commenter la ligne puis uploader le sketch à nouveau, de manière à ce que pour les prochains reset de l'arduino tu ne rerègle pas à chaque fois l'heure sur celle de compilation du sketch, le principe de la RTC étant de conserver l'heure même en cas d'extinction de l'arduino

je me demande si ma programmation est bien faite dans les règles de l'art ?

quelques remarques qui se veulent constructives

le code n'est pas indenté, c'est moche :slight_smile: appuyez sur ctrl-T dans l'IDE

ça c'est un long délai....delay(3600000);.. utilisez la technique de millis() au moins vous pourrez faire d'autres trucs pour montrer à l'utilisateur que votre montage est en vie...

un truc qui compte un nombre de fois où quelque chose se produit devrait sans doute être un unsigned. De plus êtes vous sûr que sa valeur max est adaptée à ce que vous mesurez? (vous comptez jusqu'à 2, un byte serait suffisant)int compteurfm = 0;                                  // compteur de fronts montantsDe plus cette variable est utilisée dans une interruption, idéalement il vaut mieux la déclarer en [url=https://www.arduino.cc/reference/en/language/variables/variable-scope--qualifiers/volatile/]volatile[/url]

pourquoi un float puisque vous ne comptez que des tours entiers?float nbrtour = 0;

Donnez des noms à vos pins et homogénéisez (soit tout en const byte, soit des #define)

#define DHTPIN A0                                     // Capteur temperature et humidité connecté à la pin A0 
...
int direction = A3;                                   //girouette sur entrée analogique 3
...
pinMode (2, INPUT);

Utilisez attachInterrupt([b]digitalPinToInterrupt[/b](pin), ISR, mode); c'est plus propreattachInterrupt (0, anemometre, FALLING);            // capteur de fronts descendants

Pourquoi est-ce une variable globale?int vitesseaffiche = 0;                              // variable juste pour avoir un nombre entier

Pourquoi tous cesdelay(1000);dans l'impression?

Serial.print(data1);
delay(1000);
Serial.print(';');
delay(1000);
sprintf(data2," %02d:%02d",heure,mn);
Serial.print (data2);
delay(1000);
Serial.print ("; ");
delay(1000);    
Serial.print(';');
delay(1000);
Serial.print(" Humid;");
delay(1000); 
Serial.print (h = dht.readHumidity());
delay(1000);
Serial.print(";%");
delay(1000);
Serial.print("; Temp;");
delay(1000); 
Serial.print(t = dht.readTemperature());
delay(1000);
Serial.print(";*C");
delay(1000);
Serial.print("; Vent moy;");
delay(1000); 
Serial.print (vitesseaffiche);                      //  envoie vitesse moy du vent
delay(1000);
Serial.print(";Km/h;");
delay(1000);

cette ligne va faire grossir votre binaire de plus de 1.5k... sprintf(data2," %02d:%02d",heure,mn);imprimez simplement heure et mn séparément (en testant s'ils sont plus petit que 10 alors mettre éventuellement un 0 devant), le buffer ne sert à rien

Faut penser à utiliser des else quand ça aide le code à éviter des tests inutiles...

if ((sensorValue>910) && (sensorValue<1010)) {
    Serial.print("NO;");
    } 
if ((sensorValue>440) && (sensorValue<600)) {
    Serial.print("E;");
    } 
if ((sensorValue>10) && (sensorValue<150)) {
    Serial.print("SE;");
    } 
if ((sensorValue>150) && (sensorValue<270)) {
    Serial.print("S;");
    } 
if ((sensorValue>270) && (sensorValue<440)) {
    Serial.print("SO;");
    } 
if ((sensorValue>600) && (sensorValue<750)) {
    Serial.print("O;");
    } 
if ((sensorValue>750) && (sensorValue<850)) {
    Serial.print("NE;");
    } 
if ((sensorValue>850) && (sensorValue<910)) {
    Serial.print("N;");
    }

Ce n'est pas beau de faire une affectation au sein de l'impression Serial.print(pressure = bmp280.getPressure()/100+25);

ce n'est pas optimal et vous perdez sans doute un tick

compteurfm++;
if (compteurfm >2){
compteurfm = 0;
   }

if (compteurfm == 2){                               // car 2 fronts descendants = 1 tour
nbrtour++;
   }

puisque vous testez quand compteurfm est à deux vous augmentez le nombre de tour, puis au prochain tick il passe à 3 donc vous le mettez à 0...

Bonjour,

Merci pour vos réponses, je vais me remettre au travail