Problème d’intégration d'un code dans un autre code Multi-tâche

Bonjour,

Je suis très novice dans l’électronique et la programmation, et dans le mode arduino ainsi que dans ce forum.

Je souhaite utilisé mon ARDUINO UNO pour créer une petite station météo (histoire de débuter).

Dans ce cadre j’ai grappiller des codes ici ou là et j’ai réussi à obtenir des codes me renvoyant les données des différents capteurs. Individuellement mes codes marches bien. Le premier jet de jumelage des codes me donne satisfaction à l’exception de l’intégration d’un code.

Je vous joint une image de mon montage.

Voilà mon code multitâches (permettant l’affichage des données orientation du vent (potentiomètre); humidité; température; luminosité).

#define DHT11_PIN 0


//TEMPERATURE;HUMIDITE 
byte read_dht11_dat()
{
  byte i = 0;
  byte result=0;
  for(i=0; i< 8; i++)
  {
    while(!(PINC & _BV(DHT11_PIN)))
    {};
    delayMicroseconds(30);
    if(PINC & _BV(DHT11_PIN))
      result |=(1<<(7-i));
    while((PINC & _BV(DHT11_PIN)));
    }
    return result;
}

//LUMINOSITE
int lightPin =A2;



void setup()
{
  //TEMPERATURE;HUMIDITE
  DDRC |= _BV(DHT11_PIN);
  PORTC |= _BV(DHT11_PIN);
  Serial.begin(9600);  
  
}
     
void loop()     
{
  //TEMPERATURE;HUMIDITE
  byte dht11_dat[5];    
  byte dht11_in;
  byte i;
  PORTC &= ~_BV(DHT11_PIN);
  delay(18);
  PORTC |= _BV(DHT11_PIN);
  delayMicroseconds(1);
  DDRC &= ~_BV(DHT11_PIN);
  delayMicroseconds(40);      
  dht11_in = PINC & _BV(DHT11_PIN);
  if(dht11_in)
  {
    delay(1000);
    return;
  }
  delayMicroseconds(80);
  dht11_in = PINC & _BV(DHT11_PIN); //  
  if(!dht11_in)
  {
    return;
  }
   
  delayMicroseconds(80);
  for (i=0; i<5; i++)
  {  dht11_dat[i] = read_dht11_dat();}
   
  DDRC |= _BV(DHT11_PIN);
  PORTC |= _BV(DHT11_PIN);
  byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];
  if(dht11_dat[4]!= dht11_check_sum)
  {
  }
  

  //GIROUETTE
    int sensorValue = analogRead(A1);
Serial.print(sensorValue);
  Serial.print(";");
  
  
  //TEMPERATURE;HUMIDITE
  Serial.print(dht11_dat[0], DEC);
  Serial.print(",");
  Serial.print(dht11_dat[1], DEC);
  Serial.print(";");
  Serial.print(dht11_dat[2], DEC);
  Serial.print(",");
  Serial.print(dht11_dat[3], DEC);
  Serial.print(";");
  
  //LUMINOSITE
    Serial.println(analogRead(lightPin));
  
  
  
  delay(2000);
}

Et je souhaiterai inclure se code me permettant d’affiché à la suite la vitesse du vent:

//ANEMOMETRE
volatile int NbTopsFan;
int Calc;                               
int hallsensor = 2;


void rpm ()
{ 
  NbTopsFan++;
} 


//ANEMOMETRE
void setup() //
{ 
  pinMode(hallsensor, INPUT);
  Serial.begin(9600);
  attachInterrupt(0, rpm, RISING);
} 



//ANEMOMETRE
void loop ()    
{
  NbTopsFan = 0;   //Set NbTops to 0 ready for calculations
  sei();      //Enables interrupts
  delay (1000);   //Wait 1 second
  cli();      //Disable interrupts
  Calc = ((NbTopsFan*0.000025*3.14159265*1)*60*60);//vitesse du vent en Km/H 
  Serial.println(Calc, DEC); //Prints the number calculated above
}

Je ne sais pas si le problème vient des tempo ou autre mais lorsque j’essaye de l’intégré cela m’entraîne un bug et je n’ai aucun retour de donnée, merci de bien vouloir m’aider.

Le code pour la lecture du compteur de vitesse du vent interdit les interruptions en dehors de l'appel à delay().
C'est débile, ca bloque toutes les fonctions de temps.
Donc dès que le reste du code appele delay(...), tout se coince.

Je suggère la modif suivante :

lecture_vent()
{
  cli(); // on interdit les interruptions le temps de mettre le compteur à zéro.
  NbTopsFan = 0;   //Set NbTops to 0 ready for calculations
  sei();      //Enables interrupts
  delay (1000);   //Wait 1 second
  cli();      //Disable interrupts - juste le temps de faire le calcul
  Calc = ((NbTopsFan*0.000025*3.14159265*1)*60*60);//vitesse du vent en Km/H 
  sei(); // Et on remet les interruptions pour les autres avant de continuer
  Serial.println(Calc, DEC); //Prints the number calculated above
}

D'une manière générale, si tu prends des bouts de code à droite et à gauche sans chercher à comprendre ce qu'ils font, tu cours à la cata et tous les 2 jours tu viendras demander de l'aide pour qu'on corrige ton code.

Maintenant, si ma modif marche, fait une pause, assieds toi et essaye de comprendre l'ensemble du code en question (pas juste ma modif, mais tout ce que tu as copié) avant d'aller plus loin.
Si tu as des questions, nous serons heureux de t'aider à comprendre.
Il y a des tutos, lis les aussi.
Il n'y a que comme cela que tu apprendras et que tu seras fier du résultat.

Bonsoir,

Merci beaucoup Barbudor, en effet ta proposition donne satisfaction.

Je prends bien compte de tes remarques, j'ai bien conscience que ma façon de procéder n'est pas forcément la bonne, mais mon tempérament a tendance à me pousser à obtenir un résultat avant même de réellement savoir comment faire.

Je te remercie encore de m'avoir sortie de mon impasse.

A bientôt peut-être pour d'autre conseil.