5
5
3
5
4
5
4
4
4
5
3
4
4
4
4
6
4
4
4
4
5
4
4
5
4
4
4
1023 //qui ho alzato l'input analogico
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH
1023
HIGH //qui ho portato al valore basso l'input analogico...
4
5
4
5
4
5
4
4
4
3
5
4
3
4
5
4
3
5
3
5
7
4
5
5
7
4
6
4
4
4
4
3
4
4
5
3
4
4
4
5
3
4
5
4
3
3
6
4
2
4
4
7
4
4
4
4
4
2
6
6
4
3
4
4
4
5
6
5
4
4
4
1
3
4
4
4
4
3
4
4
4
3
3
4
3
6
3
2
4
3
4
4
dopo circa una decina di secondi, non vedendo cambiamenti di stato ho interrotto premendo il tast reset
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);
}
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
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
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.
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);
}
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
Lui voleva un ritardo di spegnimento ma non un ritardo di lettura del segnale di pilotaggio. Il tuo codice non controlla se il pin di uscita é H o L e percui aspetta ogni volta che trova il segnale a L