Buongiorno a tutti sono alle prime armi con la programmazione arduino ho fatto un piccola programmino che allego nell'immagine qui sotto ma ho un problema. Nel punto del programma indicato con il segno arancione vorrei che rimanga fermo li fino a quando lo stato del pin 1 cambia stato e passa da high a low e poi prosegua con il resto del programma. Come poaso fare?
Se davvero ti sta bene che il programma resti bloccato in quel punto finché non cambia lo stato della pompa allora puoi fare una cosa del tipo:
while(digitalRead(2)==HIGH){};
La variabile evpompa non cambierà mai stato da sola quando tu fai:
int evpompa = digitalRead(2);
Assegni alla variabile evpompa il valore ritornato dalla funzione digitalRead, ma anche se il relativo pin cambiasse stato se tu non assegni di nuovo il valore alla variabile questa manterrà il valore memorizzato in precedenza.
Il suggerimento di prima potrebbe essere anche scritto in questo modo
while(evpompa==HIGH)
{
evpompa = digitalRead(2);
}
In questo modo continui a leggere lo stato del pin e ad essegnarlo alla variabile, quando il suo valore sarà LOW allora si esce dal ciclo while e il programma prosegue.
Piccoli accorgimenti, al posto di inserire direttamente il numero del pin nei vari punti del programma definisci una costante o, appunto, una define Es.
#define PIN_POMPA 2
...
...
digitalRead(PIN_POMPA);
In questo modo se un domani devi cambiare pin ti basta modificare la define e il programma seguirà il nuovo pin. Inoltre quando andrai a leggere il programma a distanza di tempo sarà subito più chiaro cosa stai leggendo in un determinato punto del programma, perché 2 non è molto "parlante" ![]()
Per il futuro allega il tuo codice, come previsto dal regolamento, racchiudendolo nei tag <code/> e non con un immagine. Più facile da leggere e si può copiarlo per fare le opportune verifiche
@lucapicchio: Quoto al 100% fabpolli ...
il codice NON va messo come un'immagine, in cui non è possibile fare copia/incolla, esso va messo come codice racchiudendolo tra i tag CODE (fai copia/incolla, dopo di che selezioni la parte di codice e premi l'icona <code/> nella barra degli strumenti per contrassegnarla come codice).
Guglielmo
Indovinando un po', penso che tu abbia fatto un errore nel codice e volevi fare:
int evpompa = digitalRead(1);// assegnato stato elettrovalvola a evpompa
E per fermare il codice a quel punto come ti ha già detto @fabpolli
while(digitalRead(1)==HIGH){};
chiedo scusa per non aver messo nel modo giusto il codice, grazie mille degli aiuti. ho scritto il codice in questa maniera pensate che possa andare bene?
il programma nella riga del while(evpompa==HIGH) rimane in attesa finche lo stato non cambia in LOW giusto?
inoltre vorrei sapere con il programma scritto in questo modo quando arriva alla fine programma e il pin1 è rimasto in LOW arduino rimane fermo finchè il pin1 non diventa High e così facendo fa ripartire il programma dal inizio giusto?
finito il programma seguirò i consigli e lo renderò più parlante.
//CONTROLLO MOTOPOMPA
void setup() {
// set the digital pin as output:
pinMode(1, INPUT); //ricevitore stato elettrovalvola
pinMode(2, OUTPUT); //invio consendo accensione motopompa
pinMode(3, OUTPUT); //invio input motorino d'avviamento
pinMode(4, OUTPUT); //invio input polo positivo accelleratore MAX
pinMode(5, OUTPUT); //invio input polo negativo accelleratore MAX
pinMode(6, OUTPUT); //invio input polo positivo accelleratore MIN
pinMode(7, OUTPUT); //invio input polo negativo accelleratore MIN
Serial.begin(9600); // inizio scrittura seriale
}
void loop() {
int evpompa = digitalRead(1); //assegnato stato elettrovalvola a evpompa
Serial.println(evpompa); // scrittura su seriale valore evpompa
if (evpompa == HIGH); { // se l'elettrovalvola è accesa
delay(20000); //attendi 20 secondi
digitalWrite(2, HIGH); //consenso ON motopompa
delay(2000); //attendi 2 secondi
digitalWrite(3, HIGH); //motorino avviamento ON
delay(3000); //attendi 2 secondi
digitalWrite(3, LOW); //motorino avviamento OFF
delay(60000); //attendi 60 secondi
digitalWrite(4, HIGH); //Accelleratore MAX +
digitalWrite(5, HIGH); //Accelleratore MAX -
delay(10000); //attendi 10 secondi
digitalWrite(4, LOW); // STOP INPUT Accelleratore MAX +
digitalWrite(5, LOW); // STOP INPUT Accelleratore MAX -
while(evpompa==HIGH)
{
evpompa = digitalRead(1);
}
delay(1000); //attendi 1 secondo
digitalWrite(2, LOW); //consenso OFF motopompa
delay(2000); //attendi 1 secondo
digitalWrite(6, HIGH); //Accelleratore MIN +
digitalWrite(7, HIGH); //Accelleratore MIN -
delay(10000); //attendi 10 secondi
digitalWrite(6, LOW); // STOP INPUT Accelleratore MIN +
digitalWrite(7, LOW); // STOP INPUT Accelleratore MIN -
}
}
può essere semplificato in:
while (digitalRead(1));
Il while ti bloccherà il programma in quel punto finché il pin non avrà stato diverso da HIGH.
Mentre per la seconda parte... no non rimane fermo ma il processore continuerà a far girare il loop in continuo. In pratica verrà letto di continuo lo stato del pin 1 assegnando il valore alla variabile evpompa, il suo valore verrà scritto sulla seriale e poi se sarà LOW non entrerà nell'if e il ciclo si ripeterà. Quando il valore sarà HIGH allora entrando nell'if verranno eseguite tutte le istruzioni al suo interno.
Perfetto grazie mille e proprio quello che voglio. Fino a quando lo stato del pin 1 non diventa HIGH non deve eseguire nessuna operazione. Questi giorni iniziero a fare delle prove a banco. E vi faccio sapere
Buongiorno ho modificato leggermente il codice ma mi ritrovo questo problema.
anche se non do i 5v sul PIN1 quindi dovrebbe rimanere lo stato LOW mi si accende il led nella scheda questo significa che è entrato nel ciclo IF anche con il pin1 in LOW mentre ci dovrebbe entrare solo se il PIN 1 è in HIGH cosa ho sbagliato nel codice?
//CONTROLLO MOTOPOMPA
void setup() {
// set the digital pin as output:
pinMode(1, INPUT); //ricevitore stato elettrovalvola
pinMode(2, OUTPUT); //invio consendo accensione motopompa
pinMode(3, OUTPUT); //invio input motorino d'avviamento
pinMode(4, OUTPUT); //invio input polo positivo accelleratore MAX
pinMode(5, OUTPUT); //invio input polo negativo accelleratore MAX
pinMode(6, OUTPUT); //invio input polo positivo accelleratore MIN
pinMode(7, OUTPUT); //invio input polo negativo accelleratore MIN
pinMode(LED_BUILTIN, OUTPUT); //led su scheda se acceso pin1 = HIGH
Serial.begin(9600); // inizio scrittura seriale
}
void loop() {
int evpompa = digitalRead(1); //assegnato stato elettrovalvola a evpompa
Serial.println(evpompa); // scrittura su seriale valore evpompa
digitalWrite(LED_BUILTIN, LOW); // spegni Led su scheda
delay(2000); //attendi 2 secondi
if (evpompa == HIGH); { // se l'elettrovalvola è accesa
digitalWrite(LED_BUILTIN, HIGH); // accendi Led su scheda
delay(20000); //attendi 20 secondi
digitalWrite(2, HIGH); //consenso ON motopompa
delay(2000); //attendi 2 secondi
digitalWrite(3, HIGH); //motorino avviamento ON
delay(3000); //attendi 2 secondi
digitalWrite(3, LOW); //motorino avviamento OFF
delay(60000); //attendi 60 secondi
digitalWrite(4, HIGH); //Accelleratore MAX +
digitalWrite(5, HIGH); //Accelleratore MAX -
delay(10000); //attendi 10 secondi
digitalWrite(4, LOW); // STOP INPUT Accelleratore MAX +
digitalWrite(5, LOW); // STOP INPUT Accelleratore MAX -
while(evpompa==HIGH)
{
evpompa = digitalRead(1);
}
delay(1000); //attendi 1 secondo
digitalWrite(2, LOW); //consenso OFF motopompa
delay(2000); //attendi 1 secondo
digitalWrite(6, HIGH); //Accelleratore MIN +
digitalWrite(7, HIGH); //Accelleratore MIN -
delay(10000); //attendi 10 secondi
digitalWrite(6, LOW); // STOP INPUT Accelleratore MIN +
digitalWrite(7, LOW); // STOP INPUT Accelleratore MIN -
digitalWrite(LED_BUILTIN, LOW); // spegni Led su scheda
}
}
C'è una resistenza di pull down sul pin 1?
No ho solo caricato il programma su arduino senza collegarci niente e mi aspettavo che il led rimanesse spento
Mettila.
punto e virgola di troppo.
Prima regola di Arduino, i pin "flottanti" (senza collegarci niente) hanno in input un valore a casaccio.
Devi collegare resistenza in pulldown o pullup. (non come hai fatto in foto) vedi:
"Antonio Mancuso's Blog: Pulsanti e Resistenze di Pull Up-Down con Arduino"
Perfetto adesso con la restistenza sul pin 1 per il pull down e alcune correzioni al codice sembra funzionare bene adesso proseguo con i collegenti dei relè e vediamo se funziona. Grazie mille a tutti per l'aiuto
Collegamento di moduli relè o relè, la differenza è che i relè non li puoi collegare direttamente ai pin di arduino.
Ciao.
Questi moduli relè in foto. Avrei una sola domanda. Io ho una tensione di 24vdc che controllo aul pin 1 come faccio a trasformala in 5v dc per far si che sia leggibile da arduino? A me interessa solo high e low non devo fare nessuna misurazione
Ok per il modulo relè, tieni conto che ne esistono di elettricamente isolati, il tuo non lo è.
Per ridurre i 24Vdc a 5Vdc ti conviene un accoppiatore ottico tipo PC817.
La riduzione si può fare anche con un partitore ma è rischioso fare ciò su breadboard, meglio il PC817.
Ti serve il PC817, un diodo led rosso, una resistenza da 3.9k e una da 1k.
Li hai?
Ho le resistenze il resto lo devo aquistare. Provo a cercargli online. Si riesce a trovare uno schema su come gli devo collegare insieme? Per quanto riguarda il relè cosa significa elettronicamente isolati? Che dicitura hanno quelli isolati?


