Ciao a tutti,
sto cercando di realizzare un piccolo progetto nel quale, come parametro di controllo, devo misurare una pressione di un fluido mediante un sensore ad immersione.
Come sensore ho optato per un MS5837-30BA della Mouser, ma montato su un modulo CJMCU-5837.
Questo modulo presenta un cavetto con già le connessioni necessarie per poterlo interfacciare ad Arduino:
VCC, GND, SCL e SDA. Il modulo comunica mediante I2C.
Ora, vedendo il PCB del modulino e lo schema elettrico del produttore del sensore "nudo", sul modulo sono già presenti un regolatore di tensione con condensatore di disaccoppiamento e due resistenze di pullup da 10kohm.
In definitiva, ho collegato SCL e SDA rispettivamente ai pin 7 e 5. Vcc e GND prelevati dalla stessa sorgente che alimenta il Digispark.
A questo punto, non sapendo NULLA di comunicazione I2C, se non che è una specie di seriale che lavora a nodi, dove ad ogni nodo corrisponde un sensore o uno slave generico a cui è associato un codice ASCII, ho cercato in rete e ho letto che, per comunicare in I2C con un sensore di questo tipo, bisogna innanzitutto conoscerne il codice identificativo.
Qui iniziano i dolori: non conoscendo questo codice (fornitore sensore e produttore modulo non hanno nulla a livello di documentazione in merito), ho pescato dagli schetch di esempio del Digispark un programma che, mediante interrogazione sulla linea I2C, effettua una specie di ping incrementando l'indirizzo di destinazione fino a +127.
#include <Wire.h>
#include <DigiKeyboard.h>
void setup()
{
Wire.begin();
DigiKeyboard.delay(3000);
DigiKeyboard.println("\nI2C Scanner");
}
void loop()
{
byte error, address;
int nDevices;
DigiKeyboard.println("Scanning...");
nDevices = 0;
for (address = 1; address < 127; address++ )
{
// The i2c_scanner uses the return value of
// the Write.endTransmisstion to see if
// a device did acknowledge to the address.
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0)
{
DigiKeyboard.print("I2C device found at address 0x");
if (address < 16)
DigiKeyboard.print("0");
DigiKeyboard.print(address, HEX);
DigiKeyboard.println(" !");
nDevices++;
}
else if (error == 4)
{
DigiKeyboard.print("Unknow error at address 0x");
if (address < 16)
DigiKeyboard.print("0");
DigiKeyboard.println(address, HEX);
}
}
if (nDevices == 0)
DigiKeyboard.println("No I2C devices found\n");
else
DigiKeyboard.println("done\n");
DigiKeyboard.delay(5000); // wait 5 seconds for next scan
}
Bene, al primo "Scanning..." che appare a schermo (mantenendo il Digispark collegato via USB e cliccando su un file vuoto del Notepad) non accade più nulla, come se tutto andasse in blocco.
Ho provato anche con un secondo Digispark, ma nulla. Ho provato per scrupolo ad utilizzare ulteriori resistenze di pullup, ma nulla.
Manca qualcosa nel Codice? Idee?
Grazie infinite.
Fabio
