Sensore di pressione

Buona sera,

devo implementare questo piccolo sckecth :

void setup() {
  // 
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  Serial.begin(9600);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
}

void loop() 
{
  if (Serial.available())
   {
    char ch = Serial.read();
    if (ch=='1')
     digitalWrite(8, HIGH);
    else if (ch=='A')
     digitalWrite(8, LOW);
    else if (ch=='2')
     digitalWrite(9, HIGH);
    else if (ch=='B')
     digitalWrite(9, LOW);
   }
}

con le righe necessarie per leggere il segnale proveniente dal sensore di pressione PCA2-B4VGS che invia un segnale che vale 1 - 1024 per pressioni da 0 a 4 bar, in modo da poterle trattare col PC.

Mi puoi aiutare? Grazie.

Vedo che ne avevi già parlato qui, e lo sketch che hai messo lì mi sembra più corretto di questo. Perché leggi la seriale? Se il sensorie invia in uscita una tensione proporzionale alla pressione, la strada giusta è analogRead(), come avevi già fatto.

Il caso è diverso.

Qui devo leggere il valore del sensore (0- 1024) e renderlo disponibile (sulla porta seriale?) per la lettura col PC.

Ho riscritto lo sketch, spero vada bene, manca l’istruzione che scrive il valore della pressione sulla porta seriale.

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int reading = 0;

int sensorPin = A0;


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

  pinMode(7,OUTPUT);

  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, INPUT);
  Serial.begin(9600);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
}

void loop() 
{
  if (Serial.available())
   {
    char ch = Serial.read();
    if (ch=='1')
     digitalWrite(8, HIGH);
    else if (ch=='A')
     digitalWrite(8, LOW);
    else if (ch=='2')
     digitalWrite(9, HIGH);
    else if (ch=='B')
     digitalWrite(9, LOW);
   }

lettura = analogRead(sensorPin);

int pressione = lettura;   // serve per ricavare il giusto valore della pressione

lcd.setCursor(0, 0);

lcd.print("Temperatura: ");

lcd.setCursor(0,1);

lcd.print(pressione);
}

Grazie.

D’accordo, ma mica cambia come leggi il sensore… Dopo che l’hai letto metterai la lettura sulla seriale, ma si legge sempre allo stesso modo.

Ok, quindi lo sketch giusto dovrebbe essere questo :

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int reading = 0;

int sensorPin = A0;


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

  pinMode(7,OUTPUT);

  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, INPUT);
  Serial.begin(9600);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
}

void loop() 
{
  if (Serial.available())
   {
    char ch = Serial.read();
    if (ch=='1')
     digitalWrite(8, HIGH);
    else if (ch=='A')
     digitalWrite(8, LOW);
    else if (ch=='2')
     digitalWrite(9, HIGH);
    else if (ch=='B')
     digitalWrite(9, LOW);
   }

lettura = analogRead(sensorPin);

int pressione = lettura;

lcd.setCursor(0, 0);

lcd.print("Temperatura: ");

lcd.setCursor(0,1);

lcd.print(pressione);
analogWrite(7, pressione);
delay(500);
}

Sono graditi suggerimenti e/o correzioni, grazie.

Boh, se funziona come deve va bene, ma non mi pare che invii niente sulla seriale, la pressione viene solo stampata sull'LCD e quindi usata per pilotare un'uscita PWM.

Su quest'ultima cosa c'è un errore, in quanto la lettura sarà tra 0-1023 (10 bit), ma il PWM accetta solo valori tra 0-255 (8 bit). Suggerisco di introdurre la funzione map() per effettuare una conversione del valore.

Inoltre perché usi la variabile pressione e quella lettura, quando sono la stessa cosa?

Pensavo, in sede di prova, di utilizzare > pressione < per modificare il valore di > lettura <.

Comunque penso che non esistano problemi.

L’istruzione :

analogWrite(7, pressione);

non rende disponibile il valore > pressione < sulla porta seriale?

Se no, come posso procedere? Grazie.

Dinamo2016:
L’istruzione :

analogWrite(7, pressione);

non rende disponibile il valore > pressione < sulla porta seriale?

… sarà bene che vai nella pagina del Reference e dedichi del tempo a studiare i vari metodi per le porte Analogiche e la classe Serial per la comunicazione seriale, perché … hai le idee molto confuse ::slight_smile:

Guglielmo

Scusa ma non sarebbe meglio indicarmi l'istruzione giusta per poterla usare subito e facilitare la ricerca di studio? Grazie.

Perché cosa ho fatto ? ? ? Ti ho indicato esattamente cosa e dove cercare quello che devi studiare perché NON hai capito né a cosa serve la analogWrite() né come si usa la seriale. Cosa altro ti devo dire ?

E NO, mi spiace, la "pappa fatta" non la fornisco ... prima pretendo che si capisca di cosa si sta parlando, poi tutto l'aiuto che serve ...

Guglielmo

La vedo così :

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
lettura = A0; //pin analogico di ingresso

void setup() {
  lcd.begin(16, 2);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  Serial.begin(9600);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
}

void loop() 
{
  if (Serial.available())
   {
    char ch = Serial.read();
    if (ch=='1')
     digitalWrite(8, HIGH);
    else if (ch=='A')
     digitalWrite(8, LOW);
    else if (ch=='2')
     digitalWrite(9, HIGH);
    else if (ch=='B')
     digitalWrite(9, LOW);
   }
lettura = analogRead(A0);
pressione = lettura;		// lettura per uso futuro
lcd.setCursor(0, 0);

lcd.print("Temperatura: ");

lcd.setCursor(0,1);

lcd.print(pressione);
Serial.println(analogRead(pressione));
delay(500);
}

... mi sembra meglio, ma ... starei attento con la dichiarazione delle variabili (mi sembra che ne manchi qualcuna) ed il loro uso ... :wink:

Guglielmo

ciao

Quasi...

questo non ha senso.

Serial.println(analogRead(pressione));

pressione è una variabile dove hai memorizzato il valore della pressione, non il PIN che usi per leggerla.

Quindi potresti scrivere:

Serial.println(analogRead(A0));

però visto che la pressione la hai già letta prima per "scriverla" sulla seriale basta un:

Serial.println(pressione);

ciao
pippo72

Grazie pippo72

Ok,

Ora il sistema funziona ma il rilevamento del valore della pressione non è affidabile, mi spiego meglio :

  • il dato della pressione è presente sulla porta A0.

  • lo leggo da programma esterno, ogni 10 secondi quindi 6 rilevazioni al minuto.

  • le prime 3 rilevazioni, seppur differenti, sono giuste, nel mio caso, 1,35 - 1.40 Bar, concordanti con quanto leggo sul manometro analogico.

  • le altre e rilevazioni ( 4 5 e 6) sono completamente sballate (0.1 - 0.2 Bar) in completa discordanza col manometro.

  • alla sesta rilevazione, si ripete tutto in modo identico.

  • lo sketch prevede un ritardo di 500 ms dopo ogni lettura, ovvero

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int reading = 0;
int pressione = 0;

void setup() {
  lcd.begin(16, 2);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  Serial.begin(9600);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
}

void loop() 
{
  if (Serial.available())
   {
    char ch = Serial.read();

    if (ch=='1')		// valvola di Carico
     digitalWrite(8, HIGH);
    else if (ch=='A')
     digitalWrite(8, LOW);

    else if (ch=='2')		// valvola di Scarico
     digitalWrite(9, HIGH);
    else if (ch=='B')
     digitalWrite(9, LOW);

    else if (ch=='3')		// toglie la corrente
     digitalWrite(10, HIGH);    // collegamenti relè diversi
    else if (ch=='C')
     digitalWrite(10, LOW);
 
   }
pressione = analogRead(A0);
lcd.setCursor(0, 0);
lcd.print("Temperatura: ");
lcd.setCursor(0,1);
lcd.print(pressione);
Serial.println(pressione);
delay(500);
}

Posso fare qualcosa per risolvere il problema delle rilevazioni?

Grazie.