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

Yani bu kadar basit bir iş ancak bu kadar karmaşıklaştırılabilir. Neden sürekli sensöreden bilgi okuyorsan niye birden fazla zaman sabiti var anlamıyorum. Niye ana döngüyü bırakıp için a() diye bir fonksiyon açıyorsun....?

Bence senin önce c++ dili üzerine basit örneklerle çalışman lazım, olayın mantığından uzaksın şevkin kırılmasın zor değil kolay öğrenilir. Senin kodu düzenlemek sanırım birkaç ayımı alır benim içinde kayboldum gittim. Örnek bi kod yazdım kitaplıklar olmadığı için derlemedim çalıştırmadım yazım yanlışları da olabilir ama mantığı anlarsın en azından.

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

const int sensorPin = 11;
const int kirmiziLed = 8;
const int yesilLed = 9;
const int maviLed = 10;
const int fanPin = 2;

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, & Wire, OLED_RESET);
DHT dht(DHTPIN, DHTTYPE);

int period = 1000;
unsigned long time_now = 0;

float sicakSinir = 27.0;
float sogukSinir = 25.0;

String sicaklikDizisi;


void setup() {
  pinMode(sensorPin, OUTPUT); // sensorden veri okunmuyor hatası ışığı
  pinMode(kirmiziLed, OUTPUT); // kırmızı led çıkış//hava cok sicak gostergesi
  pinMode(yesilLed, OUTPUT); // yesil led cıkıs//hava normal gosterge
  pinMode(maviLed, OUTPUT); // mavi led cıkıs//hava soguk gosterge
  pinMode(fanPin, OUTPUT); // fan çıkışı

  Wire.begin();
  dht.begin();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay(); // ekranı temizler
  display.display();
}

void loop() {
  if (millis() >= time_now + period) {
    time_now += period;

    float sicaklik = dht.readTemperature();
    if (isnan(sicaklik)) {
      digitalWrite(fanPin, LOW);
      digitalWrite(kirmiziLed, HIGH);
      digitalWrite(yesilLed, LOW);
      digitalWrite(maviLed, LOW);

      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();
    } else {
      if (sicaklik >= sicakSinir) {
        digitalWrite(fanPin, HIGH);
        digitalWrite(kirmiziLed, LOW);
        digitalWrite(yesilLed, LOW);
        digitalWrite(maviLed, LOW);
      } else if (sicaklik < sicakSinir && sicaklik >= sogukSinir) {
        digitalWrite(fanPin, LOW);
        digitalWrite(kirmiziLed, LOW);
        digitalWrite(yesilLed, HIGH);
        digitalWrite(maviLed, LOW);
      } else if (sicaklik < sogukSinir) {
        digitalWrite(fanPin, LOW);
        digitalWrite(kirmiziLed, LOW);
        digitalWrite(yesilLed, LOW);
        digitalWrite(maviLed, HIGH);
      }
      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(sicaklik);
      display.println(" C");
      display.drawLine(0, 16, 128, 16, WHITE);
      display.drawLine(0, 63, 128, 63, WHITE);

      if (sicaklikDizisi.length() > 126)
        sicaklikDizisi.remove(0, 1);
      int sicaklikInt = (int)(sicaklik * 100);
      sicaklikInt = map(sicaklikInt, 1500, 3800, 60, 20);
      sicaklikDizisi += sicaklikInt;

      display.fillRect(0,20,127,40,0);
      for (int i = 0; i < sicaklikDizisi.length(); i++)
        display.drawPixel(i, sicaklikDizisi[i]-48, WHITE);

    }
  }
}

Hataları yazarsın birlikte debug yaparız hem öğrenmiş olursun hem de senden sonra arayanlar için bir örnek olur.
 
Son düzenleme:
Yani bu kadar basit bir iş ancak bu kadar karmaşıklaştırılabilir. Neden sürekli sensöreden bilgi okuyorsan niye birden fazla zaman sabiti var anlamıyorum. Niye ana döngüyü bırakıp için a() diye bir fonksiyon açıyorsun....?

Bence senin önce c++ dili üzerine basit örneklerle çalışman lazım, olayın mantığından uzaksın şevkin kırılmasın zor değil kolay öğrenilir. Senin kodu düzenlemek sanırım birkaç ayımı alır benim içinde kayboldum gittim. Örnek bi kod yazdım kitaplıklar olmadığı için derlemedim çalıştırmadım yazım yanlışları da olabilir ama mantığı anlarsın en azından.

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

const int sensorPin = 11;
const int kirmiziLed = 8;
const int yesilLed = 9;
const int maviLed = 10;
const int fanPin = 2;

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, & Wire, OLED_RESET);
DHT dht(DHTPIN, DHTTYPE);

int period = 1000;
unsigned long time_now = 0;

float sicakSinir = 27.0;
float sogukSinir = 25.0;

String sicaklikDizisi;
int alinanSicaklikSayisi = 0;

void setup() {
  pinMode(sensorPin, OUTPUT); // sensorden veri okunmuyor hatası ışığı
  pinMode(kirmiziLed, OUTPUT); // kırmızı led çıkış//hava cok sicak gostergesi
  pinMode(yesilLed, OUTPUT); // yesil led cıkıs//hava normal gosterge
  pinMode(maviLed, OUTPUT); // mavi led cıkıs//hava soguk gosterge
  pinMode(fanPin, OUTPUT); // fan çıkışı

  Wire.begin();
  dht.begin();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay(); // ekranı temizler
  display.display();
}

void loop() {
  if (millis() >= time_now + period) {
    time_now += period;

    float sicaklik = dht.readTemperature();
    if (isnan(sicaklik)) {
      digitalWrite(fanPin, LOW);
      digitalWrite(kirmiziLed, HIGH);
      digitalWrite(yesilLed, LOW);
      digitalWrite(maviLed, LOW);

      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();
    } else {
      if (sicaklik >= sicakSinir) {
        digitalWrite(fanPin, HIGH);
        digitalWrite(kirmiziLed, LOW);
        digitalWrite(yesilLed, LOW);
        digitalWrite(maviLed, LOW);
      } else if (sicaklik < sicakSinir && sicaklik >= sogukSinir) {
        digitalWrite(fanPin, LOW);
        digitalWrite(kirmiziLed, LOW);
        digitalWrite(yesilLed, HIGH);
        digitalWrite(maviLed, LOW);
      } else if (sicaklik < sogukSinir) {
        digitalWrite(fanPin, LOW);
        digitalWrite(kirmiziLed, LOW);
        digitalWrite(yesilLed, LOW);
        digitalWrite(maviLed, HIGH);
      }
      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);

      if (alinanSicaklikSayisi > 126)
        sicaklikDizisi.remove(0, 1);
      int sicaklikInt = (int)(sicaklik * 100);
      sicaklikInt = map(sicaklikInt, 1500, 3800, 60, 20);
      sicaklikDizisi += String(sicaklikInt);

      for (int i = 0; i < sicaklikDizisi.length(); i++)
        display.drawPixel(i, sicaklikDizisi[i].toInt(), WHITE);

    }
  }
}

Hataları yazarsın birlikte debug yaparız hem öğrenmiş olursun hem de senden sonra arayanlar için bir örnek olur.

tesekkurler hocam. bu benim ilk içinde birden fazla iş barımdıran projem olduğu için farklı farklı işlevleri tek koda uyarlamak daha önce yaptığım bir iş değildi. ben projemi gözümde buyutmusum maalesef siz basit deyince sasirmadım cunki bana zor. size basit olabilir. saygıda kusur ettiysem affola. daha önce dil çalışmadım arduino uzerinden modullerrle ilerleye ilerleye devam ediyorum. ama şunu söyleyebilirim bu proje bana çok şey kattı. loop içinde işleri farklı fonksiyonlarla yapayım diye düşünmüştüm başta. sonra hepsini a fonksiyonuna attım. loopa atmak aklıma gelmemişti. birde ben bir millis kullanılan yerin tanımlamalarını başka yerde kullanamam diye dusunup baska zamanlar tanımlamıştım. daha bu işlerde yeniyim millisi ilk defa burda kullandım mesela. sizlerden ogreneceğim çok seyim var. teşekkurler.verilen hata;
:In function 'void loop()':
:error:'t' was not declared in this scope ( bunu duzeltebildim ama assadakini cozemedim)
:error: request for member 'toInt' in 'sicaklikDizisi.String:perator[](((unsigned int)i))', which is of non-class type 'char'
 
:error: request for member 'toInt' in 'sicaklikDizisi.String:perator[](((unsigned int)i))', which is of non-class type 'char'
String sınıfında toInt() fonksiyonu "123" yazısını 123 sayısına çevirmek için kullanılır Stringin karakterlerini de çevirir sanmıştım ama çevirmiyormuş. sicaklikDizisi zaten tek başına ascii bir karakter olduğuna göre ascii '0' yani 48 sayısını çıkarırsak bize gerçek sayı değerini vermiş olur.

Yani şunu yazacaksın.

C++:
display.drawPixel(i, sicaklikDizisi[i]-48, WHITE);
 
String sınıfında toInt() fonksiyonu "123" yazısını 123 sayısına çevirmek için kullanılır Stringin karakterlerini de çevirir sanmıştım ama çevirmiyormuş. sicaklikDizisi zaten tek başına ascii bir karakter olduğuna göre ascii '0' yani 48 sayısını çıkarırsak bize gerçek sayı değerini vermiş olur.

Yani şunu yazacaksın.

C++:
display.drawPixel(i, sicaklikDizisi[i]-48, WHITE);
Şimdi oldu hocam tamamdır teşekkür ederim
 
Şimdi oldu hocam tamamdır teşekkür ederim
Olmamıştır şimdi bakarken gördüm en fazla 127 sıcaklık değerini grafik yapıp duracaktır yani kaymayacaktır.

Kod:
      if (alinanSicaklikSayisi > 126)
        sicaklikDizisi.remove(0, 1);

kısmını

Kod:
      if (sicaklikDizisi.length() > 126)
        sicaklikDizisi.remove(0, 1);

olarak değiştir ve alinanSicaklikSayisini sil en yukarıdan ve ayrıca grafik alanını her pixelden önce temizelemesi lazım ki grafik kayabilsin. onun için de:
Kod:
for (int i = 0; i < sicaklikDizisi.length(); i++)
        display.drawPixel(i, sicaklikDizisi[i].toInt(), WHITE);

kısmını
Kod:
display.fillRect(0,20,127,40,0);
for (int i = 0; i < sicaklikDizisi.length(); i++)
        display.drawPixel(i, sicaklikDizisi[i]-48, WHITE);

olarak değiştir.
 
Son düzenleme:
Olmamıştır şimdi bakarken gördüm en fazla 127 sıcaklık değerini grafik yapıp duracaktır yani kaymayacaktır.

Kod:
      if (alinanSicaklikSayisi > 126)
        sicaklikDizisi.remove(0, 1);

kısmını

Kod:
      if (sicaklikDizisi.length() > 126)
        sicaklikDizisi.remove(0, 1);

olarak değiştir ve alinanSicaklikSayisini sil en yukarıdan.
Tamamdır deneyeceğim
 

Forum istatistikleri

Konular
128,198
Mesajlar
915,773
Kullanıcılar
449,980
Son üye
shield325

Yeni konular

Çevrimiçi üyeler

Geri
Üst