Recensisci!
Diventa un recensore per ricevere prodotti gratuiti o scontati!
Iscriviti
Se desideri, puoi effettuare un'iscrizione gratuita al forum per entrare nella nostra community.
Ricerca Avanzata
Answers
Se necessiti di aiuto, clicca il pulsante "Cerco Aiuto" (disponibile anche per i non iscritti).
I postatori più attivi del mese
Bawoo
 

allarme antincendio che funziona a metà con arduino

Andare in basso

allarme antincendio che funziona a metà con arduino

Messaggio Da decos il Mer Apr 18, 2018 10:32 pm

Salve a tutti del forum, sono Costantino.
Ho copiato qui sul forum l'impianto antincendio di Poderak e fatto alcune modifiche:
ho portato i sensori gas a due e i sensori fiamma a quattro, tolto i led e  aggiunto due relè, uno per i sensori gas e uno per i sensori fiamma.
Il tutto funziona solo che la scheda legge un'allarme per volta, cioè mi spiego meglio:
quando un sensore va in allarme, l'altro sensore non funziona fino a quando l'allarme finisce.
ora mi chiedo se il problema sia dovuto ad un errore nella compilazione dello sketch o è proprio un limite della scheda che può leggere un'allarme per volta.
questo è lo sketch che ho compilato:


Codice:
int gas1 = A0; //pin in cui ho collegato il sensore gas1
int gas2 = A1; //pin in cui ho collegato il sensore gas2
int flame1 = A2; //pin in cui ho collegato il sensore fiamma1
int flame2 = A3; //pin in cui ho collegato il sensore fiamma2
int flame3 = A4; //pin in cui ho collegato il sensore fiamma3
int flame4 = A5; //pin in cui ho collegato il sensore fiamma4
int valg1=0; //variabile che contiene lettura sens. gas1
int valg2=0; //variabile che contiene lettura sens. gas2
int valf1=0; //variabile che contiene lettura sens. fiamma1
int valf2=0; //variabile che contiene lettura sens. fiamma2
int valf3=0; //variabile che contiene lettura sens. fiamma3
int valf4=0; //variabile che contiene lettura sens. fiamma4
int rele1=4; //pin digitale del rele1
int rele2=5; //pin digitale del rele2

void setup() {
  pinMode(gas1, INPUT); //imposto il sensore come input
  pinMode(gas2, INPUT); //imposto il sensore come input
  pinMode(flame1, INPUT); //imposto il sensore come input
  pinMode(flame2, INPUT); //imposto il sensore come input
  pinMode(flame3, INPUT); //imposto il sensore come input
  pinMode(flame4, INPUT); //imposto il sensore come input
  pinMode(rele1, OUTPUT); //imposto il sensore come output
  pinMode(rele2, OUTPUT); //imposto il sensore come output
  Serial.begin(9600);
}

void loop() {
  valg1 = analogRead(gas1); //leggo e inserisco il valore del sensore gas1 in valg1
  valg2 = analogRead(gas2); //leggo e inserisco il valore del sensore gas1 in valg2
  valf1 = analogRead(flame1); //leggo e inserisco il valore del sensore flame1 in valf1
  valf2 = analogRead(flame2); //leggo e inserisco il valore del sensore flame1 in valf2
  valf3 = analogRead(flame3); //leggo e inserisco il valore del sensore flame1 in valf3
  valf4 = analogRead(flame4); //leggo e inserisco il valore del sensore flame1 in valf4
  Serial.print("Sensore gas1: "); //stampo su serial monitor i valori
  Serial.println(valg1);
  Serial.print("Sensore gas2: "); //stampo su serial monitor i valori
  Serial.println(valg2);
  Serial.print("Sensore flame1: "); //stampo su serial monitor i valori
  Serial.println(valf1);
  Serial.print("Sensore flame2: "); //stampo su serial monitor i valori
  Serial.println(valf2);
  Serial.print("Sensore flame3: "); //stampo su serial monitor i valori
  Serial.println(valf3);
  Serial.print("Sensore flame4: "); //stampo su serial monitor i valori
  Serial.println(valf4);
  if (valf1>780&&valf2>780&&valf3>780&&valf4>780&&valg1<120&&valg2<120) { //i sensori sono in stato di riposo
    digitalWrite(rele1, HIGH);
    digitalWrite(rele2, HIGH);
  }

  if(valf1<780||valf2<780||valf3<780||valf4<780) { //in questo stato un sensore fiamma è in allarme
    for (int i=0; i<10; i++) { //ripeto l'allarme per 10 volte
    digitalWrite(rele1, LOW); //il rele
   delay(1000);  //ritardo di 1000 millisecondi
    }
  }
  if(valg1>120||valg2>120) { //in questo stato un sensore è in allarme
    for (int i=0; i<10; i++) { //ripeto l'allarme per 10 volte
    digitalWrite(rele2, LOW); //il rele
   delay(1000);  //ritardo di 1000 millisecondi
    }
  }
  
}
avatar
decos
Sono un nuovo membro
Sono un nuovo membro

Messaggi Messaggi : 2
Crediti Crediti : 4
Reputazione Reputazione : 0
Data d'iscrizione Data d'iscrizione : 13.04.18

Visualizza il profilo

Torna in alto Andare in basso

Re: allarme antincendio che funziona a metà con arduino

Messaggio Da Admin il Gio Apr 19, 2018 8:59 am

Ciao @decos,

ho visto il tuo codice è sembra tutt'ok. Il fatto che ti faccia uno o l'altro è perché utilizzi la funzione delay. La funzione deley "congela" l'Arduino da qualsiasi altra funzione.

Le soluzioni sono due:
- Quella più barbarica: inserisci un controllo dell'altro allarme mentre fa il ciclo for (ma in questo caso inserisci codice doppio).
- Quella più consigliata ma un po' complicata: usi la funzione millis al posto di delay. Ecco una guida che potrebbe interessarti: premi qui.

A presto Ciao!
avatar
Admin
♔ Amministratore

Messaggi Messaggi : 4343
Crediti Crediti : 12114
Reputazione Reputazione : 187
Data d'iscrizione Data d'iscrizione : 08.03.11
Età Età : 20
Località Località : Brescia

Visualizza il profilo http://wikiinfo.forumattivo.it

Torna in alto Andare in basso

Re: allarme antincendio che funziona a metà con arduino

Messaggio Da decos il Mar Apr 24, 2018 11:03 pm

Ciao a tutti
Ho capito che la funzione delay durante il suo processo  blocca la scheda, ma non sono riuscito a sostituirla con millis, quello che segue è lo sketch che sono riuscito a fare ma purtroppo non funziona   Sad
non capisco dove sbaglio
Codice:
nt gas1 = A0; //pin in cui ho collegato il sensore gas1
int gas2 = A1; //pin in cui ho collegato il sensore gas2
int flame1 = A2; //pin in cui ho collegato il sensore fiamma1
int flame2 = A3; //pin in cui ho collegato il sensore fiamma2
int flame3 = A4; //pin in cui ho collegato il sensore fiamma3
int flame4 = A5; //pin in cui ho collegato il sensore fiamma4
int valg1=0; //variabile che contiene lettura sens. gas1
int valg2=0; //variabile che contiene lettura sens. gas2
int valf1=0; //variabile che contiene lettura sens. fiamma1
int valf2=0; //variabile che contiene lettura sens. fiamma2
int valf3=0; //variabile che contiene lettura sens. fiamma3
int valf4=0; //variabile che contiene lettura sens. fiamma4
int rele1=4; //pin digitale del rele1
int rele2=5; //pin digitale del rele2
unsigned long rele1Time;
unsigned long rele2Time;
boolean rele1on;
boolean rele2on;


void setup() {
  pinMode(gas1, INPUT); //imposto il sensore come input
  pinMode(gas2, INPUT); //imposto il sensore come input
  pinMode(flame1, INPUT); //imposto il sensore come input
  pinMode(flame2, INPUT); //imposto il sensore come input
  pinMode(flame3, INPUT); //imposto il sensore come input
  pinMode(flame4, INPUT); //imposto il sensore come input
  pinMode(rele1, OUTPUT); //imposto il sensore come output
  pinMode(rele2, OUTPUT); //imposto il sensore come output
  rele1on = false;
  rele2on = false;
  Serial.begin(9600);
}

void loop() {
  valg1 = analogRead(gas1); //leggo e inserisco il valore del sensore gas1 in valg1
  valg2 = analogRead(gas2); //leggo e inserisco il valore del sensore gas1 in valg2
  valf1 = analogRead(flame1); //leggo e inserisco il valore del sensore flame1 in valf1
  valf2 = analogRead(flame2); //leggo e inserisco il valore del sensore flame1 in valf2
  valf3 = analogRead(flame3); //leggo e inserisco il valore del sensore flame1 in valf3
  valf4 = analogRead(flame4); //leggo e inserisco il valore del sensore flame1 in valf4
  Serial.print("Sensore gas1: "); //stampo su serial monitor i valori
  Serial.println(valg1);
  Serial.print("Sensore gas2: "); //stampo su serial monitor i valori
  Serial.println(valg2);
  Serial.print("Sensore flame1: "); //stampo su serial monitor i valori
  Serial.println(valf1);
  Serial.print("Sensore flame2: "); //stampo su serial monitor i valori
  Serial.println(valf2);
  Serial.print("Sensore flame3: "); //stampo su serial monitor i valori
  Serial.println(valf3);
  Serial.print("Sensore flame4: "); //stampo su serial monitor i valori
  Serial.println(valf4);
  if (valf1>700&&valf2>700&&valf3>700&&valf4>700&&valg1<120&&valg2<120) { //i sensori sono in stato di riposo
    digitalWrite(rele1, HIGH);
    digitalWrite(rele2, HIGH);
  }

  if(valf1<700||valf2<700||valf3<700||valf4<700) { //in questo stato un sensore fiamma è in allarme
    for (int i=0; i<10; i++) { //ripeto l'allarme per 10 volte
    digitalWrite(rele1, LOW); //il rele
    rele1on = true;
    rele1Time = millis();
    }
  }
  if(valg1>120||valg2>120) { //in questo stato un sensore gas è in allarme
    for (int i=0; i<10; i++) { //ripeto l'allarme per 10 volte
    digitalWrite(rele2, LOW); //il rele
    rele2on = true;
    rele2Time = millis();
    }
  }
  if(rele1on)
    if(millis() - rele1Time > 30000) {
      digitalWrite(rele1, LOW);
      rele1on = false;
    } 
  if(rele2on)
    if(millis() - rele2Time > 30000) {
      digitalWrite(rele2, LOW);
      rele2on = false;
 
}
}
avatar
decos
Sono un nuovo membro
Sono un nuovo membro

Messaggi Messaggi : 2
Crediti Crediti : 4
Reputazione Reputazione : 0
Data d'iscrizione Data d'iscrizione : 13.04.18

Visualizza il profilo

Torna in alto Andare in basso

Re: allarme antincendio che funziona a metà con arduino

Messaggio Da Admin il Lun Mag 07, 2018 5:36 pm

Ciao Very Happy

piccolo consiglio. Prova prima a utilizzarlo in un semplice blink di led e poi cerca di applicarlo in questo progetto. In questo modo prendi dimestichezza con la funzione millis che all'inizio non è molto semplice Wink
avatar
Admin
♔ Amministratore

Messaggi Messaggi : 4343
Crediti Crediti : 12114
Reputazione Reputazione : 187
Data d'iscrizione Data d'iscrizione : 08.03.11
Età Età : 20
Località Località : Brescia

Visualizza il profilo http://wikiinfo.forumattivo.it

Torna in alto Andare in basso

Torna in alto


 
Permessi di questa sezione del forum:
Non puoi rispondere agli argomenti in questo forum