Aynı Hatta birden Fazla DS18B20

Başlatan muhittin_kaplan, 25 Ocak 2013, 22:25:33

muhittin_kaplan

Nasıl Olur, Nasıl Yapabilirim ? Aynı hatta Birden Fazla Sensör.

F.T

hocam bildiğim kadar rom kodları ile sorguluyorsun.tabi rom kodlarını önce kaydediyorsun.
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

Mucit23

ben basicde yapmıştım. 4 sensoru aynı hattan okudum.mantığı çok basit hocam istersen kodları vereyim

muhittin_kaplan

Alıntı yapılan: Mucit23 - 25 Ocak 2013, 22:38:41
ben basicde yapmıştım. 4 sensoru aynı hattan okudum.mantığı çok basit hocam istersen kodları vereyim
Tereyağlı Ballı Ekmek Olur. Basic mi ?  ;D


muhittin_kaplan

#5
Hocam Oraya Baktım. Owrite ve Oread Kullanılmış. Bana Mantığını ve basamaklarını anlayabileceğim bir dilde gerek. C ye aktarmam gerekiyor.

mesaj birleştirme:: 25 Ocak 2013, 23:07:47

Alıntı yapılan: Mucit23 - 25 Ocak 2013, 22:38:41
ben basicde yapmıştım. 4 sensoru aynı hattan okudum.mantığı çok basit hocam istersen kodları vereyim
Mucit Beklemekteyim.

Mucit23

Hocam burada iki sensörü okuyorum.

Geçen sene öyle can sıkıntısından yazmıştım.. Şimdi derleyemedim yalnız bir saattir uğraşıyorum. Kanser oldum resmen >:(
PORTA=0:PORTB=0
TRISA=0     
TRISB=%00000001 
'-----------------------------------------------------------------
@ DEVICE pic16F628A                      'işlemci 16F628                                
@ DEVICE pic16F628A, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_off            'MCLR pini kullanılmıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak 
'-----------------------------------------------------------------
DEFINE LCD_DREG		PORTB	'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT		4		'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_EREG		PORTB	'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT		3		'LCD Enable Bacağı Hangi bite bağlı ?
define LCD RWREG    PORTB   'LCD R/W Bacağı Hangi Porta bağlı?
define LCD_RWBIT    2       'LCD R/W Bacağı Hangi bite bağlı ?
DEFINE LCD_RSREG	PORTB	'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT	1		'LCD RS bacağı Hangi Bite bağlı  ?
DEFINE LCD_BITS		4		'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES	2		'LCD Kaç sıra yazabiliyor
'-------------------------------------------------------------------------
CMCON=7    'comparatör iptal
'----------------------------------------------------------------------------
DQ           VAR PORTB.0
TEMP1        VAR WORD
TEMP2        VAR WORD
FLOAT1       VAR WORD
FLOAT2       VAR WORD  
ISI1L        VAR byte
ISI1H        VAR BYTE 
ISI2L        VAR byte  
ISI2H        VAR BYTE     
DERECE       CON 223        

'-----------------------------------------------------------------------------
CLEAR 
PAUSE 300
LCDOUT $FE,1

BASLA:
  GOSUB SENSOR1_OKU
  GOSUB SENSOR2_OKU
  GOSUB EKRAN
GOTO BASLA

SENSOR1_OKU:
    OWOUT DQ, 1, [$55,$28,$6E,$D7,$B8,$00,$00,$00,$4C,$44] ;1. Sensör Rom kodu = $28,$6E,$D7,$B8,$00,$00,$00,$4C
    OWOUT DQ, 1, [$55,$28,$6E,$D7,$B8,$00,$00,$00,$4C,$BE]
    OWIN DQ, 2, [Temp1.LOWBYTE,Temp1.HIGHBYTE]             ;1. Sensör Sıcaklık Değerini oku
    GOSUB HESAP1
RETURN

SENSOR2_OKU:
    OWOUT DQ, 1, [$55,$28,$30,$C5,$B8,$00,$00,$00,$8E,$44] ;2. Sensör Rom kodu = $28,$30,$C5,$B8,$00,$00,$00,$8E
    OWOUT DQ, 1, [$55,$28,$30,$C5,$B8,$00,$00,$00,$8E,$BE]
    OWIN DQ, 2, [Temp2.LOWBYTE,Temp2.HIGHBYTE]             ;2. Sensör sıcaklık Değerini oku
    GOSUB HESAP2
GOTO BASLA

HESAP1:  ;1. Sensörden okunan sıcaklık değeri hesaplanıyor             
    FLOAT1 = (TEMP1*10)/16        
    ISI1H=FLOAT1/10 
    ISI1L=FLOAT1//10 
RETURN  

HESAP2:  ;2. Sensörden okunan sıcaklık değeri hesaplanıyor 
    FLOAT2 = (TEMP2*10)/16        
    ISI2H=FLOAT2/10 
    ISI2L=FLOAT2//10 
RETURN   

EKRAN:
    LCDOUT $FE,$80,"1.SENSOR=",DEC2 ISI1H,",",DEC1 ISI1L,DERECE,"C"
    LCDOUT $FE,$C0,"2.SENSOR=",DEC2 ISI2H,",",DEC1 ISI2L,DERECE,"C"
RETURN
END

Burada sensörlerin rom kodunu önceden öğrenip programda sabit olarak girdim.

rom kodunu öğrenmek içinde bunu yazdım..
PORTA=0:portb=0
TRISB=%00000001   'PortB.0 giriş diğerleri çıkış yapıldı.
TRISA=0           'A portu tamamı çıkış yapıldı.
'-----------------------------------------------------------------
@ DEVICE pic16F628A                      'işlemci 16F628                                
@ DEVICE pic16F628A, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_off            'MCLR pini kullanılmıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak 
'-----------------------------------------------------------------
DEFINE LCD_DREG		PORTB	'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT		4		'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_EREG		PORTB	'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT		3		'LCD Enable Bacağı Hangi bite bağlı ?
define LCD RWREG    PORTB   'LCD R/W Bacağı Hangi Porta bağlı?
define LCD_RWBIT    2       'LCD R/W Bacağı Hangi bite bağlı ?
DEFINE LCD_RSREG	PORTB	'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT	1		'LCD RS bacağı Hangi Bite bağlı  ?
DEFINE LCD_BITS		4		'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES	2		'LCD Kaç sıra yazabiliyor

CMCON=7    ' komparatör iptal
'----------------------------------------------------------------------------
DQ     VAR PORTB.0
ID     VAR BYTE[8]

CLEAR 
PAUSE 500
LCDOUT $FE,1
BASLA:
OWOUT DQ, 1, [$33]  ' Issue Read ROM command
OWIN DQ, 0, [STR ID\8]' Read 64-bit device data into the 8-byte array "ID"
LCDOUT $FE,$80,HEX2 ID[0],HEX2 ID[1],HEX2 ID[2],HEX2 ID[3],HEX2 ID[4],HEX2 ID[5],HEX2 ID[6],HEX2 ID[7]
GOTO BASLA
END

muhittin_kaplan

Uğraşma derlemeye Keza bende C ye çevireceğim becerebilirsem :)

Mucit23

Hocam kodu derledim ama yine çalışmadı. picin RB4 ü çalışmıyor. Tüm portu 1 yaptım ama Rb4 ü 1 yapamadım. Kafama sıkacam yeminle  :-X :-X
Akşam Akşam yine düdük yarışına düştük....

Sanırsam Basic ile kod yazmayı bıraktığım için Basic ihanetin bedelini bana ödediyor.

0xefe

#9
Hocam inşallah işinizi görür, Arduino tembeliyim. Önceden sensörlerin rom kodlarını öğrenip değişkenlere atıyorum:

  byte sensor1[8] = {0x28, 0x44, 0xD2, 0x20, 0x02, 0x00, 0x00, 0x55};
  byte sensor2[8] = {0x28, 0x6D, 0x89, 0x3F, 0x04, 0x00, 0x00, 0xE3};
  byte sensor3[8] = {0x28, 0x21, 0x01, 0x09, 0x03, 0x00, 0x00, 0x25};
  byte sensor4[8] = {0x28, 0xDD, 0x56, 0x40, 0x04, 0x00, 0x00, 0xE7};


celsius1 = read_DS18B20(sensor1);

Fonksiyon çağırarak sonucu celsius float değişkenine alıyorum.

Tam kod aşağıda, Cosm'dan aldığım hazır koda ekler yaparak kullandım. Ethernet ile ilgili kodları göz ardı edin.
One Wire kütüphaneler sizde farklı biliyorum, read_DS18B20 fonksiyonu yardımcı olur umarım.

Hatam olduysa affola.

/*
 * Ethernet shield attached to pins 10, 11, 12, 13
 
 created 15 March 2010
 updated 16 Mar 2012
 by Tom Igoe with input from Usman Haque and Joe Saavedra
 http://arduino.cc/en/Tutorial/PachubeClient
 This code is in the public domain.
  */

#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>

#define APIKEY         "xxxxxxxxxxxxxxxxx" // your cosm api key
#define FEEDID         87695 // your feed ID
#define USERAGENT      "Home heating" // user agent is the project name

byte mac[] = { 0x24, 0xEF, 0xEE, 0xA1, 0x1E, 0xFE };
IPAddress ip(192,168,1,115);
// initialize the library instance:
EthernetClient client;
IPAddress server(173,203,98,29);    // numeric IP for api.cosm.com
//char server[] = "api.cosm.com";   // name address for cosm API

unsigned long lastConnectionTime = 0;          // last time you connected to the server, in milliseconds
boolean lastConnected = false;                 // state of the connection last time through the main loop
const unsigned long seconds = 60;
const unsigned long secmillis = 1000;
const unsigned long postingInterval = 296000; //delay between updates to Cosm.com
OneWire  ds(2);  // on pin 2
byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
  byte sensor1[8] = {0x28, 0x44, 0xD2, 0x20, 0x02, 0x00, 0x00, 0x55};
  byte sensor2[8] = {0x28, 0x6D, 0x89, 0x3F, 0x04, 0x00, 0x00, 0xE3};
  byte sensor3[8] = {0x28, 0x21, 0x01, 0x09, 0x03, 0x00, 0x00, 0x25};
  byte sensor4[8] = {0x28, 0xDD, 0x56, 0x40, 0x04, 0x00, 0x00, 0xE7};
  
  float celsius1;
  float celsius2;
  float celsius3;
  float celsius4;
  float deltaT;
  unsigned  long readingstart = 0;
  const unsigned long readdelay = 1000;
  
void setup() {
  Serial.begin(9600);
  Ethernet.begin(mac, ip); //DHCP denemeden, statik ip ile bağlanıyoruz
                      }
  
void loop() {
  // if there's incoming data from the net connection.
  // send it out the serial port.  This is for debugging
  // purposes only:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }
   
  // if there's no net connection, but there was one last time
  // through the loop, then stop the client:
  if (!client.connected() && lastConnected) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
  }

  // if you're not connected, and ten seconds have passed since
  // your last connection, then connect again and send data:
  if(!client.connected() && (millis() - lastConnectionTime > postingInterval)) {
    celsius1 = read_DS18B20(sensor1); 
    celsius2 = read_DS18B20(sensor2);
    celsius3 = read_DS18B20(sensor3);
    celsius4 = read_DS18B20(sensor4);
    deltaT = celsius1 - celsius4;
    sendData(celsius1, celsius2, celsius3, celsius4, deltaT);
  }
  // store the state of the connection for next time through
  // the loop:
  lastConnected = client.connected();
}

// this method makes a HTTP connection to the server:
void sendData(float sensor1, float sensor2, float sensor3, float sensor4, float deltaTT) {
  // if there's a successful connection:
  if (client.connect(server, 80)) {
    Serial.println("connecting...");
    // send the HTTP PUT request:
    client.print("PUT /v2/feeds/");
    client.print(FEEDID);
    client.println(".csv HTTP/1.1");
    client.println("Host: api.cosm.com");
    client.print("X-ApiKey: ");
    client.println(APIKEY);
    client.print("User-Agent: ");
    client.println(USERAGENT);
    client.print("Content-Length: ");

    // calculate the length of the sensor reading in bytes:
    // 8 bytes for "sensor1," + number of digits of the data:
    int thisLength = 40 + getLength(sensor1) + getLength(sensor2) + getLength(sensor3) + getLength(sensor4) + getLength(deltaTT);
    Serial.print("Length: ");
    Serial.println(thisLength);
    client.println(thisLength);

    // last pieces of the HTTP PUT request:
    client.println("Content-Type: text/csv");
    client.println("Connection: close");
    client.println();

    // here's the actual content of the PUT request:
    client.print("sensor1,");
    client.println(sensor1);
    client.print("sensor2,");
    client.println(sensor2);
    client.print("sensor3,");
    client.println(sensor3);
    client.print("sensor4,");
    client.println(sensor4); 
    client.print("deltaT,");
    client.println(deltaTT);  
  } 
  else {
    // if you couldn't make a connection:
    Serial.println("connection failed");
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
  }
   // note the time that the connection was made or attempted:
  lastConnectionTime = millis();
}


// This method calculates the number of digits in the
// sensor reading.  Since each digit of the ASCII decimal
// representation is a byte, the number of digits equals
// the number of bytes:

int getLength(int someValue) {
  // there's at least one byte:
  int digits = 1;
  // continually divide the value by ten, 
  // adding one to the digit count for each
  // time you divide, until you're at 0:
  int dividend = someValue /10;
  while (dividend > 0) {
    dividend = dividend /10;
    digits++;
  }
  // return the number of digits:
  return digits;
}

float read_DS18B20(byte address[8]) {
  float result;
  ds.reset();
  ds.select(address);
  ds.write(0x44,1);         // start conversion, with parasite power on at the end
  //readingstart = millis();
  //while((millis() - readingstart) < readdelay);
  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(address);    
  ds.write(0xBE);         // Read Scratchpad

  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
  }
  
    // convert the data to actual temperature
    unsigned int raw = (data[1] << 8) | data[0];
    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
  result = (float)raw / 16.0;
  return result;
}
   

erolca

zamanında avr ile yapmış olduğum prj. umarım işinize yarar
http://yadi.sk/d/pngtahLA0Tz39
eroool

muhittin_kaplan

teşekkür ederim. biraz çalışalım üzerinde.

serhat1990

Hocam merhabalar , aradığınız dosya burada Hocam . Hi-tech C dilinde yazılmış tek hat üzerinden çalışıyor . İyi çalışmalar dilerim ...

https://320volt.com/ds18b20-hakkinda-turkce-bilgiler-ve-hitech-c-uygulama-ornegi/


buzkırıcı

Hocam bende önceden rom kodları öğrenim programa gömüp yapmıştım. Ama artık eeproma yada farklı bir yere kaydedilerek yapılabilir.
ilk projelemrinden biriydi o yüzden yazılım kötü olabilir. Kusura bakmayın  :-[
Bende Lpc1768 de yapmıştım örnek kodu ise:

float ds_oku1(void){
  	char i=0,busy=0,lsb,msb;
	int s1=40,s2=176,s3=253,s4=88,s5=3,s6=0,s7=0,s8=115;
	float ondalik,deger1;


	reset(); 

	  bir_byte_yazma(0x55);
		 
	 
		 bir_byte_yazma(s1);
		 bir_byte_yazma(s2);
		 bir_byte_yazma(s3);
		 bir_byte_yazma(s4);
		 bir_byte_yazma(s5);
		 bir_byte_yazma(s6);
		 bir_byte_yazma(s7);
		 bir_byte_yazma(s8);
					 
	bir_byte_yazma(0x44);
	  while(busy==0)
		 busy=bir_byte_okuma(); 
   
   	reset();
 	bir_byte_yazma(0x55);
				  
	     bir_byte_yazma(s1);
		 bir_byte_yazma(s2);
		 bir_byte_yazma(s3);
		 bir_byte_yazma(s4);
		 bir_byte_yazma(s5);
		 bir_byte_yazma(s6);
		 bir_byte_yazma(s7);
		 bir_byte_yazma(s8);   
//		while(i==10)
//		   {GecikmeUs(1000);   i++;}
	   bir_byte_yazma(0xBE); 
	   lsb=bir_byte_okuma();
       msb=bir_byte_okuma();
//		if(msb&0xf0) negatif=1;
	   if(lsb&0x08) ondalik += 0.5;
	     if(lsb&0x04)	ondalik += 0.25;
	if(lsb&0x02)	ondalik += 0.125;
		if(lsb&0x01)	ondalik += 0.0625;
		deger1 =((msb<<4)+(lsb>>4)+ondalik);
			  while(i==250)
		{GecikmeUs(1000);   i++;}
		lsb=0;msb=0;ondalik=0;
		return deger1;
		  
   }

float ds_oku2(void){
  	char i=0,busy=0,lsb,msb;
	int s1=40,s2=213,s3=27,s4=201,s5=3,s6=0,s7=0,s8=115;
	float ondalik,deger1;

	reset();
 	bir_byte_yazma(0x55);

		 bir_byte_yazma(s1);
		 bir_byte_yazma(s2);
		 bir_byte_yazma(s3);
		 bir_byte_yazma(s4);
		 bir_byte_yazma(s5);
		 bir_byte_yazma(s6);
		 bir_byte_yazma(s7);
		 bir_byte_yazma(s8);
    
	bir_byte_yazma(0x44);
	  while(busy==0)
		 busy=bir_byte_okuma(); 
   
   	reset();
 	bir_byte_yazma(0x55);

		 bir_byte_yazma(s1);
		 bir_byte_yazma(s2);
		 bir_byte_yazma(s3);
		 bir_byte_yazma(s4);
		 bir_byte_yazma(s5);
		 bir_byte_yazma(s6);
		 bir_byte_yazma(s7);
		 bir_byte_yazma(s8);
		while(i==10)
		   {GecikmeUs(1000);   i++;}i=0;
	   bir_byte_yazma(0xBE); 
	   lsb=bir_byte_okuma();
       msb=bir_byte_okuma();
//		if(msb&0xf0) negatif=1;
	   if(lsb&0x08) ondalik += 0.5;
	     if(lsb&0x04)	ondalik += 0.25;
	if(lsb&0x02)	ondalik += 0.125;
		if(lsb&0x01)	ondalik += 0.0625;
		deger1 =((msb<<4)+(lsb>>4)+ondalik);
			  while(i==250)
		{GecikmeUs(1000);   i++;}
		lsb=0;msb=0;ondalik=0;
		return deger1;
   }


Burada tek tek sensörlerden sıcaklıkları okuyorum. İsterseniz projeyide verebilirim.
İmza Atmayı bilmem Parnak Bassam olur mu?

muhittin_kaplan

hocam sevinirim, iki sensörden de okuyamıyorum şu anda şüphelenmeye başladım sağlamlıklarından.