Semua Tentang Belajar Teknologi Digital Dalam Kehidupan Sehari - Hari

  • IC Timer 555 yang Multifungsi

    IC timer 555 adalah sirkuit terpadu (chip) yang digunakan dalam berbagai pembangkit timer, pulsa dan aplikasi osilator. Komponen ini digunakan secara luas, berkat kemudahan dalam penggunaan, harga rendah dan stabilitas yang baik

  • Ayo Migrasi TV Digital

    Kami bantu anda untuk memahami lebih jelas mengenai migrasi tv digital, apa sebabnya dan bagaimana efek terhadap kehidupan. Jasa teknisi juga tersedia dan siap membantu instalasi - setting perangkat - pengaturan antena dan distribusi televisi digital ke kamar kos / hotel

  • Bermain DOT Matrix - LOVEHURT

    Project Sederhana dengan Dot Matrix dan Attiny2313. Bisa menjadi hadiah buat teman atau pacarmu yang ulang tahun dengan tulisan dan animasi yang dapat dibuat sendiri.

  • JAM DIGITAL 6 DIGIT TANPA MICRO FULL CMOS

    Jika anda pencinta IC TTL datau CMOS maka project jam digital ini akan menunjukkan bahwa tidak ada salahnya balik kembali ke dasar elektronika digital , sebab semuanya BISA dibuat dengan teknologi jadul

  • Node Red - Kontrol Industri 4.0

    Teknologi kontrol sudah melampaui ekspektasi semua orang dan dengan kemajuan dunia elektronika, kini semakin leluasa berkreasi melalui Node Red

Selasa, 09 Juni 2020

[Praktek Gampang] Jam di TV dengan Arduino - Part 3 - Esp8266-01 Kirim NTP via I2C



Kegemaran saya mengoprek jam kalender dan TV dimulai sejak  membaca tulisan mengenai steve wozniak dan steve jobs tentang bagaimana mereka bekerjasama membuat hardware video game "breakout" di Atari, hingga akhirnya menciptakan komputer apple yang legendaris itu. Dulu saat penulis kuliah sempat mendapat praktikum interfacing monitor VGA tapi hanya selintas aja dan menyesal juga kenapa gak sedari dulu bisa mengerti walau nilai praktikum dapat A (nyontek teman yg pinter sihhh). Dari dua latar belakang tersebut dan ketika microcontroller semakin murah dan mudah didapatkan menjadi tantangan tersendiri bermain micro di TV dan terlihat seperti main-main dan menghabiskan waktu, memang itu benar tapi asyik lhoo!  Tapi jangan berkecil hati karena penulis juga dapat banyak ilmu terutama mengenai pemrograman script yang lebih efisien. Salah satunya adalah ketika tantangan komunikasi arduino ke ESP agar tidak mengganggu timer Atmega328 untuk scanning TV. Jika menggunakan Serial baik Hardware atau emulasi software tetap aja akan menimbulkan interfrensi timer. Untuk itu digunakan komunikasi dengan timer  yg independen yaitu I2C. Dari hasil googling didapat bahwa ESP8266 bisa juga dimanfaatkan sebagai I2C master dan Arduino sebagai Slave nya. 




Komunikasi I2C sudah tersedia librarinya dalam instalasi default sketch,  yaitu dengan library " wire.h ". Untuk arduino uno / mini / micro yg berbasis ATmega328 pin SDA = A4 pin SCL =A5 . Dengan menggunakan I2C maka master dapat mengirim data atau meminta data ke slave. Tiap komponen yg diakses memiliki address masing-masing. Untuk ESP8266-01 memiliki 2 output GPIO yang bukan berfungsi sebagai I2C secara spesifik, sehingga perlu dilakukan inisialisasi port sendiri mana yg berfungsi sebagai SDA atau SCL. 

Menyambung tulisan mengenai jam di TV dan esp8266 , maka sebelum melanjutkan ke bahasan dibawah ada baiknya paca dulu PART1 dan PART2


- Praktek Testing I2C

Kita akan mencoba menghubungkan ESP sebagai master, terhubung secara I2C ke Arduino sebagai Slave dan tujuannya adalah mengirimkan data kalender secara periodik. Slave kemudian akan menuliskan hasil data yg diperoleh ke Serial port.

Script Master ( ESP8266-01)

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include "TimeLib.h"
//library I2c
#include <Wire.h>
//library NTP , unduh jika blom ada
#include <NTPClient.h>

const char *ssid     = "Nama Wifi";
const char *password = "Password";
//Offset WIB +7 , sesuaikan
const long utcOffsetInSeconds = 25200;

long previousMillis = 0;   
long interval = 10000; //tiap 10 detik
//Array kalender
char tanggalan[] ="20,1,1,23,59,0" ;

// NTP lokal, ubah jika perlu
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "ntp.bmkg.go.id", utcOffsetInSeconds);

void setup(){
  Serial.begin(9600); //monitor
  Wire.begin(0, 2); 
/* Koneksi i2c  SDA=0 and SCL=2  pada ESP-01 */

  WiFi.begin(ssid, password);

  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
    Serial.print ( "." );
  }

  timeClient.begin();
}

void loop() {

  unsigned long currentMillis = millis(); 

  if(currentMillis - previousMillis > interval) {

  previousMillis = currentMillis;
  timeClient.update();
  unsigned long epoch ;
  epoch = timeClient.getEpochTime();
  
//output ke array
  sprintf(tanggalan,"%2d,%02d,%02d,%02d,%02d,%02d", year(epoch)-2000, month(epoch), day(epoch), hour(epoch), minute(epoch), second(epoch));

  Wire.beginTransmission(8); /* address 8 */
  Wire.write(tanggalan);  /* kirim Kalender */
  Wire.endTransmission();    /* stop */
  Serial.print("tanggal : ");
  Serial.println(tanggalan);

  }
}



Script Slave (Arduino)

#include <Wire.h>


void setup()
{
Serial.begin(9600);
Wire.begin(8);
//rutin event receive i2c
Wire.onReceive(espWifiReceiveEvent);

}

void loop()
{
delay(1);
}

//Kirim ke serial saat ada data i2c masuk

void espWifiReceiveEvent(int count)
{
Serial.print("Received[");
while (Wire.available())
{
char c = Wire.read();
Serial.print(c);
}
Serial.println("]");

}


Nah jika dilihat output pada serial monitor / putty disisi arduino/slave seperti berikut:




- SCRIPT JAM LENGKAP

Terdapat beberapa hal yg menjadi perhatian saat data diterima arduino pada port I2C, dimana timer tetap akan kacau kalau data i2c nya panjang. I2C akan hang itulah yg terjadi saat 17 byte char diterima ,  jadi diakali dengan melakukan penonaktifan I2C setelah data kalender lengkap. Peng-update-an tanggalan dilakukan setiap jam atau sesuai keinginan misalnya tiap jam 3 pagi jika TV mau nyala terus dan gak dipake emak nonton sinetron..hehehehe...ayuk kita kupas satu persatu.


#include <TVout.h>
#include <Wire.h>
#include "fontALL.h"
#include <String.h>

TVout TV;

long previousMillis = 0;    
byte second, minute, hour, dayOfMonth, month, year;
long interval = 200;
int tvx,tvy,tvradius,x2,y2,x3,y3;
char buff[20]="20,08,06,23,58,58";
int buffindex=0;
char incomingByte ;

//status flag
bool ntpkomplit = false;
bool ntpupdate = false;

//function nulis kalender dan jam
void printTime()
{

second++;

if(second >=60){
  minute++;
  second=0;

}

if(minute >=60){
  hour++;
  minute=0;

  //reset flag
  ntpkomplit=false;
  ntpupdate=false;
  
  //restart i2C
   TWCR = 0;
   Wire.begin(8); //address 8
   Wire.onReceive(espWifiReceiveEvent);

}

if(hour >=24){
  hour=0;  
  dayOfMonth++;
}

//jika flag ntp komplit maka update kalender
if( ntpkomplit == true && ntpupdate == false ){
//parsing koma ke kalender
  char* ptr = strtok(buff, ",");
  byte i = 0;
  while (ptr) {
    if( i ==0 )year=atoi(ptr);
    else if( i == 1)month=atoi(ptr);
    else if( i == 2)dayOfMonth=atoi(ptr);
    else if( i == 3)hour=atoi(ptr);
    else if( i == 4)minute=atoi(ptr);
    else if( i == 5)second=atoi(ptr);
    
    ptr = strtok(NULL, ",");
    i++;
  }
  //flag ntp telah terupdate
  ntpupdate = true;
}

//tulis kalender

TV.set_cursor(0,0);
TV.print( char( hour/10 + 0x30) );
TV.print( char( hour%10 + 0x30) );
TV.print(":");
TV.print( char(minute/10 + 0x30));
TV.print( char(minute%10 + 0x30));
TV.print(":");
TV.print(char (second/10+0x30));
TV.print(char (second%10+0x30));


TV.set_cursor(8,9);
TV.print(char(dayOfMonth/10+0x30));
TV.print(char(dayOfMonth%10+0x30));
TV.print("/");
TV.print(char(month/10+0x30));
TV.print(char(month%10+0x30));
TV.set_cursor(10,18);
TV.print("20");
TV.print(char(year/10+0x30));
TV.print(char(year%10+0x30));
  
//status NTP connecting atau OK 

if( ntpupdate == false)
{
  TV.set_cursor(10,38);
  TV.print("con");
}

else{

  TV.set_cursor(10,38);
  TV.print("OK!");
}

//gambar Jam
//courtesy of Giant Metal Robot Blog 
  
TV.draw_circle(tvx,tvy,tvradius-5,BLACK,BLACK);

float angle = second*6 ;
angle=(angle/57.29577951) ; //Convert degrees to radians  
x3=(tvx+(sin(angle)*(tvradius-6)));
y3=(tvy-(cos(angle)*(tvradius-6)));
TV.draw_line(tvx,tvy,x3,y3,WHITE);
angle = minute * 6 ;
angle=(angle/57.29577951) ; //Convert degrees to radians  
x3=(tvx+(sin(angle)*(tvradius-11)));
y3=(tvy-(cos(angle)*(tvradius-11)));
TV.draw_line(tvx,tvy,x3,y3,WHITE);
angle = hour * 30 + int((minute / 12) * 6 )   ;
angle=(angle/57.29577951) ; //Convert degrees to radians  
x3=(tvx+(sin(angle)*(tvradius-15)));
y3=(tvy-(cos(angle)*(tvradius-15)));
TV.draw_line(tvx,tvy,x3,y3,WHITE);

}


void setup()  {
//TV di mode NTSC

TV.begin(_NTSC,150,71);
TV.select_font(font6x8);
TV.clear_screen();

tvx= TV.hres()/2;
tvy=TV.vres()/2;
tvradius=TV.vres()/2 ;
//clock face lingkaran
 TV.draw_circle(tvx,tvy,tvradius,WHITE);
//hour ticks
for( int z=0; z < 360;z= z + 30 ){
  //Begin at 0° and stop at 360°
  float angle = z ;
  angle=(angle/57.29577951) ; //Convert degrees to radians
  x2=(tvx+(sin(angle)*tvradius));
  y2=(tvy-(cos(angle)*tvradius));
  x3=(tvx+(sin(angle)*(tvradius-5)));
  y3=(tvy-(cos(angle)*(tvradius-5)));

  TV.draw_line(x2,y2,x3,y3,WHITE);
}
  
  
  TV.set_cursor(10,30);
  TV.print("NTP");
  TV.set_cursor(0,55);
  TV.print("aisi555");
  TV.set_cursor(3,63);
  TV.print(".com");



//buka serial kalau mau debug
//Serial.begin(9600);
Wire.begin(8); // I2C
Wire.onReceive(espWifiReceiveEvent);

}

void loop() {
  
unsigned long currentMillis = millis();

if(currentMillis - previousMillis > interval) {

  previousMillis = currentMillis;
  TV.delay(980); // Sesuaikan antara 950-1000
  printTime();

  }

}


void espWifiReceiveEvent(int count)
{

 //buka blok serial kalau mau debug
//Serial.print("Received[");

//jika i2c terima data dan blum komplit kalendernya
while (Wire.available() && ntpkomplit == false)
{
 char c = Wire.read();
 //Serial.print(c);
 buff[buffindex]=c;
 buffindex++;
}
//Serial.println("]");


//Ntpkomplit = true Jika buffer kalender sampe menit terpenuhi 
if(buffindex >=14) {
  ntpkomplit = true;
  TWCR = 0; //bunuh i2c
  
}

buffindex = 0;

}




HASIL :



Proses update yg saya gunakan adalah tiap JAM atau menit ke 0, jadi memang tidak akan langsung terupdate akibat proses BITBANG tabrak menabrak antar timer vs i2c. Jadi seperti video berikut ini dapat dilihat UPDATE ke waktu NTP terjadi hampir  2 menit kemudian.



Bagaimana ? Sudah Mumet ? Sebaiknya baca dari awal ya PART1 dan PART2 dan juga bagian sebelumnya mengenai TV menggunakan microcontroller yang sudah saya tulis sejak 2012. 

SELAMAT MENCOBA

Share:

[Praktek Gampang] Jam di TV dengan Arduino - Part 2 - ESP8266-01 NTP

Ini merupakan kelanjutan dari pembahasan Jam TV part1 dan merupakan bagian yang paling penting untuk mendapatkan waktu yg akurat. Umumnya para desainer elektronika yg membutuhkan pewaktu akan menggunakan RTC baik yg jadul paralel DS12887 atau yg sangat murah RTC serial/i2c DS1807. Penulis sangat benci menggunakan RTC karena ketidak akuratannya yg akan melenceng seiring waktu. Bahkan tidak pernah menggunakan RTC dalam proyek apapun karena selalu menggunakan timer internal dari AVR seperti yg pernah saya bahas secara gamblang disini. Karena sekarang saya menggunakan timer secara khusus untuk timing raster tv maka akan mengganggu library tvout nya. Untuk itu saya menggunakan NTP atau network time protocol yang kekauratatnnya teruji untuk penggunaan komputer. Menurut wikipedia....

Network Time Protocol (NTP) adalah sebuah protokol yang digunakan untuk pengsinkronan waktu di dalam sebuah jaringan bisa pada jaringan LAN (Local Area Network) maupun pada jaringan internet dan untuk sinkronisasi jam-jam sistem komputer di atas paket-switching, variabel-latency jaringan data. Proses sinkronisasi ini dilakukan didalam jalur komunikasi data yang biasanya menggunakan protokol komunikasi TCP/IP. Sehingga proses ini sendiri dapat dilihat sebagai proses komunikasi data yang hanya melakukan pertukaran paket-paket data saja.

NTP menggunakan port komunikasi UDP nomor 123. Salah satu contoh NTP server yg bisa dicoba adalah  ntp.bmkg.go.id  dan banyak lagi NTP server lainnya. Data yg diberikan oleh server NTP berupa elapsed second sejak tahun 1900. Komputer pada umumnya menggunakan unix / epoch time yg dihitung mulai 1 januari 1970,  jadi butuh perhitungan mengurangi data yg diterima sebanyak 2208988800 . Wow lumayan besar angkanya jadi kita akan terbiasa dengan format angka Unsigned Long. Untuk mempelajari prinsip epoch, unix time, dan NTP bisa baca di epochconverter.com .

- ESP8266 / ESP-01


Modul murah meriah ESP8266 merupakan penggerak utama dari perkembangan IOT di dunia sejak 10 tahun lalu. Bagaimana tidak hampir semua alat ber-wifi menggunakan platform yg sama dan membuat saya heran karena harganya super murah. Gak habis pikir deh berapa nilai keuntungan yg diambil oleh espressif ? Sebagai jebolan pabik komponen jadi ingat kalau pabrik di china bisa sampai menekan harga dan mengambil untung hanya 1 sen untuk tiap produknya, dengan catatan order  ke mereka main kuantitas besar. Ahh jangan dibahas lah kalau lawan industri china, kita di Indonesia hanya bisa lihat dan impor saja, bermimpi kembali ke jaman 80-90an dimana ada pabrik komponen yg pabriknya lokal jawa timuran.

Gambar Yang saya tampilkan diatas merupakan interfacing / hubungan antara ESP yg berlevel tegangan 3.3 volt dengan Arduino dengan level 5 volt. Pembagi tegangan menggunakan resistor bisa ditambahkan untuk keamanan, tapi menurut saya sudah bertahun-tahun level uart TTL bisa langsung dipake ke uart 3.3 volt asal jangan sampai tegangan supplynya / vcc aja sampe salah. 

Baudrate UART dari ESP pada umumnya di set 115200 dan menggunakan perintah AT command seperti halnya pada modul GSM SIM800. Anda bisa mencobanya dengan USB UART dan terminal yang memiliki fasiitas penambahan "CR" pada akhir command. Jadi jangan gunakan putty secara polos ya, gunakan monitor uart pada arduino atau Real Term daripada bingung karena Putty tanpa respond  hanya keluar tulisan " Ready". 

-Library ESPWiFi mode AT COMMAND



Kita lanjut pembahasan bagaimana interfacingnya modul ESP01 ini ke arduino dan penulis sangat terkejut bahwa library dari ESP yg dengan firmware AT "WiFiEsp" sudah memiliki fasilitas NTP-UDP siap pakai. Wahh tinggal copy paste ini sepertinya dan benar saja dari kumpulan script example bisa kita langsung dapatkan hasil yang memuaskan.

Untuk mengubah data waktu EPOCH dengan hasil yg lebih spesifik (hari tanggal bulan tahun) maka kita perlu menambahkan libary pengolah kalender "TimeLib.h". Ini karena pada library WiFiEsp tidak ada fasilitas pengolahan data EPOCH nya. Modifikasi saja pada script sesuai contoh berikut:

if (Udp.parsePacket()) {
    Serial.println("packet received");
    // We've received a packet, read the data from it into the buffer
    Udp.read(packetBuffer, NTP_PACKET_SIZE);

    // the timestamp starts at byte 40 of the received packet and is four bytes,
    // or two words, long. First, esxtract the two words:

    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
    // combine the four bytes (two words) into a long integer
    // this is NTP time (seconds since Jan 1 1900):
    unsigned long secsSince1900 = highWord << 16 | lowWord;
    Serial.print("Seconds since Jan 1 1900 = ");
    Serial.println(secsSince1900);

    // now convert NTP time into everyday time:
    Serial.print("Unix time = ");
    // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
    const unsigned long seventyYears = 2208988800UL;
    // subtract seventy years:
    unsigned long epoch = secsSince1900 - seventyYears + 25200; //offset +7
    // print Unix time: Indonesia + 7 WIB
    Serial.println(epoch);

   
    // print the hour, minute and second , ini mode libraru standar
    Serial.print("Waktu WIB (+7) = ");       // WIB +7
   Serial.print(( epoch % 86400L) / 3600); // print the hour 
    Serial.print(':');
    if (((epoch % 3600) / 60) < 10) {
      // In the first 10 minutes of each hour, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.print((epoch  % 3600) / 60); // print the minute 
    Serial.print(':');
    if ((epoch % 60) < 10) {
      // In the first 10 seconds of each minute, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.println(epoch % 60); // print the second
  
  // dibawah ini penggunaan TimeLib.h yang lebih singkat

    char buffer[100] ;
sprintf(buffer, "  Tanggal : %4d-%02d-%02d", year(epoch), month(epoch),day(epoch));
    Serial.println(buffer);
  } 



- Mengubah ESP01 menjadi Berbasis Arduino 


Kelanjutan pembahasan saya kali ini alur ceritanya maju kedepan saat kegagalan mencoba Wifi + NTP + TVOUT gara-gara critical timingnya. Jadi saya perlu mendapatkan parameter waktu tanpa mengganggu timer 16 bit nya atmega328 dan ini sangat mustahil. Awalnya saya berpikir menggunakan Software Serial untuk mengambil data vi AT command, akan tetapi layar TV langsung blank. Jadi Mau tidak mau harus menggunakan jalur komunikasi lainnya yg memungkinkan, dan benar saja GPIO dari ESP8266/01 ini ada 2 buah yg GPIO 0 dan 2, jadi cukup lah untuk menjadikannya port I2C ( SDA dan SCL). Namun saya perlu merangkai flashernya agar bisa diprogram melalui sketch arduino.




Cara flashingnya  dengan urutan :  Menekan 2 Tombol Flash + Reset , kemudian lepas tombol Reset dan tombol Flash tetap ditekan , ditandai dengan led esp warna biru kedip sekali. Nah selanjutnya anda bisa menekan Upload pada sketch seperti biasanya. Pembahasan I2C untuk mengirim data kalender akan dibahas pada tulisan berikutnya.  Anda bisa mencoba menggunakan ESP01 untuk menerima data NTP dan menampilkan pada serial port / debug port seperti script dibawah.

#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

const char *ssid     = "Nama Wifi";
const char *password = "Passwordnya";

const long utcOffsetInSeconds =  25200; //offset +7 WIB

char daysOfTheWeek[7][12] = {"Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"};

// NTP lokal aja yg dipake, ubah kalau mau

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "ntp.bmkg.go.id", utcOffsetInSeconds);

void setup(){
  Serial.begin(9600); 

  WiFi.begin(ssid, password);

  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
    Serial.print ( "." );
  }

  timeClient.begin();
}

void loop() {
  timeClient.update();

  Serial.print(daysOfTheWeek[timeClient.getDay()]);
  Serial.print(", ");
  Serial.print(timeClient.getHours());
  Serial.print(":");
  Serial.print(timeClient.getMinutes());
  Serial.print(":");
  Serial.println(timeClient.getSeconds());
  
  delay(1000);
}


Lalu bagaimana menggabungkan Jam TV menggunakan Arduino dengan ESP8266-01 sebagai pengirim  NTP ? Bisa dibaca disini.

Selamat Mencoba
Share:

[Praktek Gampang] Jam di TV dengan Arduino - Part 1 - Library TvOut



Kekuatan dari arduino adalah kegilaan para "opreker" dalam membuat script library yang sangat rapih dan membuat anda yang kurang kekuatan berimajinasinya menjadi sangat terbantu. 10 tahun yg lalu mungkin ini menjadi kekecewaan saya , kenapa gak dari jaman saya awal belajar microcontroller dulu muncul library yg gampang ini? Akan tetapi ada bergunanya juga saya belajar microcontroller mulai dari bahasa assembly dimana saya dengan mudah melakukan modifikasi dari suatu library , hasil pemahaman "jeroan" dari register microcontroller  sekelas AVR. Contoh nyata adalah yang pernah saya tulis di Praktek Jam TV Dengan Attiny2313 dimana saya berhasil mengoprek library arduino agar muat ke ROM attiny yg super kecil.




Penjelasan teori dari bagaimana menampilkan gambar pada TV composite analog dapat dibaca pada  beberapa seri tulisan Micro vs TV yg menggunakan hardware yg sama seperti gambar diatas. Bermodal 2 resistor 1K dan 470 Ohm maka sinyal sync dan blanking dapat diatur sedemikian rupa menggunakan fungsi timer pada microcontroller. Cukup dengan script delay saja bisa membuat karakter sederhana seperti video yutub dibawah ini. Dan akhir dari seri praktek TV 7 taun yg lalu itu adalah membuat overlay/osd pada gambar live TV.

  

Ketika saya memutuskan membahas arduino pada blog, maka saya jadi berpikiran pasti ada library yang membahas TV dan ternyata ada library TVOUT yang memang sudah ada sejak lama. Namun kalau tampilannya itu itu aja maka akan sedikit kurang tantangannya. Hasil googling saya  menunjukkan hasil karya TVOUT jam digital  dengan gabungan tulisan dan animasi jam dinding. Bisa anda baca di http://giantmetalrobot.blogspot.com/2011/05/arduino-analog-clock.html.  Dan sebagai tantangannya saya akan merubah penggunaan RTC menjadi NTP yaitu mengambil data jam dari server internet semacam  http://ntp.bmkg.go.id. Saya akan membuat seri tulisan yg akan membahas satu persatu agar pembaca semakin paham, mulai dari menulis di tv, mengambil data NTP melalui ESP8266 dan terakhir penggabungannya.



Jika menggunakan pemrograman avr non arduino, maka register timer 16 bit diatas harus dipahami sampai diluar kepala. Ya mau tidak mau harus!  Karena menulis pada TV memerlukan timing yang pas pada jangka waktu per raster yg hanya 64us. Pada Library TVout nya arduino anda tidak perlu pusing-pusing lagi karena cukup menggunakan fasilitas langsung jadi. Hardware pun masih sama 2 resistor saja dengan menggunakan port seperti pada gambar.




Baiklah setelah terangkai dengan benar, maka kita bisa membuat tulisan sederhana seperti pada contoh script singkat berikut.

#include <TVout.h>
#include <fontALL.h>

TVout TV;
void setup()
{
  //Setup display.
  TV.begin(PAL,120,96);
  //Select font.
  TV.select_font(font6x8);
}
void loop()
{
  //Clear screen at the beginning of the loop.
  TV.clear_screen();
  //Set curosr position. (x,y)
  TV.set_cursor(0, 10);
  //Print text.
  TV.println("www.aisi555.com");
  
  TV.delay(60);
}


Thats it....hanya sebaris itu..Bagaimana dengan membuat jam seperti pada gambar paling atas? Tinggal langsung copy paste aja kok dari blog aslinya dan merubah bagian pembacaan RTC dan membuat delay 1 detik sehingga mensimulasi pergantian detik ke menit jam tanggal dan seterusnya.


void loop() {

unsigned long currentMillis = millis();

if(currentMillis - previousMillis > interval) {

  previousMillis = currentMillis;
  TV.delay(1000); // delay 1 detik
  printTime();

   // script asli membaca RTC kita hapus aja
  //read RTC
 // getDateDs1307() ; 
  }
}


void printTime()
{

second++;

if(second >=60){
  minute++;
  second=0;
}

if(minute >=60){
  hour++;
  minute=0;
}

if(hour >=24){
  hour=0;  
  dayOfMonth++;
}

...............................
script lainnya sama
...............................


Hasilnya bisa dilihat pada video berikut :





Lanjutan pembahasan NTP sebagai sumber waktu dapat dibaca DISINI

SELAMAT MENCOBA 



Share:

Jumat, 29 Mei 2020

[Belajar Mudah] Love Hurt 2020 - Remake pake Arduino




Lama banget gak utak-atik LED MATRIX padahal barang satu ini favorit saya sejak kuliah 20 tahun yang lalu. Kekaguman saya pada benda ini berawal saat tahun 90an saya sering diminta teman membuat LED susun menjadi tulisan tertentu dan kemudian digabung dengan IC 4017 agar menjadi efek gerak kedip kanan kiri, sayangnya karakter yg dibentuk gak bisa diubah. Dan saat saya kuliah ketemu dot matrix yang gak lain led disusun yang bisa diubah ubah tampilannya sesuai keinginan. Bahkan ingatan saya masih clink pada tahun 1998 di atas atap kampus Elektro ITS terpampang text berjalan dari Bohlam yg disusun menjadi seperti LED matrix berukuran super besar. 


Tuh saya masih inget bikin generator susunan led ke bit / hex yang nantinya dimasukkan ke script atmel studio. Dulu saya pake IC legendaris ATTINY 2313 dan banyak yang belajar dari modul pembelajaran (yang saya jual paketan) dimana praktek terakhirnya bikin teks berjalan pada satu marix yang bisa dibaca disini atau versi excel disini . Kini sudah tahun 2020 saya ingin membagi ilmu nya kembali dengan format lebih jaman now menggunakan Arduino. Lanjut kumpulin bahan-bahannya yuk...


Bahan-bahan dapat disesuaikan dengan yang ada dirumah aja jangan kaku sampe harus beli (walau murah tinggal klik olshop). Rangkaian nya sangat simple karena akan menggunakan pin I/O nomer 2-8 sebagai BARIS dan pin 9-13 sebagai KOLOM dari led matrix. Sebaiknya jika bingung prinsip penyalaan LED MATRIX bisa dibaca dulu dasarnya disini.



Karena Arduino Pro Mini yg saya gunakan memakai header cowok maka sangat simple menyambungkannya  ke Led Matrix dengan menggunakan kabel jumper cewek ke cewek. Tinggal colok seperti gambar dibawah. Kalau pake arduino jenis lain tinggal sesuaikan saja.


Mari kita bahas scriptnya secara mendalam..jangan sampe pusing ya ! Pegangan kalau kepala sudah muncul bintang nya..hehehe


- Penyusunan Karakter di Memori


const byte love1[5] =
{
0b0011110,
0b0100001,
0b1000010,
0b0100001,
0b0011110

};

const byte love2[5] =
{
0b0001100,
0b0010010,
0b0100100,
0b0010010,
0b0001100

};





Untuk menyusun karakter diatas anda butuh mengunduh software TextToBit yang saya kerasikan disini. Jadi saya ingin membuat animasi jantung berdenyut dengan 2 frame karakter yang dinyalakan bergantian (kalau mau banyak ya lebih keren juga). Jadi prinsipnya menyusun BIT sedemikian rupa agar karakter terwakili pada led dengan kombinasi 7 output BARIS (HIGH) vs 5 output KOLOM (LOW). Perhatikan gambar berikut ya ...


Dari gambar dapat dibayangkan bahwa BIT biner pada array (BARIS)  diatas menunjukkan  nilai 1 berarti LED NYALA dan sebaliknya. Selanjutnya akan di scanning KOLOM nya satu persatu secara cepat dan mata melihat sebagai satu gambar utuh. Karena Matrix yg kita gunakan 7x5 maka cukup menggunakan 7 bit saja per baris. 


- Inisialisasi PIN I/O

#define BARIS1 2
#define BARIS2 3
#define BARIS3 4
#define BARIS4 5
#define BARIS5 6
#define BARIS6 7
#define BARIS7 8
#define KOLOM1 9
#define KOLOM2 10
#define KOLOM3 11
#define KOLOM4 12
#define KOLOM5 13


byte kolomnya[5]= {KOLOM1,KOLOM2,KOLOM3,KOLOM4,KOLOM5} ;
byte barisnya[7] = {BARIS1,BARIS2,BARIS3,BARIS4,BARIS5,BARIS6,BARIS7} ;

void setup() {
   //BARIS
   pinMode(BARIS1, OUTPUT);
   pinMode(BARIS2, OUTPUT);
   pinMode(BARIS3, OUTPUT);
   pinMode(BARIS4, OUTPUT);
   pinMode(BARIS5, OUTPUT);
   pinMode(BARIS6, OUTPUT);
   pinMode(BARIS7, OUTPUT); 

   //KOLOM
   pinMode(KOLOM1, OUTPUT);
   pinMode(KOLOM2, OUTPUT);
   pinMode(KOLOM3, OUTPUT);
   pinMode(KOLOM4, OUTPUT);
   pinMode(KOLOM5, OUTPUT);

}




Tujuan membuat array yang isinya PIN I/O untuk kolom dan baris adalah memudahkan proses geser BIT saat scanning dan penyalaan LED. Ini karena arduino menggunakan penamaan PIN sebagai Port I/O tersendiri bukan seperti Attiny dan microcontroler AVR lainnya yg PORT disesuaikan dengan register portnya masing-masing selebar 8 bit sehingga mudah melakukan operasi geser bit. Ini bedanya tukang solder yg pernah belajar microcontroller menggunakan bahasa assembly dengan yang langsung lompat menggunakan arduino. Kalau anda langsung menggunakan Arduino mungkin akan kebingungan memahaminya.


- Function Untuk Menulis Karakter




void tulis(int lama, byte *dot)
{

for(int a=0 ; a<lama ; a++)
{
 for(int b=0 ; b<5 ; b++)         
  {

   for( int c=0;c<5 ; c++){
       if( c == b) digitalWrite(kolomnya[c],LOW );
       else digitalWrite(kolomnya[c],HIGH );
        }
   

   for(int d=0;d<7;d++) {
         digitalWrite(barisnya[d], ((1<<d) & dot[b]) >> d );       
         }
   delay(2);
   blank();
   delay(1);    
  }
 }
}



Kita akan bahas baris per baris fungsi diatas agar gampang memahaminya.


void tulis(int lama, byte *dot)


Lama = waktu lama for loop dijalankan agar menunjukan lama tampilnya sebuah karakter.
*dot   = Pointer ke array yang akan melewatkan 7 bit baris karakter

Terdapat 4 buah FOR LOOP yaitu :

a = Loop lama tampil sebuah karakter 
b = Scanning KOLOM
c = Geser kolom (LOW)
d = Geser baris (HIGH)

Kita akan breakdown for loop C dan D :

for( int c=0;c<5 ; c++){
       if( c == b) digitalWrite(kolomnya[c],LOW );
       else digitalWrite(kolomnya[c],HIGH );
        }

Ketika scanning kolom satu persatu maka yg bergerak adalah memberikan pin i/o sebagai  LOW / 0, jadi kalau diberikan perintah secara manual akan menjadi  :






if ( b == 0 ) { 
                        digitalWrite(KOLOM1, LOW);
                        digitalWrite(KOLOM1, HIGH);
                        digitalWrite(KOLOM1, HIGH);
                        digitalWrite(KOLOM1, HIGH);
                        digitalWrite(KOLOM1, HIGH);
                    }

else if ( b == 1 ) { 
                        digitalWrite(KOLOM1, HIGH);
                        digitalWrite(KOLOM1, LOW);
                        digitalWrite(KOLOM1, HIGH);
                        digitalWrite(KOLOM1, HIGH);
                        digitalWrite(KOLOM1, HIGH);
                    }

else if ( b == 2 ) { 
                        digitalWrite(KOLOM1, HIGH);
                        digitalWrite(KOLOM1, HIGH);
                        digitalWrite(KOLOM1, LOW);
                        digitalWrite(KOLOM1, HIGH);
                        digitalWrite(KOLOM1, HIGH);
                    }

else if ( b == 3 ) { 
                        digitalWrite(KOLOM1, HIGH);
                        digitalWrite(KOLOM1, HIGH);
                        digitalWrite(KOLOM1, HIGH);
                        digitalWrite(KOLOM1, LOW);
                        digitalWrite(KOLOM1, HIGH);
                    }

else if ( b == 4 ) { 
                        digitalWrite(KOLOM1, HIGH);
                        digitalWrite(KOLOM1, HIGH);
                        digitalWrite(KOLOM1, HIGH);
                        digitalWrite(KOLOM1, HIGH);
                        digitalWrite(KOLOM1, LOW);
                    }






Terlalu panjang, namun mudah dimengerti dan merupakan terjemahan isi dari FOR LOOP C yang hanya 4 baris saja.


for(int d=0;d<7;d++) {
    
      digitalWrite(barisnya[d], ((1<<d) & dot[b]) >> d );       
         
     }

For Loop D memiliki keunggulan geser bit dengan hanya sebaris script, tapi untuk memahaminya butuh penjabaran yaitu :

GESER BIT  1 :  (1<<d) & dot[b] 
GESER BIT  2 :   >> d 

Semisal nih..7 BIT baris yg akan dinyalakan adalah 0b0001100 , dimana 0 = mati , 1 = nyala. Sehingga kita perlu mengetahui bit yg sesuai dengan PIN i/o yg bersesuaian juga. Inilah hubungan kita membuat ARRAY yg berisikan nomer PIN. 

Jadi dengan 7 kali loop maka kita akan tau PIN BARIS ke X  itu mati atau nyala. Penejelasannya seperti berikut :

saat d=0 , maka angka 1 geser kiri sebanyak 0 kali = 0000001 , lanjut di AND dengan isi semuanya  0001100 hasilnya = 00000000, kemudian geser kanan semuanya sebanyak 0 kali hasilnya PIN BARIS1 = 0 /MATI

saat d=1 , maka angka 1 geser kiri sebanyak 1 kali = 0000010 , lanjut di AND dengan isi semuanya  0001100 hasilnya = 00000000, kemudian geser kanan semuanya sebanyak 1 kali hasilnya PIN BARIS2 = 0 /MATI

saat d=2 , maka angka 1 geser kiri sebanyak 2 kali = 0000100 , lanjut di AND dengan isi semuanya  0001100 hasilnya = 00000100, kemudian geser kanan semuanya sebanyak 2 kali hasilnya PIN BARIS3 = 1 /NYALA


saat d=3 , maka angka 1 geser kiri sebanyak 3 kali = 0001000 , lanjut di AND dengan isi semuanya  0001100 hasilnya = 00001000, kemudian geser kanan semuanya sebanyak 3 kali hasilnya PIN BARIS4 = 1 /NYALA

saat d=4 , maka angka 1 geser kiri sebanyak 4 kali = 0010000 , lanjut di AND dengan isi semuanya  0001100 hasilnya = 00000000, kemudian geser kanan semuanya sebanyak 4 kali hasilnya PIN BARIS5 = 0 /MATI

saat d=5 , maka angka 1 geser kiri sebanyak 5 kali = 0100000 , lanjut di AND dengan isi semuanya  0001100 hasilnya = 00000000, kemudian geser kanan semuanya sebanyak 5 kali hasilnya PIN BARIS6 = 0 /MATI

saat d=6 , maka angka 1 geser kiri sebanyak 6 kali = 1000000 , lanjut di AND dengan isi semuanya  0001100 hasilnya = 00000000, kemudian geser kanan semuanya sebanyak 6 kali hasilnya PIN BARIS7 = 0 /MATI


Seperti itulah proses geser BIT sehingga tiap LED dapat ditentukan mati dan nyalanya .

   delay(2);
   blank();
   delay(1);    


Fungsi blank mengatasi kelembaman mata yg menyebabkan efek LED berbayang (saking cepetnya ) dengan cara mematikan semua LED saat akan pindah  7 bit Baris selanjutnya 


 void blank ()
 {
   digitalWrite(BARIS1,LOW);
   digitalWrite(BARIS2,LOW);
   digitalWrite(BARIS3,LOW);
   digitalWrite(BARIS4,LOW);
   digitalWrite(BARIS5,LOW);
   digitalWrite(BARIS6,LOW);
   digitalWrite(BARIS7,LOW);
   
 }


- Sedangkan untuk LOOP utama cukup singkat aja 

void loop() {


 tulis(10,love1);
 tulis(10,love2);

 }


- Hasilnya :





Selanjutnya ada fasilitas text geser kanan dan naik



Tinggal mengolah sedikit script pada tulisan sebelumnya di 2011 di link disini.

Bagaimana ? SELAMAT MENCOBA !
Share:

Kontak Penulis



12179018.png (60×60)
+628155737755

Mail : ahocool@gmail.com

Site View

Categories

555 (8) 7 segmen (3) adc (4) amplifier (2) analog (19) android (12) antares (8) arduino (25) artikel (11) attiny (3) attiny2313 (19) audio (5) baterai (5) blog (1) bluetooth (1) chatgpt (2) cmos (2) crypto (2) dasar (46) digital (11) dimmer (5) display (3) esp8266 (25) euro2020 (13) gcc (1) iklan (1) infrared (2) Input Output (3) iot (58) jam (7) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (17) komputer (3) komunikasi (1) kontrol (8) lain-lain (8) lcd (2) led (14) led matrix (6) line tracer (1) lm35 (1) lora (5) MATV (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroler (1) mikrokontroller (14) mikrotik (5) modbus (9) mqtt (3) ninmedia (5) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (88) pcb (2) power (1) praktek (2) project (33) proyek (1) python (7) radio (17) raspberry pi (4) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (2) sharing (3) signage (1) sinyal (1) sms (6) software (18) solar (1) solusi (1) tachometer (2) technology (1) teknologi (2) telegram (2) telepon (9) televisi (167) television (28) transistor (2) troubleshoot (3) tulisan (93) tutorial (108) tv digital (6) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika