Buongiorno gente,
sto tentando di capire come far funzionare questo sensore con arduino. A parte che i piedini non si incastrano nella breadboard (andra' a finire che li saldero' a dei fili volanti per ora) , qualcuno riesce ad indicarmi un link dove spiega passo passo cosa-metto-dove-dove-metto-cosa?
Trovato molte cose che riguardano l'SPI ma piu' collegate al collegare due board o lo schermo, niente sui sensori.
Sembra strano che i piedini non si incastrino nella board, hanno un passo standard.
Riguardo al resto la vedo dura. Non c'è uno straccio di libreria per quel sensore e anche col manuale non sarà facile ricreare il protocollo di comunicazione.
PaoloP:
Sembra strano che i piedini non si incastrino nella board, hanno un passo standard.
Pensavo anche io, ma questi hanno una distanza piu' breve.
PaoloP:
Riguardo al resto la vedo dura. Non c'è uno straccio di libreria per quel sensore e anche col manuale non sarà facile ricreare il protocollo di comunicazione.
Pensavo di utilizzare la libreria SPI.h , ma non trovo altri sensori che la utilizzino.
La cosa non è di semplice soluzione.
Dovresti scriverti la libreria di sana pianta e inoltre, con pazienza, ricavarti anche lo schema del circuito perché dal manuale non si capisce se, ad esempio, i condensatori sono da aggiungere o sono già previsti sulla scheda.
E' un vero peccato perché come prodotto sembra interessante, ma senza supporto diventa difficile utilizzarlo per i propri progetti.
Mai arrendersi! Tutto si può fare, basta solo capire come...
Ho avuto tra le mani questo sensore e dopo aver constatato che esistono poche e lacunose informazioni mi sono messo all'opera ed ho trovato il modo di farlo funzionare. Il sensore in questione è + o - uguale ad un altro sensore di cui ho trovato un utilizzo. Ho eliminato il controllo CRC perchè, nonostante l'utilizzo di vari condensatori di decoupling, continuavo ad avere disturbi sulla trasmissione. In ogni caso, al momento sto utilizzando il sensore senza controllo CRC da un bel pò e non mi ha dato nessun tipo di problema, ho fatto vari test con temperatura ed umidità diverse ed ha risposto in modo affidabile. Riguardo i piedini più stretti, piuttosto che cercare lo zoccolo adatto che cmq darebbe poi problemi simili avendo lo stesso tipo di piedinatura, consiglio di saldare 6 fili direttamente al posto dei piedini. Di seguito il programma modificato:
// Written by Nick Gammon
// February 2011
// see http://mushclient.com/spi
// Rework for DYPTH01B_SPI Temperature and Humidity sensor
// using MTH01 Sensor
// D. Richards, Jan 2012
// see http://www.suntekstore.co.uk/product-14001923-DYPTH01B-SPI+Temperature++Humidity+Sensor+Module.html
// Rework for MB-SM24118 High Sensitivity Humidity & Temperature Sensor Module
// G. Di Febbraro, June 2013
// see http://www.sureelectronics.net/goods.php?id=1438
// Corrected pinout corrispondences
// Removed CRC check - to be optimized - I don't need it - for me work very well!
// Sensor top view
// CS - On/Off 1|° ------- [][][][]
// SCK - CLK 2|° [ ] [][][][]
// SDAT - MOSI 3|° [ ] [][][][]
// Reset - Reset 4|° [ ] [][][][]
// VSS - GND 5|° ------- ° °
// VDD - +5 V 6|° ° °
// ------------------------------
// Work well with +3.3 V too
//Pin Arduino(Slave) Pin Sensor(Master)
// 7 1
// 11 3
// 13 2
#include "pins_arduino.h"
unsigned char buf [7];
volatile byte pos;
volatile boolean process_it;
int MTH_temperature;
int MTH_humidity;
#define HCS 6
void setup (void)
{
Serial.begin (9600); // debugging
Serial.println ("MB-SM24118 High Sensitivity Humidity & Temperature Sensor Module");
pinMode(HCS, OUTPUT); // CS output
digitalWrite(HCS, HIGH); // CS inactive
SPCR |= _BV(SPE); // turn on SPI in slave mode - get ready for an interrupt
pos = 0; // empty buffer
process_it = false;
SPCR |= _BV(SPIE); // now turn on interrupts
digitalWrite(HCS, LOW); // CS active, starts conversion
}
// SPI interrupt routine
ISR (SPI_STC_vect)
{
byte c = SPDR; // grab byte from SPI Data Register
if (pos < sizeof buf) // add to buffer if room
{
buf [pos++] = c;
if(pos >= 4) // when all 4 bytes received
{
digitalWrite(HCS, HIGH); // disable further conversions
process_it = true; // signal ready to main loop
}
}
}
void loop (void)
{
if (process_it)
{
MTH_temperature = ( (256*buf[0]) + buf[1] ) - 400;
MTH_humidity = buf[2];
Serial.print(" T=");
Serial.print( MTH_temperature / 10);
Serial.print(".");
Serial.print( MTH_temperature % 10);
Serial.print("C, H=");
Serial.print(MTH_humidity);
Serial.println("%");
delay(5000);
pos = 0; // reset buffer index
process_it = false; // preset buffer not ready
digitalWrite(HCS, LOW); // start conversion
}
}