[]

mikroçip ve DHT22

Merhabalar,
18F4520 ile DHT22 kullanmak istiyorum.

Amacım şu; sıcaklık 20 derecenin altına düşünce ısıtıcı devreye girsin, nem 50'nin üstüne çıkınca fan devreye girsin.

İnternette bulduğum örneklerde unsigned int16 olarak değer alınıyor, bu değer char'a döndürülüp display'de görüntüleniyor. Ben görüntülemek istemiyorum. Hiçbir yerde bu denli basit bir örnek görmedim. Kendim de beceremedim.

DHT22 kullanmış olan var ise bana bundan nasıl normal düz integer değer alabileceğimi söyleyebilir mi? Char değeri integer'a dönüştüreyim dedim onu da beceremedim.

2 bayt olarak okumuş, sonra onu çarpmış bölmüş char messajı haline getirmiş, onu da display'de yazmış falan benim işime yarayan bir değer yok.

if( sıcaklık < 20)
ısıtıcıyı aç;

Bana bu lazım sadece ama okunan byte değeri 20'nin yerine kullanmaya çalıştım o da olmadı.

Teşekkürler...

 
Merhaba,

www.sparkfun.com
Yukarıda datasheet var. Dijital output veriyormuş cihaz. kendi adc'si var. output sinyali 40 bitmiş. 2 saniyede bir örneklem alabiliyormuş. maksimum 2 sn olacak şekilde istediğiniz şekilde bir periyot belirleyip (clock divider) cihaza "wake up" (aktif low en az 1 ms) sinyali göndereceksiniz. "wake up" sinyali gelince ölçüme başlıyor ve ardından 40 bit data gönderiyor.
Data'nın içeriği de şu şekildeymiş:
"DHT22 send out higher data bit firstly!
DATA=8 bit integral RH data+8 bit decimal RH data+8 bit integral T data+8 bit decimal T data+8 bit check-sum
If the data transmission is right, check-sum should be the last 8 bit of "8 bit integral RH data+8 bit decimal RH
data+8 bit integral T data+8 bit decimal T data"."

sonuç olarak 2 byte olarak okuyacaksınız sonra ilgili bit'leri alacaksınız. öncesinde de data doğru mu diye checksum'ı kontrol etmeniz lazım.


EKLEME: internet dünya üzerindeki en güzel şey olabilir. Direkt şuraya bakın:
simple-circuit.com
  • sparkle kiddle  (01.03.23 21:30:04 ~ 21:36:40) 
örnekteki gibi message[] içine yazayım, sonra oradaki basamakları tek tek float bir değişkene alayım dedim o da olmadı.
mesajın birinci elemanını 10 ile çarptım, ikinciyi çarpmadım, üçüncü zaten virgül, dördüncüyü 10 ile böldüm ve hepsini toplayıp sayı elde edeyim dedim olmadı.

string to integer mı yapmak gerek? kafam durdu vallahi, daha bunu bitirip başka şeylere geçeceğim :D
  • makedon  (02.03.23 20:31:54) 
int16 değeri printf ile char döndürdüğü bir satır olmalı.
atoi fonksiyonunu denedin mi ?

  • orpheus  (02.03.23 20:55:49 ~ 20:56:43) 
bu örnekte data'yı 8bit 8bit parse ediyor aslında. bana okay gibi geldi.string geliyor diyorsanız direkt onu int değişkende tutamazsınız. type casting yapmanız lazım. "orpheus" söylemiş onu da.


  • sparkle kiddle  (02.03.23 21:31:05) 
linkteki kodda şöyle satırlar var:
message1[7] = (Temp / 100) % 10 + 48;
message1[8] = (Temp / 10) % 10 + 48;
message1[10] = Temp % 10 + 48;

message1 charının içine bu sayıalr yazılıyor zaten. bunlar o işlemler sonucunda integer olmuyor mu? her char elemanını ayrı ayrı yazıyor char içine, sonra da lcd'de gösteriyor. yoksa bu işlemler ascii karşılığı gibi bir şey mi?

ben float bir temperature tanımlasam ve;
temperature_ = ((((Temp / 100) % 10) + 48) * 10) + (((Temp / 10) % 10) + 48) + (((Temp % 10) + 48) / 10);
if(temperature_ < 20.0) // 20,0'den küçükse ısıtıcıyı aç

desem olmuyor mu?
olmuyor gerçi neden öyle sorduysam :)

atoi ve atof denedim ama char içinde harfler de var diye sanırım pek olmadı.
  • makedon  (05.03.23 21:06:20 ~ 21:07:45) 
hocam;
onlinegdb.com

şunu bir dener misiniz? ben tam olarak anlayamıyorum çok da zaman ayıramıyorum açıkçası. compiler'a göre işlemler değişebilir. Aldığınız hataya göre işlem yapmalısınız. bu adam char sen bu int tipinde işleme sokamazsın diyorsa dönüşüm yapmalısınız. Evet haklısınız artık sayısal işlem yapıldığında int oluyor ama olmuyorsa da dönüşümü yapın.

EKLEME: onlinegdb.com
hatta üstteki kodu atayım. 52 4'ün ascii karşılığı. type casting'i de "(int)" ile yaptım.
  • sparkle kiddle  (05.03.23 22:03:04 ~ 22:10:21) 
çok teşekkür ediyorum yardımlarınız için.

sorunu çözdüm, açıklayacağım ve aşağıya çalışan kodu da yazıyorum.

display'de gösterilecek charlarının yanında bir de ayrıca float değere dönüştürmek için ayrı iki char tanımladım. DHT22'den okunan 16 bitin yazdırıldığı şekilde aynen kendi tanımladığım char'a da yazdırdım. sonra onu atof() ile float değere dönüştürdüm ve 10'a böldüm, küsurat için.

sonra if(temperature_ < 22.0)
output_high(HEATER);

evet biraz ilkel ama çalışıyor. şu an sadece timeout hatası alıyorum çünkü program biraz şişti. iki satır if kodu ekliyorum DHT'nin zamanlaması şaşıyor. delay_ms() yazan yerlerdeki süreleri düşürmeye çalıştım, olmadı :D

ama teşekür ediyorum, şimdilik sorun çözüldü.


/////////////////////////////////

char Temperature_message[] = "Temp = 00.0 C";
char Humidity_message[] = "RH = 00.0 %";
char tmp[] = "000";
char hmd[] = "000";
...
DHT22 fonksiyonları
...
void main()
float temperature_, humidity_;

...

Temperature_message[7] = (Temp / 100) % 10 + 48;
Temperature_message[8] = (Temp / 10) % 10 + 48;
Temperature_message[10] = Temp % 10 + 48;
Humidity_message[7] = (Humid / 100) % 10 + 48;
Humidity_message[8] = (Humid / 10) % 10 + 48;
Humidity_message[10] = Humid % 10 + 48;
Temperature_message[11] = 223; // Degree symbol
lcd_putc('_'); // LCD clear
lcd_gotoxy(1, 1); // Go to column 1 row 1
printf(lcd_putc, Temperature_message); // Display message1
lcd_gotoxy(1, 2); // Go to column 1 row 2
printf(lcd_putc, Humidity_message); // Display message2

tmp[0] = (Temp / 100) % 10 + 48;
tmp[1] = (Temp / 10) % 10 + 48;
tmp[2] = Temp % 10 + 48;
hmd[0] = (Humid / 100) % 10 + 48;
hmd[1] = (Humid / 10) % 10 + 48;
hmd[2] = Humid % 10 + 48;

temperature_ = atof(tmp);
humidity_ = atof(hmd);
temperature_ = temperature_ / 10;
humidity_ = humidity_ / 10;
  • makedon  (06.03.23 20:09:05) 
1
buraya yazılanların hakları Sir Anthony Hopkins'e aittir.
yazan eden compumaster, ilgilenen eden fader
modere edenler angelus, Artibir, aychovsky, baba jo, basond, compumaster, deckard, duyulmasi gerektigi kadar, fader, fraise, groove salad, kahvegibi, kaymaktutmayansicaksut, kibritsuyu, monstro, pandispanya, robin, ron dennis
bu sitede yazılanların hiçbiri doğru değildir. site içeriği küçükler için sakıncalı olabilir. yazılardan yazarları sorumludur. kaynak göstermeden alıntılanamaz. devlet tarafından atanmış bir kurumun internet üzerinde kimin hangi bilgiye ulaşıp ulaşamayacağına karar vermesi insan haklarına aykırıdır. web siteleri kullanıcıların istekleri doğrultusunda bağlandıkları yerlerdir. kullanıcılar isterlerse bir web sitesine bağlanmayabilirler. bu güçleri ve imkanları mevcuttur. bir kullanıcı bir siteye bağlanmak istiyorsa bu onun tercihi ve hakkıdır. bağlanmak istemiyorsa bu yine onun tercihi ve hakkıdır. halkın kendisine hizmet etmesi için görevlendirdiği kurumlar hadlerini aşıp halka neye ulaşıp ulaşmayacağını bilmeyen cahil cühela muamelesi edemezler. ebeveynlerin çocuklarını sakıncalı içeriklerden koruması için çok sayıda bedava ve ücretli yazılım mevcuttur. bu yazılımlar bir web tarayıcısını kullanmaktan daha karmaşık teknik bilgi gerektirmemektedir. devletin milletini küçük düşürmesi ve ebleh yerine koyması yasaktır. Skimlinks ile linkler üzerinden yönlendirme payı alınmaktadır.