DS 1820 hőmérő élesztés

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: DS 1820 hőmérő élesztés

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

Bascom? Arduino? Csak mert a Bascom topicban van a DS18x20 kérdés :evil: :roll: :cry:
És mi a kód? Anélkül csak tippözön.

Szóval:
- Programnyelv?
- Fordító verzió?
- Használt nem fordítóban levő függvények?
- Programkód?
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: DS 1820 hőmérő élesztés

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

Ahogyan a képedet nézegetem szerintem, hiányzanak a függvény paraméterek nevei.
Csak 1 példa kiragadva: …::crct(uint8_t* ???,uint8_t* ???) Mi a paraméter neve???

Bár könnyebb lenne ha a hibás kódot látnánk!
lithium89
Újonc
Újonc
Hozzászólások: 1
Csatlakozott: 2014. április 15. kedd, 11:12

Re: DS 1820 hőmérő élesztés

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

Üdv!

Ds18B20 olvasásakor más is kapott már 65314 vagy hasonlóan kiugró hőmérséklet értékeket?
Word típusú változóban tárolom, konvertálás után megvan a szükséges várakozás is. CRC is oké.
A hiba nem folyamatos, csak ritkán jelentkezik, de akkor ~félpercre.
Köszönöm.

szerk.:
Megoldódott.
A negatívba váltásnál volt a hiba. :)
bgachip
DrótVégénSzéndarab
Hozzászólások: 49
Csatlakozott: 2013. november 5. kedd, 20:00

Re: DS 1820 hőmérő élesztés

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

Itt a kód, bekötöttem a hőmérőt először a digital 10 helyre, majd mikor nem működött az analógra is.
4,7 kohm-os ellenállást használtam felhúzó ellenállásnak.

"no more address"-t ír ki állandóan, bármit csinálok.

panelen van a ds1820, eleve így vettem.
bár eleve külső felhúzó ellenállás nélkül próbáltam ki, de úgy sem működik.

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

#include <OneWire.h>

// OneWire DS18S20, DS18B20, DS1822 Temperature Example
//
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
// The DallasTemperature library can do all this work for you!
// http://milesburton.com/Dallas_Temperature_Control_Library

OneWire  ds(10);  // on pin 10

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

void loop(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
  
  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }
  
  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return;
  } 

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // start conversion, with parasite power on at the end
  
  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

  Serial.print("  Data = ");
  Serial.print(present,HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();

  // convert the data to actual temperature

  unsigned int raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // count remain gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw << 3;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
    // default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("  Temperature = ");
  Serial.print(celsius);
  Serial.print(" Celsius, ");
  Serial.print(fahrenheit);
  Serial.println(" Fahrenheit");
}
Avatar
SzLacus
Tranzisztorgyógyász
Hozzászólások: 175
Csatlakozott: 2012. május 20. vasárnap, 6:00

Re: DS 1820 hőmérő élesztés

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

Kezdj bele az elemzésbe. Az, hogy nincs több cím, nem azt jelenti, hogy egy sincs, csak azt, hogy nincs több. A present úgy működik, hogy a reset-re mindenkinek válaszolni kell egy nyugtázással. ezt a nyugtát kapod vissza a present-ben. Ha nincs present, akkor nem látszik a vonalon senki. Ha zárlatos a vonalad, akkor kapsz presen-et, de az valójában hamis. A vonalnak magasban kell lenni ha nincs kommunikáció. Ezt is észre tudod venni egy vizsgálattal. Aztán ha a ds.search talált a vonalon eszközt, akkor a serial.print("ROM=") kezdetű ciklus ki fogja írni a címét az eszköznek. Mit látsz a soros monitorban? Szóval fog az működni, csak meg kell találd a hibát. Ja és a hiba sokszor nem a példa programban van.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: DS 1820 hőmérő élesztés

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

A DQ vonal a 10-es lábon van? tedd át 2-3-4-5-re. Azokon mit csinál, plusz a kódban is írdd át. Ha van SPI-s eszköz, akkor a D10 _nem_ használható! Az a #SS (slave select) az SPI buszhoz tartozik!
A TavIR szenzoron ott van egy 2k2..4k7 felhúzó.
Avatar
Kotesz
Tranzisztorgyógyász
Hozzászólások: 171
Csatlakozott: 2009. szeptember 24. csütörtök, 6:00

Re: DS 1820 hőmérő élesztés

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

Üdv.

Van egy hűtővezérlőm, 3 d18s20 szenzorral.
Minden jól működött míg az egyik szenzor meg nem adta magát.
Kicseréltem egy vízmentes változatra és felborult a rend. A 3 pult szenzora jó értéket ad csak nem oda ahova kellene.
Gondolom is hogy mi a baj, de a programozási szintaktikával van gondom.

Itt a kód:

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

'-------------------------------------------------------------------------------
' Senzor keresése
'-------------------------------------------------------------------------------

W = 1wirecount()
Dsid1(1) = 1wsearchfirst()
Dsid2(1) = 1wsearchnext()
Dsid3(1) = 1wsearchnext()

'-------------------------------------------------------------------------------
' A beolvasott CRC egyeztetés
'-------------------------------------------------------------------------------

Cls
If Dsid1(8) = Crc8(dsid1(1) , 7) Then
  Locate 2 , 1
  Lcd "Pult szenzor OK"
  Locate 2 , 1
   For B = 1 To 8
       Lcd Hex(dsid1(b))
   Next
  End If
  Waitms 50

If Dsid2(8) = Crc8(dsid2(1) , 7) Then
   Locate 3 , 1
   Lcd "CRC Sensor 2 OK"
   Wait 1
   Locate 3 , 1
   For B = 1 To 8
       Lcd Hex(dsid2(b))
   Next
End If
Waitms 50

If Dsid3(8) = Crc8(dsid3(1) , 7) Then
  Locate 4 , 1
  Lcd "huto2 szenzor OK"
  Locate 4 , 1
   For B = 1 To 8
       Lcd Hex(dsid2(b))
   Next
  End If
  Wait 1

Indul:
Cls
      Locate 2 , 1
      Lcd "Pult   :          " ; "C"
      Locate 1 , 1
      Lcd "Beall. :          " ; "C"
      Locate 3 , 1
      Lcd "Huto1  :          " ; "C"
      Locate 4 , 1
      Lcd "Huto2  :          " ; "C"

'-------------------------------------------------------------------------------
' Főprogram
'-------------------------------------------------------------------------------

Kezd:

Do

  Incr Compresszor
  If Compresszor = 50 Then Compresszor = 10

' pult senzor

  Convallt
   Waitus 200 : Waitus 200 : Waitus 200 : Waitus 200


  1wverify Dsid2(1)
  Locate 2 , 1
  If Err = 1 Then
    Lcd "Huto 1 szenzor hiba    "
    Goto Indul
  Elseif Err = 0 Then                                      
    1wwrite &HBE
    Sc(1) = 1wread(9)
    If Sc(9) = Crc8(sc(1) , 8) Then
       Dg = Decigrades(sc(9))
        Locate 3 , 14
       Lcd Hok ; " "
      ' Print Hok
    End If
  End If

  1wverify Dsid3(1)
  Locate 3 , 1
  If Err = 1 Then
    Lcd "Huto2 szenzor hiba        "
    Goto Indul
  Elseif Err = 0 Then                                       
    1wwrite &HBE
    Sc(1) = 1wread(9)
    If Sc(9) = Crc8(sc(1) , 8) Then
       Dg = Decigrades(sc(9))
        Locate 4 , 14
       Lcd Hok ; " "
      ' Print Hok
    End If
  End If

1wverify Dsid1(1)                                           
  Locate 2 , 1
  If Err = 1 Then
    Lcd "Pult szenzor hiba   "                              
    Goto Indul
  Elseif Err = 0 Then                                      
    1wwrite &HBE
    Sc(1) = 1wread(9)                                      
    If Sc(9) = Crc8(sc(1) , 8) Then

       Dg = Decigrades(sc(9))
       Locate 2 , 14
       Lcd Hok ; " "
       Print Hok ; " C"
       Locate 1 , 14
       Lcd Befok ; " "

    End If
  End If

'-------------------------------------------------------------------------------
' Ha a hőmérséklet a beállított érték felé nő akkor kapcsol a relé.
'-------------------------------------------------------------------------------

If Dg > K Then Goto Megy Else Goto All



Loop


End                                                         'end program
'-------------------------------------------------------------------------------
' Konvertálás
'-------------------------------------------------------------------------------
Sub Convallt

  1wreset
  1wwrite &HCC
  1wwrite &H44
End Sub


Function Decigrades(byval Sc(9) As Byte)

  Decigrades = 0
  Decigrades = Makeint(sc(1) , Sc(2))
  Decigrades = Decigrades * 10
  Decigrades = Decigrades / 16

  Ho = 0
  Ho = Dg / 10
  Hok = Fusing(ho , "00.0")
  Ho = Val(hok)

  Be_fok = Beall_temp / 10
  Befok = Fusing(be_fok , "00.0")

End Function
A szenzorok a hőmérséklet lekérdezésekor nincsenek azonosítva, nincs egyértelműen megadva hogy melyik id szenzor melyik pultrészhez tartozik.
Hogyan tudom egyértelműen megadni hogy az x azonosítójú szenzor melyik részhez tartozik?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: DS 1820 hőmérő élesztés

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

A programkód HIBÁS!
Ezt:

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

Waitus 200 : Waitus 200 : Waitus 200 : Waitus 200
cseréld ki erre:

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

Waitms 800
A program a bejelentkezés sorrendjében kérdezi le a hőmérőket.
Ezt úgy illik megcsinálni, hogy nem a skip ROM jellegű lekérdezést csinálod, hanem

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

1wverify hőmérőazonosító
, majd _utána_ olvasod ki a hőfokértéket.

A vízmentes tokozott hőmérő nem 18S20, hanem 18B20 chipet tartalmaz!
Avatar
Kotesz
Tranzisztorgyógyász
Hozzászólások: 171
Csatlakozott: 2009. szeptember 24. csütörtök, 6:00

Re: DS 1820 hőmérő élesztés

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

Köszönöm Robi!
Értem a lényeget.
Délután le is tesztelem.
Avatar
Kotesz
Tranzisztorgyógyász
Hozzászólások: 171
Csatlakozott: 2009. szeptember 24. csütörtök, 6:00

Re: DS 1820 hőmérő élesztés

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

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

W = 1wirecount()
Dsid1(1) = 1wsearchfirst()
Dsid2(1) = 1wsearchnext()
Dsid3(1) = 1wsearchnext()
Itt olvassa be bejeletkezési sorrendben a szenzorokat.
Ha jó érte akkor ezt kellene lecserélni.

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

1wwerify dsid1(1)
kiolvasás
1wwerify dsid2(1)
kiolvasás
1wwerify dsid3(1)
kiolvasás
Jól gondolom Robi?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: DS 1820 hőmérő élesztés

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

Igen, jó!

Amit ellenőrizz, hogy hány hőmérőd van a buszon. Ha 2, akkor 3 beolvasás érdekes eredményt ad.
ds2() = ds3() !
Avatar
Kotesz
Tranzisztorgyógyász
Hozzászólások: 171
Csatlakozott: 2009. szeptember 24. csütörtök, 6:00

Re: DS 1820 hőmérő élesztés

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

Köszönöm a segítséget.
Válasz küldése