Arduino DHT sensorle 0.96 inc oled ekrana sicaklik grafiği yansitma

Katılım
5 Şub 2021
Mesajlar
123
Puanları
16
Yaş
24
Selam. Lisedeyim. Tübitak projem olan dht sensorle sicaklik kontrolü projemde bir yerde sıkıntı yaşadım. 0.96 inc i2c oled ekrana ( ssd1306 olarakda geçer) sensorden aldigim verileri yazdirdim. Bu sicaklik yazisinin altina bir bolum olusturdum burayada sicaklik grafigi yapmak istiyorum. Sicaklik degerleri arttikca ekranin sutununa koyulacak olan nokta yukarda, azaldikca nokta assagiya dogru kayacak.boyle boyle her iki saniyede ekrana bir nokta koyulacak. Grafik kayadabilir. Veya ekran dolunca silinip yeni sayfaya da gecilebilir. Nasil bir algoritma yapabilirim? Teşekkür ederim.

Kullandigim ekran kutuphanesi adafruit ssd1306 ve adafruit gfx.
IMG_20210205_163549.jpg
 
Şöyle yapacaksın:

pixelyeri = map(sicaklik,altsinir,ustsinir,pixelaltsinir,pixelustsinir)
Her veri aldığında pixelyeri datasını drawpixel fonksiyonuyla ekrana yazacaksın yani drawpixel(x,pixelyeri,1) x i döngüyle sıfırdan 128 e kadar artırıp sonra sıfırlayacaksın.

Kod:
for(int i =0;i<128;i++){
    olculenSicaklik = dht_verial();
    sicaklik = (int)(olculenSicaklik*100); //float to int dönüşüm
    sicaklik = map(sicaklik,0,100,pixel_altsinir,pixel_ustsinir); //sıcaklığı pixel aralığına dönüştür
    oled.drawChar(i,sicaklik,1);   
}

bu kod çalıştığında ters çizdiğini farkedeceksin çünkü oledin 0 noktası yukarıdadır, pixel aralığını söylersen dönüşümü yaparız.
 
Son düzenleme:
Şöyle yapacaksın:

pixelyeri = map(sicaklik,altsinir,ustsinir,pixelaltsinir,pixelustsinir)
Her veri aldığında pixelyeri datasını drawpixel fonksiyonuyla ekrana yazacaksın yani drawpixel(x,pixelyeri,1) x i döngüyle sıfırdan 128 e kadar artırıp sonra sıfırlayacaksın.

Kod:
for(int i =0;i<128;i++){
    olculenSicaklik = dht_verial();
    sicaklik = (int)(olculenSicaklik*100); //float to int dönüşüm
    sicaklik = map(sicaklik,0,100,pixel_altsinir,pixel_ustsinir); //sıcaklığı pixel aralığına dönüştür
    oled.drawChar(i,sicaklik,1);  
}

bu kod çalıştığında ters çizdiğini farkedeceksin çünkü oledin 0 noktası yukarıdadır, pixel aralığını söylersen dönüşümü yaparız.
Çok teşekkür ederim Hocam sağolun. Dediğinizi deneyeceğim. Pikselleri öğrenip size de soyleyeyim.
 
pixelleri sen belirleyeceksin o çizdiğin çizgilerden üstte olanının y değeri ve altta olanın y değerini söyleceksin o kadar. Tahminimce üstteki 30 alttaki 55 civarıdır.
 
pixelleri sen belirleyeceksin o çizdiğin çizgilerden üstte olanının y değeri ve altta olanın y değerini söyleceksin o kadar. Tahminimce üstteki 30 alttaki 55 civarıdır.
Ustteki cizgi 16. Pikselin satirinda. Alttakide 63. Pikselin satirinda efendim. Grafikte yukarida en fazla 19, altta en fazla 60. Piksele kadar gelse iyi olacaktır tahminimce. Bu arada Hocam kodu denedim. Benim kutuphanede drawChar komutu olmadigindan" drawLine(baslangicX, baslangicY, bitisX, bitisY,renk); " komutunu kullandım. Yani kod derlenemedi galiba yok drawChar. DrawLine komutuda cizgi cizme komutu. Baslangic ve bitis piksellerini yazip rengini belirtiyorsun. Bu seklide yaptim fakat olmadi. Ekranda diğer seyler var fakat bu grafik icin bisi yazmiyo ekrana. Map satirinda degisiklikler denedim belki ekran disina cikiyodur vs. Diye fakat sonuca ulasamadim Hocam. Simdiden yardimlariniz için çok teşekkür ederim
 

Ekli dosyalar

  • IMG_20210206_130833.jpg
    IMG_20210206_130833.jpg
    237 KB · Görüntüleme: 6
25.12 dereceyi 100 ile carparsan 2512 eder farkindaysan
 
Ustteki cizgi 16. Pikselin satirinda. Alttakide 63. Pikselin satirinda efendim. Grafikte yukarida en fazla 19, altta en fazla 60. Piksele kadar gelse iyi olacaktır tahminimce. Bu arada Hocam kodu denedim. Benim kutuphanede drawChar komutu olmadigindan" drawLine(baslangicX, baslangicY, bitisX, bitisY,renk); " komutunu kullandım. Yani kod derlenemedi galiba yok drawChar. DrawLine komutuda cizgi cizme komutu. Baslangic ve bitis piksellerini yazip rengini belirtiyorsun. Bu seklide yaptim fakat olmadi. Ekranda diğer seyler var fakat bu grafik icin bisi yazmiyo ekrana. Map satirinda degisiklikler denedim belki ekran disina cikiyodur vs. Diye fakat sonuca ulasamadim Hocam. Simdiden yardimlariniz için çok teşekkür ederim
Şimdi düzeltmeler yapıyım öncelikle drawChar değil drawPixel olacaktı yanlış yazmışım adafruit GFX kullanıyorsundur büyük ihtimalle, ikincisi float'dan int'e dönüşünce sıcaklık 100 kat artmış oldu onun için map fonksiyonundaki sicaklığın tavan değerinin 100 değil 10000 olarak değişmesi lazım. yani

Kod:
sicaklik = map(sicaklik,0,10000,pixel_altsinir,pixel_ustsinir); //sıcaklığı pixel aralığına dönüştür

olarak değişecek.
 
Şimdi düzeltmeler yapıyım öncelikle drawChar değil drawPixel olacaktı yanlış yazmışım adafruit GFX kullanıyorsundur büyük ihtimalle, ikincisi float'dan int'e dönüşünce sıcaklık 100 kat artmış oldu onun için map fonksiyonundaki sicaklığın tavan değerinin 100 değil 10000 olarak değişmesi lazım. yani

Kod:
sicaklik = map(sicaklik,0,10000,pixel_altsinir,pixel_ustsinir); //sıcaklığı pixel aralığına dönüştür

olarak değişecek.
Aynen Adafruit gfx kullaniyorum. Hocam ekrana grafigi yazdirmayi basardim. Float int donusum kismini sildim biraz degisiklikler yaptim fakat yine bir sorunum var. Simdiden çok teşekkür ederim. Ekrana yazdirdigim sicaklik değerinin oldugu yazi grafik cizmeye baslayinca guncellenmemeye basliyor. Normalde veri iki saniyede bir yenileniyordu. For dongusu ile grafik ekleyince grafigin her cizgisini iki saniyede verecek sekilde yaptim. Grafik ekrana yazilip ekran doldugu anda for dongusunden cikilip loop icinde devam edildigi icin sanirsam yazili degerim yenileniyor ekran her dolup geri basladigi anda yazi yenileniyor. Birde grafik cizgiyi sicakliga gore veriyor ama yazi ile uyusmuyor dolayisiyla. Haliyle ekranda 10 15 grafik cizgisi olsa her biri iki saniyeden yarim dakka eder Hocam. Yazi yarim dakkada bir yenilenmis oluyor. Ama grafik normal. Bunu nasil cozerim. Sicaklik yazisini ve grafigin cercevesi olan iki cizgiyi de for dongusinun icinedemi yazdirayim. Birde ekranin sağ alt kosesinde kendi kendine bi kac piksel yazdiriyor onu anlamadim .
 

Ekli dosyalar

  • IMG_20210206_170454.jpg
    IMG_20210206_170454.jpg
    149 KB · Görüntüleme: 14
  • IMG_20210206_170221.jpg
    IMG_20210206_170221.jpg
    205.1 KB · Görüntüleme: 10
Moderatör tarafında düzenlendi:
Dostum tüm kodu yaz şuraya düzeltip göndereyim, grafikle sıcaklık aldığın döngüyü birleştirmeszsen tabiki yenilenmez. grafik döngüsü bitene kadar bekler.
 
Dostum tüm kodu yaz şuraya düzeltip göndereyim, grafikle sıcaklık aldığın döngüyü birleştirmeszsen tabiki yenilenmez. grafik döngüsü bitene kadar bekler.
// hocam sağolun. kodlardaki bellı sıcaklık degerlerindeki yapılan durumlar var. degisiklikleri kolay gozlemlemek-
// için degerleri yakın tuttum mesela 27 derecenin ustu sicak hava fan calısır. 25 altı soguk hava. yazdıgım kodları-
// kolay kontrol etmek için degerler boyle yani. degiştirecegim onları. teşekkür ederim.
Kod:
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>

#define SCREEN_WIDTH 128             // OLED display width
#define SCREEN_HEIGHT 64            // OLED display height
#define DHTPIN 6    
#define DHTTYPE DHT11      
#define OLED_RESET 4
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


unsigned long oncekizmn3 = 0;                         
const long bekle3 = 2000; 

unsigned long oncekizmn = 0;                               // millis sensor yenilenmesi için 
const long bekle = 2000;                                    // millis sensor yenilenmesi için

unsigned long oncekizmn2 = 0;                          // hata ledi için
const long bekle2 = 1000;
int ledState = LOW; 
const int ledPin =  11;  

DHT dht(DHTPIN, DHTTYPE);



void setup(){

       pinMode( 11, OUTPUT);     // sensorden veri okunmuyor hatası ışığı
       pinMode( 8, OUTPUT);     // kırmızı led çıkış//hava cok sicak gostergesi
       pinMode( 9, OUTPUT);     // yesil led cıkıs//hava normal gosterge
       pinMode( 10, OUTPUT);    // mavi led cıkıs//hava soguk gosterge
       pinMode( 2, OUTPUT);      // fan çıkışı
       Wire.begin();
       dht.begin();
       display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
       display.clearDisplay(); // ekranı temizler
       display.display(); 
}


void loop(){
       a();
}

void a(){

      
     float t = dht.readTemperature();                       // sıcaklık Celcius

     int sicaklik = dht.readTemperature();                     // if yapısındaki koşul için
     if( sicaklik >= 27) {                            // 27 ve ustu deger için fan calişsın
     if(sicaklik >25) {                                   // 25 İN ALTINA DUSENE KADAR CALİŞCAK
     digitalWrite(2, HIGH);
     } else { digitalWrite(2, LOW); }
     } else if(sicaklik<=25) {                            // 25 İN ALTINA İNİNCE DURSUN
      digitalWrite ( 2, LOW);
     }


      int derecee = dht.readTemperature(); 
      if( derecee >= 27) {
        digitalWrite(8, HIGH);                                     // hava sıcaksa kırmızı led yanar
      } else {
        digitalWrite(8, LOW);
      }

      if( 25 < derecee && derecee < 27) {
        digitalWrite(9, HIGH);                                  // normalse hava yesil led
      } else {
        digitalWrite(9, LOW);
      }

      if( derecee <= 25 ) {
        digitalWrite(10, HIGH);                                      // hava soguksa mavi
      } else {
        digitalWrite(10, LOW);
      }


if ( isnan(t)) {
    unsigned long simdikizmn2 = millis();                     // hata ledi yanıp soner
  if(simdikizmn2 - oncekizmn2 >= bekle2) {
    oncekizmn2 = simdikizmn2;  
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;   
    digitalWrite(ledPin, ledState);
  }
     // sensorden veri alınmaz ise EKRANA uyarı verir;
         display.clearDisplay();                                         // ekranı temizler            
         display.setTextSize(1);                                   // yazı tipi boyutu
         display.setCursor(22,20);                          // yazının matematiksel konumu
         display.print("   Sensorden");
         display.setCursor(34,35);                                // yazının matematiksel konumu
         display.print("   Veri");
         display.setCursor(5,50);
         display.print("     Okunamiyor!");
         display.display();
         return;
      } else {
         digitalWrite(11, LOW);                                    //sensor hatası yoksa hata ledi yanmasın
         
}


////      ***   ekrana sıcaklıgı ve grafik cercevesini yazdıran kısım   ***
       display.clearDisplay(); // ekranı temizler
       display.setTextColor(WHITE); // Yazının rengi.
       display.setTextSize(1); // yazı tipi boyutu
       display.setCursor(0,3);
       display.print("  SICAKLIK: ");
       display.print(t);
       display.println(" C");
       display.drawLine(0,16,128,16,WHITE);
       display.drawLine(0,63,128,63,WHITE);
 

//////////// **** ekrandaki grafik çerçevesinin içine grafik yazdıran kısım ****      
       for( int i=0; i<128; i) {
       
            unsigned long simdikizmn3 = millis();                  
            if(simdikizmn3 - oncekizmn3 >= bekle3) {
             
      int sicaklik = dht.readTemperature();
      sicaklik = map(sicaklik,15,38,60,20);
      display.drawLine(i+1,sicaklik,i+10,sicaklik,WHITE); //çizgi çizme
      display.display();
      i = i+10;
      oncekizmn3 = simdikizmn3;} 
  }


            unsigned long simdikizmn = millis();                     // millis sensor yenilenmesi için
            if(simdikizmn - oncekizmn >= bekle) {                     // millis sensor yenilenmesi için
            oncekizmn = simdikizmn;}     // Veri yenileme suresi      // millis sensor yenilenmesi için
       //sensor yavaş bir sensor oldugu için sureyi 2sn tuttuk         // millis sensor yenilenmesi için
  
}
 
Moderatör tarafında düzenlendi:

Forum istatistikleri

Konular
128,206
Mesajlar
915,817
Kullanıcılar
449,985
Son üye
sSait Başdaş

Yeni konular

Geri
Üst