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
Pubblicità Adsense
Answers
Se necessiti di aiuto, clicca il pulsante "Cerco Aiuto" (disponibile anche per i non iscritti).
I postatori più attivi del mese
Admin
 
Answers
 
simone300500
 

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 dell'utente

Tornare 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 : 4295
Crediti Crediti : 11970
Reputazione Reputazione : 187
Data d'iscrizione Data d'iscrizione : 08.03.11
Età Età : 19
Località Località : Brescia

Visualizza il profilo dell'utente http://www.wikiinfo.net

Tornare 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 dell'utente

Tornare 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 : 4295
Crediti Crediti : 11970
Reputazione Reputazione : 187
Data d'iscrizione Data d'iscrizione : 08.03.11
Età Età : 19
Località Località : Brescia

Visualizza il profilo dell'utente http://www.wikiinfo.net

Tornare in alto Andare in basso

Tornare in alto


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