"Kembali Ke Dasar Elektronika Digital ... "

  • 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

  • Animasi LED Dengan IC 4017

    IC 4017 adalah IC 16-pin CMOS dekade counter dari seri IC CMOS 4000. Sangat berguna jika ingin membuat animasi lampu atau LED secara sederhana seperti led berjalan, tulisan berjalan , counter/timer dan masih banyak kegunaan lainnya

  • 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

  • BIKIN PCB SEDERHANA TAPI GA MURAHAN

    Bikin PCB itu ga susah kok..dengan software EAGLE CAD dan teknik sterika kamu dapat membuat PCB untuk berbagai project elektronika mu ...

Tampilkan postingan dengan label arduino. Tampilkan semua postingan
Tampilkan postingan dengan label arduino. Tampilkan semua postingan

Rabu, 22 Juli 2020

MODBUS - Komunikasi Industri Jaman dulu [part 4] Arduino MQTT Bridge




Setelah berhasil memposisikan arduino menjadi modbus master, kita akan butuh sedikit usaha lagi untuk melengkapi piramida IOT nya. Untuk itu perlu penggabungan dari beberapa tulisan sebelumnya yaitu dasar MQTT pada ESP8266 disini dengan tulisan seri modbus part 3 disini. Ada dua mode mqtt yang ingin saya gunakan yaitu mode request-reply dan mode periodic. Perhatikan rangkaian dasar yang telah kita bahas sebelumnya.


Skematik arduino mqtt bridge


Dengan asumsi pembaca telah memahami pembahasan sebelumnya, mode request-reply memiliki 5 type perintah yang akan dikirim ke perangkat modbus dan jika di tuliskan dalam script seperti berikut  :


if (Serial.available() > 0) { //perintah dari serial port monitor/putty
    // read the incoming byte:
    incomingByte = Serial.read();

    if (incomingByte == '1') {  //toggle led mati hidup
       if (!led) mod.write(ledOn, sizeof(ledOn)); //modbus led on
       else mod.write(ledOff, sizeof(ledOff)); //modbus led off

       led=!led;
      }
    else if (incomingByte == '2')  mod.write(tombol, sizeof(tombol));  //cek tombol
    else if (incomingByte == '3')  mod.write(humitemp, sizeof(humitemp)); //baca dht11
    else if (incomingByte == '4')  mod.write(aisi, sizeof(aisi)); //baca holding register

    }
Pada script diatas merupakan perintah atau request yang dikirimkan oleh Terminal Serial semisal putty atau serial monitor sketch arduino dimana terjemahan perintah nya seperti berikut :

  • '1'  : Togle led On atau Off
  • '2'  : Baca penekanan tombol
  • '3'  : Baca sensor DHT11
  • '4'  : Baca Holding Register

Kita dapat  merubah request dari terminal serial menjadi perintah yg  dikirim melalui SUBSCRIBE TOPIK  MQTT,  jadi esp8266 akan menunggu apakah ada request dari server/broker yang masuk dan membandingkan isi payloadnya sesuai script berikut :

void mqtt_callback(char* topic, byte* payload, unsigned int length) {
 
  Serial.print("Message arrived in topic: ");
  Serial.println(topic);
 
  Serial.print("Message:");
 
  String message;
  for (int i = 0; i < length; i++) {
    message = message + (char)payload[i];  //Convert *byte to String
  }
   Serial.print(message);
   if(message == "1"){  //bandingkan payload yang masuk dan kirim modbus
       if (!led) mod.write(ledOn, sizeof(ledOn));
       else mod.write(ledOff, sizeof(ledOff));

       led=!led;
      }
   if(message == "2")mod.write(tombol, sizeof(tombol));
   if(message == "3")mod.write(humitemp, sizeof(humitemp));
   if(message == "4")mod.write(aisi, sizeof(aisi));


 }
Untuk memahaminya tidaklah begitu sulit jika anda rajin membaca blog ini dari seri tulisan mengenai mqtt yang sering saya bahas sebelumnya. 

Setelah modbus me-reply request maka esp8266 akan membandingkan reply modbus dan selanjutnya melakukan PUBLISH MQTT ke topik yang telah ditentukan ke broker mqtt. Anda juga bisa menggunakan Smartphone dengan aplikasi IOT MQTT PANEL untuk menerima data yang di PUBLISH oleh bridge mqtt esp8266 dan tentunya juga bisa mengirimkan perintah/request ke modbus.




Untuk mode periodic cukup menambahkan timer pada loop utama yang akan mengirimkan perintah modbus untuk pengecekan tombol dan pembacaan DHT11 setiap jeda waktu tertentu. Selengkapnya ikuti penjelasan pada video berikut ini :



Share:

Selasa, 21 Juli 2020

MODBUS - Komunikasi Industri Jaman dulu [part 2] Membedah Isi Pesan Modbus




Pada bagian kedua kita akan membedah standar protokol modbus melalui pembedahan perintah yang dikirim dan terima dari master menuju slave. Dari software sniffer serial port  yg menyadap komunikasi serial pada komunikasi antara PC sebagai master modbus dan arduino sebagai modbus slave, didapatkan pola pengiriman data seperti ini saat menghidupkan LED:

05 05 00 00 FF 00 8D BE

Kode diatas berupa Hexa jadi kalau dipisah-pisah berdasarkan standar pada beberapa tulisan yang saya baca di beberapa artikel di internet adalah seperti berikut:

05     =  Alamat device id slave
05     =  Perintah force coil / function 05
00 00  = 2 byte alamat address memori (mulai 0)
FF 00  = 2 byte force coil ON
8D BE  = Checksum / CRC 16 modbus

Ada pola khusus yaitu alamat address register dan data perintah berupa 2 byte. Register / alamat memory modbus selalu dimulai dari nol walaupun sejatinya alamat yang dituju merupakan register yg diawali angka 1, contoh kita akan megakses register 40001, tetap saja perintah nya akses ke reg 0 karena sudah diwakili oleh byte perintah function sebagai penanda jenis register yg akan diakses. Check sum ini didapat dengan rumus tertentu dan daripada pusing langsung aja gunakan website https://www.scadacore.com/tools/programming-calculators/online-checksum-calculator/ untuk menjadi crosscheck. Pada terminal realterm sudah terdapat penghitung checksum otomatis sehingga sangat gampang.



Jadi untuk mematikan led perintahnya adalah :


05 05 00 00 00 00 CC 4E

Untuk mengecek checksumnya (CC 4E) dapat menggunakan website yang telah saya berikan sebelumnya. Untuk mengecek penekanan tombol perintahnya adalah :


05 02 00 00 00 01 B8 4E

05     =  Alamat device id slave
02     =  Perintah baca input digital / function 02
00 00  = 2 byte alamat address memori (mulai 0)
00 01  = 2 byte panjang data yg diharapkan
B8 4E  = Checksum / CRC 16 modbus



Jawaban yg diterima untuk kondisi tombol dilepas / LOW :

05 02 01 00 A0 B8

Untuk kondisi tombol ditekan / HIGH
05 02 01 01 61 78

Dimana yang berwarna merah artinya  bisa dilihat pada website  parsing data RTU berikut  http://rapidscada.net/modbus/ModbusParser.aspx


Untuk membaca DHT11 dilakukan dengan function 04 dan 3 buah data akan diminta ke modbus yaitu  suhu didepan koma, suhu di belakang koma dan terakhir angka kelembaban. Perintahnya sebagai berikut :

05 04 00 00 00 03 B1 8F

05     =  Alamat device id slave
04     =  Perintah baca input analog/ function 04
00 00  = 2 byte alamat address memori (mulai 0)
00 03  = 2 byte panjang data yg diharapkan (3 buah data)
B1 8F  = Checksum / CRC 16 modbus

sedangkan replynya seperti ini formatnya : 

05 04 06 00 1D 00 4F 00 5F CF BE

05     =  Alamat device id slave
04     =  Perintah baca input analog/ function 04
06     = 6 byte data berikut akan muncul (format 2 byte per data) 
00 1D  = 2 byte pertama adalah 001D = 29
00 4F  = 2 byte kedua adalah 004F =  79
00 5F  = 2 byte ketiga adalah 005F = 95
CF BE  = Checksum / CRC 16 modbus

Jadi hasil pembacaan dari DHT 11 adalah 29,79 derajat Celcius dengan kelembaban 95%. Untuk lebih jelasnya bisa dilihat pada video https://www.youtube.com/watch?v=cOmQoyfORtg&t=34m30s



Share:

Kamis, 02 Juli 2020

The Coolest Way To Visualize VU Meter From Arduino to Microsoft Excel



On this tutorial i will try to show you how cool is python if combined with arduino, as i've already wrote on previous blogs Here dan Here . Sorry since i was writing only in Bahasa so please use google translate for your convenience and now i would like to write in english and i hope you'll understand.

First prepare some components from this schematic for amplifier part, the purpose is to create audio signal gain (from condenser mic) which is too weak for arduino's ADC to read from. 

Since we only want to read the signal's voltage so we can skip loud speaker part, but if you want to hear some poor noisy sound then it is up to you. Pin no 5 of LM386 can directly feed into any arduino ADC pin and the power supply can directly connected to 5 volt on arduino. The Script is quite simple as i only copy and paste from arduino's ADC example scripts collection.


int analogPin = A0; // Any ADC Pin on ardiuno
                    
int val = 0;  // variable to store the value read

void setup() {
  Serial.begin(9600);           //  setup serial
}

void loop() {
  val = analogRead(analogPin);  // read the input pin
  Serial.println(val);          // send value to serial
  delay(100);   // 100 ms delay is the best, try other number
}
That is one simple scripts, i only use hardware serial directly connecting to USB COM port then the python will do the rest. Xlwings library is a simple tools to write and read directly to any excel 'cell' so then the graph chart on excel can becoming "alive" in real time if the data is changed rapidly. 


import serial #serial library
import xlwings as xw #excel library

wb = xw.Book('Audio.xlsx') #file name, change accordingly
sht = wb.sheets['data'] #sheets name, change it depend on your excel
row = 1

serialPort = serial.Serial(port = "COM4", baudrate=9600,   #baudrate
                           bytesize=8, timeout=2, 
                           stopbits=serial.STOPBITS_ONE)

serialString = ""   

while(1):
    if(serialPort.in_waiting > 0): #read if any serial data is coming
        serialString = serialPort.readline()
        data=serialString.decode('utf-8')     
        print(data) 
        if row == 51: #reset the row
          row=2 
        else: 
          row=row+1
        audio='A'+str(row) #new cell
        sht.range(audio).value= float(data) #write cell

The scripts read the integer value from ADC readout which is sent by arduino, then write it rapidly on cell A2 until A51 in excel file. The graph will be "dancing" according to the sound wave traveling through the condenser microphone.



As microsoft excel is easy to use or to customize then you can create any chart or graph you like and can be use as simple visualization as long as the data speed is not very fast, eg: Heart Beat or ECG.





 I hope you understand and happy Visualizing your favorite music on Excel


Naya Marie Rivera , naya rivera, glee, @nayarivera, missing
Share:

[Tutorial] Menggambar Grafik Data Arduino ke Excel



Sangat jarang saya menulis blog setelah youtube nya duluan saya upload, jadi mungkin terbawa perasaan kehilangan teman yang sering bikin vlog, jadi beberapa hari belakangan saya rajin mengunggah video tutorial. Bahasan yg di tampilkan adalah mengenai cara menulis data dan menampilkan grafik dari Arduino ke microsoft excel, walau diluaran sana sudah ada tools langsung jadi tapi kini saya bahas lebih mudah menggunakan bantuan python / xlwings. Jadi dengan tutorial kali ini maka tidak susah-susah lagi menggunakan mysql+php pada windows (xamp) cukup excel aja.




Sensor sejuta umat DHT11 mungkin paling sering dibahas dimana-mana termasuk pada blog ini dimana untuk DHT11 vs MQTT sudah pernah saya bahas di :http://www.aisi555.com/2019/10/iot-lebih-lanjut-dengan-mqtt.html , jadi kali ini saya anggap pembaca sudah paham cara mengirim data MQTT nya. Kita akan lebih ke library python nya yang saya gunakan yaitu XLWINGS.



import xlwings as xw   #library

wb = xw.Book('Book1.xlsx') #nama file excel
sht = wb.sheets['coba']  #nama sheets

sht.range('C1').value= 10
sht.range('C2:C10').value='aku menulis'


for x in range(1,50): 
    a='A'+str(x)
    b='B'+str(x)
    sht.range(a).value= x*3
    sht.range(b).value= x*2

Sangat jelas dan singkat script python diatas jadi tidak perlu dibahas lagi dan jika dijalankan hasilnya akan seperti berikut:


xlwings merupakan library paling bagus menurut saya kalau dilihat dari segi metode penulisannya yang langsung saat excel terbuka, jadi sangat cocok untuk menampilkan grafik realtime dari pengukuran DHT11. Script dari wemos-esp8266-wifi-mqtt yang saya gunakan seperti berikut :

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"

const char *ssid =  "myIOT";  //ubah sesuai wifi anda
const char *pass =  "selaluterhubung";  
//broker gratisan hivemq.com
const char *mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;
const char *mqtt_user = "";
const char *mqtt_pass = "";
const char *mqtt_client_name = "ahocool445566"; 
//inisialisasi DHT
#define DHTPIN 5
#define DHTTYPE DHT11
  
DHT dht(DHTPIN, DHTTYPE); 

WiFiClient wclient;
PubSubClient client(wclient);

#define TOPIKDHT "/test/dht11" //topik yang digunakan


//koneksi wifi
void setupwifi()
{
   if (WiFi.status() != WL_CONNECTED) {
    Serial.print("Connecting to Wifi:  ");
    Serial.print(ssid);
    Serial.println("...");
    WiFi.begin(ssid, pass);

    if (WiFi.waitForConnectResult() != WL_CONNECTED)
      return;
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
  }
}

void setup() {
Serial.begin(9600); //serial monitoring
setupwifi();
client.setServer(mqtt_server, mqtt_port); // server mqtt
dht.begin();  //mulai dht

}

void kirim(String kata) //publish ke topik
{

    Serial.println("publish to topic: " );
    Serial.print(TOPIKDHT);
    Serial.print(" : ");
    Serial.println(kata);
    char message_buff[kata.length() + 1];
    kata.toCharArray(message_buff, kata.length() + 1);
    client.publish(TOPIKDHT,message_buff);
  
}

void reconnectmqtt() //konek mqtt lagi jika putus
{

      Serial.println("Connecting to MQTT server..");
     
      if (client.connect(mqtt_client_name,mqtt_user, mqtt_pass)) {
        Serial.println("Connected to MQTT server");
      } else {
        Serial.println("Could not connect to MQTT server");   
      }
   
}


void loop() {

  if (!client.connected()) //cek koneksi mqtt
   {
    reconnectmqtt();
   }
 //baca suhu dan kelembaban
  float h = dht.readHumidity();
  float t = dht.readTemperature();
 
  // Cek jika pembacaan sensor benar lalu kirim
  if (isnan(h) || isnan(t)) {
      Serial.println(F("Failed to read from DHT sensor!"));
  }
  else{
    
  //kirim ke serial monitoring
      Serial.print(F("Humidity: "));
      Serial.print(h);
      Serial.print(F("%  Temperature: "));
      Serial.print(t);
      Serial.print(F("°C "));
  //kirim ke mqtt data "suhu,kelembaban"
      kirim( String(t) + ","+ String(h) );
    }

 delay(5000); //delay pengiriman mqtt
}

Sangat sederhana tujuan script diatas berupa pengiriman ke sebuah TOPIK MQTT yaitu : "/test/dht11" berupa data string "suhu , kelembaban" (contoh :  "30.5,70.00") lalu oleh python akan di subscribe dan jika ada data masuk akan ditulis oleh library python XLWINGS seperti script berikut:


import paho.mqtt.client as mqtt #library mqtt
import xlwings as xw #library menulis excel

wb = xw.Book('Book1.xlsx') #nama book/file excel
sht = wb.sheets['data'] #nama sheets
row = 1
########## menulis ke excel #########
def to_excel(data):
    print(data)
    datae = data.split(",") #bikin list delim koma
    global row  #ini reset row kembali ke 2
    if row == 51:
       row=2 
    else:
      row=row+1 #increment row tiap ada data masuk
    rowsuhu='A'+str(row) #kolom suhu
    rowhumi='B'+str(row) #kolom kelembaban
    sht.range(rowsuhu).value= float(datae[0]) #tulis suhu
    sht.range(rowhumi).value= float(datae[1]) #tulis kelembaban
############ call back pesan mqtt masuk ##########
def on_message(client, userdata, message):
    print("message received " ,str(message.payload.decode("utf-8")))
    print("message topic=",message.topic)
    print("message qos=",message.qos)
    print("message retain flag=",message.retain)
    to_excel(str(message.payload.decode("utf-8"))) #tulis ke excel  
########################################
broker_address="broker.hivemq.com" #broker mqtt
broker_port=1883
broker_user=""
broker_pass=""
print("creating new instance")
client = mqtt.Client("P1") #create new instance
client.on_message=on_message #attach function to callback
client.username_pw_set(broker_user,broker_pass)
print("connecting to broker")
client.connect(broker_address,broker_port) #connect to broker
 #start the loop
print("Subscribing to topic","/test/dht")
client.subscribe("/test/dht11")
client.loop_forever()
Jadi jika kita run script pythonnya dan data kemudian akan ditulis ke excel sehingga grafik terupdate.


Ini cocok digunakan untuk sensor yang jarak jauh dan ingin ditampilkan sebagai monitoring langsung dan karena excel  umum digunakan maka pengaturan tampilannya dapat disesuaikan dengan mudah. Jika alat yang dimonitoring letaknya dekat maka cukup menggunakan serial port dan akan dibahas pada tulisan selanjutnya.




#daring #daringadalah daring adalah mpls #sekolah #guru #google classroom google classroom sekolah online guru kelas zoom webcam 
Share:

Selasa, 09 Juni 2020

[Praktek] 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:

Kontak Penulis



12179018.png (60×60)
+628155737755

HP: 081331339072
Mail : ahocool@gmail.com

Site View

Categories

555 (6) 7 segmen (3) adc (4) amplifier (2) analog (10) android (11) antares (3) arduino (14) attiny (1) attiny2313 (17) blog (1) bluetooth (1) cmos (2) crypto (2) dasar (35) display (3) esp8266 (3) gcc (1) iklan (1) infrared (2) Input Output (3) iot (16) jam (6) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (12) komputer (3) komunikasi (1) kontrol (4) lain-lain (8) lcd (2) led (9) led matrix (6) line tracer (1) lm35 (1) memory (1) metal detector (4) microcontroller (55) mikrokontroller (7) mikrotik (5) ninmedia (1) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (29) pcb (2) praktek (2) project (33) proyek (1) python (1) radio (3) raspberry pi (4) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (1) sharing (3) signage (1) sms (6) software (18) tachometer (2) telepon (7) televisi (58) television (2) transistor (1) troubleshoot (3) tulisan (55) tutorial (78) tvri (1) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3)

Diskusi


kaskus
Forum Hobby Elektronika