[Risolto] HCH-1000-002 problemi

Ciao a tutti, ho in mente di fare un qualcosa simile a garduino. Ho già collegato il sensore di temperatura, la fotoresistenza e l'lcd. Ora però avendo acquistato il sensore di umidità HCH-1000-002 nn riesco a farlo funzionare.. Avete delle dritte da darmi? Considerate che sono nuovo nel mondo di Arduino...

Il datasheet del componente è questo: http://sensing.honeywell.com/index.php?ci_id=54699&la_id=1

Per ora mi vorrei limitare a dare l'output dell'umidità all'lcd. Grazie a quanti di voi mi aiuteranno smiley-slim

Soluzione
Sul pin di carica (13) ho messo una resistenza da 10Mohm e sul pin di scarica (10) ho messo una resistenza da 220ohm

#define CHARGE_PIN 13
#define DISCHARGE_PIN 10
#define VOLTAGE_CHECK_PIN A2
// Callibrating definitions
// Value for 0% humidity
#define HUMIDITY_0 4000
// Value for 100% humidity
#define HUMIDITY_100 4716

// 1 - Callibration mode
// 0 - Measurement in units mode
#define CALIBRATION 1

int counter = 0;


unsigned long charge()
{
  // Setting pins in charging mode
  pinMode(DISCHARGE_PIN, INPUT);
  unsigned long begin_time = micros(); // Loading the initial time
  pinMode(CHARGE_PIN, OUTPUT);
  digitalWrite(CHARGE_PIN, HIGH);
  // Waiting for the capacitor to reach 63,2% of supply voltage
  while (analogRead(VOLTAGE_CHECK_PIN) < 648);
  unsigned long end_time = micros(); // Loading the final time
  return end_time - begin_time; // Calculating the charging time
}


void discharge()
{
  // Setting pins in discharging mode
  pinMode(CHARGE_PIN, INPUT);
  digitalWrite(CHARGE_PIN, LOW);
  pinMode(DISCHARGE_PIN, OUTPUT);
  digitalWrite(DISCHARGE_PIN, LOW);
  // Waiting for the capacitor to reach 0V
  while (analogRead(VOLTAGE_CHECK_PIN) > 0);
}


unsigned int get_humidity()
{
  discharge();
  unsigned long charge_time = charge(); // Charging with time measurement
  // Skalowanie
  unsigned int humidity = map(charge_time, HUMIDITY_0, HUMIDITY_100, 0, 100);
  // Callibration mode (1) or measurement mode (0)
  if (CALIBRATION == 1)
    return charge_time;
  else
    return humidity;
}


void setup()
{
  Serial.begin(9600);
}


void loop()
{
  unsigned int humidity;
  // Sensor requires frequent measurement
  // Every hundredth measurement is displayed
  while (counter < 100)
  {
    humidity = get_humidity();
    counter++;
  }
  Serial.println(((((float)humidity*5000/1023) - 800)/310), 2);
  counter = 0;
}

Quel sensore vari al sua capacità in modo direttamente proporzionale all'umidità, quindi è come se tu dovessi misurare un condensatore variabile, realizzando una specie di capacimetro, a mio modestissimo parere. Credo che una soluzione immediata possa essere quella di creare un mini circuito con una resistenza in serie all'alimentazione che carichi in condensatore, ed il collegamento ad un pin analogico che misuri il tempo di carica. Penso che questi sensori funzionino tutti allo stesso modo, hai cercato nel Playground qualcosa in merito?

Prima di tutto grazie per la risposta :wink:

In realtà mi hai dato due dritte e credo di essere sulla strada giusta. Ho trovato questo, può fare al caso mio, che dici? Arduino Playground - CapacitanceMeasurement

Figurati, quella è certamente una strada, quindi inizia a realizzare quel circuito, usa qualche condensatore campione che rientri nella gamma generata dal tuo sensore e ricavati la formula di conversione avendo dei valori certi di riferimento, a quel punto sostituisci il condensatore campione col sensore e vedi che ne esce. Buon divertimento! :slight_smile:

C'ho provato ma nulla... Ti faccio vedere uno schema che penso sia buono ma nn mi ha dato i risultati sperati.. http://starter-kit.nettigo.eu/wp-content/uploads/2010/10/schemat.png

Per lo sketch diciamo ancora peggio... Mi sono appoggiato a questa guida Humidity sensor – Starter Kit ma quando devo mandare l'informazione al monitor seriale quale pin dovrei leggere? L'analogico? Scusa l'gnoranza, magari per te questo è una cavolata :smiley: Grazie ancora :blush:

niente è una cavolata e poi io ne so meno di te :wink:
Sul link del sensore di umidità mi pare ci sia tutto, certo non è da copia/incolla ma con un po' di applicazione e pazienza dovresti uscirne, purtroppo non ce la faccio a trovare tutto questo tempo per farlo io.
Comunque lo schema è giusto, lì hai un circuito di carica ed uno di scarica sui pin 2 e 3; la variazione te la trovi sul pin analogico A0, devi quindi fare una lettura analogica su A0; credo ti serva per calcolare il tempo che trascorre tra il C scarico ed il C carico, ed in base a quello ricavi il valore del C stesso.

Guarda ho attaccato 3 resistenze in serie da 330kohm sul pin di carica e da 220ohm sul pin di scarica. Leggo dei valori che sono "decenti" anche se nn riesco a capire come farli diventare una percentuale.. Di formulette in giro se ne trovano ma ho dei problemi a metterle nello sketch...

Adesso uso questo:

#define CHARGE_PIN 13
#define DISCHARGE_PIN 10
#define VOLTAGE_CHECK_PIN 2
// Callibrating definitions
// Value for 0% humidity
#define HUMIDITY_0 4000
// Value for 100% humidity
#define HUMIDITY_100 4716

// 1 - Callibration mode
// 0 - Measurement in units mode
#define CALIBRATION 1

int counter = 0;


unsigned long charge()
{
  // Setting pins in charging mode
  pinMode(DISCHARGE_PIN, INPUT);
  unsigned long begin_time = micros(); // Loading the initial time
  pinMode(CHARGE_PIN, OUTPUT);
  digitalWrite(CHARGE_PIN, HIGH);
  // Waiting for the capacitor to reach 63,2% of supply voltage
  while (analogRead(VOLTAGE_CHECK_PIN) < 648);
  unsigned long end_time = micros(); // Loading the final time
  return end_time - begin_time; // Calculating the charging time
}


void discharge()
{
  // Setting pins in discharging mode
  pinMode(CHARGE_PIN, INPUT);
  digitalWrite(CHARGE_PIN, LOW);
  pinMode(DISCHARGE_PIN, OUTPUT);
  digitalWrite(DISCHARGE_PIN, LOW);
  // Waiting for the capacitor to reach 0V
  while (analogRead(VOLTAGE_CHECK_PIN) > 0);
}


unsigned int get_humidity()
{
  discharge();
  unsigned long charge_time = charge(); // Charging with time measurement
  // Skalowanie
  unsigned int humidity = map(charge_time, HUMIDITY_0, HUMIDITY_100, 0, 100);
  // Callibration mode (1) or measurement mode (0)
  if (CALIBRATION == 1)
    return charge_time;
  else
    return humidity;
}


void setup()
{
  Serial.begin(9600);
}


void loop()
{
  unsigned int humidity;
  // Sensor requires frequent measurement
  // Every hundredth measurement is displayed
  while (counter < 100)
  {
    humidity = get_humidity();
    counter++;
  }
  Serial.println(humidity);
  counter = 0;
  delay(1000);
}

In pratica dovrei mettere la formula alla fine, li dove c'è Serial.println(humidity)?

La formula è questa:

(((humidity/1023)*5)-0.8)/0.031

Sì, il serial.print è il comando che invia al monitor il valore "humidity" calcolato dallo sketch; se sostituisci umidity con la tua formula ovviamente rielabori tale valore in modo da farti dare la percentuale di umidità, anche se teoricamente il programma dovrebbe già fornire questo valore. Vedo all'inizio:

// 1 - Callibration mode
// 0 - Measurement in units mode
#define CALIBRATION 1

quindi il software è impostato in modalità calibrazione, probabilmente per restituirti un valore da usare da qualche altra parte; ottenuto tale valore credo che tu debba impostare quella riga a 0, in modo da lavorare in modalità misura.

Ci sono riuscito :slight_smile: Era solo un problema di parentesi.. Però una cosa... Il sensore mi dà sempre uno stesso valore, anche se ci "alito" vicino.. Secondo te da che cosa può dipendere?

alex87r6:
Ci sono riuscito :slight_smile: Era solo un problema di parentesi.. Però una cosa... Il sensore mi dà sempre uno stesso valore, anche se ci "alito" vicino.. Secondo te da che cosa può dipendere?

se non ti sei lavati i denti lo avrai distrutto :sweat_smile:
no, non lo so, ti consigliavo di fare la prova con un paio di condensatori di valore entro il range previsto dal sensore, da lì ti accorgi se sta funzionando

Ho fatto quello che mi hai consigliato.. Se metto il sensore mi dà l'output, se metto 3 condensatori da 100uF in serie (il sensore lavora ottimalmente a 330uF,ma funziona anche a 300uF) nn succede niente :cry:

alex87r6:
Ho fatto quello che mi hai consigliato.. Se metto il sensore mi dà l'output, se metto 3 condensatori da 100uF in serie (il sensore lavora ottimalmente a 330uF,ma funziona anche a 300uF) nn succede niente :cry:

microfarad :astonished: no, non ti funzionerà mai! Il sensore non è che lavora ad una data capacità, ma varia la sua capacità in base al variare dell'umidità, tu in pratica stai facendo una conversione capacità->tensione per poterla leggere con Arduino; cambiando capacità devi ottenere un valore diverso, altrimenti il software non sta funzionando. Il data-sheet ti dice che la capacità del sensore varia da 275 a 315 picoFarad (NON micro!) in base alla temperatura con umidità 0%, ed arriva a 335-375 pF, sempre in base alla temperatura con umidità al 100%. quindi tu puoi mettere al posto del sensore un condensatore da 270pF e poi da 330pF e dovresti avere prima un valore prossimo allo 0% e poi un valore prossimo al 100%; solo quando sarà così potrai usare il tuo sensore.

Hai ragione, mi ricordavo male :cry: Guarda ho attaccato il condensatore da 330pF, ho provato le resistenze che avevo messo e mi dava 550 come valore... Le ho ridimensionate e ora sto a 94.7... Il problema è che tanto metto il condensatore, tanto metto il sensore di umidità ho sempre lo stesso output.. A questo punto penso che il codice sia sbagliato :cry:

Sto usando questo:

#include <LiquidCrystal.h> //include la libreria per il funzionamento dell'lcd
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //setta le uscite di arduino per lcd
float tempC;
//dichiarazione di variabile
int tempPin = 0; //inizializzazione del pin di Arduino
int fotoresistenzaPin = 1; // inizializza il pin 0 analogico
int fotoresistenzaReading; // il valore che conterrà la lettura
// Sensore HCH-1000-002 setup
// Input iniziali
#define CHARGE_PIN 13
#define DISCHARGE_PIN 10
#define VOLTAGE_CHECK_PIN 2

// Valore del 0% umidita'
#define HUMIDITY_0 4000
// Valore del 100% humidity
#define HUMIDITY_100 4716

// 1 - Calibrazione
// 0 - Misurazione
#define CALIBRATION 1

int counter = 0;

unsigned long charge()
{
  // Modalita' carica pin
  pinMode(DISCHARGE_PIN, INPUT);
  unsigned long begin_time = micros(); // Attesa tempo iniziale
  pinMode(CHARGE_PIN, OUTPUT);
  digitalWrite(CHARGE_PIN, HIGH);
  // Attesa che il condensatore arrivi al 63,2% del suo voltaggio
  while (analogRead(VOLTAGE_CHECK_PIN) < 648);
  unsigned long end_time = micros(); // Caricamento tempo finale
  return end_time - begin_time; // Calcolo tempo di carica
}


void discharge()
{
  // Modalita' scarica pin
  pinMode(CHARGE_PIN, INPUT);
  digitalWrite(CHARGE_PIN, LOW);
  pinMode(DISCHARGE_PIN, OUTPUT);
  digitalWrite(DISCHARGE_PIN, LOW);
  // Attesa che il condensatore arrivi a 0V
  while (analogRead(VOLTAGE_CHECK_PIN) > 0);
}


unsigned int get_humidity()
{
  discharge();
  unsigned long charge_time = charge(); // Carica e misura del tempo di carica
  unsigned int humidity = map(charge_time, HUMIDITY_0, HUMIDITY_100, 0, 100);
  // Modalita' calibrazione (1) o misurazione (0)
  if (CALIBRATION == 1)
    return charge_time;
  else
    return humidity;
}

void setup() {
lcd.begin(16, 2); // setta del numero delle colonne e delle righe
}

void loop() {
lcd.print("Temperatura..."); // stampa della prima riga sull'lcd
tempC = analogRead(tempPin);
//lettura valore del sensore
tempC = (5.0 * tempC * 100.0)/1024.0; //conversione del dato analogico in temperatura
lcd.setCursor(0, 1); // setta il cursore sulla seconda riga al primo carattere
lcd.print(tempC); // stampa la temperatura
lcd.print(" Celsius "); // stampa Celsius dopo il valore
delay(1000); // aspetta 1 secondo (1000 millesimi)
lcd.clear(); // pulisce lo schermo

lcd.print("Valore fotoresistenza"); // stampa della prima riga sull'lcd
fotoresistenzaReading = analogRead(fotoresistenzaPin); //inserisce il valore della lettura su fotoresistenzaReading
lcd.setCursor(0, 1); // setta il cursore sulla seconda riga al primo carattere
lcd.print(fotoresistenzaReading); // stampa del valore della fotoresistenza
delay(1000); // aspetta 1 secondo (1000 millesimi)
lcd.clear(); // pulisce lo schermo

{
  unsigned int humidity;
  // Il sensore richiede frequenti misurazioni
  // Ogni 100 misurazioni mi da' un output
  while (counter < 100)
  {
    humidity = get_humidity();
    counter++;
  
  }
 lcd.print("Umidita: ");
 lcd.setCursor(0,1);
 lcd.print(((((float)humidity/1023)*5)-0.9)/0.03159, 1); // Scrivo il valore di umidità con un decimale
 lcd.print("%");
  counter = 0;
  delay(1000);
  lcd.clear();
}
}

Ma in questo sketch stai usando pin che non c'entrano nulla con lo schema che mi hai postato. Hardware e software camminano assieme quindi devi replicare lo schema collegato a questo sketch. Mi spiego: mi hai postato uno schema in cui usi i pin 2,3,A0 ma nello sketch vedo che imposti i pin 2, 10, 13, come potrà mai funzionare?

ASPETTA :slight_smile:
I miei dubbi erano su una parte del circuito, ecco perchè in quel caso i pin erano "a caso", ma in realtà il pin dov'è attaccata la resistenza più grande è quello digitale 13, il pin con la resistenza più piccola è il 10 e l'analogica è la A2 :slight_smile:

Ho riportato il codice così come ci sto lavorando :slight_smile:

Alex, così li fai uscire pazzi quelli che ti aiutano ]:smiley: quindi abituati seriamente a postare schemi reali e sketch reali, non dati a caso (per non dirlo in maniera più chiara ]:D)
il pin A2 si indica con A2 NON con 2, che è il pin 2 e si trova dall'altra parte ed è un pin digitale, penso che il problema sia questo.

Hai ragione, scusa, nn succederà più :wink:

In realtà avevo visto che nn c'era differenza se mettevo A2 o 2 perchè tanto quando gli dai il comando "analogWrite" Arduino dovrebbe capire da solo che 2 sta per A2... Ho comunque provato a cambiare pin su "#define VOLTAGE_CHECK_PIN A2" ma la risposta è sempre la stessa.. 94,2%... Da quello che ho capito il valore delle resistenze, entro certi limiti non variano molto il valore, quindi se i collegamenti sono fatti bene nn so dove sbattere la testa :cry:

Guarda controlliamo anche quelli:

come analogWrite???? mi sa che sei un po' confuso :fearful:

analogWrite è un comando di uscita per i pin "pwm"

Tu invece devi LEGGERE un pin analogico, quindi devi usare il comando analogRead per leggere A2 :sweat_smile:

Nn ci siamo capiti e questo mi dispiace... analogWrite e analogRead fanno parte della stessa famiglia, nonostante con due compiti diversi, e fin qui ci siamo. Ma Arduino che tu gli dici analogRead(2) o analogRead(A2) sempre lo stesso comando dà....

Cmq il punto non è questo, le prove le ho fatte cambiando da 2 ad A2 ma niente...

PS: cmq anche con la temperatura e con la fotoresistenza ho usato semplicemente 0 e 1 e funzionano bene... Forse sarà la fortuna del principiante hiihhiih

Scusa, tu scrivi

In realtà avevo visto che nn c'era differenza se mettevo A2 o 2 perchè tanto quando gli dai il comando "analogWrite" Arduino dovrebbe capire da solo che 2 sta per A2

e poi mi dici che non ci siamo capiti :astonished:?

Va bene, analogRead (2) e analogRead(A2) sono la stessa cosa, l'obiezione ovviamente è nata perché hai scritto un'altro comando, che poi ci sia questa parentela tra analogRead e analogWrite lo sai tu, a me non risulta :stuck_out_tongue_closed_eyes:

Non so come altro aiutarti, bisognerebbe verificare lo schema per capire come hai calcolato quelle resistenze, bisognerebbe capire come mai hai messo una linea in più che va verso il vuoto su fritzing, che è quanto di peggio si possa usare per comunicare, dovresti cercare di disegnare un vero schema elettrico, e poi bisognerebbe analizzare bene lo sketch. Infine, strumenti alla mano, bisognerebbe misurare cosa succede ai capi di quel condensatore campione. Troppo per un poveraccio come me :~

Cerca almeno di mettere un po' d'ordine in tutto e poi vediamo cosa si può fare. :slight_smile: