Calcul RPM ventilateur 12V

Bonjour,

J’ai connecté entre autre un ventilateur 12V à une carte arduino(cf montage en pièce jointe).

Lorsque j’utilise le code suivant (le code gère plus de capteurs que présenté sur le montage mais ici je m’interesse uniquement à la partie capteur température + ventilateur) :

#include <dht.h>
#include <Wire.h>
#include “ds3231.h”
#include “rtc_ds3231.h”

//**** Variables for DHT22 and Fan ****
#define DHT22_PIN 2
dht DHT;
unsigned long time2=3000;
#define VENTILO_PIN 13
#define PULSE_PIN 7
#define PULSE_TIMEOUT 1000000
unsigned long rpm;

void setup()
{
Serial.begin(9600);
Wire.begin();
//DS3231_init(DS3231_INTCN);
memset(recv, 0, BUFF_MAX);
//Define output pin LED PWM
for(int i=0;i<3;i++) pinMode(myLED*.pinLED, OUTPUT);*

  • //Define output pin for Fan*

  • pinMode(13,OUTPUT);*

  • pinMode(PULSE_PIN, INPUT);*

  • digitalWrite(PULSE_PIN, HIGH);*

  • //Output pin for the CO2 sensor (MG811)*

  • pinMode(BOOL_PIN, INPUT); *

  • digitalWrite(BOOL_PIN, HIGH); *
    }
    void loop()
    {

  • char in;*

  • char buff[BUFF_MAX];*

  • unsigned long now = millis();*

  • struct ts t;*

  • float temperature; // temperature from DS3231*

  • int hours; //hours from DS3231*

  • int RPM;*

  • int a; // Variable to convert char variable into integer variable*

  • int b; // Variable to convert char variable into integer variable*

  • unsigned long time;*

  • time=millis();*

  • float Temp_max = 25.00; //maximum temperature*

  • int humidity_max = 95; //maximum humidity*

  • int CO2_max=1000; // maximum CO2 level*

  • int percentage;*

  • float volts;*

  • if((time-time2)>8000){*
    _ Serial.println("************** Data from DHT22 *****************\n");_
    _ Serial.print (“DHT22 \t”);_

  • int chk = DHT.read22 (DHT22_PIN); //read the dht22*

  • switch (chk) {*

  • case 0: *
    _ Serial.print (“OK,\t”);_

  • break; // read OK*

  • case -1:*
    _ Serial.print (“Checksum error,\t”);_

  • break; //error*

  • case -2:*
    _ Serial.print (“Time out error,\t”);_

  • break; // error*

  • default:*
    _ Serial.print (“Unknown error,\t”);_

  • break; //error*

  • }*

  • // DISPLAT DATA from DHT22*
    _ Serial.print(“Humidity : “);_
    _ Serial.print (DHT.humidity,1);_
    _ Serial.print(” %”);_
    _ Serial.print (",\t");_
    _ Serial.print(“Temperature : “);_
    _ Serial.print (DHT.temperature,1);_
    _ Serial.println(” C”);_
    _ Serial.print(’\n’);_

  • time2=time;*

  • //If temperature is higher than maximum temperature*

  • //or If humidity is higher than maximum humidity*

  • //or CO2 is higher than maximum CO2 level allowed*

  • if(DHT.temperature > Temp_max || DHT.humidity > humidity_max){*
    _ Serial.print(“Fan ON”);_
    _ Serial.print(’\t’);_

  • digitalWrite(13,HIGH); //fan ON*

  • rpm=pulseIn(PULSE_PIN, LOW, PULSE_TIMEOUT);*

  • //Serial.println(rpm);*
    _ RPM=60/((4*rpm)/1000000.0);_
    _ Serial.print("\tRPM : ");_
    _ Serial.println(RPM,DEC);_
    _ Serial.print(’\n’);_

  • if(RPM == 0.0){ //fan is not rotating*
    _ Serial.println(“WARNING : FAN IS BLOCKED”);_
    _ Serial.print(’\n’);_

  • }*

  • }*

  • else if (DHT.temperature < 24 && DHT.humidity < 80) {*

  • digitalWrite(13,LOW); //else fan OFF*

  • }*
    // **** Data from MG811 ****
    _ Serial.println("************** Data from MG811 *****************\n");_

  • volts = MGRead(MG_PIN);*
    _ Serial.print( "SEN-00007 : " );_
    _ Serial.print(volts);_
    _ Serial.print( " V " );_

  • percentage = MGGetPercentage(volts,CO2Curve);*
    _ Serial.print(“CO2:”);_

  • if (percentage == -1) {*
    _ Serial.print( “<400” );_

  • } else {*
    _ Serial.print(percentage);_

  • }*

_ Serial.print( “ppm” ); _
_ Serial.println(); _

}
[/quote]
Et bien lorsque la température dépasse 25°C le ventilateur se met en route. Seulement l’affichage de son RPM est de … -19831 ! (voir deuxième image jointe)
Alors que la seconde valeur, prise quelque seconde plus tard, quand la température est toujours supérieure à 25°, est correcte (2658 sachant que mon ventilateur est un 3000 RPM).
Pouvez m’expliquer d’où vient le problème de la première valeur ? Je précise que parfois la première valeur est cohérente (environ 400-500, assez faible mais comme elle est mesurée juste après que le ventilateur s’enclenche c’est assez logique non ?).
Merci d’avance !
Capture.JPG
Capture1.JPG

Salut,

Déclare RPM en float

Effectivement, utiliser un type pouvant prendre une valeur négative n'est pas bon.

Soit float, word, long... au choix.

Bonsoir,

Est-ce que la valeur rpm se stabilise d'elle-même ?

A priori, je ne vois pas pourquoi, pour répondre à mes prédecesseurs, une "integer" serait problématique dans ce cas là. La valeur est tout simplement incohérente et demande peut-être à être temporisée, prise au bon moment. Je constate tout simplement qu'il n'y a aucun delay() dans le programme...

@+

Zoroastre.

Oui il n'y a que la première valeur d'incohérente ensuite ça tourne autour de 2600 (pour un ventilateur annoncé avec 3000 RPM). Et l’utilisation d'un int n'a pas réglé le problème.

Je n'ai pas utilisé la fonction delay parce qu'on me l'avait déconseillée étant donné que le programme gère des capteurs en simultané. Je devrai peut être en ajouter un juste avant d'afficher la valeur de RPM. Quel temps d'attente me conseillez vous ? 1s ?

rpm est un int. pulsein retourne un unsigned long. Au démarrage si le ventilateur est un peut lent tu dois dépasser la capacité d'un int.