Mi servirebbe un aiuto per un comando

Salve a tutti sono nuovo e come nuovo non intendo solo nel sito.. ma anche in questo campo.
Da due giorni ho iniziato il mio approccio con arduino, stavo facendo un progettino e direi che tutto va bene soltanto mi servirebbe sapere come faccio a raggruppare un insieme di sequenze senza ripetere il comando più volte.
Chiedo di scusarmi per il programma non accellente smiley-yell ahahahaha

ì

 const int sensorPin=A0;
const int analogPin = A1;
int ledPin1  = 8;
int ledPin2  = 9;
int ledPin3 = 10;
int sensorValue = 0;
int fotoValue = 0;
int piezo = 11;


void setup()
{
  Serial.begin(9600);
  {
    pinMode(analogPin,INPUT);
    pinMode(sensorPin,INPUT);
    pinMode(ledPin1, OUTPUT);
    pinMode(ledPin2, OUTPUT);
    pinMode(ledPin3, OUTPUT);
    pinMode(piezo,   OUTPUT);
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, LOW);
   
   
}
}

void loop()
{
  Serial.flush();
  delay(1000);
  sensorValue = analogRead(sensorPin);
  fotoValue   = analogRead(analogPin);
  Serial.print("Umidità:"); 
  Serial.println(sensorValue);
  Serial.print("                   Lumen:"); 
  Serial.println(fotoValue);


if (sensorValue<270){
  digitalWrite(ledPin1, HIGH);
  digitalWrite(ledPin2,  LOW);
  digitalWrite(ledPin3,  LOW);}
 

if ((sensorValue>271)&&(sensorValue<680)){
   digitalWrite(ledPin1,  LOW);
   digitalWrite(ledPin2, HIGH);
   digitalWrite(ledPin3,  LOW);}
 
 
if (sensorValue>681){
  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, HIGH);}

if ((sensorValue<270)&&(fotoValue>900)){
    digitalWrite(piezo, HIGH); 
    delayMicroseconds(500);  
    digitalWrite(piezo, LOW); 
    delayMicroseconds(500); 
    digitalWrite(piezo, HIGH); 
    delayMicroseconds(500);  
    digitalWrite(piezo, LOW); 
    delayMicroseconds(500);   
    digitalWrite(piezo, HIGH); 
    delayMicroseconds(500);  
    digitalWrite(piezo, LOW); 
    delayMicroseconds(500);   
    digitalWrite(piezo, HIGH); 
    delayMicroseconds(500);  
    digitalWrite(piezo, LOW); 
    delayMicroseconds(500);   
    digitalWrite(piezo, HIGH); 
    delayMicroseconds(500);  
    digitalWrite(piezo, LOW); 
    delayMicroseconds(500);   
    digitalWrite(piezo, HIGH); 
    delayMicroseconds(500);  
    digitalWrite(piezo, LOW); 
    delayMicroseconds(500);  
    digitalWrite(piezo, HIGH); 
    delayMicroseconds(500);  
    digitalWrite(piezo, LOW); 
    delayMicroseconds(500);   
    digitalWrite(piezo, HIGH); 
    delayMicroseconds(500);  
    digitalWrite(piezo, LOW); 
    delayMicroseconds(500);   
    digitalWrite(piezo, HIGH); 
    delayMicroseconds(500);  
    digitalWrite(piezo, LOW); 
    delayMicroseconds(500); 
    digitalWrite(piezo, HIGH); 
    delayMicroseconds(500);  
    digitalWrite(piezo, LOW); 
    delayMicroseconds(500); 
    digitalWrite(piezo, HIGH); 
    delayMicroseconds(500);  
    digitalWrite(piezo, LOW); 
    delayMicroseconds(500);   
    digitalWrite(piezo, HIGH); 
    delayMicroseconds(500);  
    digitalWrite(piezo, LOW); 
    delayMicroseconds(500);   
    digitalWrite(piezo, HIGH); 
    delayMicroseconds(500);  
    digitalWrite(piezo, LOW); 
    delayMicroseconds(500);   
    digitalWrite(piezo, HIGH); 
    delayMicroseconds(500);  
    digitalWrite(piezo, LOW); 
    delayMicroseconds(500);   
    digitalWrite(piezo, HIGH); 
    delayMicroseconds(500);  
    digitalWrite(piezo, LOW); 
    delayMicroseconds(500);  
    digitalWrite(piezo, HIGH); 
    delayMicroseconds(500);  
    digitalWrite(piezo, LOW); 
    delayMicroseconds(500);   
    digitalWrite(piezo, HIGH); 
    delayMicroseconds(500);  
    digitalWrite(piezo, LOW); 
    delayMicroseconds(500);   
    digitalWrite(piezo, HIGH); 
    delayMicroseconds(500);  
    digitalWrite(piezo, LOW); 
    delayMicroseconds(500);       
    digitalWrite(piezo, HIGH); 
    delayMicroseconds(500);  
    digitalWrite(piezo, LOW); 
    delayMicroseconds(500); 
    digitalWrite(piezo, HIGH); 
    delayMicroseconds(500);  
    digitalWrite(piezo, LOW); 
    delayMicroseconds(500);   
    digitalWrite(piezo, HIGH); 
    delayMicroseconds(500);  
    digitalWrite(piezo, LOW); 
    delayMicroseconds(500);   
    digitalWrite(piezo, HIGH); 
    delayMicroseconds(500);  
    digitalWrite(piezo, LOW); 
    delayMicroseconds(500);   
    digitalWrite(piezo, HIGH); 
    delayMicroseconds(500);  
    digitalWrite(piezo, LOW); 
    delayMicroseconds(500);   
    digitalWrite(piezo, HIGH); 
    delayMicroseconds(500);  
    digitalWrite(piezo, LOW); 
    delayMicroseconds(500);  
    digitalWrite(piezo, HIGH); 
    delayMicroseconds(500);  
    digitalWrite(piezo, LOW); 
    delayMicroseconds(500);   
    digitalWrite(piezo, HIGH); 
    delayMicroseconds(500);  
    digitalWrite(piezo, LOW); 
    delayMicroseconds(500);   
    digitalWrite(piezo, HIGH); 
    delayMicroseconds(500);  
    digitalWrite(piezo, LOW); 
    delayMicroseconds(500);       
    

}
}

Grazie in anticipo per l'aiuto smiley

di solito la cosa giusta è mettere vicino a i simboli > < il simbolo = quando si fa una verifica
maggiore o uguale a.... oppure minore o uguale a.....

es: in questa riga
if ((sensorValue>271)&&(sensorValue<680))......

se hai letture di 271 oppure 680 non "succede nulla"

per far il resto va usata millis (e soprattutto studiata && compresa)
ma se metti un delay (1000) nel loop si fermerà tutto lo stesso per un secondo :roll_eyes:

puoi usare molti blink senza delay (programma dell'ide)

es uno con un ritardo di un secondo per il serial print,
e l'altro per il piezo,
se aggiusti bene il tutto hai un solo serial print ogni secondo ( stampate a raffica sul serial monitor non sono utili)

@Luca, ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento

Il cross-posting è vietato. O chiedi aiuto in italiano o in inglese.
Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare, altrimenti parte del codice viene mostrato male o può mancare.

Se ho capito bene, tu vuoi ridurre il codice no?

Allora puoi usare un funzione, che definirai in fondo al codice del loop() :

void loop() {
....
....
.....
}

void blink() {
    digitalWrite(piezo, HIGH); 
    delayMicroseconds(500);  
    digitalWrite(piezo, LOW); 
    delayMicroseconds(500); 
}

Che richiamerai all'interno dell'ultimo if(..), all'interno di un ciclo while(..)
Così ad ogni iterazione, while richiama la funzione blink() e il piezo reagisce.

Spero di aver capito bene... :grin:

Si, mi sembra @Ale abbia capito.
Aggiungo che la sua blink() la dovrai ripetere nel tuo caso (se ho contato bene) 27 volte

void loop()
{ for(int i=1;i<=27;i++)
  { blink();
  }
}

Tieni anche conto di quel che ti suggerisce @elrospo. Se sei agli inizi o il bloccante della delay non ti da noia allora okay, ma poi dovrai imparare ad usare la millis() studiando esempio BlinkWithoutDelay

Grazie mille a tutti.. gentilissimi!! :slight_smile:
Comunque è da pochissimo che sto cercando entranto in questo "mondo" :smiley: direi meno di una settimana..eheheh lo so.. ho molto da studiare ma non mi scoraggio!!!
@nid ora seguirò i tuoi consigli e.. appena avrò finito con il progettino sarò felice di mostrarvelo ovviamente nella "sezione giusta" ahahah :wink:

Già che ci siamo vi chiedo un'altra cosa vediamo se ne sapete qualcosa in riguardo o ho sbagliato io qualcosa.
Con i campioni prelevati da "A0" ho dei problemi.. praticamente non rileva ciò che avviene realmente.. bensì mi prende dei valori che partono da 0 fino a 1023 a "casaccio" però sembra seguire una "scala" perchè va dal più piccolo sino al più grande

Ma che sensori vuoi leggere? Come li hai collegati ?

Alcuni consigli nel codice.
-Per ogni pin puoi dichiarare "const byte" e mettere chiaramente nel nome pin (vedi piezo che in realtà sarebbe meglio piezoPin) e quindi anche

int ledPin1  = 8;

puoi metterlo come

const byte ledPin1  = 8;

-Nella setup, dopo il Serial.begin metti una aperta graffa che non serve (togli lei e quella che la chiude), sono 2 graffe inutili.

Grazie comunque ti spiego tutto il progetto cosi ti do una visione chiara di ciò che voglio fare..
Praticamente sto facendo un controllo di umidità per gli esami di stato ( che ho domani ahahah ) dove, a valori minori di 270, arduino deve accendermi un led rosso che sta ad indicare che il terreno è secco. A valori compresi tra 271 e 680 mi accenderà un led verde per indicare che l'acqua nel vaso è in quantita esatta, a valori maggiori di 680 un led blu che mi sta a indicare più acqua del dovuto. Poi ho una fotoresistenza ed un piezo che mi vanno a servire per fare: in caso di terreno secco quindi con valori minori di 270 ( sensore di umidità) e valori maggiori di 900 (fotoresistenza) cioè che abbiamo il sole che minaccia la "piantina" nel vaso, deve scattare un allarme, per avvisarmi che devo mettere l'acqua alla pianta sennò si rischia di farla morire.. spero sia stato chiaro. Prima di violare qualche regola ti chiedo se posso pubblicare il link del sito da cui ho preso ispirazione e li puoi vedere come ho collegato il tutto.

Si, puoi mettere i link. Ma la cosa che preme sapere è esattamente quale sensore di umidità usi e come lo hai collegato.
Ed anche la fotoresistenza come l'hai collegata.
Perchè se il sensore di umidità ti da dei valori strani secondo me lo hai collegato in maniera errata.

Ecco di seguito i link del sensore di umidità e quello per la fotoresistenza..
http://www.danilolarizza.com/sensore-di-umidita-terreno-con-arduino/

Cosa te ne pare?
Ah dimenticavo fino a ieri pomeriggio quando ancora avevo sviluppato solo la prima parte di programma (soltanto il controllo di umidità sarebbe a dire) tutto regolare, dopodichè in serata ho completato il programma e sono iniziati i problemi... quindi non so.. forse ho smosso qualcosa e c'è qualche falso contatto, o cosa improbabile credo.. vada in conflitto qualcosa nel programma.

Prova a togliere momentaneamente tutta la parte che hai nell'if

if ((sensorValue<270)&&(fotoValue>900)){

niente continua a dare valori insensati.. ho appena fatto caso che..a valore "basso" nel sensore di umidità viene letto anche nella foto resistenza un valore basso..

Prova allora a commentare questo:

// fotoValue   = analogRead(analogPin);

così è come se non ci fosse.

niente continua a dare valori insensati.. ho appena fatto caso che..a valore "basso" nel sensore di umidità viene letto anche nella foto resistenza un valore basso..

Sta facendo due letture consecutive su A0 e subito dopo su A1, è stato detto un sacco di volte che il multiprexer sugli ADC passando da un input ad un altro resta ancora memorizzato il valore del pin precedente e che impiegano un certo tempo per raggiungere il nuovo valore, perciò va fatta una lettura a vuoto, il curcuito ADC è uno solo e deve gestire 8 input, poi non sarebbe male fare una media di 10-20 valori, ad esempio fare un for di 10 letture, memorizzare le ultime 8 e fare una media di queste 8.

Per fortuna era un problema hardwer dovuto a qualche falso contatto.. Ringrazio tutti comunque per l'aiuto che mi avete offerto..
Prossimamente caricherò le foto del progetto :smiley: