Bonjour,
je voulais programmer mon Arduino pour suivre le schéma suivant :
Il faut que l'arduino envoie un signal pour allumer un gyrophare si la température reçue
(par un capteur de température) est au dessus de 28°C pendant 3h. Il faut cependant ajouter un programme qui met en pause (pendant 5H) le programme précédent quand elle reçoit un signal de 5V."
J'ai donc écrit le programme suivant (quelques valeurs ont été changées pour le tester) :
// Constantes
const int brocheGyrophare = 7;
const int brocheCapteur = 2;
const int seuilTemp = 24;
const int tempsAlarme = 10800; // 3 heures en millisecondes
const int tempsPause = 18000000; // 5 heures en millisecondes
const float T0 = 25 + 273.15;
const float RT0 = 10000;
const float R0 = 10000;
const float B = 3977;
// Variables
float temperature;
bool alarme = false;
unsigned long tempspasse = 0;
unsigned long temps = 0;
unsigned long intervalle = 0;
#define B 3977 // ntc b constant
#define RESISTOR 10000 // résistance de la résistance, 10 kOhm
#define THERMISTOR 10000 // résistance nominale de la thermistor, 10 kOhm
#define NOMINAL 25 // température nominale
#define sensor A0
void setup() {
// Initialisation des broches
pinMode(brocheCapteur, INPUT);
pinMode(brocheGyrophare, OUTPUT);
pinMode(sensor, INPUT);
Serial.begin(9600);
}
void loop() {
if(alarme){Serial.println("alarme=vraie");}
else{Serial.println("alarme=fausse");}
// Lecture de la température
int t = analogRead(sensor);
float tr = 1023.0 / t - 1;
tr = RESISTOR * tr;
Serial.print("R=");
Serial.print(tr);
Serial.print(", t=");
float temperature;
temperature = tr / THERMISTOR;
temperature = log(temperature);
temperature /= B;
temperature += 1.0 / (NOMINAL + 273.15);
temperature = 1.0 / temperature;
temperature -= 273.15;
Serial.println(temperature);
// Vérification de la température
if (temperature > seuilTemp) {
tempspasse=millis()-temps;
intervalle = intervalle+tempspasse;
Serial.println(intervalle);
if (!alarme && (intervalle >= tempsAlarme)) {
// Alarme déclenchée
alarme = true;
intervalle=0;
digitalWrite(brocheGyrophare, HIGH);
}
} else {
intervalle = 0;
if (alarme) {
// Alarme terminée
alarme = false;
digitalWrite(brocheGyrophare, LOW);
}
}
// Vérification du signal de pause
if (digitalRead(brocheCapteur) == HIGH) {
// Signal de pause reçu
alarme = false;
digitalWrite(brocheGyrophare, LOW);
delay(tempsPause);
}
temps=millis();
}
Mon problème est que le calcul de temps est très imprécis (environ 3 secondes pour 10 secondes). Auriez vous une idée d'où cela peut venir ?
Merci, Léopold
