//sama seperti tam awal hanya ganti metode dengan string
//PROGRAM BERJALAN LUMAYAN BAIK UNTUK DEBUK, CUMA LAYAR VIRTUAL KEPOTONG
//SATU INDEK DI BELAKANG, KETIKA ANIMASI BERJALAN DI AWAL SAJA
//ini untuk dikhususkan untuk esp
//ini adalah pengetesan efek tampilan nilaiGeser pada lcd l2c
//gambaran logika dapat dilihat di file efekTampilanLCD.odg di home/pi/esr
//berhasil diverifikasi
//lihat simulasinya di wokwi, ada buk
//ketika geser ke kiri
//terlihat karakter terakhir numpuk, kalau yang ke
//kanan arahGeser=1, normal
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include<ezButton.h>//coba pakai tombol
//#if defined(ARDUINO) && ARDUINO >= 100
#define printByte(args) write(args);
//#else
//#define printByte(args) print(args,BYTE);
//#endif
#define debuk 0//ubah ini jika non debuk(non pemeriksaan)
//tahapan animasi+++++++++++++++
#define pengisian 0
#define isiLayarVirtual 1
#define tampilkanDiLcd 2
#define diGeser 3
#define SS_PIN 10
//+++++++++++++++++++++++++++
#define PKanan 0
#define PKiri 1
#define PKananKop 2
#define PKiriKop 3
LiquidCrystal_I2C lcd(0x27,16,2); //RS,E,D4,D5,D6,D7
ezButton tomKanan(A3);//bermasalah
ezButton tomKiri(A2);
bool sekali1=false;
bool sekali2=false;
byte revisi=0;
//costum katakter, tidak termasuk animasi berjalan===============================
//lcd setiap karakter memiliki 5 kolom dan 8 baris bintik,baris yang bawah biasa tidak dipakai
//karena untuk jarak antar baris
uint8_t panahKanan[8] = {0B00011000,
0B00011100,
0B00011110,
0B00011111,
0B00011110,
0B00011100,
0B00011000};
uint8_t panahKananKop[8] ={0B00011000,
0B00010100,
0B00010010,
0B00010001,
0B00010010,
0B00010100,
0B00011000};
uint8_t panahKiri[8] ={0B00000011,
0B00000111,
0B00001111,
0B00011111,
0B00001111,
0B00000111,
0B00000011};
uint8_t panahKiriKop[8] = {0B00000011,
0B00000101,
0B00001001,
0B00010001,
0B00001001,
0B00000101,
0B00000011};
uint8_t panahBawahKi[8] = {0B00000011,//untuk penunjuk pengaturan waktu
0B00000011,
0B00000011,
0B00001111,
0B00000111,
0B00000011,
0B00000001};
uint8_t panahBawahKa[8] = {0B00011000,//untuk penunjuk pengaturan waktu
0B00011000,
0B00011000,
0B00011110,
0B00011100,
0B00011000,
0B00010000};
//===========================================================
//indeks 012345678901
char charLayarSemen[29];
String layarSemen="";//16x2=32,32-4=28
char layarVirtual[14];//indeks kolom layar lcd sampai 15 dikurangi dua untuk tanda panah ditambah satu
//untuk menyimpan null karakter
byte makLayarVirtual=14;
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 | 14 15 16 17 18 19 20 21 22 23 24 25 26 27
byte minVir=14;//tidak menyimpan null karakter, 14 jika arah == -1
byte makVir=27;//tidak menyimpan null karakter, 27 jika arah == -1
byte minSemen=0;
byte makTampil=13;//maksimal tampilan untuk tampilanSetelah dan tampilanAwal
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 | 14 15 16 17 18 19 20 21 22 23 24 25 26 27
byte makSemen=27;
//ini yang diganti string/////////////////////////
String tampilanAwal="";//tidak menyimpan null karakter
String tampilanSetelah="";//tidak menyimpan null karakter
///////////////////////////////////////////
int arahGeser=-1;
byte nilaiGeser=0;//menampung nilai pernilaiGeseran
//bool pengisian=true;//
//status animasi==============================
byte tahapannya=pengisian;
bool animasi=false;//animasi berhenti awalnya
byte tampilan=1;
bool tunggulah=false;
//===========================================
byte tambahan=0;//simpanan indek membantu pengisian di layar virtual
byte minim=0;//variabel untuk membantuvpengisian layar semen ke layar virtual
byte maksi=0;//variabel untuk membantuvpengisian layar semen ke layar virtual
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 | 14 15 16 17 18 19 20 21 22 23 24 25 26 27
// ^ ^
// | |
byte makSemen1=13;
byte minSemen2=14;
int kecepatanGeser=100;//kecepatan pernilaiGeseran karakter
int jedaBaca=2000;//jeda saat animasi selesai, jeda dimaksudkan untuk kesempatan membaca,
// ini tidak berlaku kalau pakai tombol
//
//bentuk-bentuk char array
//char menu0[]={'h','a','i','\0'};
//char menu0[]="hai";
//indeks 01234567890123
char menu1[]="1.lcd 16x2---_";
char menu2[]="2.test teks--_";
char menu3[]="3.teks geser-_";
char menu4[]="4.Sudah geser_";
char menu5[]="5.belum?-----_";
char menu6[]=" 00 : 00 : 00 ";//penunjuknya di kolom
//jam (2,3) ,detik (7,8) ,menit (12,13)
void setup() {
//Serial.begin(9600);
#if debuk
Serial.begin(9600);
delay(1000);
for(int i=0;i<=10;i++){
Serial.println("tunggu..");
delay(1250);
}
Serial.println("========================================");
delay(500);
Serial.println("Pemeriksaan program teks berjalan di LCD");
delay(500);
Serial.println("========================================");
#endif
lcd.init();
lcd.backlight();
lcd.createChar(PKanan, panahKanan);
lcd.createChar(PKiri, panahKiri);
lcd.createChar(PKananKop, panahKananKop);
lcd.createChar(PKiriKop, panahKiriKop);
// lcd.createChar(7, panahBawahka);
lcd.home();
// 0123456789012345
lcd.print(" Geser teks");
// k,b
// lcd.setCursor(0,1);
// lcd.print("timer");
//tampilan awalnya=====
#if !debuk
lcd.setCursor(0,1);
lcd.printByte(PKiriKop);
lcd.setCursor(15,1);
lcd.printByte(PKananKop);
lcd.setCursor(1,1);
lcd.print(menu1);
#endif
//========================
tomKanan.setDebounceTime(50);
tomKiri.setDebounceTime(50);
//animasi=true;
tunggulah=true;
// maxSemen no indeknya
//0 1 2 3 4 5 6 7 8 9 10 11 12 13 |14 15 16 17 18 19 20 21 22 23 24 25 26 27 yang | adalah tengah"
// makSemen1=(makSemen-1)/2;//ini dinon aktif!!!!!!!
// minSemen2=makSemen1+1;//ini dinonaktif!!!!!!!!!!
delay(1000);
}
void loop() {
tomKanan.loop();
tomKiri.loop();
if(animasi==false){//====================================
if((tomKanan.isPressed())&&(sekali1==false)){
//akanKanan=true;
//BERMASALAH!!!
if(tampilan!=6){
tampilan++;}//tampilan dari 0 sampai 4
else{//jika sudah tampilan ke 4
tampilan=0;//tampilan balik ke awal
}
arahGeser=1;//belum diaktifkan
//membuat tanda panah
lcd.setCursor(0,1);
if(arahGeser==-1){
lcd.printByte(PKiriKop);}
else{lcd.printByte(PKiri);}
//membuat tanda panah
lcd.setCursor(15,1);
if(arahGeser==1){
lcd.printByte(PKananKop);}
else{lcd.printByte(PKanan);}
minVir=minSemen;//minSemen= 0
makVir=makSemen1;//makSemen1= 13
tahapannya=pengisian;//set proses pengisian dahulu, ke layar semen lalu
animasi=true;//segera animasikan.
sekali1=true;}
else{
sekali1=false;}
if((tomKiri.isPressed())&&(sekali2==false)){
// akanKiri=true;
if(tampilan!=1){
tampilan--;}//tampilan dari 0 sampai 4
else{//jika sudah tampilan ke 4
tampilan=6;//tampilan balik ke awal
}
arahGeser=-1;//belum diaktifkan
//membuat tanda panah
lcd.setCursor(0,1);
if(arahGeser==-1){
lcd.printByte(PKiriKop);}
else{lcd.printByte(PKiri);}
//membuat tanda panah
lcd.setCursor(15,1);
if(arahGeser==1){
lcd.printByte(PKananKop);}
else{lcd.printByte(PKanan);}
minVir=minSemen2;//14
makVir=makSemen;//27
tahapannya=pengisian;//set proses pengisian dahulu, ke layar semen lalu
animasi=true;//segera animasikan.
sekali2=true;}
else{
sekali2=false;}
}//================================================
if(animasi==true){
if(tahapannya==pengisian){//ingat proses pengisian hanya sekali, sampai animasinya sudah selesai!
pilihan();
//pengisian tampilan Awal dan setelah===========================
//===========================================================
//================================================================
//Pengisian layarSemen (layar Sementara) denga tampilanAwal
//dan tampilanSetelah
#if debuk
delay(1000);
Serial.println("===========");
Serial.println("Var tampilanAwal =");
Serial.println(tampilanAwal);
Serial.println("Var tampilanSetelah =");
Serial.println(tampilanSetelah);
#endif
layarSemen="";//penghapusan teks sebelum
if (arahGeser==-1){
//layarSemen=layarSemen+tampilanSetelah;
//layarSemen=layarSemen+tampilanAwal;
//revisi=====
layarSemen=tampilanSetelah+tampilanAwal;
//===========
}
else if(arahGeser==1){
//layarSemen=layarSemen+tampilanAwal;
//layarSemen=layarSemen+tampilanSetelah;
//revisi===/=/
layarSemen=tampilanAwal+tampilanSetelah;
//===========
}
#if debuk
delay(1000);
Serial.println("===========");
Serial.println("Variabel layarSemen :");
Serial.println(layarSemen);//ini tadi belum ditulis
#endif
//=======================================================================
tahapannya=isiLayarVirtual;}//tahap pengisian selesai, sekali pengisian selesai, tunggu sampai habis
//==========================================================================
if(tahapannya==isiLayarVirtual){
//pergeseran>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if(arahGeser==-1){
minVir=minSemen2-nilaiGeser;//minim ganti dengan minVir.
makVir=makSemen-nilaiGeser;}//maksi ganti dengan makVir.
else if(arahGeser==1){
minVir=minSemen+nilaiGeser;
makVir=makSemen1+nilaiGeser;}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
layarSemen.toCharArray(charLayarSemen,29);//BARU!!!!!!!!!!!!!
//layarSemen="";//penghapusan
//Serial.println("charLayarSemen=");
//Serial.println(charLayarSemen);
#if debuk
delay(1000);
#endif
tambahan=0;//ini baru!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//MASIH ADA MASALAH DIBAWAH INI, CUMA KURANG 1 INDEK LAYAR VIRTUALNYA, !!
//SAAT LAYARVIRTUAL TAMPIL PERTAMA KALI ANIMASI SAJA, SELEBIHNYA NORMAL.!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
////pindahkan sebagian layarSemen ke layar Virtual
//14,15,16,17,18,19,20,21,22,23,24,25,26,27
//1 . l c d 1 6 x 2 - - - _
//perbaikan, jika arah==-1 maka makVir tambah 1
if(arahGeser==1){
revisi=makVir;}//+1
else{
revisi=makVir+1;}
//akhir perbaikan======
for(int i=minVir;i<=revisi;i++){//ada perubahan, +1 dihilangkan!!!!!!!
//variabel tambahan digunakan, karena perbedaan indek layarVirtual, dengan layarSemen
//variabel tambahan dimulai dari 0;
//if(tambahan!=14) dihilangkan, beserta else dibawahnya!!!!!!!!!!!!!!
layarVirtual[tambahan]=charLayarSemen[i];
#if debuk
//if(i==minVir){
Serial.println("====PENTING=====");
delay(500);
Serial.println("!Variabel layarVirtual isinya :");//}
Serial.write(layarVirtual[tambahan]);//ini tadinya [i]!!!!!!!!!
Serial.print(" , indeknya i=");
Serial.println(i);
delay(500);
Serial.print("charLayarSemen[i]=");
Serial.println(charLayarSemen[i]);
delay(1000);
Serial.print("indeknya tambahan= ");
Serial.println(tambahan);
delay(1000);
#endif
tambahan++;
}//akhir for
tambahan++;//ditambah ini!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
layarVirtual[makLayarVirtual]='\0';//penambahan null supaya jadi array char
#if debuk
Serial.println(" - NULLLLLLLLL");
Serial.println(" ");
delay(500);
Serial.println("Variabel tambahan =");
Serial.println(tambahan);
delay(500);
Serial.println("Variabel minVir =");
Serial.println(minVir);
Serial.println("Variabel makVir =");
Serial.println(makVir);
Serial.println("Variabel nilaiGeser =");
Serial.println(nilaiGeser);
delay(1000);
Serial.println("===========");
Serial.print("layarVitual=");
Serial.println(layarVitual);
delay(200);
Serial.println("===========");
delay(500);
Serial.println("Selesai tahapnya");
delay(500);
Serial.println("===========");
delay(2000);
#endif
tahapannya=tampilkanDiLcd;
}
//===========================================================================
if(tahapannya==tampilkanDiLcd){
//tampilkan ke layar lcd, saat layar virtual sudah siap====================
//contoh sketsa bisa buka program StringAdditionOperator.ino
tambahan=0;//variabel baru, belum deklarasi
//lcd.clear();
#if !debuk
String ayoTampilkan=String(layarVirtual);
// lcd.setCursor(0,1);
// if(arahGeser==-1){
// lcd.printByte(PKiriKop);}
// else{lcd.printByte(PKiri);}
lcd.setCursor(1,1);//ini baru ditambahkan
lcd.print(ayoTampilkan);
// lcd.setCursor(15,1);
// if(arahGeser== 1){
// lcd.printByte(PKananKop);}
// else{lcd.printByte(PKanan);}
#endif
for(int i=0;i<=makLayarVirtual;i++){
layarVirtual[i]=0;}
tahapannya=diGeser;
}
//atau
// lcd.setCursor(1,1);
// lcd.print(layarVirtual);
//=======================================================================
if(tahapannya==diGeser){
delay(kecepatanGeser);
//pengganti minVir dan makVir di bawah, belum dilakukan!!!!!!!!!!!!!!!!!!!!!!!!!!
#if debug
Serial.println(" ");
Serial.println("==geser=====!");
Serial.print("Variabel minVir = ");
Serial.println(minVir);
delay(500);
Serial.print("Variabel makVir = ");
Serial.println(makVir);
Serial.print("Variabel arahGeser = ");
Serial.println(arahGeser);
delay(500);
#endif
//supaya ada proses pernilaiGeseran huruf------------------
if(((minVir!=minSemen)&&(arahGeser==-1))||
((makVir!=makSemen)&&(arahGeser==1))){
// if(nilaiGeser!=14){
nilaiGeser=nilaiGeser+1;
//Serial.print("nilaiGeser=");
//Serial.println(nilaiGeser);
#if debuk
Serial.println("===========");
Serial.println("Tidak perngisian lagi");
Serial.println("Variabel nilaiGeser :");
Serial.println(nilaiGeser);
delay(1000);
#endif
tahapannya=isiLayarVirtual;}//sampai disini ulangi isi layar virtual,
//bukan dari pengisian awal,
//ulangi sampai mentok ke pojok
//-----------------------------------------------------
//pernilaiGeseran usai--------------------------------------
//mentok ke pojok, jeda sejenak, ganti tampilan, animasi=false
else if(((minVir==minSemen)&&(arahGeser==-1))||
((makVir==makSemen)&&(arahGeser==1))){
//if(arahGeser==14){
//------------------------------------------------------------------------------
#if debuk
Serial.println("==============");
delay(500);
Serial.println("Animasi sudah selesai,");
delay(1000);
Serial.println("berhenti sejenak, dan mulai baru");
delay(500);
#endif
nilaiGeser=0;//reset nilai geser
//buat normal pointer
lcd.setCursor(15,1);
lcd.printByte(PKananKop);
lcd.setCursor(0,1);
lcd.printByte(PKiriKop);
animasi=false;//animasi bernilaiGeser usai, dilanjutkan dengan animasi berikutnya
tunggulah=false;}//jeda waktu selama peralihan menu, bisa dihilangkan kalau pakai tombol
else{
#if debug
Serial.println("!!!!!!!!!!");
Serial.println("Kesalahan kode");
#endif
}
}//akhir if tahapannya==dinilaiGeser
//-----------------------------------------------------
}//akhir animasi=true, artinya menu sudah berubah dan sudah dianimasikan
//==========================================
//Dibawah ini diedit jika gunakan tombol!!!!!!!!!!!!!!!!!!!!!!!!!
//ganti tampilan huruf atau kemenu berikutnya, dan dianimasikan============
/* if((animasi==false)&&(tunggulah==false)){//tiada animasi berjalan, dan jeda waktu untuk membaca menu ketika berhenti
tunggulah=true;
//menambah karakter tanda panah penuh______
lcd.setCursor(0,1);
lcd.printByte(PKiri);
lcd.setCursor(0,15);
lcd.printByte(PKanan);
//_________________________________________
if(arahGeser=-1){//ini menentuka arah pergeseran
minVir=minSemen2;//14
makVir=makSemen;//27
if(tampilan!=4){
tampilan++;}//tampilan dari 0 sampai 4
else{//jika sudah tampilan ke 4
tampilan=0;//tampilan balik ke awal
//arahGeser=1;//belum diaktifkan
}
}
else{//yang ini belum bisa karena program diatas harus disesuaikan
minVir=minSemen;//minSemen= 0
makVir=makSemen1;//makSemen1= 13
if(tampilan!=0){
tampilan--;}//tampilan dari 0 sampai 4
else{//jika sudah tampilan ke 4
tampilan=4;//tampilan balik ke awal
//arahGeser=1;//belum diaktifkan
}
}
delay(jedaBaca);//nah ini jeda waktu untuk membaca menu, ketika berhenti.
tahapannya=pengisian;//set proses pengisian dahulu, ke layar semen lalu
animasi=true;//segera animasikan.
}
*/
}//akhir void loop
void pilihan(){
if (arahGeser==1){
switch(tampilan){
case 1:
//modif///////////////////////////
tampilanAwal=String(menu6);
//////////////////////////////////
//modif///////////////////////////
tampilanSetelah=String (menu1);
//////////////////////////////////
break;
case 2:
//modif///////////////////////////
tampilanAwal=String(menu1);
//////////////////////////////////
//modif///////////////////////////
tampilanSetelah=String (menu2);
//////////////////////////////////
break;
case 3:
//modif///////////////////////////
tampilanAwal=String(menu2);
//////////////////////////////////
//modif///////////////////////////
tampilanSetelah=String (menu3);
//////////////////////////////////
break;
case 4:
//modif///////////////////////////
tampilanAwal=String(menu3);
//////////////////////////////////
//modif///////////////////////////
tampilanSetelah=String (menu4);
//////////////////////////////////
break;
case 5:
//modif///////////////////////////
tampilanAwal=String(menu4);
//////////////////////////////////
//modif///////////////////////////
tampilanSetelah=String (menu5);
//////////////////////////////////
break;
case 6:
//modif///////////////////////////
tampilanAwal=String(menu5);
//////////////////////////////////
//modif///////////////////////////
tampilanSetelah=String (menu6);
//////////////////////////////////
break;
default:
break;
}
}
else{
switch(tampilan){
case 1:
//modif///////////////////////////
tampilanAwal=String(menu2);
//////////////////////////////////
//modif///////////////////////////
tampilanSetelah=String (menu1);
//////////////////////////////////
break;
case 2:
//modif///////////////////////////
tampilanAwal=String(menu3);
//////////////////////////////////
//modif///////////////////////////
tampilanSetelah=String (menu2);
//////////////////////////////////
break;
case 3:
//modif///////////////////////////
tampilanAwal=String(menu4);
//////////////////////////////////
//modif///////////////////////////
tampilanSetelah=String (menu3);
//////////////////////////////////
break;
case 4:
//modif///////////////////////////
tampilanAwal=String(menu5);
//////////////////////////////////
//modif///////////////////////////
tampilanSetelah=String (menu4);
//////////////////////////////////
break;
case 5:
//modif///////////////////////////
tampilanAwal=String(menu6);
//////////////////////////////////
//modif///////////////////////////
tampilanSetelah=String (menu5);
//////////////////////////////////
break;
case 6:
//modif///////////////////////////
tampilanAwal=String(menu1);
//////////////////////////////////
//modif///////////////////////////
tampilanSetelah=String (menu6);
//////////////////////////////////
break;
default:
break;
}
}
}