BZ (I)
Offline
Brattain Member
Karma: 162
Posts: 15757
+39 349 2158303
|
 |
« Reply #15 on: July 24, 2012, 08:27:41 am » |
altra prova: int cmd_tx = 5; int analogPin = 3; int rx_val = 0;
void setup() { Serial.begin(9600); delay(3000); pinMode(cmd_tx, OUTPUT); digitalWrite(cmd_tx, LOW); }
void loop() { rx_val = analogRead(analogPin); Serial.println(rx_val,DEC); if (rx_val > 50) //se il valore analogico è > di 50, metto a 1 l'output cmd_tx { digitalWrite(cmd_tx, HIGH); Serial.println("HIGH"); }
if (rx_val < 50) { Serial.println("LOW1"); if (digitalRead(cmd_tx)) //se il valore analogico è < di 50, e cmd_tx è a 1 { Serial.println("Aspetta"); delay(3000); //attendo 3 secondi digitalWrite(cmd_tx, LOW2); Serial.println("LOW"); //scrivo a zero cmd_tx }} delay(100); } Ciao Uwe [/quote]
|
|
|
|
« Last Edit: July 24, 2012, 08:48:16 am by uwefed »
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 0
Posts: 57
|
 |
« Reply #16 on: July 24, 2012, 08:37:48 am » |
Ciao, non sono un esperto di arduino quindi ciò che ti scrivo prendila come una mia idea rozza Io scriverei il codice così void setup() { pinMode(cmd_tx, OUTPUT); int tempo; }
void loop() { if (rx_val>50) { digitalWrite(cmd_tx, HIGH); tempo=0; }
if (rx_val<50 and cmd_tx !=0) { tempo++; }
if(tempo>3000) { digitalWrite(cmd_tx, LOW); tempo=0; } }
Tuttavia in questo modo il '3000' che c'è nell'if non è preciso in quanto io sto semplicemente addizionando una unità alla variabile tempo ad ogni ciclo del programma e e quindi non si basa sul tempo trascorso. Quindi quello che si potrebbe fare è utilizzare la funzione millis per ricavare il tempo ciclo del programma e ricavarti poi l'effettivo valore da inserire per far si che siano 3000ms. Forse sono stato un pò contorto ma è da principiante è l'unica cosa che mi viene in mente  PS il codice l'ho scritto al volo quindi può essere che abbia commesso qualche errore di sintassi
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 16
|
 |
« Reply #17 on: July 24, 2012, 08:42:46 am » |
nel finale del codice mi dava errore, ho quindi scritto: if (digitalRead(cmd_tx)) //se il valore analogico è < di 50, e cmd_tx è a 1 { Serial.println("Aspetta"); delay(3000); //attendo 3 secondi digitalWrite(cmd_tx, LOW); Serial.println("LOW2"); //scrivo a zero cmd_tx }} delay(100); }
comunque: (cut) 4 LOW1 5 LOW1 4 LOW1 4 LOW1 1023 //porto analogico 3 a livello alto HIGH 1023 HIGH 1023 HIGH
taglio per non rubare troppo spazio
1023 HIGH 1023 HIGH 1023 HIGH 1023 HIGH 4 //porto analogico 3 a livello basso... LOW1 2 LOW1 3 LOW1 4 LOW1 5 LOW1 4 LOW1 4 LOW1 4 LOW1 ....etc etc etc... fino a reset
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 16
|
 |
« Reply #18 on: July 24, 2012, 08:48:24 am » |
Grazie per il tuo intervento Nagy, e stai tranquillo che pure io sono decisamente nabbo. Vista la mia attività lavorativa, ho approcciato Arduino a scopo di hobby pensando di fare una passeggiata, ma non mi ero accorto di essere "Scalzo sui vetri"...
L'idea può essere sicuramente buona, tuttavia mi pare di capire che il problema stà nel fatto che non vuole saperne di fare quell'IF con l'AND tra il valore analogico e quello digitale, sia scritto come (&&) che come due IF in cascata. Risolto questo dovrò capire come contare il tempo senza piantare il programma con il DELAY, ma per quello la tua può essere già la soluzione. Tuttavia avevo già sperimentato la libreria METRO con successo.
|
|
|
|
|
Logged
|
|
|
|
|
BZ (I)
Offline
Brattain Member
Karma: 162
Posts: 15757
+39 349 2158303
|
 |
« Reply #19 on: July 24, 2012, 08:56:47 am » |
Il delay in questo momento non é il problema.  comunque: http://arduino.cc/en/Tutorial/BlinkWithoutDelayFacciamo una cosa: definiamo una variabile di stato per il pin di uscita e vediamo: int cmd_tx = 5; int analogPin = 3; int rx_val = 0; int stato_tx =0;
void setup() { Serial.begin(9600); delay(3000); pinMode(cmd_tx, OUTPUT); digitalWrite(cmd_tx, stato_tx); }
void loop() { rx_val = analogRead(analogPin); Serial.println(rx_val,DEC); if (rx_val > 50) //se il valore analogico è > di 50, metto a 1 l'output cmd_tx { stato_tx = 1; digitalWrite(cmd_tx, stato_tx); Serial.println("HIGH"); }
if (rx_val < 50) { Serial.println("LOW1"); if (stato_tx) //se il valore analogico è < di 50, e cmd_tx è a 1 { Serial.println("Aspetta"); delay(3000); //attendo 3 secondi stato_tx =0; digitalWrite(cmd_tx, stato_tx); Serial.println("LOW2"); //scrivo a zero cmd_tx }} delay(100); }
|
|
|
|
|
Logged
|
|
|
|
|
BZ (I)
Offline
Brattain Member
Karma: 162
Posts: 15757
+39 349 2158303
|
 |
« Reply #20 on: July 24, 2012, 08:58:41 am » |
cosa hai attacato al pin di uscita? Magari un LED senza resistenza? Ciao Uwe
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 16
|
 |
« Reply #21 on: July 24, 2012, 09:02:16 am » |
no, un fotoaccoppiatore. comunque così ha funzionato 6 LOW1 5 LOW1 4 LOW1 5 LOW1 4 LOW1 4 LOW1 5 LOW1 4 LOW1 4 LOW1 6 LOW1 3 LOW1 4 LOW1 3 LOW1 3 LOW1 1023 HIGH 1023 HIGH 1023 HIGH 1023 HIGH 1023 HIGH 1023 HIGH 1023 HIGH 1023 HIGH 3 LOW1 Aspetta LOW2 4 LOW1 4 LOW1 3 LOW1 5 LOW1 4 LOW1 4 LOW1 4 LOW1 4
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 16
|
 |
« Reply #22 on: July 24, 2012, 09:22:21 am » |
Grazie Uwe, non ho capito bene il perchè ora funziona, ma visto che è ok, non tocco niente e vado avanti con il resto.
Grazie ancora Claudio
|
|
|
|
|
Logged
|
|
|
|
|
BZ (I)
Offline
Brattain Member
Karma: 162
Posts: 15757
+39 349 2158303
|
 |
« Reply #23 on: July 24, 2012, 09:23:10 am » |
no, un fotoaccoppiatore.
insisto: Un fotoaccoppiatore senza resistenza?
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 16
|
 |
« Reply #24 on: July 24, 2012, 09:39:17 am » |
kappa che c'è, da 10K
|
|
|
|
|
Logged
|
|
|
|
|
BZ (I)
Offline
Brattain Member
Karma: 162
Posts: 15757
+39 349 2158303
|
 |
« Reply #25 on: July 24, 2012, 09:41:17 am » |
no, intendevo sul lato LED IR, non sul lato fototransistore. Ciao Uwe
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 16
|
 |
« Reply #26 on: July 24, 2012, 10:39:37 am » |
scusami, allora non ho capito, che intendi per LED IR?
|
|
|
|
|
Logged
|
|
|
|
|
Varese
Offline
God Member
Karma: 8
Posts: 581
|
 |
« Reply #27 on: July 24, 2012, 10:43:25 am » |
io ho risolto cosi int cmd_tx = 5 ; int analogPin = 3; int rx_val = 0;
void setup() { pinMode(cmd_tx, OUTPUT);
}
void loop() { rx_val = analogRead(analogPin); if (rx_val < 50) { digitalWrite(cmd_tx, HIGH); } else { delay(3000); //attendo 3 secondi digitalWrite(cmd_tx, LOW); }
}
|
|
|
|
|
Logged
|
|
|
|
|
BZ (I)
Offline
Brattain Member
Karma: 162
Posts: 15757
+39 349 2158303
|
 |
« Reply #28 on: July 24, 2012, 10:46:49 am » |
io ho risolto cosi int cmd_tx = 5 ; int analogPin = 3; int rx_val = 0;
void setup() { pinMode(cmd_tx, OUTPUT);
}
void loop() { rx_val = analogRead(analogPin); if (rx_val < 50) { digitalWrite(cmd_tx, HIGH); } else { delay(3000); //attendo 3 secondi digitalWrite(cmd_tx, LOW); }
} Quel codice aspetta ogni volta 3 secondi prima di mettere il pin a LOW. per questo ralenta di molto la reszione su un cambio di stato del segnale di entrata. Ciao Uwe
|
|
|
|
|
Logged
|
|
|
|
|
BZ (I)
Offline
Brattain Member
Karma: 162
Posts: 15757
+39 349 2158303
|
 |
« Reply #29 on: July 24, 2012, 10:49:21 am » |
scusami, allora non ho capito, che intendi per LED IR?
 Come hai collegato il optocopler al uscita Arduino? Hai usato una resistenza come nell imagine? Ciao Uwe
|
|
|
|
« Last Edit: July 24, 2012, 10:52:00 am by uwefed »
|
Logged
|
|
|
|
|
|