dht11 sonucunun char/int dönüşümü

Başlatan Emre MERMİ, 17 Ocak 2016, 22:12:03

Emre MERMİ

hocalarım bu aralar çok fazla soru soruyorum ama affınıza sığınarak bir konuda yardım isteyeceğim.

dht11 ile termostat devresi yapıyorum.
kod;
#include <16F628A.h>
#use delay(internal=4MHz)


#define LCD_ENABLE_PIN PIN_B0
#define LCD_RS_PIN PIN_B1
#define LCD_RW_PIN PIN_B2
#define LCD_DATA4 PIN_B4
#define LCD_DATA5 PIN_B5
#define LCD_DATA6 PIN_B6
#define LCD_DATA7 PIN_B7

#include <lcd.c>
#include "DHT11.C"


int max1=0,max2=0,z=0,a=0,b=0;
void main()
{

   lcd_init();
   delay_ms(100);

   dht_init();
      delay_ms(100);
   while(TRUE)
   { 
   
   if(z==0){
   
      read_dht();
         delay_ms(100);
      lcd_gotoxy(1,1);
      printf(lcd_putc,"%d.%d %%  ",dht_dat[0],dht_dat[1]);
      lcd_gotoxy(1,2);
      printf(lcd_putc,"%d.%d %cC  ",dht_dat[2],dht_dat[3],223);
      a=dht_dat[0];
      b=dht_dat[2];
   }
   
   if(z==1){
      

   lcd_gotoxy(1,1);
   printf(lcd_putc,"nem ayar ");
   lcd_gotoxy(1,2);
   printf(lcd_putc,"%d  %%",max1);
   
   if(input(pin_a1)){
   delay_ms(150);
   max1=max1+1;
   }
    if(input(pin_a7)){
   delay_ms(150);
   max1=max1-1;
   }
   }
   
   
   if(z==2){
  
   lcd_gotoxy(1,1);
   printf(lcd_putc,"sicaklik ayar ");
   lcd_gotoxy(1,2);
   printf(lcd_putc,"%d %cC",max2,223);
   
   if(input(pin_a1)){
   delay_ms(150);
   max2=max2+1;
   }
    if(input(pin_a7)){
   delay_ms(150);
   max2=max2-1;
   }
   }
 
      if(input(pin_a6)){
     delay_ms(150);
     z=z+1;
     lcd_putc('\f');
     if(z==3){
     z=0;
     }     
     } 
     
     
    if(max1>a){
    output_high(pin_a3);
    }
    if(max1<a){
    output_low(pin_a3);
    }
    if(max2>b){
    output_high(pin_a2);
    }
    if(max2<b){
    output_low(pin_a2);
    }
   }

}
 

kodda en son röle sürmek için a ile max 1 ve b ile max 2 yi karşılaştırıyorum. ölçümleri normal yapsam bile a ve b hep 0 oluyor ve devre sadece max1 ve max2 yi 0 altına düşürünce röle anahtarlıyor. a ve b yerine sırayla  dht_dat[0] ve dht_dat[2] de yazsam aynı oluyor. Ekrana yazarken doğru yazıyor ama neden karşılaştırma yaparken yanlış yapıyor ?
şemayı da ekte veriyorum, aynı hatayı simülasyonda da görebilirsiniz.
yardımlarınız için şimdiden teşekkür ediyorum.

http://dosya.web.tr/KWynbO

dursuncemal

a ve b yerine direkt rakam yaz  oyle bi bak.  printf ten gordugum kadariyle ,dht_dat[] signed int obur degiskenlerin  unsigned tur donusumu yapmalisin gibime geliyo.
:=

Emre MERMİ

Hocam her ikiside signed int gibime geliyor ama değişkenlerin tanımlamasını değiştirerek deneyeceğim.

dursuncemal

#3
int 0 255 olmasi lazim;


mesaj birleştirme:: 18 Ocak 2016, 02:01:40

if(max2 < (signed int) b) boylede olmasi lazim karsilastırıken toplarken cikarırken tur donusumlerı cok basit durumlarda bile goz ardı edilirse ciddi zaman kayıplarına neden oluyo malesef
:=

Emre MERMİ

#4
muhtemelen dediğiniz gibi bir sorun var hocam

#include <16F628A.h>
#use delay(internal=4MHz)
#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8,stream=PORT1)
#include "DHT11.C"
int a=0,b=0,c=0,d=0;
void main()
{
 dht_init();
      delay_ms(100);
   while(TRUE)
   {
 read_dht();
 a=dht_dat[0];
 b=dht_dat[1];
 c=dht_dat[2];
 d=dht_dat[3];
 
         delay_ms(1000);
       printf("%d.%d %%  ",a,b);
      
      printf("%d.%d %cC  ",c,d,223);
      //TODO: User Code
   }

}


kodu şöyle denediğimde yine sıcaklık ve nem değerlerini olması gerektiği gibi görüyorum.

mesaj birleştirme:: 18 Ocak 2016, 02:10:10

Söylediğiniz şekilde değiştirdim sonuç aynı ;


    if(max1>(signed int)a){
    output_high(pin_a3);
    }
    if(max1<(signed int)a){
    output_low(pin_a3);
    }
    if(max2>(signed int)b){
    output_high(pin_a2);
    }
    if(max2<(signed int)b){
    output_low(pin_a2);
    }

dursuncemal

dht_dat[] degiskeninin turunu gormedim printf ten yola cıkarak tahmin etiim onun turu ne ise ya;   onun turu  a=0,b=0,c=0,d=0;  yada              (onunturu )a = dht_dat[0]; veya         a = (anınturu) dht_dat[0]//ama burda negatif deger olmaz  sadece pozitif kismini a ya atar
:=

Emre MERMİ

dediğiniz gibi herhalde sorun şu ;

char dht_dat[10];

kütüphanede böyle tanımlamış. Bu durumda nasıl bir düzeltme yapmam lazım ?

dursuncemal

   dht_dat[] in turu signed int ise entemizi   bunu yap      signed int max1=0,max2=0,z=0,a=0,b=0;

char ise (char) yap yada  char max1=0,max2=0,z=0,a=0,b=0;
:=

Emre MERMİ

#include <16F628A.h>
#use delay(internal=4MHz)


#define LCD_ENABLE_PIN PIN_B0
#define LCD_RS_PIN PIN_B1
#define LCD_RW_PIN PIN_B2
#define LCD_DATA4 PIN_B4
#define LCD_DATA5 PIN_B5
#define LCD_DATA6 PIN_B6
#define LCD_DATA7 PIN_B7

#include <lcd.c>
#include "DHT11.C"


char max1=0,max2=0,z=0,a=0,b=0;
void main()
{

   lcd_init();
   delay_ms(100);

   dht_init();
      delay_ms(100);
   while(TRUE)
   { 
   
   if(z==0){
   
      read_dht();
         delay_ms(100);
      lcd_gotoxy(1,1);
      printf(lcd_putc,"%d.%d %%  ",dht_dat[0],dht_dat[1]);
      lcd_gotoxy(1,2);
      printf(lcd_putc,"%d.%d %cC  ",dht_dat[2],dht_dat[3],223);
      a=dht_dat[0];
      b=dht_dat[2];
   }
   
   if(z==1){
      

   lcd_gotoxy(1,1);
   printf(lcd_putc,"nem ayar ");
   lcd_gotoxy(1,2);
   printf(lcd_putc,"%d  %%",max1);
   
   if(input(pin_a1)){
   delay_ms(150);
   max1=max1+1;
   }
    if(input(pin_a7)){
   delay_ms(150);
   max1=max1-1;
   }
   }
   
   
   if(z==2){
  
   lcd_gotoxy(1,1);
   printf(lcd_putc,"sicaklik ayar ");
   lcd_gotoxy(1,2);
   printf(lcd_putc,"%d %cC",max2,223);
   
   if(input(pin_a1)){
   delay_ms(150);
   max2=max2+1;
   }
    if(input(pin_a7)){
   delay_ms(150);
   max2=max2-1;
   }
   }
 
      if(input(pin_a6)){
     delay_ms(150);
     z=z+1;
     lcd_putc('\f');
     if(z==3){
     z=0;
     }     
     } 
     
     
    if(max1>a){
    output_high(pin_a3);
    }
    if(max1<a){
    output_low(pin_a3);
    }
    if(max2>b){
    output_high(pin_a2);
    }
    if(max2<b){
    output_low(pin_a2);
    }
   }

}


yine aynı hocam

dursuncemal

olamaz koda bi bakiyim bu makinada ccs yok akraip bakacam   butun  degiskenlerini lcd de saglikli gorebiliyormusun

:=

Emre MERMİ

aynen hocam tüm değişkenler lcd de sağlıklı görünüyor. Kafama yatmadı bir de seri porttan yolladım a,b,c,d ve dht_dat[]... şeklinde hepsini sorunsuz görüyorum. Ayrıca kütüphanedeki char dht_dat[10];  u da int dht_dat[10];  ve diğer değişkenleri de int e çevirip yine denedim yine aynı.

mesaj birleştirme:: 18 Ocak 2016, 02:38:04

#include <16F628A.h>
#use delay(internal=4MHz)
#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8,stream=PORT1)
#include "DHT11.C"
int a=0,b=0,c=0,d=0;
void main()
{
 dht_init();
      delay_ms(100);
   while(TRUE)
   {
 read_dht();
 a=dht_dat[0];
 b=dht_dat[1];
 c=dht_dat[2];
 d=dht_dat[3];
 
         delay_ms(1000);
       printf("%d.%d %%  ",a,b);
      
      printf("%d.%d %cC  ",c,d,223);
      //TODO: User Code
   }

}


bu kodlar da seri porttan kontrol etmek için yolladığım kodlar.

dursuncemal

#11
kod tas gibi duruyo yada gozden kacan bisi var ama benim iddam ayni

prinf de butun degiskenleri   %c   yani char gosterecek sekılde yaz  bazisini      %d bazisini  %c    yapma          lcdede   %d  de gordugun degerle   %c de gordugun deger  ayni olsa bile degeri ayni diildir.

mesaj birleştirme:: 18 Ocak 2016, 17:25:28

dht_dat[ ]     ile   max1     degiskenlerini   tusla artitip azaltarak lcd de bi gozle kafam ıyıce karıstı benım  ama prinf te ayni turde yazarak  yan yana             

mesaj birleştirme:: 18 Ocak 2016, 04:07:14

DHT11 e bir goz gezdirdim sensorden verri char olarak geliyor. senin char to decimal yapman gerekiyor kanimca
:=

Emre MERMİ

#12
Yok mu hocam yardım edebilcek biri ?

mesaj birleştirme:: 18 Ocak 2016, 11:57:49

@dursuncemal hocam bulabildiniz mi ?

Emre MERMİ

bu arada devreyi şu şekilde çalıştırdım hocam, yine sizin dediğiniz gibi yaptım ama farklı olan ne anlamadım bu sefer çalıştı. Eğer ihtiyacı olan biri olursa kod;

#include <16F628A.h>


#use delay(internal=4MHz)


#define LCD_ENABLE_PIN PIN_B0
#define LCD_RS_PIN PIN_B1
#define LCD_RW_PIN PIN_B2
#define LCD_DATA4 PIN_B4
#define LCD_DATA5 PIN_B5
#define LCD_DATA6 PIN_B6
#define LCD_DATA7 PIN_B7

#include <lcd.c>
#include "DHT11.C"


int max1=0,max2=0,z=0;
char a=0,b=0;


void main()
{

   lcd_init();
   delay_ms(100);

   dht_init();
      delay_ms(100);
   while(TRUE)
   { 
   
   if(z==0){
   
      read_dht();
         delay_ms(100);
      lcd_gotoxy(1,1);
      printf(lcd_putc,"%d.%d %%  ",dht_dat[0],dht_dat[1]);
      lcd_gotoxy(1,2);
      printf(lcd_putc,"%d.%d %cC  ",dht_dat[2],dht_dat[3],223);
      a=dht_dat[0];
      b=dht_dat[2];

   }
   
   if(z==1){
      

   lcd_gotoxy(1,1);
   printf(lcd_putc,"nem ayar ");
   lcd_gotoxy(1,2);
   printf(lcd_putc,"%d  %%",max1);
   
   if(input(pin_a1)){
   delay_ms(150);
   max1=max1+1;
   }
    if(input(pin_a7)){
   delay_ms(150);
   max1=max1-1;
   }
   }
   
   
   if(z==2){
  
   lcd_gotoxy(1,1);
   printf(lcd_putc,"sicaklik ayar ");
   lcd_gotoxy(1,2);
   printf(lcd_putc,"%d %cC",max2,223);
   
   if(input(pin_a1)){
   delay_ms(150);
   max2=max2+1;
   }
    if(input(pin_a7)){
   delay_ms(150);
   max2=max2-1;
   }
   }
 
      if(input(pin_a6)){
     delay_ms(150);
     z=z+1;
     lcd_putc('\f');
     if(z==3){
     z=0;
     }     
     } 
     

     
    if(max1<(signed int)a){
    output_high(pin_a3);
    }
    if(max1>(signed int)a){
    output_low(pin_a3);
    }
    if(max2<(signed int)b){
    output_high(pin_a2);
    }
    if(max2>(signed int)b){
    output_low(pin_a2);
    }
   }

}

dursuncemal


problem tur donusumu sen ekranda 0 gorunde kapatmıyı daha sasgida kapatiyo dıyosunya senın ekranda gordugun 0 karakter onun desimal karsılıgı 48

dht_dat[] dat dizisinden sana char geliyo yani ;

asagida karakterlerin desimal karsiliklari var

karakter 0 = desimal 48
karakter 1 = desimal 49
karakter 2 = desimal 50
.
.
.
karakter 9 = desimal 57

diyelim ki   lcd de   nem  : 10   gozokoyor   simdi bu su anlama geliyor ;

karakter olarak; dht_dat[0] = 0   desimal olarak dht_dat[0] = 48
karakter olarak; dht_dat[1] = 1   desimal olarak dht_dat[0] = 49

int max1=0,max2=0,z=0.,birler = 0 ,onlar = 0;


birler = dht_dat[0]-48;//////////// dht_dat[0] da 0 vardi char karsiligi 48 - 48 = 0 olur.

onlar =  dht_dat[1]-48;/////////////////dht_dat[1] da 1 vardi char karsiligi 49 - 48 = 1 olur.

max1 = (onlar * 10) + birler  ///////// 1*10 + 0 = 10   

degiskenin basına koydugun(signed int ) chari   signed int e ceviriyo yukaridaki gibi
:=