MCP9808 lukeminen, I2C

Onko kukaan käytellyt lämpötila-anturia MCP9808?

Kytkentä lienee ok (Arduinoon), mutta lukemat mystisiä…

Hitto kun löytäisi esimerkkikoodia jostain. Aika halpa
ja monipuolinen anturi tämä sinänsä on, hiukka mutkikas
vaan lukea, näemmä!

Ootkos vilkassut että conffaat tuon piirin oikein?

pahus ku itellä ei ole noita piirejä, niin ei voi testiä ollenkaan. LM75 verrattuna pikkusia muutoksia, mutta ei pitäs olla kuitenkaan niin paljoa vaikeampi käyttää.
Vai oliko LM75:sta kokemuksia?

Edit:
Arduinosta en tiiä onko I2C liikenteessä timeout. Jos on niin oletko katellut, että liikenne menee oikein eikä timeouttia tapahdu?

Moi

Ei ole ollu LM75, LM35 on ollut, mutta on “hiukka” yksinkertaisempi…

I2C on on mulle muutoinkin outo juttu, mutta tuleepahan tutustuttua!
En ole confannut piiriä ollenkaan, oletan että siinä on tietty perusvika,
tai ei se vika piirissä ole :smiley:

Pitkin nettiä olen haeskellut vinkkejä, mutta aika köyhäksi on anti
jäänyt.

pari ekaa hyvää google hittiä:

Tuossa on jotain koodia
forum.arduino.cc/index.php/topic,169036.0.html

ja avrfreaksistä bongasin että konkka sensorin powerreihin on hyvä juttu:
avrfreaks.net/index.php?name … c&t=123901

Ja ajatehan sopivilla kelloilla tuota piiriä? Jos on mahdollista niin hiljennä vauhtia. se menee paremmin piikkilangoista ja muista huonoista johdoista pidemmän matkaa.

Jep, olen kyllä katsastanut mainitut esimerkkikoodit ja pari muutakin
paikkaa, jotka kaivoin esille.

Perusongelma on I2C -kädettömyyteni.

Olen ymmärtävinäni, että ensin tehdään langoitus.

GND - GND
Vcc - 5V
A0, A1, A2 - 5V
SLC ja SDA pinnit 5 ja 4

Tämä lienee oikein.

Sitten tarvitsee varmaan ajaa anturille jokin configgialustus (ei mitään hajua),
sen jälkeen kai aletaan lukemaan piiriä jotenkin (ei juuri hajua tästäkään).

Esimerkkikoodia MCP9808 on tosi huonosti saatavilla. Tai manuaalin lopussa on
kyllä PICille tehty esimerkkikoodi, joka ei aivan minulle avaudu.

EDIT:

Pientä edistystä. I2C -skanneri löytää I2C-laitteen osoitteesta 0x1F.
Koodi palauttaa aina luvun 0. Jokin mättää…

#include <Wire.h>
#define address 0x1F

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

void loop()
{
  Wire.beginTransmission(address);
 
  Wire.write(0x05);
  Wire.requestFrom(address, 2);
  int temperature;
  if (Wire.available()) {
     temperature = Wire.read();
  }
  Wire.endTransmission();
  Serial.println("-----------");
  Serial.println(temperature);
  delay(1000);
}

EDIT EDIT:

Koplasin Nick Gammonin koodia avukseni, vaan eipä toimi tämäkään.

// Written by Nick Gammon
// Date: 18th February 2011

#include <Wire.h>

const int SLAVE_ADDRESS = 0x1F;

void sendCommand (const byte cmd, const int responseSize)
  {
  Wire.beginTransmission (SLAVE_ADDRESS);
  Wire.write (cmd);
  Wire.endTransmission ();
  
  Wire.requestFrom (SLAVE_ADDRESS, responseSize);  
  }  // end of sendCommand
  
void setup ()
  {
  Wire.begin ();   
  Serial.begin (9600);  // start serial for output
  }  // end of setup

void loop()
  {
  int val;
  
  sendCommand ((byte) 0x05, 2);
  val = Wire.read ();
  val <<= 8;
  val |= Wire.read ();
  Serial.print ("Value of A0: ");
  Serial.println (val, BIN);
  delay (500);   
  }  // end of loop

Tohon ekaan koodiin tekisin seuraavan muutoksen. Eli odotetaan että väylä vastaa.

Toi nolla on varmaan alustus arvo.

[code]void loop()
{
Wire.beginTransmission(address);

Wire.write(0x05);
Wire.requestFrom(address, 2);
int temperature;
while(Wire.available() == 0); // Odota että väylä on valmis

temperature = Wire.read();

Wire.endTransmission();
Serial.println("-----------");
Serial.println(temperature);
delay(1000);
}[/code]

Tosiaan tossa alkp koodissa hypättiin ton lukemisen yli jos väylä ei ollu valmis ja sulettiin se sen jälkeen.

Moi, kokeilin alla olevaa… takaisin tulee 0 ja 29. Olen kokeillut vaikka mitä, vaan ei onnistu.
Pitäisi vääntää manuaalin ww1.microchip.com/downloads/en/D … 25095A.pdf sivulla 25 oleva koodi “arduinaksi”… Ei oikein multa väänny.


#include <Wire.h>
int address = 0x1F;

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

void loop()
{
  Wire.beginTransmission(address);
  Wire.write(0x05);
  Wire.requestFrom(address, 2);
  while(Wire.available() == 0); // Odota että väylä on valmis
  byte msb = Wire.read();
  byte lsb = Wire.read();
  Wire.endTransmission();
  Serial.println("-----------");
  Serial.println(msb);
  Serial.println(lsb);
  delay(1000);
}