Jadwal Waktu Shalat (JWS) 2 & 3 Panel P10 Arduino Uno dengan kontroller Android melalui Bluetooth

Rancangan displai jadwal waktu sholat / JWS menggunakan arduino ini memanfaatkan I2C EEPROM 24C32 sebagai penyimpan data tampilan Infomasi text yang mampu menampung 4096 karakter. Chip 24C32 umumnya disertakan pada modul RTC DS1307 / DS3231 dengan jalur komunikasi yang sama dan alamat yang berbeda. Karena komunikasi I2C dikategorikan lambat, maka akses pembacaan memori ini diminimalisir dengan metode read on demand.

Display Jadwal Sholat Arduino

Perancangan JWS menggunakan Arduino atau JWS dengan kontroller running text harus mampu menangani hal-hal berikut :

  1. Waktu sholat berdasarkan perjalanan matahari yang berubah-ubah sepanjang tahun, sehingga dibutuhkan perhitungan khusus untuk menentukan posisi matahari secara matematis. Formula yang digunakan berasal dari islamicity, dengan penambahan variabel sudut-sudut matahari.
  2. Pengaturan yang komplek namun fleksibel mengharuskan JWS didesain mampu menyesuaikan tugasnya dengan beberapa parameter yang bisa di monitor atau diganti berkala. Seperti adanya kegiatan-kegiatan khusus sehingga JWS bisa beralih fungsi.

Kapasitas memory flash arduino uno (ATMega328) yang 32Kb masih menyisakan ruang untuk 3 set font diamping 1 font angka. Font-font ini berfungsi memberikan efek tulisan sehingga memungkinkan adanya penekanan informasi.

Efek JWS Arduino

Efek-efek tampilan diperlukan supaya kehadiran JWS lebih menghiasi dinding, bukan hanya sebagai papan informasi. efek yang di tambahkan :

  1. Wipe in – wipe out
  2. Marque
  3. Lukis gambar

JWS Bluetooth

Fasilitas pengaturan JWS dengan bluetooth:

  1. 10 teks informasi yang disimpan dalam memory 24C32 yang mampu menyimpan 4096 karakter.
  2. Font informasi bisa diatur terpisah (System Font 5×7,Arial 14,Arial Black 16) pada uno, dan bisa ditambahkan pada board yang memiliki memori lebih besar.
  3. Waktu padam dan nyala.
  4. Perhitungan waktu sholat dengan metode sudut matahari.
  5. Tampilan tanggal hijriah (bisa diatur dan dinonaktifkan).
  6. Efek wipe untuk tampilan waktu-waktu sholat.
  7. Efek tulisan gambar.
  8. Pengaturan bluetooth meliputi kecerahan DMD panel, kecepatan scroll.
  9. Token aplikasi apk, untuk mengantisipasi apabila ada komunikasi bluetooth yang tidak diinginkan yang mungkin akan merubah setting.
  10. Konfirmasi data setting diterima dan waktu padam/nyala ke apk android.
  11. Data yang diketik di apk disimpan dalam database android, jadi saat aplikasi ditutup data yang diketik tetap akan tampil saat aplikasi dibuka kembali.

Komponen yang digunakan dalam JWS Arduino bluetooth:

  1. Arduino Uno (Gunakan Arduino mega untuk memory yang lebih besar).
  2. RTC DS3231 (termasuk 24C32) kompatibel DS1307 (beda address)
  3. Bluetooth HC-05
  4. Panel P10 (2 panel)

Jika ingin upload sketch dari arduino ide, lepaskan dahulu pin ‘0’ / pin RX jika menggunakan bluetooth hardware serial.

Skema arduino JWS bluetooth:

Video bluetooth arduino JWS:

 

JWS Android

Screenshoot JWS Android bluetooth:

JWS bluetooth android ini menggunakan hardware SPI sebagai pengirim data ke running text, meskipun mengorbankan pin 12 (MISO) yang tidak bisa digunakan karena dikontrol oleh SPI.

Pengaturan JWS dengan arduino yang dibutuhkan :

  1. #define modeDemo pada baris atas digunakan jika ingin menjalankan JWS demo, hapus baris ini jika JWS digunakan normal.
  2. Pin Kontrol DMD hardware SPI : pinOE  harus dipasangkan pada pin PWM sebagai pengatur kecerahan. Sedangkan pinA, pinB, dan pinSCK bisa ditempatkan dimana saja.
  3. Jumlah panel.
  4. Perancangan ini dibuat dengan DS3231, jika menggunakan DS1307 harap diganti bagian alamat I2C-nya.
  5. Pin SQW (DS3231) diset sebagai penghasil pulsa dengan frekuensi 1 HZ sebagai interupsi bagi JWS bahwa detik telah berubah. dalam perancangan JWS arduino ini dihubungkan ke pin A3 namun bisa dipindahkan kemana saja.
  6. Jenis font bisa disesuaikan dengan kebutuhan, (#include-kan juga library font-nya). dengan merubah variabel berikut:
    #define fontWaktu               angka6x13
    #define fontInformasi           SystemFont5x7Ramping
    #define fontTanggal             SystemFont5x7Ramping
    #define fontNamaSholat          SystemFont5x7Ramping
    #define fontWaktuSholat         SystemFont5x7Ramping
    #define fontWaktuMasuk          SystemFont5x7Ramping
    #define fontAdzan               SystemFont5x7Ramping
    #define fontIqomah              SystemFont5x7Ramping
    #define fontMatikanHP           Arial14
    
  7. JWS ini dilengkapi sistem token, untuk RTC dan komunikasi bluetooth, apabila token yang digunakan cocok maka perintah untuk RTC dan bluetooth (setting variabel) akan dijalankan.

Sketch/koding header dan setup android bluetooth JWS:

#define modeDemo                0    //<<==================================== DEMO prinsip kerja 0 / 1

#define selisihImsak            10

//defenisi pin
#define pinA                    6
#define pinB                    7
#define pinOE                   9
#define pinSCK                  8

#define alarm                   5
#define RTCDetikIRQ             A3

//variabel Setting
#define jumlahKolomPanel        2  //panel
#define jumlahBarisPanel        1  //panel

#define lamaTampilWaktuSholat   10 // * 100 milidetik
#define lamaTampilInformasiJam  100 // * 100 milidetik

#define fontWaktu               angka6x13
#define fontInformasi           SystemFont5x7Ramping
#define fontTanggal             SystemFont5x7Ramping
#define fontJadwalSholat        SystemFont5x7Ramping
#define fontWaktuSholat         SystemFont5x7Ramping
#define fontWaktuMasuk          SystemFont5x7Ramping
#define fontAdzan               SystemFont5x7Ramping
#define fontIqomah              SystemFont5x7Ramping
#define fontMatikanHP           Arial14

#define RTC_ADDRESS             0x68
#define I2CEEPROM_ADDRESS       0x57  //Perhatikan alamat I2CEEPROM 0x50(ds1307 .. 0x57(ds3231)
#define RTC_CONTROL_REG         0x0E  //0x07 ds1307, 0x0E ds3231 


#include <Wire.h>
#include <SPI.h>
#include <avr/sleep.h>
#include <avr/pgmspace.h>
#include <EEPROM.h>
#include <SoftwareSerial.h>

#include <DMD2.h>

#include "fungsi.h"
#include "definisi.h"
#include "konstanta.h"
#include "rtc.h"
#include "prayer.h"
#include "i2cUmum.h"
#include "trigonometri.h"

#include <fonts/SystemFont5x7Ramping.h>
#include <fonts/Arial14.h>
#include <fonts/Arial_Black_16.h>
#include <fonts/angka6x13.h>
#include <fonts/AllahMuhammad.h>

const uint16_t alamatFont[] = {&SystemFont5x7Ramping, &Arial14, &Arial_Black_16};

struct Setting
{
  int8_t koreksiHijriah;
  int8_t jumlahAlarm;
  int8_t lamaAdzan;
  int8_t lamaIqomah[5];
  int8_t ulangMatikanHP;
  int8_t lamaSholat[5];
  int8_t lamaSholatJumat;
  int8_t kecepatanJalanInfoText;
  int8_t kecerahanJWS;
  int8_t padamJam;
  int8_t padamMenit;
  int8_t nyalaJam;
  int8_t nyalaMenit;
  int8_t tampilanHijriah;
  int8_t tampilanImsak;
  int8_t tampilanTerbit;
  int8_t tampilanDhuha;
  int8_t tampilanTerbenam;
  int8_t JumlahInfoTextAktif;
};

#if modeDemo
  Setting setting = {0, 5, 1, {5, 5, 5, 5, 5}, 1, {5, 5, 5, 5, 5}, 2, 50, 20, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1};
  char namaMesjid[panjangString] = "Musholla ...\0   ";
#else
  Setting setting;
  char namaMesjid[panjangString];
#endif

//variabel
const char strWaktu[] PROGMEM = "Waktu";
const char strSholat[] PROGMEM = "Sholat";
char strWaktuInformasi[9];
JamDanMenit waktuSholat[9];

EfekMarqueHorizontalkeKiri marqueKiri;
EfekTulis efekTulis;
uint8_t efekScrollOutDanWipeIn;

uint8_t marqueOut;
bool marqueTampilan;
uint8_t wipeInTampilan;
uint8_t wipeOutTampilan;
uint8_t efekTulisTampilan;


uint8_t indexNamaSholat;
uint16_t hitungMundurSholat;
uint16_t hitungMundurPesanSebelumSholat;
uint16_t hitungMundurIqomah;
uint16_t hitungMundurAdzan;
uint8_t hitungMundurAlarm;
uint16_t hitungMudurAlarmIqomah;

byte modeOperasi;
byte modeOperasiSebelumnya;

uint8_t menitSebelumnya = 60;
uint8_t hariSebelumnya = 32;

bool statusAlarm;

bool tampilkanMenit;
bool infoWaktu;
byte infoWaktuTop;
uint16_t lamaTampil = 0;
uint16_t indekTampilan;

char textWaktuJam[6];
char textTanggalHijriah[sizeof(strNamaHari[0]) + 2 + 3 + sizeof(strNamaBulanHijriah[0]) + 3 - 2];

uint8_t bluetoothData[32];
uint16_t indexParseSerial = 0;

byte indexInformasi = 1;
long mulaiMillis;
uint16_t AlamatI2CEEPROM;

int8_t indexSetting = 0;
byte indexSettingInfo;
bool tokenValid = false;
bool RTCValid = true;

byte tanggalHijriah;
byte bulanHijriah;
uint16_t tahunHijriah;

uint16_t AlamatI2CEEPROMSebelumnya;
bool nextEEPROMData = false;
byte EEPROMDataCounter;

bool modeSambungSebelumnya = false;

tanggalDanWaktu now;
tanggalDanWaktu settingWaktu;
byte settingWaktuIndex;

//Class variabel
#define l jumlahKolomPanel * 32
#define t jumlahBarisPanel * 16
SPIDMD dmd(jumlahKolomPanel, jumlahBarisPanel, pinOE, pinA, pinB, pinSCK);
DMDFrame dmdEfek(l, t);

DMD_TextBox boxKolom1(dmd, 0, 0, l / 2, t);
DMD_TextBox boxKolom2(dmd, l / 2, 0, l / 2, t);
DMD_TextBox boxBaris1(dmd, 0, 0, l, (t / 2) - 1);
DMD_TextBox boxBaris2(dmd, 0, t / 2, l, t / 2);

DMD_TextBox boxKolom2Baris1(dmd, l / 2, 0, l / 2, t / 2);
DMD_TextBox boxKolom2Baris2(dmd, l / 2, t / 2, l / 2, t / 2);

//Eeprom24C32_64 I2CEEPROM(EEPROM_ADDRESS);
HardwareSerial *bluetooth;

#define tokenRTC 0xA9
#define tokenBluetooth 0x4C
#define tokenSetInformasi "225654"
#define tokenSetSetting "963215"

void setup() {
  Serial.begin(9600);
  Serial.println("JWS Bluetooth");
  Serial.println("https://www.project.semesin.com/");
  Serial.println();

  bluetooth = &Serial;

  pinMode(alarm, OUTPUT);
  pinMode(RTCDetikIRQ, INPUT_PULLUP);

  //Interupsi setiap 1 detik
  Wire.begin();
  Wire.beginTransmission(RTC_ADDRESS);
  Wire.write(RTC_CONTROL_REG);
  Wire.write(0x00);//SQW freq, 1Hz
  Wire.endTransmission();

#if modeDemo
  prayerData = { -1576, 27343, 1792, 5120, 213, -1152, 1024, 4608, 0, 0, 0,0,0};
  settingWaktu = {50, 29, 4, 5, 7, 5, 2018};
  simpanRTC(RTC_ADDRESS, settingWaktu);
#endif

  if (EEPROM.read(alamatTokenRTC) != tokenRTC)
  {
    //Waktu compiler
    char Month[12];
    int Day, Year;
    uint8_t monthIndex;
    int Hour, Min, Sec;
    char *monthName[12] = {
      "Jan", "Feb", "Mar", "Apr", "May", "Jun",
      "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
    };
    sscanf(__TIME__, "%d:%d:%d", &Hour, &Min, &Sec);
    sscanf(__DATE__, "%s %d %d", Month, &Day, &Year);
    for (monthIndex = 0; monthIndex < 12; monthIndex++) {
      if (strcmp(Month, monthName[monthIndex]) == 0) break;
    }
    uint8_t wday = hariDariTanggal(Day, monthIndex + 1, Year);
    settingWaktu = {Sec, Min, Hour, wday, Day, monthIndex + 1, Year};
    simpanRTC(RTC_ADDRESS, settingWaktu);
    EEPROM.write(alamatTokenRTC, tokenRTC);
  }

#if !modeDemo
  if (EEPROM.read(alamatTokenBluetooth) == tokenBluetooth)
  {
    ambilSetting();
  }
#endif
  ambilHijriah();
  dmd.begin();

  set_sleep_mode(SLEEP_MODE_IDLE);
  sleep_enable();

  mulaiMillis = millis();
  modeOperasi = tampilWaktuSholat;

  while (!digitalRead(RTCDetikIRQ));
}

 

File-file yang digunakan dalam JWS android :

  1. definisi.h
  2. fungsi.h
  3. i2cUmum.h
  4. JWS_Semesin.ino
  5. konstanta.h
  6. prayer.h
  7. rtc.h
  8. trigonometri.h
  9. JWS_Bluetooth.apk
  10. file lengkap (.zip)

Rekomendasi Perakitan JWS Bluetooth Android:

  1. unzip JWS Bluetooth + apk – Semesin.zip (adalah folder sketch arduino beserta file pendukung dalam satu folder)
  2. copy isi folder libraries ke Document/Arduino/libraries/
  3. Buka JWS_Semesin.ino dengan arduino IDE (pengujian dengan versi 1.8.5)
  4. Lepas tx Bluetooth
  5. Upload ke arduino
  6. Hubungkan tx Bluetooth
  7. Buka app JWS Bluetooth klik setting dan kirim pengaturan
  8. Selesai.

antisipasi masalah:

  1. Data EEPROM sebelumnya mungkin berpengaruh pada settingan, set dengan apk via bluetooth atau hapus dahulu dengan examples->EEPROM->eeprom_clear.
  2. #define modeDemo 1 untuk test / 0 untuk running
  3. Pastikan daya mencukupi (kalo tidak punya 5V > 5A hubungkan saja GND DMD ke GND Arduino tapi tidak Vcc +5V-nya)

nb: V1.0 -> Versi2.0

  1. Karakter informasi yang akan ditampilkan langsung diambil dari I2CEEPROM
  2. Penambahan pengaturan sudut-sudut waktu sholat.
  3. Penambahan efek grafis

catatan:

  • koordinat dalam mode derajat-menit –±dd° mm’–(menit = pecahan derajat*60/100)
    contohnya :
    lintang -6.78 -> -6-46′
    bujur 110.38 -> 110-22′
  • jika koordinat sudah sesuai, namun masih ada perbedaan waktu dengan jadwal yang diinginkan (mis: jadwal depag), maka geser bujur (ditambah/dikurang)
  • Jika sebagian jadwal shalat tidak akurat, maka geser derajat masing-masing jadwal shalat yang belum akurat
  • JWS ini belum menggunakan ikhtiyath, untuk mengantisipasinya bisa dengan menggeser derajat-menit bujur ±2 menit)

Hasil percobaan

by: Priadi Amfi

Hasil percobaan

by: Catur cahya

Hasil percobaan

by: Ochoy Thea

Prototipe pengkondisi suhu ruangan dengan perintah SMS

Prototipe ini merupakan aplikasi pengkondisi suhu ruangan kandang ayam berbasis SMS gateway/SMS server.

Kelebihan:

  1. Profil kondisi untuk ayam kecil, sedang dan besar.
  2. Mengeluarkan suara terjadwal anti stress bagi ayam
  3. Monitoring melalui SMS
  4. Pengaturan melalui SMS

Kelengkapan:

  1. Arduino Mega 2560
  2. Modem Wavecom fastrack supreme 10
  3. modul RTC DS1307
  4. DHT 11
  5. Modul max232
  6. Kipas 12v
  7. Elemen pemanas
  8. Relay 1 channel

link album: Galeri pengkondisi suhu ruangan

Timbangan beras otomatis dengan arduino

Timbangan beras digital ini merupakan timbangan beras pintar yang akan memberitahukan kapasitas beras tersisa dalam silo/tampungan beras ke apk Android melalui bluetooth sehingga pengguna dapat mengatur ketersiaan stok beras dengan mudah. Disamping itu timbangan beras berbasis arduino ini juga akan mengingatkan pengguna melalui suara apabila beras hampir habis.

Memiliki dua timbangan yaitu timbangan beras di silo dan timbangan beras yang akan dikeluarkan melalui slot beras. Beras yang ingin diambil dapat dipilih melalui panel keypad 1.000gr hingga 10.000 gram. Jika slot beras telah terisi sesuai berat yang diminta perangkat akan mengeluarkan peringatan melalui suara.

album : Galeri timbangan beras arduino android

running text anti flicker (improved DMD) dengan arduino

DMD (dot matrix display) yang dikontrol dengan arduino dengan segala keterbatasannya memiliki permasalahan saat panel DMD disusun dalam lebih dari 4 panel. Flicker terjadi karena proses pengiriman data serial dari arduino harus mengantri sekian lama sehingga pergantian aktifasi baris per baris tertangkap oleh mata seperti berayun (berkedip) dan tentu membuat mata tidak nyaman.

Untuk itu saya melakukan improvisasi terhadap library arduino –DMD2– dengan prinsip kerja satu clock untuk lebih dari satu baris. contohnya untuk ukuran panel 4 kolom 2 baris kelompok DMD dibagi menjadi 2 bagian (baris 1 dan baris 2) dengan entri data yang sama setiap clock-nya.

Kelebihan alat DMD2 arduino:

  1. Sensor DHT11 untuk memantau keadaan suhu dan kelembaban sekitar
  2. Database waktu sholat 5 waktu (statis) dan dilengkapi buzzer yang menandakan waktu sholat telah masuk.

 

Komponen yang dibutuhkan :

  1. 8 Panel P10
  2. Arduino Mega 2560
  3. RTC DS1307
  4. DHT11
  5. Buzzer

DS1307 dapat diganti dengan DS3231 untuk keperluan presisi RTC.

berikut skema-nya :

berserta sketch atau program nya:

 

#include <DMD2.h>
#include <fonts/SystemFont5x7.h>
#include <fonts/Arial14.h>
#include <TimeLib.h>
#include <DS1307RTC.h>
#include "DHT.h"

byte DataPins[2] = {33, 35}; //pin jalur out
SoftDMD dmd(4, 2, 23, 25, 27, 31, 29, 2, DataPins); //kolom, baris, OE, A, B, SCK, CLK, jumlah jalur out, pin jalur out
//SoftDMD dmd(4,2,23,25,27,31,29,33); //standard

DMD_TextBox box(dmd, 0, 0, 78, 32);

DHT dht(A0, DHT11);
String namaSholat[] = {"  Subuh", "  Zuhur", "   Asar", " Maghrib", "   Isya"};
byte waktuSholat[][2] = {{5, 12},
                        {12, 32},
                        {15, 45},
                        {18, 35},
                        {19, 44}
};

#define waktunyaSholat 1
#define pesanSMS 2

int n = 123;
byte lastSecond = 60;
byte lastDay = 32;
byte lastH = 60;
byte lastT = 32;
String Sholat;
String pesanDisplay;
byte pesan;
int buzzer = 8;
bool buzz;
byte buzzCounter;

void setup() {
  Serial.begin(9600);
  Serial.println("Running text dengan Arduino bebas kedip");
  Serial.println("https://www.project.semesin.com");
  dht.begin();
  dmd.setBrightness(255);
  dmd.begin();

  pesan = pesanSMS;
  pesanDisplay = "  Selamat\n  datang";
  dmd.selectFont(Arial14);
  box.print(pesanDisplay);
}

void loop()
{
  tmElements_t tm;
  byte h = (byte)dht.readHumidity();
  byte t = (byte)dht.readTemperature();
  RTC.read(tm);

  if (pesan == waktunyaSholat)
  {
    buzzCounter++;
    if (!(buzzCounter % 32))
    {
      buzz = !buzz;
      digitalWrite(buzzer, buzz);
      pinMode(buzzer, OUTPUT);
    }
  }

  if (tm.Second != lastSecond)
  {
    String waktu = "";
    if (tm.Hour < 10)
      waktu += "0";
    waktu += tm.Hour;
    waktu += ":";
    if (tm.Minute < 10)
      waktu += "0";
    waktu += tm.Minute;
    waktu += ":";
    if (tm.Second < 10)
      waktu += "0";
    waktu += tm.Second;
    lastSecond = tm.Second;

    dmd.selectFont(SystemFont5x7);
    dmd.drawString(80, 0, waktu);

    if ((pesan == waktunyaSholat) && (tm.Second >= 58))
    {
      box.clear();
      dmd.selectFont(Arial14);
      box.print(pesanDisplay);
      pesan = pesanSMS;
      digitalWrite(buzzer, LOW);
    }
    else if (tm.Second <= 1)
    {
      for (byte i = 0; i < 5; i++)
      {
        if ((waktuSholat[i][0] == tm.Hour) && (waktuSholat[i][1] == tm.Minute))
        {
          Sholat = namaSholat[i];
          box.clear();
          dmd.selectFont(Arial14);
          box.println("  Sholat");
          box.print(Sholat);
          pesan = waktunyaSholat;
        }
      }
    }
  }
  if (tm.Day != lastDay)
  {
    String tanggal = "";
    if (tm.Day < 10)
      tanggal += "0";
    tanggal += tm.Day;
    tanggal += "/";
    if (tm.Month < 10)
      tanggal += "0";
    tanggal += tm.Month;
    tanggal += "/";
    if (tmYearToCalendar(tm.Year) < 10)
      tanggal += "0";
    tanggal += tmYearToCalendar(tm.Year);
    lastDay = tm.Day;

    dmd.selectFont(SystemFont5x7);
    dmd.drawString(80, 8, tanggal);
  }
  if ((h != lastH) || (t != lastT))
  {
    String suhu = "";
    if (t < 10)
      suhu += "0";
    suhu += t;
    suhu += "'C ";
    if (h < 10)
      suhu += "0";
    suhu += h;
    suhu += "%";

    lastT = t;
    lastH = h;

    dmd.selectFont(SystemFont5x7);
    dmd.drawString(80, 16, suhu);
  }
}

dokumentasi Galeri DMD arduino anti flicker

Library yang sudah dimodifikasi: DMD-GL

Jika menginginkan jadwal sholat yang dinamis (waktu matahari) bisa menggunakan library “PrayerTimes.h”.

Timbangan digital presisi dan lcd pabrikan dengan arduino

dalam projek msin timbangan otomatis ini saya memanfatkan timbangan digital merk Quattro yang sudah tidak berfungsi normal. Fokus proyek ini adalah untuk memanfatkan Sensor berat/loadcell yang presisi dan linear serta LCD pabrikannya sehingga timbangan bisa dimanfatkan kembali.

komponen yang digunakan:

  1. Arduino Uno
  2. Loadcell
  3. HX711
  4. LCD pabrikan (driver HT1621)

Diagram:

Loadcell

Loadcell atau sensor berat pada perangkat quttro yang digunakan memiliki ukuran lebih besar dari loadcell yang ada dipasaran namun memiliki kesamaan cara kerja dan pengkabelan, kabel terdiri dari empat warna yaitu merah – E+, hitam – E-,  putih – A/B+ dan hijau – A/B-.

HX711

komponen (modul) ini berfungsi sebagai ADC – analog to digital converter 24 bit yang akan mengkonversi nilai resistansi dari jembatan Wheatstone menjadi nilai yang berbanding lurus dengan berat benda yang ditimbang

LCD pabrikan

LCD yang digunakan merupakan bawaan perangkat timbangan quattro yang khusus dipakai untuk jenis timbangan ini saja. karakter Terdiri dari 6 digit seven segmen, 3 digit character segmen (seperti seven segmen digabung dengan garis diagonal), 10 bar/garis penanda berat, dan tampilan penunjuk lainnya.

LCD ini dikontrol oleh driver HT1621 dengan 4 jalur input, saya hanya menggunakan 3 saja yaitu CS, WR dan Data. sedangkan  untuk tampilannya saya hanya menggunakan 6 seven segmen dan 2 character segment untk text “Gr”.

 

Skema:

program/sketch:

#include "HX711.h"

HX711 scale(8,9);

#define jumlahSegmen 15
 
//Command
#define  ComMode	0x52
#define  RCosc	  0x30
#define  LCD_on	 0x06
#define  LCD_off	0x04  
#define  Sys_en	 0x02
#define  CTRl_cmd   0x80  
#define  Data_cmd   0xa0  

//pin
int CS = A3;
int WR = A1;
int Data = A0;
int backLight = 7;
int buttonESC = 5;
int buttonPCS = 4;
int buttonUNIT = 3;
int buttonTARE = 6;
int buttonZERO = 2;

byte angka[] = {0xBE, 0x06, 0x7C, 0x5E, 0xC6, 0xDA, 0xF2, 0x0E, 0xFE, 0xCE};
byte byteArrayBerat[8];
byte strBerat[6];
 
void SendBit_1621(byte sdata,byte cnt)
{ 
  for(byte i=0;i<cnt;i++) 
  { 
	digitalWrite(WR, LOW);
	
	if(sdata&0x80) 
	  digitalWrite(Data, HIGH); 
	else 
	  digitalWrite(Data, LOW);
	  
	digitalWrite(WR, HIGH);
	sdata<<=1; 
  } 
}
 
void SendCmd_1621(byte command) 
{ 
  digitalWrite(CS, LOW); 
  SendBit_1621(0x80,4);  
  SendBit_1621(command,8); 
  digitalWrite(CS, HIGH);					 
}
 
void Write_1621(byte addr,byte sdata)
{ 
  addr<<=3; 
 digitalWrite(CS, LOW); 
 SendBit_1621(0xa0,3);	 
 SendBit_1621(addr,6);	 
 SendBit_1621(sdata,8);   
 digitalWrite(CS, HIGH); 
} 

void doubleToDecArray(double value, byte *byteArray)
{
  double divider = 1000.0;
  for(byte i=0;i<8;i++)
  {
	byte divValue = value / divider;
	byteArray[i] = divValue;
	value = value - (divValue * divider);
	divider /= 10;
  }
}

void setup() {
  pinMode(CS, OUTPUT);
  pinMode(WR, OUTPUT);
  pinMode(Data, OUTPUT);
  pinMode(backLight, OUTPUT);
  pinMode(buttonESC, INPUT_PULLUP);
  pinMode(buttonPCS, INPUT_PULLUP);
  pinMode(buttonUNIT, INPUT_PULLUP);
  pinMode(buttonTARE, INPUT_PULLUP);
  pinMode(buttonZERO, INPUT_PULLUP);

  digitalWrite(backLight,LOW);
  digitalWrite(CS, HIGH);
  digitalWrite(Data, HIGH);
  digitalWrite(WR, HIGH);

  Serial.begin(9600);
  Serial.println("Timbangan Arduino");
  Serial.println("https://www.project.semesin.com");
  
  delay(50);
  SendCmd_1621(Sys_en);
  SendCmd_1621(RCosc);	
  SendCmd_1621(ComMode);  
  SendCmd_1621(LCD_on);

  for(byte i=0;i<jumlahSegmen;i++) 
  {
	Write_1621(i,0xff); 
  } 
  delay(1000);
  for(byte i=0;i<jumlahSegmen;i++) 
  {
	Write_1621(i,0x00); 
  } 
  Write_1621(6,0x85);// huruf 'G'
  Write_1621(7,0xA6);
  Write_1621(10,0x02);//Huruf 'r'
  Write_1621(11,0x40);

  scale.set_scale(2280.f);
  scale.tare();
  }
 
void loop() {

  double Berat = scale.get_units(10);
  Serial.println(Berat);
  
  bool getNum = false;
  byte numPointer = 0;
  byte numCounter = 0;
  
  if(Berat < 0)
  {
	Berat = 0;
  }
  else
  {
	doubleToDecArray(Berat, byteArrayBerat);
	for(byte i=0;i<8;i++)
	{
	  if(byteArrayBerat[i] != 0)
	  {
		getNum = true;
	  }
	  if(getNum)
	  {
		numCounter++;
		strBerat[numPointer] = angka[byteArrayBerat[i]];
		if(i==3)
		{
		  strBerat[numPointer] |= 0x01;//Koma
		}
		if(numPointer++ == 6)
		{
			numCounter--;
			break; 
		}
	  }
	  else if(i==3)
	  {
		getNum = true;
		strBerat[numPointer++] = angka[0] | 0x01;
	  }
	}
	byte j=0;
	for(int8_t i=0;i<6-numCounter;i++)
	{
	  Write_1621(i,0x00); 
	}
	for(byte i=6-numCounter;i<6;i++)
	{
	  Write_1621(i,strBerat[j++]); 
	}
  }

  if(!digitalRead(buttonTARE))
  {
	delay(200);
	if(!digitalRead(buttonTARE))
	{
	  scale.tare();
	  while(!digitalRead(buttonTARE));
	}
  }
  delay(50);
}

Fitur-fitur modul HX711:

  1. Memiliki 2 block differential ADC sehingga bisa dengan gain yang berbeda disesuaikan dengan tingkat presisi yang diinginkan , yang tersedia 32, 64 dan 128.
  2. Memiliki regulator tegangan sendiri untuk loadcell dan ADC.
  3. Interface serial yang disederhanakan.
  4. Frekuensi keluaran dapat diatur 10SPS dan 80sps
  5. Penyaring/filter riak 50Hz dan 60Hz.

Dengan spesifikasi:

  1. Tegangan operasional dc 2.6 ~ 5.5v.
  2. ADC 24 bit yang presisi.
  3. frekuensi Internal clock 11.0592 MHz.
  4. Konsumsi arus, 1500uA (normal), 0,5uA (power down).

dokumentasi Galeri timbangan digital presisi

Library : HX711.zip

Mesin cutting sticker berbasis arduino-HPGL

perancangan Mesin CNC sudah bisa dilakukan sendiri, baik dengan mencontoh beberapa tutorial maupun dengan merancang perangkat dan firmwarenya sendiri.

Seperti proyek “Arduino Mini CNC Plotter Machine From Dvd Drives” memanfatkan CDROM bekas sebagai perangkat kerasnya dan GRBL yang tersedia secara bebas sebagai perangkat lunaknya. Namun bagi pemula cukup menyulitkan pada tahap design dan pengaplikasian perangkat tersebut ketika berurusan dengan Gcode.

Gcode merupakan protokol yang canggih dan juga komplek.Untuk mesin-mesin plotter (2.5D) penggunaan gcode tidaklah efisien dikarenakan harus menggunakan aplikasi-aplikasi 3D hanya untuk pekerjaan 2D. Sedangkan protokol HPGL lebih familiar sebagai protokol 2D/ 2.5D yang digunakan pada mesin-mesin plotter/cutting.

Kali ini saya merancang mesin cutting sticker berbasis arduino yang menggunakan perangkat mesin merk Jinka yang sudah tidak berfungsi.

Skema mesin cutting sticker HPGL – arduino

Skema tombol mesin cutting sticker merk jinka tahun tidak diketahui

Daftar komponen

  1. Arduino mega 2560
  2. CNC shield v3
  3. DRV8825 2x
  4. AT45DB161
  5. Motor driver DRV8825
  6. Mesin cutting sticker

Firmware

Untuk firmware berbasis protocol HPGL yang saya kembangkan sendiri (open source). Keunggulan proyek ini terletak pada firmware yang mampu mengontrol perangkat lebih baik dan dapat disesuaikan sesuai kebutuhan. beberapa fitur yang dikembangkan adalah :

  1. Perintah HPGL disimpan dalam dataflash sehingga memungkinkan adanya fitur duplikat (dengan menekan tombol “Duplikat” perangkat akan bekerja menjalankan perintah yang tersimpan dalam dataflash tanpa terkoneksi dengan PC/Laptop)
  2. Dengan menggunakan protokol HPGL, HPGL/2 perangkat ini bisa melaksanakan perintah langsung dari software vektor seperti Coreldraw, AutoCAD, Artcut.
  3. Waktu pengerjaan lebih cepat dengan fitur “precision on demand” (Kecepatan penuh saat pergerakan pen up, dan kecepatan setting saat pen down –proses cutting).

HPGL (Hewlett Packard Graphics Language) adalah sebuah protocol antara PC dan plotter (mesin cetak). Protokol cocok digunakan pada plotter/cutting machine dan mudah dimengerti oleh berbagai mesin bahkan bisa diartikan melalui pembacaan manusia kecuali perintah polygon encode.

Dokumen HPGL : HPGL2-RTL_ReferenceGuide_5961-3526_540pages_Sep96

contoh keluaran dari coreldraw + goldcut driver:
HPGL
IN;IP0,0,1016,1016;SC0,1000,0,1000;SP1;PU0,0;
PD15039,0,15039,25000,0,25000,0,0;PU; …

HPGL/2
BP;IN;SP0;QL100ROPS22205,15354RO90
IP0,0,15353,22204SC0,7799,11279,0ACPA0,0
WU0PW0PP1PP0PE<=UYÀwiÀ;
PM0PE_ý¿¿eqÀ`ý¿¿fqÀ;PE<=UYÀwiÀ;
PM1PM2LTSP1EP…

BP – begin plot
IN – inisialisasi
PU – pen up
PD – pen down
PE – polygon encode
banyak lagi koleksi perintahnya.

Files :

  1. Arduino-hpgl-plotter.ino
  2. HPGL.h
  3. HPGL.cpp
  4. DataFlash.h
  5. DataFlash.cpp
  6. dalam zip Arduino_hpgl_plotter.zip

Driver goldcut_driver

Foto dokumentasi :

Galeri Mesin cutting sticker dengan arduino