CzrElektronik
Üye
- Katılım
- 5 Şub 2021
- Mesajlar
- 124
- Puanları
- 16
- Yaş
- 24
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);
}
Çok teşekkür ederim Hocam sağolun. Dediğinizi deneyeceğim. Pikselleri öğrenip size de soyleyeyim.Şö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.
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 ederimpixelleri 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.
Ş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. yaniUstteki 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
sicaklik = map(sicaklik,0,10000,pixel_altsinir,pixel_ustsinir); //sıcaklığı pixel aralığına dönüştür
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 .Ş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.
// hocam sağolun. kodlardaki bellı sıcaklık degerlerindeki yapılan durumlar var. degisiklikleri kolay gozlemlemek-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.
#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
}
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?