Pada tutorial belajar Arduino kali ini akan membahas tentang bagaimana membuat pengembangan dari project aplikasi Arduino pengukur suhu sederhana dengan menggunakan sensor suhu LM35, yang sebelumnya telah dibahas. Pada pengembangan kali ini, akan ditambahkan feature password yang disimpan pada EEPROM. Sebelum melakukan pengukuran, akan diminta untuk memasukkan password terlebih dahulu. Saat pertama kali digunakan, password masih kosong, sehingga akan diminta untuk membuat password baru yang akan disimpan di EEPROM tersebut. Penyimpanan password di EEPROM internal Arduino, dimaksudkan agar password tersebut tetap tersimpan meski catu daya Arduino terputus. Untuk password yang akan digunakan, dimasukkan dengan menggunakan feature komunikasi serial dengan komputer, yakni bisa dengan Serial Monitor pada Arduino IDE.
Bila password pada EEPROM telah tersimpan, maka untuk selanjutnya saat pertama kali menjalankan aplikasi Arduino ini akan diminta password untuk bisa menjalankan aplikasi tersebut. Selama password yang dimasukkan salah, tidak sesuai dengan yang tersimpan di EEPROM, maka akses aplikasi akan ditolak. Bila sesuai dengan password yang tersimpan di EEPROM, baru aplikasi dapat dijalankan. Setelah aplikasi dijalankan, data pembacaan suhu dapat ditampilkan di Serial Monitor Arduino IDE, atau optional dapat juga ditampilkan pada LCD.
Wiring Diagram
Sebelumnya perlu dilakukan pemetaan konfigurasi wiring diagram. Hal ini ditujukan agar pin yang digunakan pada source code (sketch) dan wiring diagram sesuai. Berikut ini ialah wiring diagram yang digunakan antara board Arduino Uno dengan sensor suhu LM 35, sekaligus feature optional LCD.
Berdasarkan gambar wiring diagram tersebut.
- LCD RS pin dihubungkan ke digital pin 12
- LCD Enable pin dihubungkan ke digital pin 11
- LCD D4 pin dihubungkan ke digital pin 5
- LCD D5 pin dihubungkan ke digital pin 4
- LCD D6 pin dihubungkan ke digital pin 3
- LCD D7 pin dihubungkan ke digital pin 2
- Vout LM35 dihubungkan ke analog pin A0
Source Code
Berikut ini adalah source code (sketch) Arduino, aplikasi pengukur suhu dengan LM35 dengan password pada EEPROM.
/*
Program aplikasi pengukur suhu
Arduino LM35 password EEPROM
Loki Lang
*/
#include <EEPROM.h>
#include <LiquidCrystal.h>
LiquidCrystal lang(12, 11, 5, 4, 3, 2);
const int EEPROM_MIN_ADDR = 0;
const int EEPROM_MAX_ADDR = 511;
boolean eeprom_is_addr_ok(int addr)
{
return((addr >= EEPROM_MIN_ADDR) && (addr <= EEPROM_MAX_ADDR));
}
boolean eeprom_write_bytes(int startAddr, const byte* array, int numBytes)
{
int i;
if(!eeprom_is_addr_ok(startAddr) || !eeprom_is_addr_ok(startAddr + numBytes))
{
return false;
}
for(i = 0; i < numBytes; i++)
{
EEPROM.write(startAddr + i, array[i]);
}
return true;
}
boolean eeprom_write_string(int addr, const char* string)
{
int numBytes;
numBytes = strlen(string) + 1;
return eeprom_write_bytes(addr, (const byte*)string, numBytes);
}
boolean eeprom_read_string(int addr, char* buffer, int bufSize)
{
byte ch;
int bytesRead;
if(!eeprom_is_addr_ok(addr))
{
return false;
}
if(bufSize == 0)
{
return false;
}
if(bufSize == 1)
{
buffer[0] = 0;
return true;
}
bytesRead = 0;
ch = EEPROM.read(addr + bytesRead);
buffer[bytesRead] = ch;
bytesRead++;
while( (ch != 0x00) && (bytesRead < bufSize) && ((addr + bytesRead) <= EEPROM_MAX_ADDR) )
{
ch = EEPROM.read(addr + bytesRead);
buffer[bytesRead] = ch;
bytesRead++;
}
if((ch != 0x00) && (bytesRead >= 1))
{
buffer[bytesRead - 1] = 0;
}
return true;
}
const int BUFSIZE = 15;
char buf[BUFSIZE];
String langString;
char langStringChar[BUFSIZE];
String langPassword;
char langPasswordChar[BUFSIZE];
void setup()
{
Serial.begin(9600);
pinMode(A0, INPUT);
lang.begin(16,2);
lang.clear();
while(EEPROM.read(0) == 0)
{
Serial.println("Data password masih kosong");
Serial.println("Masukkan password baru:");
langString = Serial.readString();
Serial.println("");
Serial.println("Menyimpan password");
langString.toCharArray(langStringChar, BUFSIZE);
strcpy(buf, langStringChar);
eeprom_write_string(0, buf);
delay(2000);
}
Serial.print("Selamat datang");
delay(2000);
Serial.println("Masukkan password:");
langPassword = Serial.readString();
langPassword.toCharArray(langPasswordChar, BUFSIZE);
strcpy(buf, langPasswordChar);
eeprom_write_string(1, buf);
checkPassword();
}
void loop()
{
int valADC;
valADC = analogRead(A0);
delay(10);
float temp;
temp = valADC*5;
temp *= 100;
temp /= 1023;
Serial.print("Data suhu terbaca ");
Serial.print(temp);
Serial.print(" celsius");
Serial.println("");
lang.setCursor(0,0);
lang.print("Suhu terukur");
lang.setCursor(0,1);
lang.print(temp);
delay(10);
}
void checkPassword()
{
byte data0 = EEPROM.read(0);
byte data1 = EEPROM.read(1);
while(data0 != data1)
{
Serial.println("Password salah");
Serial.println("Masukkan ulang password:");
langPassword = Serial.readString();
langPassword.toCharArray(langPasswordChar, BUFSIZE);
strcpy(buf, langPasswordChar);
eeprom_write_string(1, buf);
byte data1 = EEPROM.read(1);
}
Serial.println("Password benar");
delay(1000);
}
Program aplikasi pengukur suhu
Arduino LM35 password EEPROM
Loki Lang
*/
#include <EEPROM.h>
#include <LiquidCrystal.h>
LiquidCrystal lang(12, 11, 5, 4, 3, 2);
const int EEPROM_MIN_ADDR = 0;
const int EEPROM_MAX_ADDR = 511;
boolean eeprom_is_addr_ok(int addr)
{
return((addr >= EEPROM_MIN_ADDR) && (addr <= EEPROM_MAX_ADDR));
}
boolean eeprom_write_bytes(int startAddr, const byte* array, int numBytes)
{
int i;
if(!eeprom_is_addr_ok(startAddr) || !eeprom_is_addr_ok(startAddr + numBytes))
{
return false;
}
for(i = 0; i < numBytes; i++)
{
EEPROM.write(startAddr + i, array[i]);
}
return true;
}
boolean eeprom_write_string(int addr, const char* string)
{
int numBytes;
numBytes = strlen(string) + 1;
return eeprom_write_bytes(addr, (const byte*)string, numBytes);
}
boolean eeprom_read_string(int addr, char* buffer, int bufSize)
{
byte ch;
int bytesRead;
if(!eeprom_is_addr_ok(addr))
{
return false;
}
if(bufSize == 0)
{
return false;
}
if(bufSize == 1)
{
buffer[0] = 0;
return true;
}
bytesRead = 0;
ch = EEPROM.read(addr + bytesRead);
buffer[bytesRead] = ch;
bytesRead++;
while( (ch != 0x00) && (bytesRead < bufSize) && ((addr + bytesRead) <= EEPROM_MAX_ADDR) )
{
ch = EEPROM.read(addr + bytesRead);
buffer[bytesRead] = ch;
bytesRead++;
}
if((ch != 0x00) && (bytesRead >= 1))
{
buffer[bytesRead - 1] = 0;
}
return true;
}
const int BUFSIZE = 15;
char buf[BUFSIZE];
String langString;
char langStringChar[BUFSIZE];
String langPassword;
char langPasswordChar[BUFSIZE];
void setup()
{
Serial.begin(9600);
pinMode(A0, INPUT);
lang.begin(16,2);
lang.clear();
while(EEPROM.read(0) == 0)
{
Serial.println("Data password masih kosong");
Serial.println("Masukkan password baru:");
langString = Serial.readString();
Serial.println("");
Serial.println("Menyimpan password");
langString.toCharArray(langStringChar, BUFSIZE);
strcpy(buf, langStringChar);
eeprom_write_string(0, buf);
delay(2000);
}
Serial.print("Selamat datang");
delay(2000);
Serial.println("Masukkan password:");
langPassword = Serial.readString();
langPassword.toCharArray(langPasswordChar, BUFSIZE);
strcpy(buf, langPasswordChar);
eeprom_write_string(1, buf);
checkPassword();
}
void loop()
{
int valADC;
valADC = analogRead(A0);
delay(10);
float temp;
temp = valADC*5;
temp *= 100;
temp /= 1023;
Serial.print("Data suhu terbaca ");
Serial.print(temp);
Serial.print(" celsius");
Serial.println("");
lang.setCursor(0,0);
lang.print("Suhu terukur");
lang.setCursor(0,1);
lang.print(temp);
delay(10);
}
void checkPassword()
{
byte data0 = EEPROM.read(0);
byte data1 = EEPROM.read(1);
while(data0 != data1)
{
Serial.println("Password salah");
Serial.println("Masukkan ulang password:");
langPassword = Serial.readString();
langPassword.toCharArray(langPasswordChar, BUFSIZE);
strcpy(buf, langPasswordChar);
eeprom_write_string(1, buf);
byte data1 = EEPROM.read(1);
}
Serial.println("Password benar");
delay(1000);
}
Demikian project Arduino aplikasi pengukur suhu dengan LM35 dengan password yang tersimpan di EEPROM. Project Arduino pengukur suhu dengan password yang tersimpan di EEPROM dan menggunakan komunikasi serial ini, merupakan hasil modifikasi sketch yang ada di Arduino Playground. Berikut link untuk sumber Arduino Playground.