Je cherche à ouvrir un obturateur d'appareil photo pendant une durée calculée à partir de la tension aux bornes d'une photorésistance (temps de pose de l'ordre de la minute).
Je pensais mon programme terminé, mais malgré mes modifs, il demeure très instable.
Il peut fonctionner quelques fois, mais de façon aléatoire il peut aussi buguer définitivement (m'obliger à éteindre l'arduino pour recommencer) ou bien le servo rester bloqué à 120 au delà de la valeur calculée dans temps_ms, ou bien encore activer le servo pendant qq millisecondes seulement...
Il semble qu'il y ait des problèmes de compatibilité dans la gestion des tâches entre millis() et le bouton poussoir, ou quelque chose comme çà.
Mais je vous avoue que là je suis complètement perdu...
Je vous joins le code entier.
Merci de m'aider à nouveau
// paramètres divers
int pin_button = 4;
int pin_LDR = A0; // port numérique lié à la photorésistance
int pin_servo = 13;
float valeur; //variable de type entier « valeur » (nombre compris en 0 et 1023)
float Rp; //valeur de la photorésitance (en ohm)
float temps_s;
float temps_ms; // conversion pour l'arduino
// paramètres afficheur
int digit1 = 10;
int digit2 = 11;
int digit3 = 12;
int segA = 9;
int segB = 2;
int segC = 3;
int segD = 5;
int segE = 6;
int segF = 8;
int segG = 7;
// librairies
#include <Servo.h>
#include <math.h>
Servo servo; // création de l'objet "servo"
unsigned long tempsAfficheur; // Temps de l'action de l'afficheur
unsigned long servoTempo = 6000; // Temps de l'action du servo
unsigned long servoMillis = 0; // Chrono pour l'action du servo, si > 0 = servo en action
void setup()
{
Serial.begin(9600);
pinMode(pin_button, INPUT_PULLUP);
pinMode(pin_LDR, INPUT); // réglage du port de la photorésistance en mode ENTREE
servo.attach(pin_servo);
servo.write(120); // Servo mis au repos
// afficheur :
pinMode(segA, OUTPUT);
pinMode(segB, OUTPUT);
pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT);
pinMode(segE, OUTPUT);
pinMode(segF, OUTPUT);
pinMode(segG, OUTPUT);
pinMode(digit1, OUTPUT);
pinMode(digit2, OUTPUT);
pinMode(digit3, OUTPUT);
}
void loop()
{
//--------------------------------- Partie bouton
if (servoMillis == 0 && (digitalRead(pin_button) == LOW)) // Si servo pas actif et bouton pressé
{
tempsAfficheur=millis();
Serial.println("ON");
valeur = analogRead(pin_LDR);
//Serial.println(valeur);
Rp=10000*(1024/valeur-1); // calculée à partir du pont diviseur
//Serial.println(Rp);
temps_s=0.0005741*pow(Rp,1.35); // caractéristique de la photorésistance
Serial.println("temps mesure:");
Serial.println(temps_s);
if (temps_s >= 2400 ) temps_s=temps_s*8;
if ((temps_s >= 1200) && (temps_s < 2400) ) temps_s=temps_s*6;
if ((temps_s >= 600) && (temps_s < 1200) ) temps_s=temps_s*5;
if ((temps_s >= 300) && (temps_s < 600) ) temps_s=temps_s*4;
if ((temps_s >= 120) && (temps_s < 300) ) temps_s=temps_s*3;
if ((temps_s >= 45) && (temps_s < 120) ) temps_s=temps_s*2.5;
if ((temps_s >= 15) && (temps_s < 45) ) temps_s=temps_s*2;
if ((temps_s >= 5) && (temps_s < 15) ) temps_s=temps_s*1.5;
if ((temps_s >= 1) && (temps_s < 5) ) temps_s=temps_s*1.25;
temps_s = round(temps_s);
Serial.println("temps corrige:");
Serial.println(temps_s);
temps_ms=temps_s*1000;
while( (millis() - tempsAfficheur) < 4000) {
displayNumber(temps_s);
}
servo.write(90); // Rotation du servo
servoMillis = millis(); // Démarrage du chrono
}
//--------------------------------- Partie temporisation
if (servoMillis > 0 && (millis() - servoMillis >= temps_ms)) // Si servo actif et arrivé à échéhence
{
Serial.println("OFF");
servo.write(120); // Servo mis au repos
servoMillis = 0; // Servo plus en action
}
}
void displayNumber(int toDisplay) {
#define DISPLAY_BRIGHTNESS 1000
#define DIGIT_ON HIGH
#define DIGIT_OFF LOW
for(int digit = 3 ; digit > 0 ; digit--) {
//Turn on a digit for a short amount of time
switch(digit) {
case 1:
digitalWrite(digit1, DIGIT_ON);
break;
case 2:
digitalWrite(digit2, DIGIT_ON);
break;
case 3:
digitalWrite(digit3, DIGIT_ON);
break;
}
//Turn on the right segments for this digit
lightNumber(toDisplay % 10);
toDisplay /= 10;
delayMicroseconds(DISPLAY_BRIGHTNESS); //Display this digit for a fraction of a second (between 1us and 5000us, 500 is pretty good)
//Turn off all digits
digitalWrite(digit1, DIGIT_OFF);
digitalWrite(digit2, DIGIT_OFF);
digitalWrite(digit3, DIGIT_OFF);
}
}
//Given a number, turns on those segments
//If number == 10, then turn off number
void lightNumber(int numberToDisplay) {
#define SEGMENT_ON LOW
#define SEGMENT_OFF HIGH
switch (numberToDisplay){
case 0:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_OFF);
break;
case 1:
digitalWrite(segA, SEGMENT_OFF);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_OFF);
break;
case 2:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_OFF);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_ON);
break;
case 3:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_ON);
break;
case 4:
digitalWrite(segA, SEGMENT_OFF);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 5:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 6:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 7:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_OFF);
break;
case 8:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 9:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 10:
digitalWrite(segA, SEGMENT_OFF);
digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_OFF);
digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_OFF);
break;
}
}