SINAU PROGRAMMING
SINAU PROGRAMMING
  • Home
  • Source Code
  • Social
  • CONTROL
    • Internet of Think (IoT)
    • ESP
      • NodeMcu
      • Lora
      • WeMos
      • Esp 32 Dev
      • Node 32s
    • Arduino
    • Raspberry
    • Proteus
  • MATLAB
    • MATLAB PROJECT
    • PLC
      • Omron
      • Mitsubishi
      • Siemens
      • Schneider
      • ArduinoPLC
    • Arduino
    • Basic & Doc
  • Contact Us

 

بِسْــــــــــــــــــمِ اللهِ الرَّØ­ْÙ…َÙ†ِ الرَّØ­ِÙŠْÙ…ِ

Deskripsi layar sentuh LCD TFT ILI9341.

Modul LCD TFT adalah salah satu perangkat yang paling populer di sejumlah proyek mikrokontroler terutama modul port serial, karena membutuhkan sedikit pin I/O dan penggunaannya umumnya sederhana. Dalam pembahasan kali ini mencoba menghubungkan layar sentuh LCD 2.4″ TFT dengan driver ILI9341 dengan Arduino. Modul LCD ini bukan hanya layar saja, tetapi juga tersedia slot untuk kartu SD. Lcd ini memiliki  resolusi 240 x 320 piksel untuk layar LCD TFT 2,4 inci dan menggunakan driver ILI9341. Layar menggunakan antarmuka serial dan dikendalikan oleh 5 kabel (CS, RS, SCL, SDA, RST). Kartu SD juga menggunakan antarmuka SPI perangkat keras (CS/MOSI/MISO/SCK).

Berikut adalah bagian-bagian dari LCD 2.4″ TFT SPI


Gambar  Gambar Blok Sistem LCD TFT SPI

 

Keterangan Pin :

VCC: 5V/3.3V power input

GND: Ground

CS: LCD chip select signal, low level enable

RESET: LCD reset signal, low level reset

DC: LCD register / data selection signal, high level: register, low level: data

MOSI: SPI bus write data signal

SCK: SPI bus clock signal

LED: Backlight control, high level lighting

MISO: SPI bus read data signal

T_CLK : Touch SPI bus clock signal

T_CS : Touch screen chip select signal, low level enable

T_DIN : Touch SPI bus input

T_DO : Touch SPI bus output

T_IRQ :Touch screen interrupt signal, low level when touch is detected

Menghubungkan layar TFT 2,4 ”dengan Arduino

LCD ini bisa digunakan menggunakan layer sentuh dan tidak menggunakan layer sentuh. Mari kita gunakan layar sebagai layar TFT biasa tanpa fungsi sentuh. Untuk ini kami hanya menghubungkan sembilan pin pertama dari layar.



Catatan :

Pin modul SPI LCD hanya dapat memasukkan level tinggi 3.3V, sedangkan output Arduino memiliki level tinggi 5V. Dan masalah utamanya modul tampilan LCD ini tidak toleran dengan tegangan 5V.


Masalah ini dapat diatasi dengan menghubungkan Arduino dan modul tampilan melalui modul konversi level eksternal, sehingga output Arduino level tinggi 5V diubah menjadi 3.3V oleh modul konversi level dan kemudian dimasukkan ke modul tampilan. Jika Anda tidak memiliki modul konversi seperti itu, Anda dapat menggunakan beberapa resistor 10K seperti yang ditunjukkan pada skema di bawah ini.


Gambar Skematik Arduino dan lcd TFT

Kode untuk menjalankan Tampilan TFT ILI9314.

Sejumlah library telah dikembangkan untuk memudahkan penggunaan tampilan layar sentuh LCD 2.4″ TFT ini dengan Arduino. Namun dapat ditemukan sejumlah library menarik dengan contoh yang dapat membantu pemula memahami cara kerja tampilan ini di www.lcdwiki.com.

Dari link di atas Anda bisa mendapatkan Library LCDWIKI_GUI.h, LCDWIKI_SPI.h dan LCDWIKI_TOUCH.h (https://mega.nz/folder/eqw3mKSb#Rceou1eW5L_RVeQzZN2g3w) yang penting untuk mengontrol layar sentuh LCD 2.4″ TFT menggunakan driver ILI9341. Anda dapat menggunakan contoh di bawah ini untuk menguji tampilan.

Dengan LCDWIKI_GUI.h, LCDWIKI_SPI.h dan LCDWIKI_TOUCH.h pemrograman tampilan sangat mudah hanya beberapa baris kode.

#include <LCDWIKI_GUI.h> //Core graphics library

#include <LCDWIKI_SPI.h> //Hardware-specific library

//paramters define

#define MODEL ILI9341

#define CS    A5   

#define CD    A3

#define RST   A4

#define MOSI  11

#define MISO  12

#define SCK   13

#define LED   A0   // jika Anda tidak perlu mengontrol pin LED,Anda

//harus mengaturnya ke -1 dan mengaturnya ke 3.3V

 

/*the definiens of software spi mode as follow:

if the IC model is known or the modules is unreadable,

you can use this constructedfunction*/

LCDWIKI_SPI mylcd(MODEL,CS,CD,MISO,MOSI,RST,SCK,LED); //model,cs,dc,miso,mosi,reset,sck,led

//if the IC model is not known and the modules is readable,you can use this //constructed function

//LCDWIKI_SPI mylcd(240,320,CS,CD,MISO,MOSI,RST,SCK,LED); //width,height,cs,dc,miso,mosi,reset,sck,led

 

//define some colour values

#define  BLACK  0x0000

#define BLUE    0x001F

#define RED     0xF800

#define GREEN   0x07E0

#define CYAN    0x07FF

#define MAGENTA 0xF81F

#define YELLOW  0xFFE0

#define WHITE   0xFFFF

 

//clear screen

void fill_screen_test()

{

  mylcd.Fill_Screen(BLACK); 

  mylcd.Fill_Screen(RED);

 mylcd.Fill_Screen(GREEN);

  mylcd.Fill_Screen(BLUE);

  mylcd.Fill_Screen(BLACK);

}

//display some strings

void text_test()

{

  mylcd.Set_Text_Mode(0);

  mylcd.Fill_Screen(BLACK); 

  mylcd.Set_Text_Back_colour(BLACK);

  mylcd.Set_Text_colour(WHITE);

  mylcd.Set_Text_Size(1);

  mylcd.Print_String("Hello World!",0, 0);

  mylcd.Set_Text_colour(YELLOW);

  mylcd.Set_Text_Size(2);

  mylcd.Print_Number_Float(1234.56,2,0, 8, '.',0, ' ');

 

  mylcd.Set_Text_colour(RED);

  mylcd.Set_Text_Size(3);

  //mylcd.Print_String("DEADBEEF", 0,24);

 mylcd.Print_Number_Int(0xDEADBEF, 0, 24, 0, ' ', 16);


  mylcd.Set_Text_colour(GREEN);

  mylcd.Set_Text_Size(5); 

  mylcd.Print_String("Groop", 0, 56); 

  mylcd.Set_Text_Size(2);

  mylcd.Print_String("I implore thee,", 0, 96);

 

  mylcd.Set_Text_Size(1);

mylcd.Print_String("my foonting turlingdromes.", 0, 112);

  mylcd.Print_String("And hooptiously drangle me", 0, 120);

  mylcd.Print_String("with crinkly bindlewurdles,", 0, 128);

  mylcd.Print_String("Or I will rend thee", 0, 136);

  mylcd.Print_String("in the gobberwarts", 0, 144);

  mylcd.Print_String("with my blurglecruncheon,", 0, 152);

  mylcd.Print_String("see if I don't!", 0, 160);

}


//draw some oblique lines

void lines_test(void)

{

    mylcd.Fill_Screen(BLACK);

      mylcd.Set_Draw_color(GREEN);

    int i = 0;  

    for(i = 0; i<mylcd.Get_Display_Width();i+=5)

    {

       mylcd.Draw_Line(0, 0, i,mylcd.Get_Display_Height()-1);

     }

     for(i = mylcd.Get_Display_Height()-1;i>= 0;i-=5)

     {

       mylcd.Draw_Line(0, 0,mylcd.Get_Display_Width()-1, i);

     }

     mylcd.Fill_Screen(BLACK);

 mylcd.Set_Draw_color(RED);

    for(i = mylcd.Get_Display_Width() -1;i>=0;i-=5)

    {

      mylcd.Draw_Line(mylcd.Get_Display_Width()-1, 0, i, mylcd.Get_Display_Height()-1);

     }

    for(i = mylcd.Get_Display_Height()-1;i>=0;i-=5)

    {

      mylcd.Draw_Line(mylcd.Get_Display_Width()-1,0, 0, i);

     }

     mylcd.Fill_Screen(BLACK);

      mylcd.Set_Draw_color(BLUE);

     for(i = 0; i <mylcd.Get_Display_Width();i+=5)

    {

      mylcd.Draw_Line(0, mylcd.Get_Display_Height()-1,i, 0);

     }

     for(i = 0; i <mylcd.Get_Display_Height();i+=5)

    {

      mylcd.Draw_Line(0,mylcd.Get_Display_Height()-1, mylcd.Get_Display_Width()-1, i);

     }

 

     mylcd.Fill_Screen(BLACK);

      mylcd.Set_Draw_color(YELLOW);

     for(i = mylcd.Get_Display_Width()-1; i>=0;i-=5)

    {

 mylcd.Draw_Line(mylcd.Get_Display_Width()-1,mylcd.Get_Display_Height()-1, i, 0);

     }

     for(i = 0; i<mylcd.Get_Display_Height();i+=5)

    {

      mylcd.Draw_Line(mylcd.Get_Display_Width()-1, mylcd.Get_Display_Height()-1, 0, i);

     }

}

//draw some vertical lines and horizontal lines

void h_l_lines_test(void)

{

    int i=0;

   mylcd.Fill_Screen(BLACK);

     mylcd.Set_Draw_color(GREEN);

    for(i =0;i<mylcd.Get_Display_Height();i+=5)

    {

      mylcd.Draw_Fast_HLine(0,i,mylcd.Get_Display_Width());

      delay(5);

 }

     mylcd.Set_Draw_color(BLUE);

     for(i=0;i<mylcd.Get_Display_Width();i+=5)

    {

      mylcd.Draw_Fast_VLine(i,0,mylcd.Get_Display_Height());

           delay(5);

    }

}

 

//draw some rectangles

void rectangle_test(void)

{

  int i = 0;

   mylcd.Fill_Screen(BLACK);

     mylcd.Set_Draw_color(GREEN);

   for(i =0;i<mylcd.Get_Display_Width()/2;i+=4)

   {

 mylcd.Draw_Rectangle(i,(mylcd.Get_Display_Height()-mylcd.Get_Display_Width())/2+i,mylcd.Get_Display_Width()-1-i,mylcd.Get_Display_Height()-(mylcd.Get_Display_Height()-mylcd.Get_Display_Width())/2-i); 

        delay(5);

   }

}

//draw some filled rectangles

void fill_rectangle_test(void)

{

 int i = 0;

   mylcd.Fill_Screen(BLACK);

     mylcd.Set_Draw_color(YELLOW);

   mylcd.Fill_Rectangle(0,(mylcd.Get_Display_Height()-mylcd.Get_Display_Width())/2,mylcd.Get_Display_Width()-1,mylcd.Get_Display_Height()-(mylcd.Get_Display_Height()-mylcd.Get_Display_Width())/2);

    mylcd.Set_Draw_color(MAGENTA);

   for(i =0;i<mylcd.Get_Display_Width()/2;i+=4)

   {

 mylcd.Draw_Rectangle(i,(mylcd.Get_Display_Height()-mylcd.Get_Display_Width())/2+i,mylcd.Get_Display_Width()-1-i,mylcd.Get_Display_Height()-(mylcd.Get_Display_Height()-mylcd.Get_Display_Width())/2-i); 

        delay(5);

   }

   for(i = 0;i<mylcd.Get_Display_Width()/2;i+=4)

   {

  mylcd.Set_Draw_color(random(255), random(255), random(255));

      mylcd.Fill_Rectangle(i,(mylcd.Get_Display_Height()-mylcd.Get_Display_Width())/2+i,mylcd.Get_Display_Width()-1-i,mylcd.Get_Display_Height()-(mylcd.Get_Display_Height()-mylcd.Get_Display_Width())/2-i); 

        delay(5);

   }

}

 

//draw some filled circles

void fill_circles_test(void)

{

  int r=10,i=0,j=0;

  mylcd.Fill_Screen(BLACK);

   mylcd.Set_Draw_color(MAGENTA);

  for(i=r;i<mylcd.Get_Display_Width();i+=2*r)

  {

    for(j=r;j<mylcd.Get_Display_Height();j+=2*r)

    {

 mylcd.Fill_Circle(i, j, r);

    }

  }

}

//drawsome circles

void circles_test(void)

{

  int r=10,i=0,j=0;

   mylcd.Set_Draw_color(GREEN);

  for(i=0;i<mylcd.Get_Display_Width()+r;i+=2*r)

  {

    for(j=0;j<mylcd.Get_Display_Height()+r;j+=2*r)

    {

      mylcd.Draw_Circle(i, j, r);

    }

  } 

}

//drawsome triangles

void triangles_test(void)

{

   int i = 0;

   mylcd.Fill_Screen(BLACK);

   for(i=0;i<mylcd.Get_Display_Width()/2;i+=5)

   {

 mylcd.Set_Draw_color(0,i+64,i+64);   

mylcd.Draw_Triangle(mylcd.Get_Display_Width()/2-1,mylcd.Get_Display_Height()/2-1-i,

mylcd.Get_Display_Width()/2-1-i,mylcd.Get_Display_Height()/2-1+i,                 

mylcd.Get_Display_Width()/2-1+i,mylcd.Get_Display_Height()/2-1+i);                  

   }

}

 //drawsome filled triangles

void fill_triangles_test(void)

{

   int i = 0;

   mylcd.Fill_Screen(BLACK);

 for(i=mylcd.Get_Display_Width()/2-1;i>0;i-=5)

   {

      mylcd.Set_Draw_color(0,i+64,i+64);

mylcd.Fill_Triangle(mylcd.Get_Display_Width()/2-1,mylcd.Get_Display_Height()/2-1-i,

                    mylcd.Get_Display_Width()/2-1-i,mylcd.Get_Display_Height()/2-1+i,

mylcd.Get_Display_Width()/2-1+i,mylcd.Get_Display_Height()/2-1+i);  

      mylcd.Set_Draw_color(i,0,i);     

mylcd.Draw_Triangle(mylcd.Get_Display_Width()/2-1,mylcd.Get_Display_Height()/2-1-i,

mylcd.Get_Display_Width()/2-1-i,mylcd.Get_Display_Height()/2-1+i,                 

mylcd.Get_Display_Width()/2-1+i,mylcd.Get_Display_Height()/2-1+i);                  

   }

}

 //drawsome round rectangles

void round_rectangle(void)

{

   int i = 0;

   mylcd.Fill_Screen(BLACK);

     for(i =0;i<mylcd.Get_Display_Width()/2;i+=4)

   {

       mylcd.Set_Draw_color(255-i,0,160-i);

 mylcd.Draw_Round_Rectangle(i,(mylcd.Get_Display_Height()-mylcd.Get_Display_Width())/2+i,mylcd.Get_Display_Width()-1-i,mylcd.Get_Display_Height()-(mylcd.Get_Display_Height()-mylcd.Get_Display_Width())/2-i,8);

        delay(5);

   }

}

//draw some filled round rectangles

void fill_round_rectangle(void)

{

     int i = 0;

   mylcd.Fill_Screen(BLACK);

     for(i =0;i<mylcd.Get_Display_Width()/2;i+=4)

   {

       mylcd.Set_Draw_color(255-i,160-i,0);

 mylcd.Fill_Round_Rectangle(i,(mylcd.Get_Display_Height()-mylcd.Get_Display_Width())/2+i,mylcd.Get_Display_Width()-1-i,mylcd.Get_Display_Height()-(mylcd.Get_Display_Height()-mylcd.Get_Display_Width())/2-i,8);

        delay(5);

   }

}

void setup()

{

  mylcd.Init_LCD();

  fill_screen_test();

  delay(500);

  text_test();

  delay(500);

  lines_test();

  delay(500);

  h_l_lines_test();

  delay(500);

  rectangle_test();

  delay(500);

  fill_rectangle_test();

  delay(500);

  fill_circles_test();

  delay(500);

  circles_test();

  delay(500);

  triangles_test();

 delay(500);

  fill_triangles_test();

  delay(500);

   round_rectangle();

   delay(500);

   fill_round_rectangle();

   delay(3000);

}

void loop()

{

 //rotate for four directions atau sudut vertical horisontal lcd 0-4

 for(uint8_t rotation=0; rotation<4;rotation++)

 {

    mylcd.Set_Rotation(rotation);

    text_test();

    delay(2000);

 }

}


hasilnya kira-kira seperti dibawah ini

Menggunakan fungsionalitas sentuh layar TFT ILI9341 2,4″.

Untuk dapat menggunakan fungsionalitas sentuh pada layar, kami menghubungkan lima pin yang tersisa sesuai dengan diagram skema di bawah ini.


Gambar Skema LCD Touch TFT dengan Arduino

Kita dapat menggunakan kode di bawah ini untuk menguji fungsionalitas sentuh. Ketika kode ini diunggah ke Arduino, kita dapat menggunakan pena sentuh untuk menulis di layar menggunakan teks dengan warna dan ketebalan yang berbeda.

Kode untuk menggunakan fungsionalitas Sentuh dari ILI9341 TFT Display.

#include <LCDWIKI_GUI.h> //Core graphics library
#include <LCDWIKI_SPI.h> //Hardware-specific library
#include <LCDWIKI_TOUCH.h> //touch screen library
//paramters define
#define MODEL ILI9341
#define CS   A5    
#define CD   A3
#define RST  A4
#define MOSI  11
#define MISO  12
#define SCK   13
#define LED  A0   //if you don't need to control the LED pin,you should set it to -1 and set it to 3.3V
 
//touch screen paramters define
#define TCS   2
#define TCLK  3
#define TDOUT 4
#define TDIN  5
#define TIRQ  6
 
//the definiens of software spi mode as follow:
//if the IC model is known or the modules is unreadable,you can use this constructed function
LCDWIKI_SPI my_lcd(MODEL,CS,CD,MISO,MOSI,RST,SCK,LED); //model,cs,dc,miso,mosi,reset,sck,led
//if the IC model is not known and the modules is readable,you can use this constructed function
//LCDWIKI_SPI my_lcd(240,320,CS,CD,MISO,MOSI,RST,SCK,LED); //width,height,cs,dc,miso,mosi,reset,sck,led
 
//the definiens of touch mode as follow:
LCDWIKI_TOUCH my_touch(TCS,TCLK,TDOUT,TDIN,TIRQ); //tcs,tclk,tdout,tdin,tirq
 
#define  BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF
uint16_t color_mask[] = {0xF800,0xFFE0,0x07E0,0x07FF,0x001F,0xF81F}; //color select
 
#define COLORBOXSIZE my_lcd.Get_Display_Width()/6
#define PENBOXSIZE my_lcd.Get_Display_Width()/4
 
int16_t old_color, current_color,flag_colour;
int16_t old_pen,current_pen,flag_pen;
boolean show_flag = true;
 
void show_string(uint8_t *str,int16_t x,int16_t y,uint8_t csize,uint16_t fc, uint16_t bc,boolean mode)
{
    my_lcd.Set_Text_Mode(mode);
    my_lcd.Set_Text_Size(csize);
    my_lcd.Set_Text_colour(fc);
    my_lcd.Set_Text_Back_colour(bc);
    my_lcd.Print_String(str,x,y);
}
 
//show color select menu
void show_color_select_menu(void)
{
   uint16_t i;
   for(i = 0;i<6;i++)
   {
       my_lcd.Set_Draw_color(color_mask[i]);
       my_lcd.Fill_Rectangle(i*COLORBOXSIZE, 0, (i+1)*COLORBOXSIZE-1, COLORBOXSIZE/2-1);
   }  
   my_lcd.Set_Draw_color(GREEN);
   my_lcd.Fill_Round_Rectangle((my_lcd.Get_Display_Width()-20)/3+10, COLORBOXSIZE/2+2, (my_lcd.Get_Display_Width()-20)/3*2+10,COLORBOXSIZE/2+20, 5);
 show_string("OK",CENTER,COLORBOXSIZE/2+4,2,RED, BLACK,1);
}
 
//show pen size select menu
void show_pen_size_select_menu(void)
{
  uint16_t i;
  my_lcd.Set_Text_Mode(1);
  my_lcd.Set_Text_Size(2);
  my_lcd.Set_Text_colour(GREEN);
  my_lcd.Set_Text_Back_colour(BLACK);
  for(i = 0;i<4;i++)
  {
      my_lcd.Print_Number_Int(i+1, 5+PENBOXSIZE*i, (COLORBOXSIZE/2-16)/2, 0, ' ',10);
      my_lcd.Set_Draw_color(RED);
      my_lcd.Fill_Rectangle(25+PENBOXSIZE*i, COLORBOXSIZE/2/2-i, PENBOXSIZE*(i+1)-10,
COLORBOXSIZE/2/2+i);
  }
   my_lcd.Set_Draw_color(GREEN);
   my_lcd.Fill_Round_Rectangle((my_lcd.Get_Display_Width()-20)/3+10, COLORBOXSIZE/2+2, (my_lcd.Get_Display_Width()-20)/3*2+10,COLORBOXSIZE/2+20, 5);
   show_string("OK",CENTER,COLORBOXSIZE/2+4,2,RED, BLACK,1);
}
 
//show main menu
void show_main_menu(void)
{
   my_lcd.Set_Draw_color(YELLOW);
   my_lcd.Fill_Round_Rectangle(5, 0, (my_lcd.Get_Display_Width()-20)/3+5,COLORBOXSIZE/2+20, 5);
 my_lcd.Fill_Round_Rectangle((my_lcd.Get_Display_Width()-20)/3*2+15, 0, (my_lcd.Get_Display_Width()-20)/3*3+15,COLORBOXSIZE/2+20, 5);
   my_lcd.Set_Draw_color(MAGENTA);
   my_lcd.Fill_Round_Rectangle((my_lcd.Get_Display_Width()-20)/3+10, 0, (my_lcd.Get_Display_Width()-20)/3*2+10,COLORBOXSIZE/2+20, 5);
   show_string("COLOUR",8+((my_lcd.Get_Display_Width()-20)/3-72)/2-1,((COLORBOXSIZE/2+20)-16)/2,2,BLUE, BLACK,1);
   show_string("CLEAR",(my_lcd.Get_Display_Width()-20)/3+10+((my_lcd.Get_Display_Width()-20)/3-60)/2-1,((COLORBOXSIZE/2+20)-16)/2,2,WHITE, BLACK,1);
show_string("PEN",(my_lcd.Get_Display_Width()-20)/3*2+15+((my_lcd.Get_Display_Width()-20)/3-36)/2-1,((COLORBOXSIZE/2+20)-16)/2,2,BLUE, BLACK,1);
 }
 
void setup(void) 
{
  my_lcd.Init_LCD();
  my_lcd.Set_Rotation(0); 
  my_touch.TP_Set_Rotation(2);
  my_touch.TP_Init(my_lcd.Get_Rotation(),my_lcd.Get_Display_Width(),my_lcd.Get_Display_Height()); 
  my_lcd.Fill_Screen(BLACK);
  show_main_menu();
  current_color = RED;
  current_pen = 0;
}
 
void loop()
{
comme:
  my_touch.TP_Scan(0);
 if (my_touch.TP_Get_State()&TP_PRES_DOWN) 
  {
         if(my_touch.y< COLORBOXSIZE/2+20) 
         {
              if(((my_touch.x>5)&&(my_touch.x < ((my_lcd.Get_Display_Width()-20)/3+5)))&&!flag_pen) //select color
              {
                flag_colour = 1;
                if(show_flag)
                {
 my_lcd.Set_Draw_color(BLACK);
                    my_lcd.Fill_Rectangle(0,0,my_lcd.Get_Display_Width()-1,COLORBOXSIZE/2+20);
                    show_color_select_menu();
                }
                show_flag = false;
                switch(current_color)
                {
                  case RED:
                  {
                    my_lcd.Set_Draw_color(WHITE);
                    my_lcd.Draw_Rectangle(0, 0, COLORBOXSIZE-1, COLORBOXSIZE/2-1);
                    break;  
                  }
 case YELLOW:
                  {
                       my_lcd.Set_Draw_color(WHITE);
                       my_lcd.Draw_Rectangle(COLORBOXSIZE, 0, 2*COLORBOXSIZE-1, COLORBOXSIZE/2-1);
                       break; 
                  }
                  case GREEN:
                  {
                       my_lcd.Set_Draw_color(WHITE);
                       my_lcd.Draw_Rectangle(2*COLORBOXSIZE, 0, 3*COLORBOXSIZE-1, COLORBOXSIZE/2-1);
break; 
                   }
                  case CYAN:
                  {
                       my_lcd.Set_Draw_color(WHITE);
                       my_lcd.Draw_Rectangle(3*COLORBOXSIZE, 0, 4*COLORBOXSIZE-1, COLORBOXSIZE/2-1);
                       break;                 
                  }
                  case BLUE:
                  {
                       my_lcd.Set_Draw_color(WHITE);
my_lcd.Draw_Rectangle(4*COLORBOXSIZE, 0, 5*COLORBOXSIZE-1, COLORBOXSIZE/2-1);
                       break;   
                  }
                  case MAGENTA:  
                  {
                       my_lcd.Set_Draw_color(WHITE);
                       my_lcd.Draw_Rectangle(5*COLORBOXSIZE, 0, 6*COLORBOXSIZE-1, COLORBOXSIZE/2-1);
                       break;   
                  }
                  default:
                      break;
                }
             }
             if(flag_colour)
             {
  if(my_touch.y < COLORBOXSIZE/2)
                 {
                    old_color = current_color;
                    if (my_touch.x < COLORBOXSIZE) 
                    { 
                        current_color = RED; 
                        my_lcd.Set_Draw_color(WHITE);
                        my_lcd.Draw_Rectangle(0, 0, COLORBOXSIZE-1, COLORBOXSIZE/2-1);
                    } 
                    else if (my_touch.x <
COLORBOXSIZE*2) 
                    {
                        current_color = YELLOW;
                        my_lcd.Set_Draw_color(WHITE);
                        my_lcd.Draw_Rectangle(COLORBOXSIZE, 0, 2*COLORBOXSIZE-1, COLORBOXSIZE/2-1);
                    } 
                    else if (my_touch.x < COLORBOXSIZE*3) 
                    {
                        current_color = GREEN;
                        my_lcd.Set_Draw_color(WHITE);
                       
my_lcd.Draw_Rectangle(2*COLORBOXSIZE, 0, 3*COLORBOXSIZE-1, COLORBOXSIZE/2-1);
                    } 
                    else if (my_touch.x < COLORBOXSIZE*4) 
                    {
                        current_color = CYAN;
                        my_lcd.Set_Draw_color(WHITE);
                        my_lcd.Draw_Rectangle(3*COLORBOXSIZE, 0, 4*COLORBOXSIZE-1, COLORBOXSIZE/2-1);
                    } 
                    else if (my_touch.x <
COLORBOXSIZE*5) 
                    {
                        current_color = BLUE;
                        my_lcd.Set_Draw_color(WHITE);
                        my_lcd.Draw_Rectangle(4*COLORBOXSIZE, 0, 5*COLORBOXSIZE-1, COLORBOXSIZE/2-1);
                    } 
                    else if (my_touch.x < COLORBOXSIZE*6) 
                    {
                        current_color = MAGENTA;
                        my_lcd.Set_Draw_color(WHITE);
                       
my_lcd.Draw_Rectangle(5*COLORBOXSIZE, 0, 6*COLORBOXSIZE-1, COLORBOXSIZE/2-1);
                    }
                    if(old_color != current_color)
                    {
                        switch(old_color)
                        {
                            case RED:
                            {
                              my_lcd.Set_Draw_color(RED);
                              my_lcd.Draw_Rectangle(0, 0, COLORBOXSIZE-1, COLORBOXSIZE/2-1);
                         
 break;  
                            }
                            case YELLOW:
                            {
                                 my_lcd.Set_Draw_color(YELLOW);
                                 my_lcd.Draw_Rectangle(COLORBOXSIZE, 0, 2*COLORBOXSIZE-1, COLORBOXSIZE/2-1);
                                 break; 
                            }
                            case GREEN:
                            {
                                 my_lcd.Set_Draw_color(GREEN);
                   my_lcd.Draw_Rectangle(2*COLORBOXSIZE, 0, 3*COLORBOXSIZE-1, COLORBOXSIZE/2-1);
                                 break; 
                             }
                            case CYAN:
                            {
                                 my_lcd.Set_Draw_color(CYAN);
                                 my_lcd.Draw_Rectangle(3*COLORBOXSIZE, 0, 4*COLORBOXSIZE-1, COLORBOXSIZE/2-1);
                                 break;
                
                            }
                            case BLUE:
                            {
                                 my_lcd.Set_Draw_color(BLUE);
                                 my_lcd.Draw_Rectangle(4*COLORBOXSIZE, 0, 5*COLORBOXSIZE-1, COLORBOXSIZE/2-1);
                                 break;   
                            }
                            case MAGENTA:  
                            {
                                 my_lcd.Set_Draw_color(MAGENTA);
                     my_lcd.Draw_Rectangle(5*COLORBOXSIZE, 0, 6*COLORBOXSIZE-1, COLORBOXSIZE/2-1);
                                 break;   
                            }
                            default:
                                break;                        
                        }
                    }
                }
                else if(my_touch.y< COLORBOXSIZE/2+20)
                {
    if((my_touch.x>(my_lcd.Get_Display_Width()-20)/3+10)&&(my_touch.x<(my_lcd.Get_Display_Width()-20)/3*2+10))
                     {
                         my_lcd.Set_Draw_color(BLACK);
                         my_lcd.Fill_Rectangle(0,0,my_lcd.Get_Display_Width()-1,COLORBOXSIZE/2+20);
                         show_main_menu();
                         flag_colour = 0;
                         show_flag = true;
                         goto comme;
                     }
 }
            }
            if((my_touch.x>((my_lcd.Get_Display_Width()-20)/3*2+15))&&(my_touch.x < (((my_lcd.Get_Display_Width()-20)/3*3+15)))&&!flag_colour) //select pen size
            {
                flag_pen = 1;
                if(show_flag)
                {
                    my_lcd.Set_Draw_color(BLACK);
                    my_lcd.Fill_Rectangle(0,0,my_lcd.Get_Display_Width()-1,COLORBOXSIZE/2+20);
        show_pen_size_select_menu();
                }
                show_flag = false;
                switch(current_pen)
                {
                   case 0:
                   {
                       my_lcd.Set_Draw_color(WHITE);
                       my_lcd.Draw_Rectangle(0, 0, PENBOXSIZE-1, COLORBOXSIZE/2-1);
                       break;
                   }
                   case 1:
                   {
                       my_lcd.Set_Draw_color(WHITE);
            my_lcd.Draw_Rectangle(PENBOXSIZE, 0, 2*PENBOXSIZE-1, COLORBOXSIZE/2-1);
                       break; 
                   }
                   case 2:
                   {
                       my_lcd.Set_Draw_color(WHITE);
                       my_lcd.Draw_Rectangle(2*PENBOXSIZE, 0, 3*PENBOXSIZE-1, COLORBOXSIZE/2-1);
                       break;   
                   }
                   case 3:  
                   {
                      
my_lcd.Set_Draw_color(WHITE);
                       my_lcd.Draw_Rectangle(3*PENBOXSIZE, 0, 4*PENBOXSIZE-1, COLORBOXSIZE/2-1);
                       break;                
                   }
                   default:
                       break;
                  }              
              }
              if(flag_pen)
              {
                   if(my_touch.y < COLORBOXSIZE/2)
                   {
                      old_pen = current_pen;
  if(my_touch.x < PENBOXSIZE)
                      {
                          current_pen = 0;
                          my_lcd.Set_Draw_color(WHITE);
                          my_lcd.Draw_Rectangle(0, 0, PENBOXSIZE-1, COLORBOXSIZE/2-1);
                      }
                      else if(my_touch.x < 2*PENBOXSIZE)
                      {
                          current_pen = 1;
                          my_lcd.Set_Draw_color(WHITE);
                         
my_lcd.Draw_Rectangle(PENBOXSIZE, 0, 2*PENBOXSIZE-1, COLORBOXSIZE/2-1);
                       }
                       else if(my_touch.x < 3*PENBOXSIZE) 
                       {
                           current_pen = 2;
                           my_lcd.Set_Draw_color(WHITE);
                           my_lcd.Draw_Rectangle(2*PENBOXSIZE, 0, 3*PENBOXSIZE-1, COLORBOXSIZE/2-1);
                       }
                       else if(my_touch.x < 4*PENBOXSIZE)
                       {
              current_pen = 3;
                           my_lcd.Set_Draw_color(WHITE);
                           my_lcd.Draw_Rectangle(3*PENBOXSIZE, 0, 4*PENBOXSIZE-1, COLORBOXSIZE/2-1);               
                       }
                       if(old_pen != current_pen)
                       {
                           switch(old_pen)
                           {
                                 case 0:
                                 {
                                    
my_lcd.Set_Draw_color(BLACK);
                                     my_lcd.Draw_Rectangle(0, 0, PENBOXSIZE-1, COLORBOXSIZE/2-1);
                                     break;
                                 }
                                 case 1:
                                 {
                                     my_lcd.Set_Draw_color(BLACK);
                                     my_lcd.Draw_Rectangle(PENBOXSIZE, 0, 2*PENBOXSIZE-1, COLORBOXSIZE/2-1);
                         break; 
                                 }
                                 case 2:
                                 {
                                     my_lcd.Set_Draw_color(BLACK);
                                     my_lcd.Draw_Rectangle(2*PENBOXSIZE, 0, 3*PENBOXSIZE-1, COLORBOXSIZE/2-1);
                                     break;   
                                 }
                                 case 3:  
                                 {
                         my_lcd.Set_Draw_color(BLACK);
                                     my_lcd.Draw_Rectangle(3*PENBOXSIZE, 0, 4*PENBOXSIZE-1, COLORBOXSIZE/2-1);
                                     break;                
                                 }
                                 default:
                                     break;           
                           }      
                       }
                   }
                   else if(my_touch.y <
COLORBOXSIZE/2+20)
                   {
                       if((my_touch.x>(my_lcd.Get_Display_Width()-20)/3+10)&&(my_touch.x<(my_lcd.Get_Display_Width()-20)/3*2+10))
                       {
                          my_lcd.Set_Draw_color(BLACK);
                          my_lcd.Fill_Rectangle(0,0,my_lcd.Get_Display_Width()-1,COLORBOXSIZE/2+20);
                          show_main_menu();
                          flag_pen = 0;
                          show_flag = true;
              goto comme;
                       }  
                   }
              }
              if(((my_touch.x>((my_lcd.Get_Display_Width()-20)/3+10))&&(my_touch.x < ((my_lcd.Get_Display_Width()-20)/3*2+10)))&&!flag_colour&&!flag_pen) 
              {
                  my_lcd.Set_Draw_color(BLACK);  
                  my_lcd.Fill_Rectangle(0,COLORBOXSIZE/2+21,my_lcd.Get_Display_Width()-1,my_lcd.Get_Display_Height()-1);
              }
         }
if (((my_touch.y-current_pen) > COLORBOXSIZE/2+20) && ((my_touch.y+current_pen) < my_lcd.Get_Display_Height()))  //drawing
      {
        my_lcd.Set_Draw_color(current_color);
        my_lcd.Fill_Circle(my_touch.x,  my_touch.y,current_pen);
    }
  }
}


Saat ini, semakin banyak perangkat elektronik yang menggunakan adaptor. Dari perangkat elektronik murah seperti radio hingga ponsel. Kebutuhan akan adaptor sebagai alternatif pengganti baterai menjadi prioritas karena baterai tidak tahan lama dan otomatis menambah biaya operasional peralatan elektronik. Anda tidak lagi membutuhkan baterai dengan adaptor, tetapi kekurangannya adalah tidak mudah dibawa, karena adaptor harus selalu terhubung ke listrik PLN.

Tapi adaptor masih digunakan. Dari berbagai jenis adaptor yang ada di pasaran, adaptor konvensional dengan trafo melangkah dan pengatur tegangan sederhana lebih umum daripada adaptor dengan teknologi switching.

Adaptor juga dikenal sebagai catu daya. Sebuah catu daya yang baik harus dapat memberikan pengaturan tegangan yang baik dan harus dapat memberikan arus yang cukup ke beban. Tegangan yang tidak diatur pada catu daya keluaran dapat merusak perangkat elektronik yang menggunakan catu daya, terutama pengatur tegangan (jika ada), tetapi jika perangkat tidak memiliki rangkaian pengatur tegangan internal, dapat dipastikan perangkat elektronik tersebut akan rusak .

Rangkaian regulator tegangan yang baik tidaklah mudah dan pada kesempatan kali ini kita akan membahas rangkaian power supply dengan rangkaian regulator switching. 



Catu daya dengan pengaturan switching lebih dikenal sebagai catu daya switching. Keuntungan dari switching power supply adalah efisiensi energi yang tinggi hingga sekitar 83% dibandingkan dengan power supply yang diatur secara konvensional menggunakan LM78xx.

Rendahnya efisiensi IC LM78xx disebabkan input dari regulator tegangan berlebih diubah menjadi panas, sehingga sebagian besar daya input hilang karena diubah menjadi panas. Namun, untuk mendapatkan tegangan yang diatur, semua regulator harus memiliki tegangan input yang lebih tinggi dari tegangan pengaturan output.


PENGERTIAN

Untuk memahami SMPS, SMPS memiliki dua pengertian, yaitu:

Power Supply - Ini mengacu pada peralatan yang berfungsi untuk menyediakan pasokan listrik yang tepat dengan peralatan. Pada umumnya tegangan yang tersedia adalah tegangan 220V ac sedangkan tegangan yang dibutuhkan untuk perangkat biasanya tegangan DC.

Switching Regulator - adalah rangkaian listrik yang berfungsi untuk membuat pemadaman stabil untuk menahan perubahan seperti, tegangan input tidak stabil, beban arus tidak stabil, suhu tidak konstan.

Yang pertama mengerjakan prinsip SMPS



SMPS secara garis besar meliputi kerja :

  1. Penyerahan – merubah tegangan masukan AC menjadi tegangan keluaran DC.
  2. Konverter – merubah tegangan dc menjadi tegangan keluaran yang sesuai dengan kebutuhan
  3. Filtering – menghilangkan denyut (ripple) pada tegangan keluaran
  4. Regulasi – membuat agar besarnya tegangan keluaran stabil terhadap perubahan tegangan masukan dan perubahan beban.
  5. Isolasi – mengisolasi bagian sekunder dari bagian primer, dengan tujuan agar chasis bagian sekunder kalau dipegang tidak timbul bahaya kena sengatan listrik.
  6. Proteksi – mampu melindungi peralatan dari tegangan keluaran yang over dan melindungi power supply dari kerusakan jika terjadi suatu kesalahan.


Bagian-bagian pokok dasar kerja sebuah switching power supply SMPS adalah sebagai berikut :

  1. Bagian penyearah. Disini tegangan masukan dari listrik ac 220v disearahkan menjadi tegangan dc menggunakan diode bridge dan 3 buah elco filter besar yaitu sebuah elco 480V680UF dan 2 buah elco 250V2200UF.
  2. Bagian pencacah atau power-switching. Tegangan masukan dc dicacah dengan menggunakan “power switch on-off ” sehingga menghasilkan tegangan pulsa-pulsa dc dengan frekwensi tinggi. SMPS mesin las Inverter umumnya bekerja pada frekwensi sekitar 50Hz hingga 60Hz. Sebagai power switch dapat menggunakan IC K2611, IRFZ24N dan IRF9Z24N.
  3. SMPS Controller driver sebagai pembangkit pulsa PWM (Pulse Wave Modulation). Sebagai sinyal drive untuk pencacah digunakan IC PC 817 yang berisi rangkaian osilator dan PWM  sebagai pembangkit pulsa-pulsa PWM. Ada rangkaian SMPS yang tidak menggunakan SMPS controller driver, dalam hal ini transistor power switching dibuat agar dapat bekerja dengan cara “ber-osilasi sendiri”
  4. Trafo switching. Tegangan dc yang telah dicacah mempunyai karakteristik seperti tegangan ac sehingga dapat dilewatkan sebuah trafo atau induktor untuk dinaikkan ataupun diturunkan tegangannya. Pada rangkaian ini menggunakan trafo E25 15:15
  5. Penyearahan dan filtering tegangan keluaran. Tegangan keluaran dari trafo masih berupa pulsa-pulsa frekwensi tinggi dan kemudian dirubah menjadi tegangan dc menggunakan diode penyearah dan filter elco.
  6. Loop umpan balik untuk membuat tegangan keluaran agar stabil.  Sirkit loop umpan balik dari tegangan keluaran B+ ke bagian primer digunakan untuk mengendalikan PWM.
  7. Rangkaian komparator atau pembanding sebagai “error detektor”. Sebuah sirkit komparator pada bagian sekunder dipakai untuk mendeteksi jika terjadi perubahan tegangan keluaran B+. Komparator bekerja dengan cara membandingkan tegangan keluaran B+ dengan sebuah tegangan “referensi” (biasanya berupa tegangan diode zener 6.8v). Output komparator berupa arus yang kemudian diumpan balikkan ke bagian primer melalui sebuah photo coupler. Kopling menggunakan photocouler bertujuan untuk meng-isolagi ground bagian primer yang menyetrum jika dipegang (HOT chasis) dengan ground bagian sekunder (COLD chasis).
Rangkaian Sederhana Skema Pwer Supply Switching 
Power Supply Switching 5Volt 5A

Power Supply Switching 12 V





Power Supply Switching 5Volt 2Ampere

  

Tutorial Membuat Alat Pulse Oxymetry SPo2 Pada 

Raspberry pi 


Sebelumnya sebaiknya lihat TUTORIAL FOR Raspberry Pi 3 + LCD 2x16 I2C
<<<<Sinau Programming>>>>



بِسْــــــــــــــــــمِ اللهِ الرَّØ­ْÙ…َÙ†ِ الرَّØ­ِÙŠْÙ…ِ


Raspberry Pi 16×2 LCD I2C Interfacing dan Pemrograman Python– Kami telah menggunakan LCD 16×2 untuk waktu yang cukup lama di berbagai proyek terkait Arduino dan IoT. Perlu diketahui bahwa LCD memiliki dua jenis LCD 16x2, yang normal menggunakan lebih banyak kabel dan yang lainnya didasarkan pada antarmuka I2C yang hanya membutuhkan dua kabel. 

LCD (Liquid Crystal Display) 16×2 adalah salah satu media penampil yang sangat populer digunakan sebagai interface antara mikrokontroler dengan user nya. Dengan penampil LCD 16×2 ini user dapat melihat/memantau keadaan sensor ataupun keadaan jalanya program. Penampil LCD 16×2 ini bisa di hubungkan dengan Raspberry pi.

            Inter Integrated Circuit atau sering disebut I2C adalah standar komunikasi serial dua arah menggunakan dua saluran yang didisain khusus untuk mengirim maupun menerima data. Sistem I2C terdiri dari saluran SCL (Serial Clock) dan SDA (Serial Data) yang membawa informasi data antara I2C dengan pengontrolnya. Jika tidak memakai I2C Juga bisa untuk menampilkan text pada LCD akan tetapi harus merangkai semua pin yang berada pada LCD ke Raspberry. Jadi disarankan lebih baik menggunakan I2C saja.

Raspberry Pi 

Fitur kuat dari Raspberry Pi adalah deretan pin GPIO (input/output tujuan umum) di sepanjang tepi atas papan. Header GPIO 40-pin ditemukan di semua papan Raspberry Pi saat ini (tidak terisi pada Pi Zero dan Pi Zero W). Sebelum Pi 1 Model B+ (2014), papan terdiri dari header 26-pin yang lebih pendek. konfiurasi pinOUT bisa di cek pada situs resmi raspberry > 

https://www.raspberrypi.org/documentation/usage/gpio/


Catatan: penomoran pin GPIO tidak berurutan; Pin GPIO 0 dan 1 ada di papan (pin fisik 27 dan 28) tetapi dicadangkan untuk penggunaan lanjutan (lihat di bawah).

Tegangan
Dua pin 5V dan dua pin 3V3 ada di papan, serta sejumlah pin ground (0V), yang tidak dapat dikonfigurasi. Pin yang tersisa semuanya adalah pin 3V3 tujuan umum, artinya output diatur ke 3V3 dan input toleran terhadap 3V3.

Keluaran
Pin GPIO yang ditunjuk sebagai pin keluaran dapat diatur ke tinggi (3V3) atau rendah (0V).

Masukan
Pin GPIO yang ditunjuk sebagai pin input dapat dibaca sebagai high (3V3) atau low (0V). Ini menjadi lebih mudah dengan penggunaan resistor pull-up atau pull-down internal. Pin GPIO2 dan GPIO3 memiliki resistor pull-up tetap, tetapi untuk pin lain ini dapat dikonfigurasi dalam perangkat lunak.

Perancangan Raspberry + LCD 2x16 I2c




Sebelum Anda mulai menggunakan layar LCD I2C 16×2 dengan Python, Anda perlu memastikan bahwa protokol I2C diaktifkan pada Raspberry Pi Anda. Anda dapat menggunakan utilitas sudo raspi-config untuk mengatasinya. Program ini dinavigasi menggunakan panah keyboard, tab dan tombol Enter. Cari I2C di opsi antarmuka dan aktifkan. Mengaktifkan I2C membutuhkan reboot.

Masuk pada konfigurasi raspberry 





Setelah sistem kembali, Anda dapat memeriksa apakah bus I2C aktif, protokol I2C mendukung banyak perangkat yang terhubung ke bus yang sama, dan protokol ini mengidentifikasi setiap perangkat berdasarkan alamat perangkat kerasnya. Perintah i2cdetect dapat digunakan untuk melihat apa yang terhubung dan apa alamatnya.


Cara termudah untuk memprogram layar LCD 16×2 I2C ini dengan Python adalah dengan menggunakan perpustakaan khusus. Ada banyak pilihan. Saya suka hal-hal sederhana, jadi library yang kami rekomendasikan adalah rpi_lcd.

Instal Library menggunakan perintah ini

sudo pip3 install rpi_lcd

Note : pip3 untuk python 3.x jika menggunakan python 2.x gbisa gunakan pip

Instal Library Max30100 menggunakan perintah ini

sudo python3.7 max30100.py
Note : Sesuaikan python yag telah diinstal

Spo2 + Layar Lcd 16x2 i2c dengan kode raspberry pi:

Saatnya menulis program uji!

Dengan Library rpi_lcd pemrograman tampilan sangat mudah hanya beberapa baris kode.
import time
import max30100
from signal import signal, SIGTERM, SIGHUP, pause
from rpi_lcd import LCD
lcd = LCD()
mx30 = max30100.Max30100()
mx30.enable_spo2()
while 1:
    mx30.read_sensor()
    mx30.ir, mx30.red
    hb = int (mx30.ir/100)
    spo2 = int(max30.red/100)
    spo2 =spo2-3;
    if mx30.ir != mx30.buffer_ir :
        print("pulse:",hb);
    
    if mx30.red != mx30.buffer_red :
        print("SPO@:",spo2);
        if spo2<=15:
            spo2=8;
        if spo2>=101:
            spo2=99;
        
        lcd.text("Pulse Oxymetry,", 1)
        lcd.text("SPO2! :"+str(spo2), 2)
    time.sleep(1)#delay spo2

hasilnya kira-kira seperti dibawah ini



Tutorial lengkap Pada Video dibawah ini
<<<<0>>>>









Newer Posts Older Posts Home





POPULAR POSTS

  • Skema Power Supply Switching SMPS
  • Proteus 8.5 Full Version Professional
  • Serial Communication UART Raspberry Pico (SoftSerial)
  • Artificial Neural Network for Identification MATLAB
  • Tutorial ILI9341 TFT SPI LCD touch Screen
  • Pulse Oxymetry (SPO2) + Raspberry Pi
  • Menampilkan Text Pada LCD 16x2 I2C Arduino

ABOUT ME

cobabaru

Sinau Programming

SUBSCRIBE & FOLLOW

Training


Contact Form

Name

Email *

Message *

Categories

  • alkes 1
  • Android 4
  • Arduino 35
  • Basic & Doc 12
  • centrifuge 1
  • ESP32 8
  • Internet of Things (IoT) 23
  • LCD TFT SPI 2
  • MATLAB 6
  • Metode kendali 1
  • Modul Charger 1
  • Nextion 4
  • NodeMcu 8
  • oled 1
  • Pattern Recognition 2
  • Pemrograman 2
  • Perbaikan 1
  • PID 2
  • PLC HMI VTSCADA ARDUINO 3
  • PRIVACY POLICY 1
  • Proteus 11
  • Python 1
  • raspberry 5
  • Teknik Elektromedik 2
  • Thingsboard 1
  • Video 5
  • Wemos 4

sinau_programming

Sinau Programming Distributed by Sinau Programming