Accensione e spegnimento led con dei pulsanti

Ciao a tutti, questo è il mio primo post in questo forum. Ho acquistato un Arduino da poco e mi sto cimentando con il primo progetto.

Ho 3 led. Tutti e tre collegati ad un interruttore.
Quello che devo costruire è molto semplice. Una sorta di avviso quando ho la portiera della macchina aperta (sx o dx) e il terzo led sarà un Master Warning e si dovrà accendere quando si verifica l’apertura di uno dei due interruttori montati sulle porte. Questo terzo led dovrà restare acceso per tutta la durata dell’anomalia ma con il terzo pulsate (reset) vorrei che si spegnesse anche se la portiera è ancora aperta.

Sono riuscito a configurare il tutto, ma ho un problema con il reset.
ho scritto il codice dove se l’interruttore n.1 è aperto deve accendere sia il led dell’anomalia sia il master warning.
Poi ho scritto il codice per il pulsante reset. Quando lo premo deve spegnersi il Master Warning. Qui nasce il problema. Se chiudo l’interruttore diciamo della portiera, e premo il reset, il led si spegne. Se invece ho ancora la portiera aperta il Master Warning non si spegne. Credo sia perché essendo una procedura in loop lui va a leggere nuovamente l’errore e lo riaccende.
Come mi consigliate di procedere? Come posso bloccare la riaccensione del Master Warning?
Grazie a tutti in anticipo e scusate se mi sono dilungato.
Nick

int lettura = 0;
int buzzer = 9;
int pulsante = 2;
int led = 13;
boolean allarme = false;


void setup() {
  pinMode(buzzer, OUTPUT);
  pinMode(led, OUTPUT);
  pinMode(pulsante, INPUT);
  

}
void inizioallarme(){
  tone(buzzer,2000);
  delay(500);
  tone(buzzer,1000);
  delay(490);
}
 void stopallarme(){
  noTone(buzzer);
 
}


 void loop() {
  lettura=digitalRead(pulsante);
 
if (lettura==1){
    allarme = true;
    digitalWrite(led, HIGH);
  } else {
    digitalWrite(led, LOW);
    
  }
   if (allarme == true){
    inizioallarme();
  } else {
    stopallarme();
  }
  if (digitalRead(pulsante) == HIGH){
    allarme = false;
  }
  delay(10);

Innanzitutto definisci bene quando il master warning dovrà riaccendersi dopo un reset.

Poi usa una coppia di flag per accenderlo, openDoor e masterDisabled, condiziona la sua accensione a questi e pilotali opportunamente.

Il master warning si dovrà riaccendere quando si verificherà un'altra anomalia. Non mi è chiaro il dichiarare flag.... ecc. purtroppo sono alle prime armi, potresti farmi un piccolo esempio?

Grazie in anticipo. N

boolean masterDisabled = false;
boolean openDoor = false;

if (openDoor && !masterDisabled)
  accendiMasterLed();
else
  spegniMasterLed();

Ora ragiona su quando mettere a vero e falso i due flag.

:o

>nicolapodda: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More ­> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

gpb01:
>nicolapodda: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More ­> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

Scusami, non lo sapevo… lo racchiudo subito.

Nicola

nicolapodda: Ciao a tutti, questo è il mio primo post in questo forum. Ho acquistato un Arduino da poco e mi sto cimentando con il primo progetto.

Ho 3 led. Tutti e tre collegati ad un interruttore. Quello che devo costruire è molto semplice. Una sorta di avviso quando ho la portiera della macchina aperta (sx o dx) e il terzo led sarà un Master Warning e si dovrà accendere quando si verifica l'apertura di uno dei due interruttori montati sulle porte. Questo terzo led dovrà restare acceso per tutta la durata dell'anomalia ma con il terzo pulsate (reset) vorrei che si spegnesse anche se la portiera è ancora aperta.

Sono riuscito a configurare il tutto, ma ho un problema con il reset. ho scritto il codice dove se l'interruttore n.1 è aperto deve accendere sia il led dell'anomalia sia il master warning. Poi ho scritto il codice per il pulsante reset. Quando lo premo deve spegnersi il Master Warning. Qui nasce il problema. Se chiudo l'interruttore diciamo della portiera, e premo il reset, il led si spegne. Se invece ho ancora la portiera aperta il Master Warning non si spegne. Credo sia perché essendo una procedura in loop lui va a leggere nuovamente l'errore e lo riaccende. Come mi consigliate di procedere? Come posso bloccare la riaccensione del Master Warning? Grazie a tutti in anticipo e scusate se mi sono dilungato. Nick

//allarme portelli
const int buttonPin = 2; //pulsante al pin 2
const int ledPin1 =   3;// led allarme generale al pin 13
const int ledPin2 =  12;//segnalazione portello A
const int ledPin3 =  11; // segnalazione portello B
const int portelloa =  10; // contatto al portello A
const int portellob =  9; // contatto al portello B
int vala = 0;
int valb = 0;

int buttonState = 0; //variabile che legge lo stato del pulsante

void setup() {   Serial.begin(9600);   pinMode(ledPin1, OUTPUT);   pinMode(ledPin2, OUTPUT);   pinMode(ledPin3, OUTPUT);   pinMode (portelloa, INPUT);   pinMode (portellob, INPUT);   pinMode(buttonPin, INPUT);

} void loop() {   buttonState = digitalRead(buttonPin); //leggo lo stato del pulsante

  //se il pulsante è premuto if (ledPin1 == HIGH ) {     // spengo i led   digitalWrite(ledPin1, LOW);     //digitalWrite(ledPin2, LOW);   // digitalWrite(ledPin3, LOW);   } else   {   (buttonState == LOW);   }   vala = digitalRead(portelloa); //LEGGO PORTELLO A   if (vala == 1) {   // digitalWrite(ledPin1, HIGH);     digitalWrite(ledPin2, HIGH);   }   else   {     //digitalWrite(ledPin1, LOW);     digitalWrite(ledPin2, LOW);   }   valb = digitalRead(portellob); // LEGGO PORTELLO B   if (valb == 1) {     digitalWrite(ledPin1, HIGH);     digitalWrite(ledPin3, HIGH);   }   else   {     //digitalWrite(ledPin1, LOW);     digitalWrite(ledPin3, LOW);   }   delay (500); }

Ragazzi, ho aggiornato il codice e sono arrivato al punto che tutto funziona tranne che il pulsante Reset. Non riesco a risolvere questo problema. Vorrei che quando clicco il reset mi si spenga il pin1 ma rimanga acceso il led dell'anomalia, quindi Pin2 e/o 3. Qualche anima che mi dia supporto? Ripeto è il mio primo progetto quindi non capisco al volo certe procedure. Grazie Nick

Ho un paio di consigli da darti: 1) visto che é il tuo rimo progetto prendi in mano un bel manuale u C e dai uno sguarxo sul forum, così cominci a "masticare" meglio il linguaggio. 2) staccati a Arduino e fai uno schema, che dica per ogni led quando deve accendersi e quando spegnersi. Perché prima legge di Nelson, che é standardoil: un programma ben pensato é già mezzo realizzato

Questo mi intrippa e lo sento alla mia portata. Non si usa mettere programmi finiti, ma posso chiedere deroga?

>C1P8: ... magari una piccola riletta al REGOLAMENTO, punti 16.1 e 16.13 ? :D

Guglielmo

C1P8: Questo mi intrippa e lo sento alla mia portata. Non si usa mettere programmi finiti, ma posso chiedere deroga?

Non ho capito tu cosa voglia esattamente fare, e neanche cosa voglia esattamente fare l'op che ha aperto questa discussione. Il codice dipende dal progetto, non il contrario

Silente: 2) staccati a Arduino e fai uno schema, che dica per ogni led quando deve accendersi e quando spegnersi. Perché prima legge di Nelson, che é standardoil: un programma ben pensato é già mezzo realizzato

Mai nominare l'ammiraglio senza adeguata preparazione tattica: questa la prendo io, è pure in rima, farà molta bella scena, grazie per onestà e correttezza sarà la prima "SECONDA" legge di Nelson le seconde leggi di Nelson sono quelle che non sono mie originali Di nuovo Grazie

Comunque la seconda legge di Nelson, che sono io, è vera per prova mi sono tolto lo sfizio, senza toccare preambolo e setup dello OP, ho realizzato il programma ri-scrivendo solo la loop in 5 minuti (esatti, il petroliere non parla mai con pressappochismo, nel caso lo dico sempre) e nove (Sì, 9, in numero è più bello?) righe di loop, se si escludono le righe vuote e le chiusure di graffe nno avendo lo HW non posso provarlo, ma confido proprio che vada, compilare compila........

Silente: Non ho capito tu cosa voglia esattamente fare, e neanche cosa voglia esattamente fare l'op che ha aperto questa discussione. Il codice dipende dal progetto, non il contrario

Io questo ho capito: un "coso pericoloso" con due portelli, non so' un forno, un frigorifero, la stanza della suocera portello si apre cicalino suona lampadina si accende il cicalino si deve poter tacitare, e non deve più intervenire per quell'allarme, semmai per un'altro (se si apre anche l'altro portello), almeno non intervenire se prima l'allarme non rientra è una cosa abbastanza normale nelle sale quadri di molti impianti tecnologici

nicolapodda:
Ragazzi, ho aggiornato il codice e sono arrivato al punto che tutto funziona tranne che il pulsante Reset. Non riesco a risolvere questo problema. Vorrei che quando clicco il reset mi si spenga il pin1 ma rimanga acceso il led dell’anomalia, quindi Pin2 e/o 3.
Qualche anima che mi dia supporto? Ripeto è il mio primo progetto quindi non capisco al volo certe procedure.
Grazie
Nick

Dai, non è difficile
comincia col pensare le condizioni di accensione dei led 2 e 3,
poi pensa quando si deve accendere il led 1
e cosa lo spegne
e poi, da ultimo, naturalmente, lo “sporco trucco” (come credi che abbia fatto il bis-nonno a fare i soldi?)
lo “sporco trucco” in questo caso è questo: se NON li tocchi i led accesi rimangono accesi, anche quelli spenti rimangono spenti

Standardoil: Dai, non è difficile comincia col pensare le condizioni di accensione dei led 2 e 3, poi pensa quando si deve accendere il led 1 e cosa lo spegne e poi, da ultimo, naturalmente, lo "sporco trucco" (come credi che abbia fatto il bis-nonno a fare i soldi?) lo "sporco trucco" in questo caso è questo: se NON li tocchi i led accesi rimangono accesi, anche quelli spenti rimangono spenti

Ciao a tutti, allora, visto che ho tanta confusione in testa e sinceramente non riesco a capire bene, ho provato a fare una cosa un pò più semplice. Diciamo che ho rimodulato il progetto in modo da capire la logica da utilizzare. Ora, Un led, due pulsanti e un cicalino. Quando premo il pulsante si accende il led e il cicalino. Quando rilascio il pulsante, led spento e cicalino ancora acceso. Sino a qui tutto funziona correttamente. Ora, quando clicco il secondo pulsante il cicalino si deve spegnere. Questo ultimo passaggio non riesco a svolgerlo. Allego il codice di questo progetto. Che codice devo assegnare al secondo pulsante? Grazie

se secondo pulsante premuto cicalino off

nicolapodda: Allego il codice di questo progetto. Che codice devo assegnare al secondo pulsante? Grazie

Se lo alleghi veramente possiamo anche vedere di aiutarti....