Richiesta funzionamento sensore mpx5100dp

Buongiorno, mi chiamo Daniele e sono appena entrato nel mondo della programmazione.
Sono in possesso di arduino uno r3, di un sensore mpx5100dp che legge la pressione differenziale e di due relè.
Vorrei chiedervi, se qualcuno di voi potesse scrivermi il codice per farlo funzionare nel seguente modo:

1)leggere il valore del sensore mpx5100dp
2)se il valore è inferiore a "x" attiva 2 secondi il relè n°1
3)se il valore è compreso tra "x e x" non fare niente
4)se il valore è maggiore di "x" attiva 2 secondi il relè n°2
5)delay 20 secondi

Per quanto riguarda i collegamenti non ho problemi, ma non essendo nel campo della programmazione ho moltissime difficoltà nel fare lo sketch.
Se qualcuno se la sentisse di aiutarmi mi farebbe molto piacere.
Ringrazio anticipatamente chiunque legga il mio messaggio e abbia il tempo e la voglia di aiutarmi.

Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Qui una serie di link utili, NON necessariamente inerenti alla tua domanda:
- serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- pinout delle varie schede by xxxPighi: Pinout
- link generali utili: Link Utili

Mi scuso, se lo ritiene necessario proceda pure alla cancellazione del post, che da come ho letto nel regolamento é vietato chiedere la programmazione.
Ringrazio comunque per l'attenzione e i suggerimenti che mi ha dato.

golandc21:
Mi scuso, se lo ritiene necessario proceda pure alla cancellazione del post, che da come ho letto nel regolamento é vietato chiedere la programmazione.

Secondo me potresti: studiare i link che hai trovato nel punto 16.1 del regolamento, poi buttare giù il codice che ritieni possa funzionare, metterlo qui (... mi raccomando, in conformità al regolamento, punto 7, racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone </> ... primo a sinistra) e ...
... chiedere aiuto sui punti che non funzionano :slight_smile:

Guglielmo

Sono riuscito a fare ciò che volevo, mi rendo conto che è molto migliorabile ma secondo la simulazione funziona.
Ora avrei bisogno di aggiungere un pulsante che mi modifichi il valore "100" che si trova alla riga 18 del codice, aumentandolo di 10 ogni volta che viene premuto, ma non sono proprio capace.
Ho fatto diverse prove ma non ci sono riuscito, se qualcuno può aiutarmi ne sarei riconoscente.
Ricordo che sono alle primissime armi...non odiatemi

 int inputVariable=0;
  void setup() {
  Serial.begin(9600);
  pinMode(3, OUTPUT);
  pinMode(5, OUTPUT);
  }
 void loop(){
  pinMode(3, LOW);                                       //spegni pin 3
  pinMode(5, LOW);                                       //spegni pin 5
   inputVariable = analogRead(A2); {                      //leggi la pressione
  Serial.println(inputVariable, DEC);                   //scrivi la pressione
  if (inputVariable  > 800){                            // molto pressione differenziale
  digitalWrite(3, HIGH);                                //accendi pin 3 
  delay(10000);                                        // aspetta 10 secondi
  digitalWrite(3, LOW);                                //spegni pin 3 
  delay(15000);                                         //aspetta 15 secondi    
  }                                                         
  if (inputVariable > 100 && inputVariable < 150){     //pressione buona
    Serial.println(inputVariable, DEC);                //scrivi la pressione
    delay(15000)   ;                                   //aspetta 15 secondi senza fare niente
    }                                                 
 if (inputVariable >= 150 && inputVariable <=800)     //pressione alta
 {
   Serial.println(inputVariable, DEC);                  //scrivi la pressione
    digitalWrite(3, HIGH);                              //accendi pin 3 
  delay(2000);                                          // aspetta 2 secondi
  digitalWrite(3, LOW);                                //spegni pin 3 
  delay(15000);                                        //aspetta 15 secondi
  } 
if    (inputVariable <= 100)                           //pressione bassa
{
     Serial.println(inputVariable, DEC);               // scrivi la pressione 
    digitalWrite(5, HIGH);                             //accendi pin 5 
  delay(2000);                                        // aspetta 2 secondi
  digitalWrite(5, LOW);                               //spegni pin 5 
  delay(15000);                                        //aspetta 15 secondi
}
}}

Ok, un passo alla volta ...
... nel tuo codice hai usato (ed abusato) della funzione delay() ... se da un lato così è banale scrivere codice, dall'altro ti sei incasinato da solo, dato che ... ogni volta che finisci su una delay(), il programma si FERMA e non può fare altro, quindi ... neanche sentire se stai premendo il pulsante che vuoi controllare per aumentare il valore che hai indicato.

Quindi, come prima cosa ti suggerire di studiare come si usa la funzione millis(), prima QUI, poi QUI ed infine leggi anche QUI e QUI ...
... dopo di che dovrai cercare di implementarla nel tuo programma per evitare tutte le delay() e fare in modo che il loop() NON si fermi mai ad aspettare, permettendoti così, in qualunque momento, di verificare la pressione di un pulsante.

Ti avviso che passare da delay() a millis() NON è né cosa banale, né facile e richiede il ridisegno della logica del programma, ma ... se ti ci applichi sicurammete qualche cosa tiri fuori :wink:

Aspettiamo di vedere il nuovo programma e ... se serve, come sempre, chiedi aiuto :slight_smile:

Guglielmo

Edit: Guarda anche QUESTO esempio ... è molto chiaro :wink:

solo una piccola nota

la parentesi graffa qui non ci vuole

   inputVariable = analogRead(A2); {                      //leggi la pressione
...
...
  delay(15000);                                        //aspetta 15 secondi
}
}}

e quindi ache in chiusura ce n'è una di troppo

Grazie di tutti i suggerimenti, un po alla volta sto imparando, adesso ho riprogettato tutto e funziona come voglio io. Praticamente tramite un sensore di pressione differenziale leggo la pressione dentro a una stanza con una forte ventola che butta fuori aria, e in base a quello che leggo faccio aprire o chiudere una finestra automatica tramite 2 relè, ho inoltre aggiunto un paio di pulsanti per regolare a mio piacimento la quantità di depressione che voglio tenere nella stanza, posto di seguito lo sketch nel caso avreste delle ottimizzazioni... adesso sto pensando di implementare un lcd per leggere i valori di pressione....un po' alla volta si fa tutto.

int inputVariable=0;
int stato_pulsante=0;
int minima=100;
int neutral=100;
int var=0;
int inputVariable=0;
int stato_pulsante=0;
int inputVariable=0;
int stato_pulsante=0;
int minima=100;
int neutral=100;
int var=0;
int var2=0;
int pin=7;
int pin2=8;
int buzzer=9;
int stampa=0;

  void setup() {
  Serial.begin(9600);
  pinMode(3, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(pin,INPUT);
  pinMode(pin2,INPUT);
  pinMode(buzzer,OUTPUT);
  }
void loop() {
  var=digitalRead(pin);
  var2=digitalRead(pin2);
  
   inputVariable = analogRead(A2);
 if (inputVariable != stampa)
 {Serial.println(inputVariable,DEC);
 stampa=analogRead(A2);
 }
 
  
  if(var==HIGH)
     {
      minima=minima+10;
     tone(buzzer,1000,200);
    Serial.println(minima,DEC);
   digitalWrite(pin,LOW);
 delay(20);
 }

 if(var2==HIGH)
     {
      minima=minima-10;
     tone(buzzer,500,200);
    Serial.println(minima,DEC);
   digitalWrite(pin2,LOW);
 delay(20);
 }

                                 
 if(inputVariable<minima)
 
 { 
  digitalWrite(3,HIGH);
 } 
 else 
 {
  digitalWrite(3,LOW);
 }
  
  

 if(inputVariable>minima+neutral)
 {
  digitalWrite(5,HIGH);
 }
 else
 {digitalWrite(5,LOW);
 }
  delay(20);
  }

solo 2 perplessità :slight_smile:

int inputVariable=0;       // perchè queste le ripeti 2 volte?
int stato_pulsante=0;   //
int minima=100;          //
int neutral=100;          //
int var=0;                   //

int inputVariable=0;
int stato_pulsante=0;
int inputVariable=0;
int stato_pulsante=0;
int minima=100;
int neutral=100;
int var=0;
  pinMode(3, OUTPUT);           // perchè a queste due non hai dato un nome esplicativo?
  pinMode(5, OUTPUT);           // tra sei mesi saprai ancora cosa sono?

  pinMode(pin,INPUT);            // a parte che pin e pin2 dicono poco....
  pinMode(pin2,INPUT);
  pinMode(buzzer,OUTPUT);

poi il pulsante non è cosi facile come sembrerebbe

Patrick_M:
solo 2 perplessità :slight_smile:

int inputVariable=0;       // perchè queste le ripeti 2 volte?

int stato_pulsante=0;   //
int minima=100;          //
int neutral=100;          //
int var=0;                   //

int inputVariable=0;
int stato_pulsante=0;
int inputVariable=0;
int stato_pulsante=0;
int minima=100;
int neutral=100;
int var=0;






pinMode(3, OUTPUT);           // perchè a queste due non hai dato un nome esplicativo?
 pinMode(5, OUTPUT);           // tra sei mesi saprai ancora cosa sono?

pinMode(pin,INPUT);            // a parte che pin e pin2 dicono poco....
 pinMode(pin2,INPUT);
 pinMode(buzzer,OUTPUT);

Ahahah solo perché ho copiato parte del primo codice che ho realizzato e non le ho più cancellate. Per le descrizioni e i nomi hai ragione che devo sistemarle, ma ero troppo contento che funzionasse il tutto che ho postato subito.

Puso:
poi il pulsante non è cosi facile come sembrerebbe

In questo caso ho messo il buzzer per verificare se mi ha preso la lettura senza usare debounce.

a parte i collegamenti....o le riparazioni programmate
il pulsante non e semplicissimo.

in che stato è?
in che stato era prima?
in che stato lo vuoi?

è molto piu complicato di quel che sembra

Personalmente ho faticato meno a capire ed utilizzare il millis() come volevo....che il pulsante come volevo.

Buongiorno a tutti, ho un ultima domanda, poi chiudo il topic.
Ho aggiunto un lcd che mi stampi i valori di mio interesse nel progetto e lo sketch in simulazione si comporta bene.
Ora voglio assemblare il tutto e cominciare a fare le prove sul campo, ma sono molto indeciso su come alimentare il tutto.
Il mio progetto si presenta con:
-arduino uno r3
-modulo pressione differenziale mpx5100dp
-2 pulsanti
-schermo lcd a due righe
-2 relè stato solido omron a 5v
La mia intenzione è alimentare l'arduino con un alimentatore da 9v.
Il sensore di pressione e i 2 pulsanti li alimento direttamente con arduino, mentre per i relè e lo schermo lcd sono indeciso se prendere un alimentatore da 5 v oppure usare uno stepdown dc to dc usando solo un alimentatore da 9v.
Fatemi sapere qual'è la scelta migliore, anche se c'è un altro modo diverso da questo.!
Grazie ancora per l'attenzione.
Lascio il codice del progetto se qualcuno volesse dare un occhiata

#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,8,9,10,11);

int inputVariable = 0;
int minima = 100;
int neutral = 100;
int var = 0;
int var2 = 0;
int bassa = 5;//alzo la zona neutra
int alta = 6;//diminuisco la zona neutra
int buzzer = 7;//suono
int stampa = 0;
unsigned long previousMillis;
int ferma = 8000;
int stato = 0;


void setup() {
  lcd.begin(16,2);

  Serial.begin(9600);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(bassa, INPUT);
  pinMode(alta, INPUT);
  pinMode(buzzer, OUTPUT);
}
void loop() {
  lcd.setCursor(0,0);
  var = digitalRead(bassa);//leggo pin5
  var2 = digitalRead(alta);//leggo pin 6

  inputVariable = analogRead(A2);//leggo pressostato
  if (inputVariable != stampa)//stampo il valore solo se è diverso
  { Serial.println(inputVariable, DEC);//scrivi sul monitor il valore pressione
  lcd.setCursor(0,0);//prima riga lcd
  lcd.print("PRESSIONE       ");//scrivi pressione
  lcd.setCursor(0,1);//seconda riga lcd
  lcd.print( "                ");//cancella
  lcd.setCursor(0,1);//seconda riga lcd
    lcd.print( inputVariable,DEC);//scrivi valore pressione
    stampa = analogRead(A2);//definisco stampa
  }


  if (var == HIGH)//schiacciando 5 aumenta la zona neutra
  {
    minima = minima + 10;
    tone(buzzer, 1000, 200);//suono
    Serial.println(minima, DEC);//stampo
      lcd.clear();
    lcd.setCursor(0,0);
     lcd.print("BANDA NEUTRA DA");
     lcd.setCursor(0,1);
     lcd.print( "                ");
     lcd.setCursor(0,1);
    lcd.print(minima,DEC);
    digitalWrite(bassa, LOW);
    delay(20);
  }

  if (var2 == HIGH)//schiacciando 6 diminuisce la zona neutra
  {
    minima = minima - 10;
    tone(buzzer, 500, 200);//suono 
    Serial.println(minima, DEC);//stampo
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("BANDA NEUTRA A ");
     lcd.setCursor(0,1);
     lcd.print( "                ");
     lcd.setCursor(0,1);
    lcd.print(minima+100,DEC);
    digitalWrite(alta, LOW);
    delay(20);
  }


  if (inputVariable < minima)//se ho pressione bassa

  {
    digitalWrite(4, LOW);


    if ((millis() - previousMillis) > ferma)//chiudo le finestre a intervallo di 8 secondi
    {
      unsigned long previousMillis = millis();
      stato = digitalRead(3);
      digitalWrite(3, !stato);
    }
  }




  if (inputVariable >= minima && inputVariable <= minima + neutral)//pressione neutra, non faccio niente
  { digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    unsigned long previusMillis = millis();
  }

  if (inputVariable > minima + neutral)//pressione alta apro la finestra
  {
    unsigned long previousMillis = millis();
    digitalWrite(3, LOW);
    digitalWrite(4, HIGH);
  }




  delay(20);
}