Serial monitor help please!

I am working on a plant watering sistem,and i have been trying to test some values,so i coded the value of the 3 sensors to print every hour,but it doesnt seem to work,it works with most of the values smaller than that,but on 1 hour it doesnt,is there any error with my code? how can i fix it? (dont mind the comments)

// Definirea pinilor senzorilor și a altor pini
const int SENZOR1 = A0;
const int SENZOR2 = A1;
const int SENZOR3 = A2;
int threshold1 = 500; // prag pentru media senzorilor
int pumpPin = 13; // pin pentru pompă
int ledPin = 11; // pin pentru led
unsigned long MA = millis(); // Timpul anterior în milisecunde

void setup() {

  Serial.begin(9600); // Inițializare comunicare Serial
  pinMode(pumpPin, OUTPUT); // Setare tip de pin pentru pompă
  pinMode(ledPin, OUTPUT); // Setare tip de pin pentru led
  
}

void loop() {

    // Citirea valorilor analogice ale senzorilor
  int SENZOR1 = analogRead(A0); // Citire valoare senzor1
  int SENZOR2 = analogRead(A1); // Citire valoare senzor2
  int SENZOR3 = analogRead(A2); // Citire valoare senzor3

  int SA = SENZOR1 + SENZOR2 + SENZOR3; // Adunarea valorilor senzorilor
  int MSA = SA / 3 ; // Calcularea mediei valorilor senzorilor
  
  unsigned long timpprezent = millis(); // Timp curent în milisecunde



  // Dacă a trecut o oră de la ultima afișare în Serial Monitor, afișează MSA
  if (timpprezent - MA > 36*100000) {
    Serial.println(MSA); // Afișează media senzorilor adunați în Serial Monitor
    MA = timpprezent; // Actualizare timp anterior
  }



  

  // Dacă a trecut 15 secunde de la ultima măsurare
  if (timpprezent - MA > 15000) {
    
    // Verifică dacă MSA este mai mare decât pragul threshold1
    if (MSA > threshold1) {

     digitalWrite(pumpPin, HIGH); // Aprinde pompă
     digitalWrite(ledPin, HIGH); // Aprinde led
     delay(5000); // Așteaptă 5 secunde
     digitalWrite(pumpPin, LOW); // Oprire pompă
     digitalWrite(ledPin, LOW); // Oprire led

     MA = timpprezent; // Actualizare timp anterior

    } else {
       digitalWrite(pumpPin, HIGH); // Aprinde pompă
       digitalWrite(ledPin, HIGH); // Aprinde led
       delay(2500); // Așteaptă 2.5 secunde
       digitalWrite(pumpPin, LOW); // Oprire pompă
       digitalWrite(ledPin, LOW); // Oprire led

       MA = timpprezent; // Actualizare timp anterior
    } 
  }
}

Try as:

 if (timpprezent - MA > 36*100000ul) {

You are resetting your variable MA elsewhere in your code. You should have separate variables for your report timing vs. your other timing so they don't interfere

1 Like

holy..thank you so much i just realised how dumb i was,thank you so much!

I use a different variant for non-blocking timing which has three advantages

  1. _
    per timer write just two lines of code
    a. declaring a variable
    b. just one line for the time-checking (updating the timer is done automatically

  2. since you are forced to use its own variable for each timing-process the bug that you had can not occur

  3. code is easier to read

// Definirea pinilor senzorilor și a altor pini
const int SENZOR1 = A0;
const int SENZOR2 = A1;
const int SENZOR3 = A2;
int threshold1 = 500; // prag pentru media senzorilor
int pumpPin = 13; // pin pentru pompă
int ledPin = 11; // pin pentru led

//pentru fiecare timp-proces declare este propria variabilă de tip unsigned long
unsigned long cronometrul_meu_orar;
unsigned long cronometrul_meu_scurt;

void setup() {
  Serial.begin(9600); // Inițializare comunicare Serial
  pinMode(pumpPin, OUTPUT); // Setare tip de pin pentru pompă
  pinMode(ledPin, OUTPUT); // Setare tip de pin pentru led
}

void loop() {

    // Citirea valorilor analogice ale senzorilor
  int SENZOR1 = analogRead(A0); // Citire valoare senzor1
  int SENZOR2 = analogRead(A1); // Citire valoare senzor2
  int SENZOR3 = analogRead(A2); // Citire valoare senzor3

  int SA = SENZOR1 + SENZOR2 + SENZOR3; // Adunarea valorilor senzorilor
  int MSA = SA / 3 ; // Calcularea mediei valorilor senzorilor
  
  unsigned long timpprezent = millis(); // Timp curent în milisecunde

  // Dacă a trecut o oră de la ultima afișare în Serial Monitor, afișează MSA
  // verifica dacă au trecut 3600 secunde de la ultima dată când a 
  // expirat variabila cronometru „cronometrul_meu_orar”
  if ( TimePeriodIsOver(cronometrul_meu_orar,36 * 100000ul) ) {
    // dacă AU trecut cu adevărat 3600 secunde
    // variabila „cronometrul_meu_orar” este actualizată automat
    Serial.println(MSA); // Afișează media senzorilor adunați în Serial Monitor
  }

  // Dacă a trecut 15 secunde de la ultima măsurare
  // verifica dacă au trecut 15 secunde de la ultima dată când a 
  // expirat variabila cronometru „cronometrul_meu_scurt”
  if ( TimePeriodIsOver(cronometrul_meu_scurt,15000ul) ) {
    // dacă AU trecut cu adevărat 15 secunde
    // variabila „cronometrul_meu_scurt” este actualizată automat
    
    // Verifică dacă MSA este mai mare decât pragul threshold1
    if (MSA > threshold1) {

     digitalWrite(pumpPin, HIGH); // Aprinde pompă
     digitalWrite(ledPin, HIGH); // Aprinde led
     delay(5000); // Așteaptă 5 secunde
     digitalWrite(pumpPin, LOW); // Oprire pompă
     digitalWrite(ledPin, LOW); // Oprire led
    } 
    else {
       digitalWrite(pumpPin, HIGH); // Aprinde pompă
       digitalWrite(ledPin, HIGH); // Aprinde led
       delay(2500); // Așteaptă 2.5 secunde
       digitalWrite(pumpPin, LOW); // Oprire pompă
       digitalWrite(ledPin, LOW); // Oprire led
    } 
  }
}

// easy to use helper-function for non-blocking timing
// Funcție de ajutor ușor de utilizat pentru sincronizare non-blocare
boolean TimePeriodIsOver (unsigned long &startOfPeriod, unsigned long TimePeriod) {
  unsigned long currentMillis  = millis();
  if ( currentMillis - startOfPeriod >= TimePeriod ) {
    // more time than TimePeriod has elapsed since last time if-condition was true
    // a trecut mai mult timp decât TimePeriod de la ultima dată dacă condiția a fost adevărată
    startOfPeriod = currentMillis; // a new period starts right here so set new starttime
    return true;                   // o nouă perioadă începe chiar aici, așa că setați o nouă oră de început
  }
  else return false;            // actual TimePeriod is NOT yet over
                                // real TimePeriod (Perioada de timp) NU s-a terminat încă
}

best regards Stefan

1 Like

Thank you!! The comments help,i will definitely try this approach! :slightly_smiling_face:

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