Penjelasan Singkat:
Hai sobat semua, kali ini kita akan membuat sebuah alat yang dapat memonitoring suhu dan menampilkannya pada layar LCD 16x2 dengan waktu dan tanggal yang dapat di atur dengan menggunakan 3 buah tombol. Disini waktu dan tanggal tidak menggunakan modul RTC melainkan memanfaatkan library time.h pada arduino. Berikut penampkannya.
Setelah dilakukan pengujian, nilai suhu yang dihasilkan oleh rangkaian arduino dengan sensor LM35 bisa dikatakan akurat setelah dibandingkan dengan termometer manual. Adapun pin yang digunakan pada arduino adalah sebagai berikut:
Pin Tombol : 2 , 3 dan 4Pin LM35 : A0
Setelah merangkainya keatas papan breadboard maka sobat bisa langsung coba sketch dibawah ini:
Sketch Arduino
// Membuat Jam sederhana menggunakan library time.h
// Menampilkan nilai Suhu menggunakan LM35
// Waktu dan Tanggal tanpa menggunakan RTC
//---------------------------------------------------------------------------------------------------
// Library yang digunakan
//---------------------------------------------------------------------------------------------------
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Time.h>
// Inisialisi library LCD 16x2
//----------------------------------------------------------------------------------------------------
#define I2C_ADDR 0x27
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
// Pendeklarasian pin arduino
//----------------------------------------------------------------------------------------------------
const int pSuhu = A0;
float suhu, data;
char ico_temp;
char *hari[] ={"Kamis ", "Jumat", "Sabtu ", "Minggu ", "Senin ", "Selasa", "Rabu "};
int maxday[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// Animasi Loading
//----------------------------------------------------------------------------------------------------
byte p1[8] = {0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10};
byte p2[8] = {0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18};
byte p3[8] = {0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C};
byte p4[8] = {0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E};
byte p5[8] = {0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F};
byte temp [8] = {B00100,B01010,B01010,B01110,B01110,B11111,B11111,B01110};
int detik = 20;
int menit = 10;
int jam = 01;
int tanggal = 01;
int bulan = 12;
int tahun = 2016;
int blinkState = LOW;
unsigned long timer1;
unsigned long timer2; //update detik1
int curX;
int curY;
int set = 6;
void setup() {
lcd.begin (16,2);
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
lcd.setBacklight(HIGH);
analogReference(INTERNAL); //Jalankan tegangan referensi internal untuk suhu [LM35]
lcd.createChar(ico_temp,temp); //Buat karakter Suhu
// Pin A0[pSuhu],2,3 & 4 jadikan sebagai masukan
//----------------------------------------------
pinMode(pSuhu,INPUT);
pinMode(2,INPUT);
pinMode(3,INPUT);
pinMode(4,INPUT);
// Buat dan Jalankan animasi loding
//--------------------------------------------------------------------------------------------------
lcd.createChar(1, p1);
lcd.createChar(2, p2);
lcd.createChar(3, p3);
lcd.createChar(4, p4);
lcd.createChar(5, p5);
loadanim();
// Tampilkan data waktu dan tanggal pada LCD.
//--------------------------------------------------------------------------------------------------
setTime(jam, menit, detik, tanggal, bulan, tahun);
}
void loop() {
unsigned long currentMillis = millis();
int t1 = digitalRead(2); // Tombol Down
int t2 = digitalRead(3); // Tombol Up
int t3 = digitalRead(4); // Tombol Setting
detik = second();
menit = minute();
jam = hour();
tanggal = day();
bulan = month();
tahun = year();
// Jika tombol Setting di tekan
//------------------------------------
if (t3 == HIGH){
set = set +1;
delay(250);
if (set > 6){
set=0;
}
}
// Setting waktu kedip-kedip
//-------------------------------------
if(currentMillis - timer1 > 300) {
timer1 = currentMillis;
if (blinkState == LOW){
blinkState = HIGH;
}
else {
blinkState = LOW;
}
}
// Setting pada posisi kedap-kedip
//--------------------------------------------------------------------------------------
if (set == 0) //Jika posisi kedip pd tanggal, cek penekanan tombol up & down.
{
curX = 0;
curY = 0;
if (t1 == HIGH){ //Jika tombol up ditekan
tanggal = tanggal +1; //Tanggal tambah dengan 1
delay(100); //Jeda 0,1 detik
if (tanggal > maxday[bulan] ) { //Jika tanggal terakhir
tanggal=1; //Kembali ke tanggal awal
}
}
if (t2 == HIGH){ //Jika tombol down yang ditekan
tanggal = tanggal -1; //Tanggal kurang dengan 1
delay(100); //Jeda 0,1 detik
if (tanggal < 1 ) { //Jika tanggal awal
tanggal=maxday[bulan]; //Kembali ketanggal akhir
}
}
setTime(jam, menit, detik, tanggal, bulan, tahun);
}
if (set == 1) //Jika posisi kedip pd bulan, cek penekanan tombol up & down.
{
curX = 3;
curY = 0;
if (t1 == HIGH) {
bulan = bulan +1;
delay(100);
if (bulan > 12 ) {
bulan=1;
}
}
if (t2 == HIGH) {
bulan = bulan -1;
delay(100);
if (bulan < 1 ) {
bulan=12;
}
}
setTime(jam, menit, detik, tanggal, bulan, tahun);
}
if (set == 2) //Jika posisi kedip pd tahun, cek penekanan tombol up & down.
{
curX = 6;
curY = 0;
if (t1 == HIGH) {
tahun = tahun +1;
delay(100);
if (tahun > 3000 ) {
tahun=2000;
}
}
if (t2 == HIGH){
tahun = tahun -1;
delay(100);
if (tahun < 2000 ) {
tahun=3000;
}
}
setTime(jam, menit, detik, tanggal, bulan, tahun);
}
if (set == 3) { //Jika posisi kedip pd jam, cek penekanan tombol up & down.
curX = 0;
curY = 1;
if (t1 == HIGH){
jam = jam +1;
delay(100);
if (jam > 23 ) {
jam=0;
}
}
if (t2 == HIGH){
jam = jam -1;
delay(100);
if (jam < 0 ) {
jam=23;
}
}
setTime(jam, menit, detik, tanggal, bulan, tahun);
}
if (set == 4) { //Jika posisi kedip pd menit, cek penekanan tombol up & down.
curX = 3;
curY = 1;
if (t1 == HIGH){
menit = menit +1;
delay(100);
if (menit > 59 ) {
menit=0;
}
}
if (t2 == HIGH){
menit = menit -1;
delay(100);
if (menit < 0 ) {
menit=59;
}
}
setTime(jam, menit, detik, tanggal, bulan, tahun);
}
if (set == 5) { //Jika posisi kedip pd detik, cek penekanan tombol up & down.
curX = 6;
curY = 1;
if (t1 == HIGH){
detik = detik +1;
delay(100);
if (detik > 59 ) {
detik=0;
}
}
if (t2 == HIGH){
detik = detik -1;
delay(100);
if (detik < 0 ) {
detik=59;
}
}
setTime(jam, menit, detik, tanggal, bulan, tahun);
}
//Jika kursor tidak pada posisi setting
//-------------------------------------
if (blinkState == LOW) {
if (set != 6){
lcd.setCursor(curX,curY);
lcd.print(" ");
}
}
// Tampilkan Jam Kalender
//------------------------
if (blinkState == HIGH) {
lcd.setCursor(0, 0);
if (tanggal < 10) lcd.print('0');
lcd.print(tanggal);
lcd.print("/");
if (bulan < 10) lcd.print('0');
lcd.print(bulan);
lcd.print("/");
lcd.print(tahun-2000); // Tampilkan tahun dua digit saja
lcd.setCursor(0,1);
if (jam < 10) lcd.print('0');
lcd.print(jam);
lcd.print(":");
if (minute() < 10) lcd.print('0');
lcd.print(menit);
lcd.print(":");
if (second() < 10) lcd.print('0');
lcd.print(detik);
lcd.print(" ");
lcd.setCursor(10, 0);
lcd.print(hari[jumlahhari()%7]); // Tampilkan Hari
lcd.setCursor(10, 1);
}
// End // Tampilkan Jam Kalender
data_suhu(); // Panggil fungsi pengecekan nilai suhu
}
// Digunakan untuk menghitung hari pasaran
//----------------------------------------
int jumlahhari(){
int d= day();
int m= month();
int y= year();
int hb[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
int ht = (y - 1970) * 365 - 1;
int hs = hb[m - 1] + d;
int kab = 0;
int i;
if(y % 4 == 0) {
if(m > 2) {
hs++;
}
}
for(i = 1970; i < y; i++) {
if(i % 4 == 0) {
kab++;
}
}
return (ht + hs + kab);
}
void data_suhu(){
lcd.setCursor(10, 1);
lcd.write(ico_temp); //Custom icon temperatur
//lcd.print(":");
data = analogRead(pSuhu); //Baca nilai tegangan pin A0 = Output LM35
suhu = data / 9.309; //Konversikan nilai tegangan ke Celcius
lcd.setCursor(12, 1);
lcd.print((int)suhu); //Bulatkan nilai Suhu
lcd.print((char)223); //Simbol Derajat
lcd.print("C");
delay(100);
}
// Animasi pada saat loading
//----------------------------------------------------------------------------------------------------
void loadanim(){
lcd.setCursor(5,0);
lcd.print("LOADING");
lcd.setCursor(0,1);
for (int loadbar = 0; loadbar < 16; loadbar++) {
lcd.setCursor(loadbar,1);
lcd.setCursor(loadbar,1);
lcd.write(1);
delay(10);
lcd.setCursor(loadbar,1);
lcd.write(2);
delay(10);
lcd.setCursor(loadbar,1);
lcd.write(3);
delay(10);
lcd.setCursor(loadbar,1);
lcd.write(4);
delay(10);
lcd.setCursor(loadbar,1);
lcd.write(5);
delay(10);
}
delay(800);
lcd.clear();
//----------------------------------------------------------------------------------------------------
}
// Menampilkan nilai Suhu menggunakan LM35
// Waktu dan Tanggal tanpa menggunakan RTC
//---------------------------------------------------------------------------------------------------
// Library yang digunakan
//---------------------------------------------------------------------------------------------------
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Time.h>
// Inisialisi library LCD 16x2
//----------------------------------------------------------------------------------------------------
#define I2C_ADDR 0x27
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
// Pendeklarasian pin arduino
//----------------------------------------------------------------------------------------------------
const int pSuhu = A0;
float suhu, data;
char ico_temp;
char *hari[] ={"Kamis ", "Jumat", "Sabtu ", "Minggu ", "Senin ", "Selasa", "Rabu "};
int maxday[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// Animasi Loading
//----------------------------------------------------------------------------------------------------
byte p1[8] = {0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10};
byte p2[8] = {0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18};
byte p3[8] = {0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C};
byte p4[8] = {0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E};
byte p5[8] = {0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F};
byte temp [8] = {B00100,B01010,B01010,B01110,B01110,B11111,B11111,B01110};
int detik = 20;
int menit = 10;
int jam = 01;
int tanggal = 01;
int bulan = 12;
int tahun = 2016;
int blinkState = LOW;
unsigned long timer1;
unsigned long timer2; //update detik1
int curX;
int curY;
int set = 6;
void setup() {
lcd.begin (16,2);
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
lcd.setBacklight(HIGH);
analogReference(INTERNAL); //Jalankan tegangan referensi internal untuk suhu [LM35]
lcd.createChar(ico_temp,temp); //Buat karakter Suhu
// Pin A0[pSuhu],2,3 & 4 jadikan sebagai masukan
//----------------------------------------------
pinMode(pSuhu,INPUT);
pinMode(2,INPUT);
pinMode(3,INPUT);
pinMode(4,INPUT);
// Buat dan Jalankan animasi loding
//--------------------------------------------------------------------------------------------------
lcd.createChar(1, p1);
lcd.createChar(2, p2);
lcd.createChar(3, p3);
lcd.createChar(4, p4);
lcd.createChar(5, p5);
loadanim();
// Tampilkan data waktu dan tanggal pada LCD.
//--------------------------------------------------------------------------------------------------
setTime(jam, menit, detik, tanggal, bulan, tahun);
}
void loop() {
unsigned long currentMillis = millis();
int t1 = digitalRead(2); // Tombol Down
int t2 = digitalRead(3); // Tombol Up
int t3 = digitalRead(4); // Tombol Setting
detik = second();
menit = minute();
jam = hour();
tanggal = day();
bulan = month();
tahun = year();
// Jika tombol Setting di tekan
//------------------------------------
if (t3 == HIGH){
set = set +1;
delay(250);
if (set > 6){
set=0;
}
}
// Setting waktu kedip-kedip
//-------------------------------------
if(currentMillis - timer1 > 300) {
timer1 = currentMillis;
if (blinkState == LOW){
blinkState = HIGH;
}
else {
blinkState = LOW;
}
}
// Setting pada posisi kedap-kedip
//--------------------------------------------------------------------------------------
if (set == 0) //Jika posisi kedip pd tanggal, cek penekanan tombol up & down.
{
curX = 0;
curY = 0;
if (t1 == HIGH){ //Jika tombol up ditekan
tanggal = tanggal +1; //Tanggal tambah dengan 1
delay(100); //Jeda 0,1 detik
if (tanggal > maxday[bulan] ) { //Jika tanggal terakhir
tanggal=1; //Kembali ke tanggal awal
}
}
if (t2 == HIGH){ //Jika tombol down yang ditekan
tanggal = tanggal -1; //Tanggal kurang dengan 1
delay(100); //Jeda 0,1 detik
if (tanggal < 1 ) { //Jika tanggal awal
tanggal=maxday[bulan]; //Kembali ketanggal akhir
}
}
setTime(jam, menit, detik, tanggal, bulan, tahun);
}
if (set == 1) //Jika posisi kedip pd bulan, cek penekanan tombol up & down.
{
curX = 3;
curY = 0;
if (t1 == HIGH) {
bulan = bulan +1;
delay(100);
if (bulan > 12 ) {
bulan=1;
}
}
if (t2 == HIGH) {
bulan = bulan -1;
delay(100);
if (bulan < 1 ) {
bulan=12;
}
}
setTime(jam, menit, detik, tanggal, bulan, tahun);
}
if (set == 2) //Jika posisi kedip pd tahun, cek penekanan tombol up & down.
{
curX = 6;
curY = 0;
if (t1 == HIGH) {
tahun = tahun +1;
delay(100);
if (tahun > 3000 ) {
tahun=2000;
}
}
if (t2 == HIGH){
tahun = tahun -1;
delay(100);
if (tahun < 2000 ) {
tahun=3000;
}
}
setTime(jam, menit, detik, tanggal, bulan, tahun);
}
if (set == 3) { //Jika posisi kedip pd jam, cek penekanan tombol up & down.
curX = 0;
curY = 1;
if (t1 == HIGH){
jam = jam +1;
delay(100);
if (jam > 23 ) {
jam=0;
}
}
if (t2 == HIGH){
jam = jam -1;
delay(100);
if (jam < 0 ) {
jam=23;
}
}
setTime(jam, menit, detik, tanggal, bulan, tahun);
}
if (set == 4) { //Jika posisi kedip pd menit, cek penekanan tombol up & down.
curX = 3;
curY = 1;
if (t1 == HIGH){
menit = menit +1;
delay(100);
if (menit > 59 ) {
menit=0;
}
}
if (t2 == HIGH){
menit = menit -1;
delay(100);
if (menit < 0 ) {
menit=59;
}
}
setTime(jam, menit, detik, tanggal, bulan, tahun);
}
if (set == 5) { //Jika posisi kedip pd detik, cek penekanan tombol up & down.
curX = 6;
curY = 1;
if (t1 == HIGH){
detik = detik +1;
delay(100);
if (detik > 59 ) {
detik=0;
}
}
if (t2 == HIGH){
detik = detik -1;
delay(100);
if (detik < 0 ) {
detik=59;
}
}
setTime(jam, menit, detik, tanggal, bulan, tahun);
}
//Jika kursor tidak pada posisi setting
//-------------------------------------
if (blinkState == LOW) {
if (set != 6){
lcd.setCursor(curX,curY);
lcd.print(" ");
}
}
// Tampilkan Jam Kalender
//------------------------
if (blinkState == HIGH) {
lcd.setCursor(0, 0);
if (tanggal < 10) lcd.print('0');
lcd.print(tanggal);
lcd.print("/");
if (bulan < 10) lcd.print('0');
lcd.print(bulan);
lcd.print("/");
lcd.print(tahun-2000); // Tampilkan tahun dua digit saja
lcd.setCursor(0,1);
if (jam < 10) lcd.print('0');
lcd.print(jam);
lcd.print(":");
if (minute() < 10) lcd.print('0');
lcd.print(menit);
lcd.print(":");
if (second() < 10) lcd.print('0');
lcd.print(detik);
lcd.print(" ");
lcd.setCursor(10, 0);
lcd.print(hari[jumlahhari()%7]); // Tampilkan Hari
lcd.setCursor(10, 1);
}
// End // Tampilkan Jam Kalender
data_suhu(); // Panggil fungsi pengecekan nilai suhu
}
// Digunakan untuk menghitung hari pasaran
//----------------------------------------
int jumlahhari(){
int d= day();
int m= month();
int y= year();
int hb[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
int ht = (y - 1970) * 365 - 1;
int hs = hb[m - 1] + d;
int kab = 0;
int i;
if(y % 4 == 0) {
if(m > 2) {
hs++;
}
}
for(i = 1970; i < y; i++) {
if(i % 4 == 0) {
kab++;
}
}
return (ht + hs + kab);
}
void data_suhu(){
lcd.setCursor(10, 1);
lcd.write(ico_temp); //Custom icon temperatur
//lcd.print(":");
data = analogRead(pSuhu); //Baca nilai tegangan pin A0 = Output LM35
suhu = data / 9.309; //Konversikan nilai tegangan ke Celcius
lcd.setCursor(12, 1);
lcd.print((int)suhu); //Bulatkan nilai Suhu
lcd.print((char)223); //Simbol Derajat
lcd.print("C");
delay(100);
}
// Animasi pada saat loading
//----------------------------------------------------------------------------------------------------
void loadanim(){
lcd.setCursor(5,0);
lcd.print("LOADING");
lcd.setCursor(0,1);
for (int loadbar = 0; loadbar < 16; loadbar++) {
lcd.setCursor(loadbar,1);
lcd.setCursor(loadbar,1);
lcd.write(1);
delay(10);
lcd.setCursor(loadbar,1);
lcd.write(2);
delay(10);
lcd.setCursor(loadbar,1);
lcd.write(3);
delay(10);
lcd.setCursor(loadbar,1);
lcd.write(4);
delay(10);
lcd.setCursor(loadbar,1);
lcd.write(5);
delay(10);
}
delay(800);
lcd.clear();
//----------------------------------------------------------------------------------------------------
}