I2C/Wire hőmérő probléma

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
Avatar
Bagameri
DrótVégénSzéndarab
Hozzászólások: 37
Csatlakozott: 2013. március 15. péntek, 14:21

I2C/Wire hőmérő probléma

Hozzászólás Szerző: Bagameri »

Hőmérővel kapcsolatban , beírtam a programot találtam is benne pár hibát azt kijavitottam .
De még most is hibát jelez a legelején .( mi lehet a hiba?)

Kód: Egész kijelölése

[#include "Wire.h"
 // 2 belső változó
 int t,1;
 // Eredmény
  float fok = 0.0;
  
  void setup()
  {
     //IIC kommunikació inicializálás
   Wire.begin();
   // Sorosport megnyitása
   Serial.begin(9600);
   
   Wire.beginTransmission(72);
   // Config register
   Wire.write(1);
   //B00000000: 0.5 fokos,de B01100000: 0.0625 fokos
   Wire.write(B01100000);
   Wire.endTransmission();
  }
  void loop()
  { Wire.beginTransmission(72);
  //00-s cim a Hőmérséklet kiolvasása
  Wire.write(0x00);
  Wire.endTransmission();
  // A 72-es cimről 2 byte-t kerunk
  Wire.requestFrom(72, 2);
  //Ha nincs eszkoz, akkor itt all a program
  while(Wire.available())
  {
    //1.byte megérkezik: egész fok
   // t = Wire.receive();
    t = Wire.read();
    
    //2. byte megerkezik :tort hőfok
   // 1 = Wire.receive();
    1 = Wire.read();
    //Hőmérséklet számolás. Lsd adatlap!
    1=1 /16;
    fok=t;
    fok=fok + 1*0.125;
    Serial.println (fok);
  } 
  delay(100);
  }*]
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: I2C/Wire hőmérő probléma

Hozzászólás Szerző: Robert »

A hibat itt erzem:

Kód: Egész kijelölése

void loop()
  { Wire.beginTransmission(72);
  //00-s cim a Hőmérséklet kiolvasása
  Wire.write(0x00);
  //Wire.endTransmission();      <- Ez a sor nem kell....
  // A 72-es cimről 2 byte-t kerunk
  Wire.requestFrom(72, 2);
  //Ha nincs eszkoz, akkor itt all a program
  while(Wire.available())
  {
    //1.byte megérkezik: egész fok
   // t = Wire.receive();
    t = Wire.read();
   
    //2. byte megerkezik :tort hőfok
   // 1 = Wire.receive();
    1 = Wire.read();
    //Hőmérséklet számolás. Lsd adatlap!
    1=1 /16;
    fok=t;
    fok=fok + 1*0.125;
    Serial.println (fok);
  }
  delay(100);
  }
Avatar
Bagameri
DrótVégénSzéndarab
Hozzászólások: 37
Csatlakozott: 2013. március 15. péntek, 14:21

Re: I2C/Wire hőmérő probléma

Hozzászólás Szerző: Bagameri »

Sajnos most sem lett meg a hiba, hiába töröltem ki azt a sort amit mondtál .
Ez írja alul ( expected unqualified-id before numeric constant )
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: I2C/Wire hőmérő probléma

Hozzászólás Szerző: Robert »

Kód: Egész kijelölése

int t,1;
Ebben a sorban egy 1-es (egyes ? )
Itt csak változó lehet!
Avatar
Bagameri
DrótVégénSzéndarab
Hozzászólások: 37
Csatlakozott: 2013. március 15. péntek, 14:21

Re: I2C/Wire hőmérő probléma

Hozzászólás Szerző: Bagameri »

Az igen az egyes . Miért másnak kéne lenni?
int t,1;
Avatar
Bagameri
DrótVégénSzéndarab
Hozzászólások: 37
Csatlakozott: 2013. március 15. péntek, 14:21

Re: I2C/Wire hőmérő probléma

Hozzászólás Szerző: Bagameri »

Most mindegyik 1-est megváltoztattam ( L )betűre és jó lett .
A soros monitoron jelenik meg ,de fél fokot nem jelez csak (27.00-28.00 fokot ír ki)
Mikor lesz a tanfolyamon hogy , ezt az értéket a kijelzőre kiírja ,vagy törjem a fejem ?!

A Gyakorlat teszi a mestert !
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: I2C/Wire hőmérő probléma

Hozzászólás Szerző: Robert »

Törd a fejed :).

Soká' lesz (float - egészrész, kódoptimalizálás fejezet...).
Avatar
Bagameri
DrótVégénSzéndarab
Hozzászólások: 37
Csatlakozott: 2013. március 15. péntek, 14:21

Re: I2C/Wire hőmérő probléma

Hozzászólás Szerző: Bagameri »

Egyébként meg lett hogy miért csak az egész fokokat jelezte ki ,
ebbe a sorba is L-t írtam az 1-es helyett
[ Wire.write(1); ]
Wekny
Újonc
Újonc
Hozzászólások: 2
Csatlakozott: 2014. október 8. szerda, 10:13

Re: I2C/Wire hőmérő probléma

Hozzászólás Szerző: Wekny »

Üdv. mindenkinek!

Nekem is van egy kérdésem ezzel a hőmérővel kapcsolatban, mégpedig a hőmérséklet számítása az ami nem tiszta. Megnéztem az adatlapot, de csak sejtéseim vannak. Szeretném, ha tisztába tennénk a dolgot.

//Hőmérséklet számolás. Lsd adatlap!
l=l /16;
fok=t;
fok=fok + l*0.125;
Serial.println (fok);

Kérdések:
1. A törtrészt azért osztjuk 16-tal, mert egy fokot 16-os felbontásban kezel a chip - vagy ez egy téves elgondolás?
2. Az egészrészhez hozzáadjuk a törtrészt - ez még tiszta - de előtte miért kell 0,125 -tel megszorozni? (Ez a rész sajnos teljes homály)

Amíg ezek nem tiszták, nem tudok/akarok továbblépni a tanfolyamban.

Segítséget köszönöm.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: I2C/Wire hőmérő probléma

Hozzászólás Szerző: Robert »

Csak fejből írom, az alapelv a lényeg (nincs itt az adatlap). 12 bites felbontással mérve, az egyik byte a egész+előjel, a másik a törtérték.

A visszakapott adat egészrésze az OK.
A törtrész:
7.bit: 0,5 fok
6. bit : 0,25 fok
5. bit: 0,125 fok
4. bit: 0,0625 fok
3-2-1-0: 0

A byteértéke ennek 0...255 közt lehet.
A /16 osztás, az gyakorlatilag 4x shifteli az értékeket balra:
7-6-5-4. bit: 0
3.bit: 0,5 fok
2. bit : 0,25 fok
1. bit: 0,125 fok
0. bit: 0,0625 fok

A kapott számérték: max: &B00001111 = 0....15
Ezt kell leképezni 0...(1-0,0625) közé. A legyszerűbb: kapott szám(tized)*0,0625.

Eredmény: Egészrész + tized
Avatar
Bagameri
DrótVégénSzéndarab
Hozzászólások: 37
Csatlakozott: 2013. március 15. péntek, 14:21

BMP 180 légnyomásmérő

Hozzászólás Szerző: Bagameri »

Tudom nem vág az előző témába ,rengeteget töröm a fejem de nem akar sikerülni olyan értéket elérni vele ami a környéken mért értékekhez közelítene. A wikipédián is utána jártam ,hogy ahol én vagyok az 149méterrel a tengerszinthez képest ezért 15milibárral kevesebb a kalibrálási érték, mivel 10méterenként 1 mbárral csökken a légnyomás .Tehát 99835ez lenne a normális légnyomás ezen a magasságon.
Ha valaki tud segítsen beállítani ,mit csináltam rosszul ?

Kód: Egész kijelölése

 
#include <Wire.h>
#include <Adafruit_BMP085.h>

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


Adafruit_BMP085 bmp;
  
void setup() {
  lcd.begin(16, 2);
  // Print a logo message to the LCD.
  lcd.print("Legnyomas mero");  
  lcd.setCursor(0, 1);
  lcd.print("Gulyas Jozsef");
  delay (2700);
  lcd.clear();

  // Print another message to the LCD.
  lcd.setCursor(2, 0);
  lcd.print("termometru -");  
  lcd.setCursor(0, 1);
  lcd.print("barometru ver1.0");
  delay (2500);
  lcd.clear();

  Serial.begin(9600);
  if (!bmp.begin()) {
 Serial.println("nu exita senzor compatibil BMP085 sau BMP180");
 while (1) {}
  }
}
  
void loop() {
    Serial.print("Temperatura = ");
    Serial.print(bmp.readTemperature());
    Serial.println(" *C");
    
    Serial.print("Presiune = ");
    Serial.print(bmp.readPressure());
    Serial.print("HPa / ");
    
 //   Serial.print("Presiune = ");
    float presiune1 = bmp.readPressure()/998.25;
    presiune1 = presiune1 * 0.760;
    Serial.print(presiune1);
    Serial.println(" mmHg");
    // 1 atm = 101325 Pa = 1013,25 hPa = 1013,25 mbar = 760 Hgmm = 760 Torr
    // A tengerszinthez képest a légnyomás hozzávetőlegesen 1 hPa (1 mbar) mértékben
    // csökken 10 méterenként. 150 méter a helyzetem a tengerszinthez képest
    Serial.print("tengerszint feletti magassag = ");
    Serial.print(bmp.readAltitude());
    Serial.println(" m");

    Serial.print("Tengerszinti legnyomas  (szamit) = ");
    Serial.print(bmp.readSealevelPressure());
    Serial.print("HPa / ");
    
   
    float presiune = bmp.readSealevelPressure()/998.25;
    presiune = presiune * 0.760;
    Serial.print(presiune);
    Serial.println(" mmHg");
    

  // you can get a more precise measurement of altitude
  // if you know the current sea level pressure which will
  // vary with weather and such. If it is 1015 millibars
  // that is equal to 101500 Pascals.
    Serial.print("Tenyleges magassag = ");
    Serial.print(bmp.readAltitude(99800));
    Serial.println(" m");
    
    Serial.println();
    
    
   lcd.setCursor(1, 0);
   lcd.print("Temp.=  ");
    if ( bmp.readTemperature() < 10)
   {
     lcd.print(" "); 
     lcd.print(bmp.readTemperature());
   }
   else
   {
   lcd.print(bmp.readTemperature(),1);
   }
   lcd.write(0b11011111);
   lcd.print("C   ");
   
   lcd.setCursor(1, 1);
   lcd.print("pres.= p");
   lcd.print(presiune,0);
   lcd.print("mmHg  ");
    
   delay(2500);
}
Válasz küldése