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
}
}
}
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
I use a different variant for non-blocking timing which has three advantages
_
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
since you are forced to use its own variable for each timing-process the bug that you had can not occur
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ă
}