Funzionamento analogread e digitalwrite

Scusate, un dubbio sul funzionamento di arduino 1 R3: In uno sketch ho impostato una istruzione digitalwrite(13,high) che comanda un relè con un determinato delay se il valore di analogread di un pin supera una determinata soglia.
Mi sembra che non lo faccia sempre... che il valore di analogread supera la soglia ma l'istruzione viene eseguita in ritardo rispetto al delay impostato o eseguita quando analogread supera di nuovo la soglia. me ne sono accorto perchè ho controllato sul monitor seriale.
Chiedo se questo può accadere normalmente (e in tal caso se ci sono soluzioni per evitarlo) o indica un problema della scheda o del relè, e se esiste un modo per capire il motivo

:warning:
Ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato. Grazie.

@simonesq : ma che fai .. mi sbagli pure sezione del forum ? :open_mouth:

Guglielmo

... senza vedere il codice è difficile da dire, però rammenta che il delay() è bloccante e NULLA viene fatto durante il delay() quindi, magari, il valore analogico varia, a tu stai fermo nel delay() ... :roll_eyes:

Guglielmo

Il codice posso inviarlo martedì, comunque era semplice, del tipo
...

if analogRead(A5) >100
{
delay(200);
digitalwrite(13,high);
delay(3000);
digitalwrite(13,low);
}

il fatto è che prima mi sembrava più preciso... ho il dubbio che è perchè ho fatto qualcosa io a livello hardware per cui la scheda non è più affidabile come prima

Il codice ha un errore, la cosa giusta da fare è

if (analogRead(A5) >100)
{
delay(200);
digitalwrite(13,high);
delay(3000);
digitalwrite(13,low);
}

Saluti

@anon90500195: buonasera, essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del regolamento di detta sezione (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO.

Grazie.

Guglielmo

Sì è vero, sono andato a memoria, non ho il programma installato dal pc da cui scrivo e quindi non lo ho controllato. nello sketch è scritto come tu hai corretto altrimenti non avrei potuto nemmeno caricarlo, mi avrebbe dato errore

Si ho letto la presentazione, infatti nel post #7 Guglielmo si riferisce all'utente @anon90500195.

Se quel codice corrisponde a quello che hai scritto tu allora il comportamento dello sketch è corretto. I delay si sommano, quindi nel loop() ci sono due delay, 200ms + 3000ms = 3200ms (~3.2s).
La lettura da A5 avviene ogni 3.2s in questi 3.2s A5 può assumere qualunque valore. Comunque è meglio che posti tutto il codice così si capisce come intervenire.

Ciao.

Si, meglio, anche se l'istruzione fondamentalmente è quella... vabbè ... martedì.
grazie intanto della disponibilità

Scusa, senza offesa, ma non posti il codice completo e dai solo una indicazione generica del circuito. Posta anche uno schema dei collegamenti. In questa frase successiva al tuo primo post parli di modifiche hw. Quali?
Senza info precise non possiamo aiutarti. Mi pare ovvio.

1 Like

Come avevo detto potevo riportare il codice solo oggi, eccolo

void setup() {
 Serial.begin(9600);
 pinMode(13, OUTPUT);
 
}

void loop()
 
 {  if (analogRead(A3)> 5)
  {
Serial.println(analogRead(A3));
  }
  
    if (analogRead(A3) > 100) {
      
  delay(200); 
  digitalWrite(13, HIGH);  
  delay(3000); 
  digitalWrite(13, LOW);
  delay(3000);
    
  }
   
}

Il pin A3 misura la tensione (fra pin e Ground) ai capi di una resistenza.
La tensione ai capi della resistenza dipende da un circuito alimentato da un relè normalmente chiuso. quando digitalwrite 13 è HIGH il relè apre il circuito.
poichè quando il circuito è chiuso un po' di tensione sul pin A3 c'è sempre, ho impostato che vedo a monitor solo se il valore è maggiore di 5 ... ripeto prima funzionava perfettamente, ho un dubbio sul funzionamento della scheda.
spero di essermi chiarito

Devi fare due misure per sapere bene chectensioni hai e che cosa misura il tuo arduino

Vedrai che se ne esce...

Devi premere nell'ide CTRL+T per formattare il codice e poi copia e incolla sul forum. Per chiarezza posta uno schema anche disegnato a matita.

Nota anche che > 5 può essere anche 100.

Non ti preoccupare di questo al momento hai cose più importanti da affrontare, ad esempio il codice è pessimo, concentrati su questo.

Ciao.

Il codice fa quello che gli chiedo, per esempio quei delay hanno un motivo preciso... per il resto è talmente elementare che non mi viene come si possa fare altrimenti.
La soglia analogread(A3) > 5 mi serve solo per non vedere sul monitor valori che non mi interessano.
Ripeto, funzionava bene, adesso mi è capitato che il valore era maggiore di 100 e non apriva il relè, o lo apriva troppo tardi, mi sembra anche meno ripetibile.
ho un dubbio sull'affidabilità della scheda... magari per qualcosa che ho fatto

void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}

void loop() {  
  if (analogRead(A3)> 5)  {
    Serial.println(analogRead(A3));
  }
  
  if (analogRead(A3) > 100) { // (1)
    delay(200); 
    digitalWrite(13, HIGH);  
    delay(3000); // (2)
    digitalWrite(13, LOW);
    delay(3000);  // (3)
  }
}
1) Se A3 > 100 vero {
2)    attendi(200ms);
3)    accendi(13);
4)    attendi(3s);
5)    spegni(13);
6)    attendi(3s);
}

Quando A3 > 100 passano 6.2 secondi prima che la riga 1 venga nuovamente eseguita. Alla riga 5 il circuito si chiude e passano 3 secondi prima che la riga 1 venga eseguita. Se A3 non è mai maggiore di 100 il codice dalla riga 2 alla 6 non viene mai eseguito.

Dove vedi scritto delay(3000) la cpu esegue questa riga per 3 secondi e non esegue altro codice.

Se quanto detto è superfluo allora non escludo un problema hardware.

PS: Ti avevo chiesto di formattare il codice con CTRL+T e poi postare, ma non lo hai fatto e l'ho fatto io per te.

Ciao.

quei tempi di attesa sono voluti: il primo (200 ms) mi serve per verificare il corretto funzionamento di uno strumento che uso (lo modifico a secondo delle necessità); il secondo è un tempo di attesa che mi sta bene dopo che il relè ha aperto il circuito; il terzo è necessario perchè alla richiusura del circuito il transitorio determina un aumento di "A3"oltre la soglia, conseguirebbe "digitalWrite(13, HIGH)" che riaprirebbe automaticamente il circuito dopo 200 ms. sicuramente il transitorio dura molto meno, ma se il delay dura 3 secondi non è un problema.
ripeto, quei tempi di attesa sono voluti e ininfluenti sulle misure.
Per quanto riguarda il codice... ok qualche riga vuota, non conoscevo ctrl+T, mi torna utile, grazie, ma non ci sono errori, viene correttamente eseguito.

Giungo al punto.. inutile girarci intorno: alcuni giorni fa involontariamente invece di collegare un estremo della resistenza al ground di Arduino ho collegato i 5 V... poche frazioni di secondo, me ne sono accorto subito .. ma è successo, lo ammetto ... chiedo se questo può provocare i problemi che riferisco: misure di "A3" meno ripetibili rispetto a prima, delay mggiore di quello impostato e non ripetibile.
in caso affermativo chiedo inoltre se per risolvere in questi casi è necessario sostituire Arduino o magari è sufficiente sostituire il bootloader. per il mancato rispetto del tempo di apertura potrebbe essere anche il relè, sostituirò anche quello.

Riguardo al CTRL+T oltre ad essere utile per se stessi è fondamentale per gli altri con cui condividi il codice. Ad esempio se il programma è grande e non formattato io non ci dedico un secondo a leggerlo, tanto non ci capirei nulla.

Riguardo all'errore di collegamento della resistenza non avendo schema non posso dire nulla. Posso solo ipotizzare che al pin A3 sia arrivato 5Vdc attraverso la resistenza e non è un problema. Non avendo lo schema potrei anche ipotizzare che hai collegato la bobina del relay direttamente al pin 13 e questo si che porta al guasto, ma anche altre conseguenze e anomalie.

Posso anche ipotizzare che la corrente assorbita sia troppo elevata e arduino si resetta e riavvia.

Fammi cessare di ipotizzare, posta lo schema di collegamento e poi argomentiamo.

PS: molti si aspettano da delay un comportamento diverso da quello che ha, per questo mi sono concentrato sul delay.

Ciao.

Se un programma è grande la formattazone è necessaria, qui sono poche righe, è molto semplice.
I 5 V dc sul ground ahimè li ho portati direttamente, nessuna resistenza interposta.
avevo fatto delle prove per avere la tensione di riferimento a 2,5 V usando due resistenze uguali in serie fra 5V e ground, mi sono distratto e ho sbagliato a spostare un collegamento.. è successo.
ho appena ordinato un nuovo arduino... faccio prima.. almeno imparo a stare attento.
Ringrazio comunque della disponibilità