Soucis avec "millis"

Bonjour à tous, j'ai copié (désolé je suis novice en programmation) un circuit d'arrosage avec 4 sondes et 4 sorties relais avec un arduino nano. Il fonctionne parfaitement sauf un petit détail comme je voulais l'utiliser au jardin j'aimerais augmenter le temps d'arrosage de chaque sortie, le temps qui se contrôle avec la fonction millis, mais je ne peux pas augmenter de plus de 30 secondes car à partir de là le temps sur cette sortie ne s'éteint plus. Est-ce que quelqu'un a une explication? merci

#define SENSOR_READ_DELAY 86400000   //This is the loop delay for sensor reading. Its in milli seconds. set it to 86400000 for once a day.
#define FULL_MOISTURE_READING 290
#define NO_MOISTURE_READING 595
#define CUT_OFF_MOISTURE_PERCENATGE 50
#define PUMP1_WATERING_TIME 2000  //This is millis
#define PUMP2_WATERING_TIME 2000  //This is millis
#define PUMP3_WATERING_TIME 2000  //This is millis
#define PUMP4_WATERING_TIME 2000  //This is millis

int pumpPin1=2;
int pumpPin2=3;
int pumpPin3=4;
int pumpPin4=5;

int inputSensorPin1=A0;
int inputSensorPin2=A1;
int inputSensorPin3=A2;
int inputSensorPin4=A3;

void setup() 
{
  // put your setup code here, to run once:
  pinMode(pumpPin1,OUTPUT);
  pinMode(pumpPin2,OUTPUT);
  pinMode(pumpPin3,OUTPUT);
  pinMode(pumpPin4,OUTPUT);

  digitalWrite(pumpPin1,HIGH);
  digitalWrite(pumpPin2,HIGH);
  digitalWrite(pumpPin3,HIGH);
  digitalWrite(pumpPin4,HIGH);
}

void getMoisturePercentageAndWaterIt(int sensorValue, int outPinNo, int wateringTime)
{
  sensorValue = constrain(sensorValue ,FULL_MOISTURE_READING, NO_MOISTURE_READING); 
  int moisturePercentage = map(sensorValue, FULL_MOISTURE_READING, NO_MOISTURE_READING, 100, 0);

  if (moisturePercentage < CUT_OFF_MOISTURE_PERCENATGE)
  {
    digitalWrite(outPinNo, LOW);
    delay(wateringTime);
    digitalWrite(outPinNo, HIGH);
  }
}


void loop() 
{
  // put your main code here, to run repeatedly:
  int inputSensorPin1Value = analogRead(inputSensorPin1);
  getMoisturePercentageAndWaterIt(inputSensorPin1Value, pumpPin1, PUMP1_WATERING_TIME);

  int inputSensorPin2Value = analogRead(inputSensorPin2);
  getMoisturePercentageAndWaterIt(inputSensorPin2Value, pumpPin2, PUMP2_WATERING_TIME);

  int inputSensorPin3Value = analogRead(inputSensorPin3);
  getMoisturePercentageAndWaterIt(inputSensorPin3Value, pumpPin3, PUMP3_WATERING_TIME);

  int inputSensorPin4Value = analogRead(inputSensorPin4);
  getMoisturePercentageAndWaterIt(inputSensorPin4Value, pumpPin4, PUMP4_WATERING_TIME);

  delay(SENSOR_READ_DELAY);
}```

Ton souci est là:

int wateringTime est une integer, maximum 32767 d'où les 30 secondes.

Changes ta ligne ainsi:
void getMoisturePercentageAndWaterIt(int sensorValue, int outPinNo, unsigned long wateringTime)

unsigned long est le type de variable utilisée par delay();

Cordialement
jpbbricole

1 Like

Si tu utilise delay dans ta fonction getMoisturePercentageAndWaterIt, cela veut dire que si un de tes capteurs détecte moins de 50% de moisissure, tu arrête toutes détection pendant ce laps de temps.

Cela est-il vraiment ce que tu veux?

si un de tes capteurs détecte moins de 50% de moisissure humidité

@mglopes dans ton titre, tu parles de millis() mais ton code n'utilise justement pas millis(). Ce qui bloque l'exécution pendant tous les delay() qui truffes ton programme.

1 Like

Merci à tous effectivement j'ai changé le " int " par " unsigned long " et problème résolut. merci encore!!!

Bonjour, finalement j’ai voulu installer mon petit circuit à 4 sorties avec 4 capteurs pour remplacer les programmateurs horaires que j’avais dans le jardin .
En plus j’ai réussi à rajouter un LCD pour me donner la lecture des 4 sondes et j’étais bien fière lol.
Mais voilà il m’arrive une chose étrange.
Tout marche à merveille dans ma boîte jusqu’aux relais, mais dès que je branche les électrovannes, le circuit devient fou le LCD clignote et le programme saute et fait un clignotant sur la première sortie rien à voir avec le code. J’ai tout essayé j’ai même utilisé une autre source de 12 v rien que pour les électrovannes mais rien a faire dès que je branche les électrovannes le circuit devient fou.
Je n’arrive plus à comprendre sont deux circuits complètement séparés et pourtant…
Si quelqu’un peut m’aider je serai reconnaissant.
Merci les amis

Des diodes de roue libre sont-elles en place sur les électrovannes ?

Sur ce schéma le moteur M représente l'électrovanne.

Au passage, piloter des électrovannes 12V peut se faire avec un simple transistor, sans relais :

Tout dépend de la puissance requise.

2 Likes

merci mon ami effectivement il a suffit de poser les diodes et probleme resolue!!!

Ok. Cela prouve au moins que tu les as posées dans le bon sens.
Bonne continuation.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.