Ciao a tutti. Sono nuovo nel forum. Lavoro con arduino da poco, e mentre lavoravo con un progetto, mi sono ritrovato davanti ad un bivio >:( . Uso un'arduino uno. Dovrei accendere un led con un pulsante, ed usando un if, dico ad arduino che quando il pulsante è premuto devo accendere un led, che dopo ad un certo periodo di tempo si spegne. Il problema arriva quando inserisco un altro pulsante, e devo dire ad arduino che quando preme il pulsante 2, anche se il pulsante 1 è stato premuto prima, riesce a spegnere il led prima del tempo.
; è possibile farlo?
Grazie per l'attenzione ![]()
Mettendo la stessa domanda in 2 parti non ricevi risposte piú veloci; anzi ricevi queste risposte senza una risposta al Tuo problema.
Ciao Uwe
Scusa, non lo sapevo
Volevo mettere lingua in italiano, solo che poi ho sbagliato e ho messo inglese
Posta lo sketch che stai usando adesso.
GiovanniGiga:
Ciao a tutti. Sono nuovo nel forum.
Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento se non lo hai già fatto: Regolamento
Qui una serie di link utili, non inerenti al tuo problema:
- qui una serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- qui le pinout delle varie schede by xxxPighi: Pinout
- qui una serie di link generali utili: Link Utili
//indico i pin dei led
const int led = 9;
const int led2 = 10;
//indico i pin dei pulsanti
const int button = 11;
const int button2 = 12;
int val = 0;
int val2 = 0;
int old_val = 0;
int old_val2 = 0;
int state = 0;
int state2 = 0;
int i = true;
int a = true;
int luce;
int conto = 31;
int conto2 = 31;
//inizio setup
void setup()
{
pinMode(led, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(button, INPUT);
pinMode(button2, INPUT);
Serial.begin(9600);
}
void salita()
{
while(i)
{
analogWrite(led, 0);
delay(142);
analogWrite(led, 10) ;
delay(142);
analogWrite(led, 20);
delay(142);
analogWrite(led, 30) ;
delay(142);
analogWrite(led, 40);
delay(142);
analogWrite(led, 50);
delay(142);
analogWrite(led, 60);
delay(142);
analogWrite(led, 70);
delay(142);
analogWrite(led, 80);
delay(142);
analogWrite(led, 90);
delay(142);
analogWrite(led, 100);
delay(142);
analogWrite(led, 110);
delay(142);
analogWrite(led, 120);
delay(142);
analogWrite(led, 130);
delay(142);
analogWrite(led, 140);
delay(142);
analogWrite(led, 150);
delay(142);
analogWrite(led, 160);
delay(142);
analogWrite(led, 170);
delay(142);
analogWrite(led, 180);
delay(142);
analogWrite(led, 190);
delay(142);
analogWrite(led, 200);
delay(142);
analogWrite(led, 210);
delay(142);
analogWrite(led, 200) ;
delay(142);
analogWrite(led, 190);
delay(142);
analogWrite(led, 180);
delay(142);
analogWrite(led, 170);
delay(142);
analogWrite(led, 150);
delay(142);
analogWrite(led, 140);
delay(142);
analogWrite(led, 130);
delay(142);
analogWrite(led, 120);
delay(142);
analogWrite(led, 110);
delay(142);
analogWrite(led, 100);
delay(142);
analogWrite(led, 90);
delay(142);
analogWrite(led, 80);
delay(142);
analogWrite(led, 70);
delay(142);
analogWrite(led, 60);
delay(142);
analogWrite(led, 50);
delay(142);
analogWrite(led, 40);
delay(142);
analogWrite(led, 30);
delay(142);
analogWrite(led, 20);
delay(142);
analogWrite(led, 10);
delay(142);
analogWrite(led, 0);
delay(142);
conto--;
Serial.println(conto);
if(conto == 0)
{
i = false;
}
i = false;
}
}
void loop()
{
val = digitalRead(button);
if((val == HIGH) && (old_val == LOW))
{
state = 1-state;
delay(10);
}
old_val = val;
if(state == 1)
{
i = true;
salita();
delay(1000);
conto = 31;
state = 0;
digitalWrite(led, LOW);
state = 2;
}
else
{
}
if(state == -1)
{
analogWrite(led2, 210);
delay(3000);
digitalWrite(led2, LOW);
state = 0;
}
val2 = digitalRead(button2);
if((val2 == HIGH) && (old_val2 == LOW))
{
state2 = 1-state2;
delay(10);
}
old_val = val;
}
La prima volta che premo il pulsante si attiva una PWM sul led 1, se premo una seconda volta si accende il led2 e poidopo un certo periodo di tempo si spegne. Vorrei premere con un altro pulsante (button2), per poi spegnere il led2 prima del tempo.
Non ho molte conoscenze in elettronica, infatti sono solo un ragazzino "faccio la terza media".
. Sono veramente alle prime armi, e da quando mi hanno regalato Arduino uno, non mi sono più fermato, è ho iniziato a fare programmi all'impazzata. L'ultimo mio progetto è stato un piccolo robot con su montata easyvr (comando vocale) e un arduino mega 2560. Il progetto presente in questo forum serve per fare un apri-cancello. Spero di essermi presentato adeguatamente
Le presentazioni andrebbero fatte ... nell'apposito thread, QUI
...
... per il tipo di cose che intendi fare, dovresti imparare ad evitare di usare l'istruzione delay(), che è bloccante ed invece imparare ad usare la millis() assieme ad una gestione di "stati logici" in cui il tuo programma si trova. ![]()
Per studiare come si può usare la millis() ti consiglio di leggere prima QUI, poi QUI ed infine leggi anche QUI e QUI ... vedrai che ti sarà tutto più chiaro ![]()
Guglielmo
La funzione delay ha un effetto secondario che in molti casi impedisce alla applicazione di funzionare correttamente.
Un delay(1000) impedisce per 1 secondo di eseguire codice scritto dopo di essa.
In pratica si mortificano le prestazione del micro e il loop gira alla velocità di 1 giro per secondo.
Per risolvere si usa la funzione millis() la quale costringe a modificare il codice anche pesantemente.
L'obbiettivo con millis è quello di verificare con "if" se è o no trascorso un intervallo di tempo. Se la condizione è vera si esegue codice a tempo, diversamente si procede con il codice a seguire. Ciò rende l'esecuzione del codice reattivo.
La funzione void salita() deve essere pesantemente rivista, ad esempio una sola chiamata a analogWrite(led, n), dove n cambia ad ogni ciclo di loop.
Ciao.
ops anticipato da gpb01.
Grazie tante per i vostri suggerimenti, corro a provare ![]()