Arduino
OKUDUĞUNUZ KONU
Arduino TFT Ekranda Sıcaklık Nem Gösterimi
16

Arduino TFT Ekranda Sıcaklık Nem Gösterimi

Yazar : Murat Duran21 Temmuz 2017

Arduino TFT ekran kullanarak görsel bir şekilde sıcaklık ve nem değerlerini bu projemizde nasıl gösterebileceğimizi anlatmaya çalışacağım.Geçen projemizde aynı ekranla dokunmatik bir paint uygulaması yapmıştık.Bu uygulamada ekranın dokunmatik özelliğini kullanamadan daha basit ve görsel bir şekilde DHT11 modülünden nem sıcalık değerlerini ekrana aktaracağız.

Projede Kullanılan Malzemeler

Projenin yapım aşamasındaki resimleri aşağıda gösterilmiştir.Öncelikle küçük bir pertinaks parçasını Arduino mega üzerine resimlerde görüldüğü gibi lehimliyoruz.Buradaki bağlantı noktaları VCC – GND ve A8 pinleridir.

Daha sonra DHT11 sıcaklık ve nem sensörünü pertinak üzerine lehimliyoruz ve kablolama yapıyoruz.Sensörün sinyal pini A8 ‘e bağlıdır.

Son olarak Arduino mega üzerine 2.4 inch lik TFT ekranımızı yerleştiriyoruz.Ekran shield olduğundan herhangi bir lehimleme vs yapmanıza gerek kalmadan kullanabilmektesiniz.

Projenin kodları aşağıda verilmiştir.Kütüphaneleri arduino programının içerisindeki libraries klasörüne yüklemeniz gerekmektedir aksi halde hata alacaksınız.

Kütüphaneleri İndir


// Proje Hocam - 2.4 inch TFT DHT11 
 
#include <SPFD5408_Adafruit_GFX.h>    // Adafruit GFX Kütüphanesi
#include <SPFD5408_Adafruit_TFTLCD.h> // TFT Ekran Kütüphanesi
#include <SPFD5408_TouchScreen.h>     // Dokunmatik Kütüphanesi
 
#include "DHT.h"
 
#define DHTPIN A8
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
 
// *** Dokunmatik Pinleri
#define YP A3  
#define XM A2  
#define YM 9   
#define XP 8   
// *** Dokunamtik Değerleri
#define TS_MINX 150
#define TS_MINY 120
#define TS_MAXX 920
#define TS_MAXY 940
 
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); 
 
// *** LCD Pinleri
#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4
 
// *** Renk Değerleri
#define BLACK   0x0000
#define WHITE   0xFFFF
#define RED     0xF800
#define GREEN   0x07E0
#define BLUE    0x001F
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define GREY    0x2108
Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
#define MINPRESSURE 10
#define MAXPRESSURE 1000
 
// Renk Şeması
#define RED2RED 0
#define GREEN2GREEN 1
#define BLUE2BLUE 2
#define BLUE2RED 3
#define GREEN2RED 4
#define RED2GREEN 5
 
uint32_t runTime = -99999;       // time for next update
int reading = 0; // Value to be displayed
int d = 0; // Variable used for the sinewave test waveform
boolean alert = 0;
int8_t ramp = 1;
int tesmod =0;
void setup() {
  dht.begin();
tft.reset(); //Reset LCD to begin
 
tft.begin(0x9341); //SDFP5408 Chipset ID on Library
 
tft.setRotation(1); // Set Rotation at 0 degress (default)
 
tft.fillScreen(BLACK); //Set Background Color with BLACK
    tft.setCursor (7,208);
    tft.setTextSize (3);
    tft.setTextColor (WHITE,BLACK);
    tft.print ("NEM"); 
    tft.setCursor (78,78);
    tft.setTextSize (1);
    tft.setTextColor (WHITE,BLACK);
    tft.print ("SICAKLIK");
     
    tft.setCursor (70,66);
    tft.setTextSize (1);
    tft.setTextColor (WHITE,BLACK);
    tft.print ("PROJE HOCAM");
 
    tft.setCursor (242,20);
    tft.setTextSize (1);
    tft.setTextColor (WHITE,BLACK);
    tft.print ("FAHRENAYT");
 
    tft.setCursor (242,118);//heat index fahrenheit
    tft.setTextSize (1);
    tft.setTextColor (WHITE,BLACK);
    tft.print ("ISI ENDEKSI");
 
    tft.setCursor (238,205);//heat index fahrenheit
    tft.setTextSize (1);
    tft.setTextColor (WHITE,BLACK);
    tft.print ("ISI ENDEKSI C");
 
    tft.setCursor (265,220);//Small celcius text
    tft.setTextSize (1);
    tft.setTextColor (WHITE,BLACK);
    tft.print ("SANTIGRAT");
     
//Design Interface (lines)
    tft.fillRect(0,197,320,4,BLUE);
    tft.fillRect(0,236,320,4,BLUE);
    tft.fillRect(217,0,4,240,BLUE);
    tft.fillRect(217,98,320,4,BLUE);
 
}
 
void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  float f = dht.readTemperature(true);
  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);
      
if (millis() - runTime >= 500) { // Execute every 500ms
    runTime = millis();
    if(tesmod==0){reading=99; }
    if(tesmod==1){reading = t;}  
     
    int xpos = 0, ypos = 5, gap = 4, radius = 52;
    // Draw a large meter
    xpos = 320/2 - 160, ypos = 0, gap = 100, radius = 105;
    ringMeter(reading,0,100, xpos,ypos,radius,"Derece",GREEN2RED); // Draw analogue meter
 
  if(h>0){  //Humidity %
    tft.setCursor (157,208);
    tft.setTextSize (3);
    tft.setTextColor (BLUE,BLACK);
    tft.print (h,0); tft.print ('%');
    tesmod=1;
  }
  if(f>0){  //Fahrenheit
    tft.setCursor (237,38);
    tft.setTextSize (4);
    tft.setTextColor (BLUE,BLACK);
    tft.print (f,0); 
    tesmod=1;
  }
  if(hif>0){  //Heat index Fahrenheit
    tft.setCursor (237,138);
    tft.setTextSize (4);
    tft.setTextColor (BLUE,BLACK);
    tft.print (hif,0); 
    tesmod=1;
  }
  if(hic>0){  //Heat index Celsius
    tft.setCursor (238,217);
    tft.setTextSize (2);
    tft.setTextColor (BLUE,BLACK);
    tft.print (hic,0); 
    tesmod=1;
  }
  }
}
 
 
// #########################################################################
//  Draw the meter on the screen, returns x coord of righthand side
// #########################################################################
int ringMeter(int value, int vmin, int vmax, int x, int y, int r, char *units, byte scheme)
{
  // Minimum value of r is about 52 before value text intrudes on ring
  // drawing the text first is an option
   
  x += r; y += r;   // Calculate coords of centre of ring
  int w = r / 3;    // Width of outer ring is 1/4 of radius 
  int angle = 150;  // Half the sweep angle of meter (300 degrees)
  int v = map(value, vmin, vmax, -angle, angle); // Map the value to an angle v
  byte seg = 3; // Segments are 3 degrees wide = 100 segments for 300 degrees
  byte inc = 6; // Draw segments every 3 degrees, increase to 6 for segmented ring
  // Variable to save "value" text colour from scheme and set default
  int colour = BLUE;
  
  // Draw colour blocks every inc degrees
  for (int i = -angle+inc/2; i < angle-inc/2; i += inc) {
    // Calculate pair of coordinates for segment start
    float sx = cos((i - 90) * 0.0174532925);
    float sy = sin((i - 90) * 0.0174532925);
    uint16_t x0 = sx * (r - w) + x;
    uint16_t y0 = sy * (r - w) + y;
    uint16_t x1 = sx * r + x;
    uint16_t y1 = sy * r + y;
 
    // Calculate pair of coordinates for segment end
    float sx2 = cos((i + seg - 90) * 0.0174532925);
    float sy2 = sin((i + seg - 90) * 0.0174532925);
    int x2 = sx2 * (r - w) + x;
    int y2 = sy2 * (r - w) + y;
    int x3 = sx2 * r + x;
    int y3 = sy2 * r + y;
 
    if (i < v) { // Fill in coloured segments with 2 triangles
      switch (scheme) {
        case 0: colour = RED; break; // Fixed colour
        case 1: colour = GREEN; break; // Fixed colour
        case 2: colour = BLUE; break; // Fixed colour
        case 3: colour = rainbow(map(i, -angle, angle, 0, 127)); break; // Full spectrum blue to red
        case 4: colour = rainbow(map(i, -angle, angle, 70, 127)); break; // Green to red (high temperature etc)
        case 5: colour = rainbow(map(i, -angle, angle, 127, 63)); break; // Red to green (low battery etc)
        default: colour = BLUE; break; // Fixed colour
      }
      tft.fillTriangle(x0, y0, x1, y1, x2, y2, colour);
      tft.fillTriangle(x1, y1, x2, y2, x3, y3, colour);
      //text_colour = colour; // Save the last colour drawn
    }
    else // Fill in blank segments
    {
      tft.fillTriangle(x0, y0, x1, y1, x2, y2, GREY);
      tft.fillTriangle(x1, y1, x2, y2, x3, y3, GREY);
    }
  }
  // Convert value to a string
  char buf[10];
  byte len = 2; if (value > 999) len = 4;
  dtostrf(value, len, 0, buf);
  buf[len] = ' '; buf[len] = 0; // Add blanking space and terminator, helps to centre text too!
  // Set the text colour to default
  tft.setTextSize(1);
 
  if(value>9){
  tft.setTextColor(colour,BLACK);
  tft.setCursor(x-25,y-10);tft.setTextSize(5);
  tft.print(buf);}
  if(value<10){
  tft.setTextColor(colour,BLACK);
  tft.setCursor(x-25,y-10);tft.setTextSize(5);
  tft.print(buf);}
 
  tft.setTextColor(WHITE,BLACK);
   
  tft.setCursor(x-39,y+75);tft.setTextSize(2);
  tft.print(units); // Units display
   
  // Calculate and return right hand side x coordinate
  return x + r;
}
 
// #########################################################################
// Return a 16 bit rainbow colour
// #########################################################################
unsigned int rainbow(byte value)
{
  // Value is expected to be in range 0-127
  // The value is converted to a spectrum colour from 0 = blue through to 127 = red
 
  byte red = 0; // Red is the top 5 bits of a 16 bit colour value
  byte green = 0;// Green is the middle 6 bits
  byte blue = 0; // Blue is the bottom 5 bits
  byte quadrant = value / 32;
 
  if (quadrant == 0) {
    blue = 31;
    green = 2 * (value % 32);
    red = 0;
  }
  if (quadrant == 1) {
    blue = 31 - (value % 32);
    green = 63;
    red = 0;
  }
  if (quadrant == 2) {
    blue = 0;
    green = 63;
    red = value % 32;
  }
  if (quadrant == 3) {
    blue = 0;
    green = 63 - 2 * (value % 32);
    red = 31;
  }
  return (red << 11) + (green << 5) + blue;
}
 
// #########################################################################
// Return a value in range -1 to +1 for a given phase angle in degrees
// #########################################################################
float sineWave(int phase) {
  return sin(phase * 0.0174532925);
}
SİZCE NASIL OLMUŞ?
Beğendim
75%
İlginç
11%
Eh İşte
8%
Anlamadım
2%
Kötü
2%
Berbat
2%
YAZAR HAKKINDA
Murat Duran
Murat Duran
Açık kaynak donanım ve yazılım geliştiricisiyim , mekanik ve robotik sistemler üzerinde çalışmalar yapmaktayım.Ayrıca bir start-up firması olan Proje Hocam 'ın kurucuyum.
16 YORUMLAR
  • ERKAN NAR
    22 Temmuz 2017 at 14:13

    BANA ŞU İŞİ ÖĞRETSENE TA EN BAŞTAN DUACI OLURUM

  • 29 Temmuz 2017 at 16:20

    Grafik tasarım çok güzel. Teşekkür ederim.

  • Mehmet bsn
    12 Ağustos 2017 at 02:35

    Hocam bende 1.77 tft ekran var 8 bacak
    1 gnd topraklama
    2 vcc + elektrik
    3 sck
    4 sda
    5 res
    6 rs
    7 cs
    8 ledA Led için elektrik
    Geri kalan pinleri nasıl bağlamam gerekir
    Olmadı çözemedim ekrana yazı yazsın yeter yardım ederseniz sevinirim

  • 30 Eylül 2017 at 19:58

    merhaba,

    dtostrf(value, len, 0, buf);
    yukarıdaki satırda aşağıdaki hatayı alıyorum?
    exit status 1
    ‘len’ was not declared in this scope

  • Fırat Akbıyık
    30 Eylül 2017 at 20:46

    Merhabalar ben hiç anlamam yaptığınız şeyden saygısızlık yapıyor isem affola ilgim olmadığı için öyle söyledim. Fakat şöyle bir şey var bilgisayar programcılığı okuyorum İnternet programcılığı dersin de hocamız arduino ile proje yapıp getirebilirsiniz dedi bunun videosunu çekip yükleme şansınız var mı yani video çektiniz mi bunu yaparken? böyle bir şeyi projem olarak sunmak beni çok memnun eder 🙂

    • Murat Duran
      1 Ekim 2017 at 15:04

      Yapım aşaması resimlerde görüldüğü gibi sadece 1 tane sensör var ve 3 tane kablo lehimliyorsunuz. Malzemeleri sitemizden temin ederseniz projeyi kurulu ve çalışır halde gönderebiliriz, konu ile ilgili detaylı görüşmek için projehocam@gmail.com ‘a mail gönderin yada 0850 304 9125 nolu numaramızdan ofisimizi arayabilirsiniz.

  • Yasin çakır
    2 Ekim 2017 at 00:03

    Merhaba;
    Hocam bu projeyi ardiuno mega yerine UNO kullanabilirmiyiz?

  • Hasan Emre
    16 Ekim 2017 at 16:45

    Hocam 2.8” ekrana uyar mı bu kodlar ?

  • mehmet
    24 Aralık 2017 at 21:36

    slm hocam bu kodları ben tft 3.2 lcd de çalıştıramadım neden acaba ? şimdiden teşekkür ederim 🙂

  • Mete yayıcı
    13 Mart 2018 at 22:04

    baglantıları daha net anlatırmısınız hoca ya size sahmet resimlerde tam anlaşılmıyor da 😀

  • Mehmet Güngör
    17 Nisan 2018 at 18:03

    Merhabalar hocam, bunun devre şeması var mı?

  • Meryem Bolat
    13 Mayıs 2018 at 22:50

    Merhaba hocam
    Ben üniversite öğrencisiyim ve proje olarak arduino tft Ekranda Sıcaklık Nem Gösterimi projenizi yapmaya çalışıyorum
    arduino mega ,DHT11 sıcaklık nem sensörü ve pertinaks yine sizin sitenizden sipariş ettim ama 2.4″ tft dokunmatik ekran stokda olmadığı için başka bir siteden sipariş ettim ve proje calışmıyor bana yardımcı olurmusunuz projeyi teslim etmem için az bi zamanım kaldı.Sorun belki arduinodadır diye başka bir arduino ile denedim ama gene çalışmadı ve kodlar hata vermiyor arduinoda hata yok ama ekran beyaz ekran veriyor belki ekranda sıkıntı vardır diye başka bir yerden yeni ekran aldım ama sorun devam ediyor LÜTFEN BANA YARDIMCI OLUN:(((((

YORUM YAP