• Tidak ada hasil yang ditemukan

Sistem Pengatur Pengisian Tangki Air 2 L Menggunakan Sensor Flow Meter Berbasis Mikrokontoler ATMega8

N/A
N/A
Protected

Academic year: 2017

Membagikan "Sistem Pengatur Pengisian Tangki Air 2 L Menggunakan Sensor Flow Meter Berbasis Mikrokontoler ATMega8"

Copied!
24
0
0

Teks penuh

(1)

Lampiran 1 Program Lengkap

#include <LiquidCrystal.h>// memasukkan ke library

LiquidCrystal lcd(8, 6, 5, A4, A5, 4); // konfigurasi PIN LCD

#define pompa A0 // pompa di PIN a0

#define up A1 // up di PIN A1

#define down 11 // down di PIN 11

#define righ 10 // right di PIN 10

#define left 9 // left di PIN 9

#define ok 12 // ok di PIN 12

int state=0; // membuat variabel pada tipe data interger

float volum=0; // membuat variabel pada tipe data float

char recev; // membuat variabel pada tipe data carakter

byte statusLed = 13; // membuat variabel pada tipe data byte

byte sensorInterrupt = 0;// membuat variabel pada tipe data byte

byte sensorPin = 2;// membuat variabel pada tipe data byte

float calibrationFactor = 4.5; // membuat variabel pada tipe data float dengan nilai

4.5

(2)

float flowRate; // membuat variabel pada tipe data float

unsigned int flowMilliLitres; // membuat variabel pada tipe data interger

float totalMilliLitres; // membuat variabel pada tipe data float

unsigned long oldTime; // membuat variabel pada tipe data float

void setup()

{

lcd.begin(16, 2); // inisialisasi LCD

pinMode(pompa,OUTPUT); // pompa menjadi output

Serial.begin(9600); // inisialisasi serial

pinMode(statusLed, OUTPUT); // statusled menjadi output

digitalWrite(statusLed, HIGH); // statusled menjadi high

pinMode(sensorPin, INPUT); // sensorpin menjadi output

digitalWrite(sensorPin, HIGH); // sensorpin menjadi high

pinMode(up, INPUT); // up menjadi input

pinMode(down, INPUT); //down menjadi input

pinMode(left, INPUT); //left menjadi input

pinMode(righ, INPUT); //right menjadi input

pinMode(ok, INPUT); // ok menjadi input

digitalWrite(up, HIGH); // up menjadi high

(3)

digitalWrite(left, HIGH); //left menjadi high

digitalWrite(righ, HIGH); //right menjadi high

digitalWrite(ok, HIGH); // ok menjadi high

pulseCount = 0; // memberikan 0 pada variabel pulseCount

flowRate = 0.0; // memberikan 0 pada variabel flowRate

flowMilliLitres = 0; // memberikan 0 pada variabel flowMilliLitres

totalMilliLitres = 0; // memberikan 0 pada variabel totalMilliLitres

oldTime = 0; // memberikan 0 pada variabel oldTime

attachInterrupt(sensorInterrupt, pulseCounter, FALLING); // membuat

attachInterrupt

}

void loop()

{

while (state==0)// perulangan selama nilai state 0

{

(4)

lcd.clear(); // menghapus LCD

lcd.setCursor(0,0); // meletakkan posisi karakter pada LCD

lcd.print("Android >>>"); // mencetak karakter android pada LCD

lcd.setCursor(0,1); // meletakkan posisi karakter pada LCD

lcd.print("Manual"); // dicetak Karakter Manual pada LCD

if (digitalRead(down)==0){state=1;} // jika tombol down ditekan maka state

sama dengan 1

if (digitalRead(ok)==0){state=2;delay(200);} // jika tombol ok ditekan maka

state sama dengan 2 dengan delay 200 ms

delay(200); // delay sama dengan 200 ms

}

while (state==1) // perulangan selama nilai state 1

{

digitalWrite(pompa,LOW); // pompa mati

pulseCount = 0; // memberikan 0 pada variabel pulseCount

flowRate = 0.0; // memberikan 0 pada variabel flowRate

flowMilliLitres = 0; // memberikan 0 pada variabel flowMilliLitres

totalMilliLitres = 0; // memberikan 0 pada variabel totalMilliLitres

oldTime = 0; // memberikan 0 pada variabel oldTime

lcd.clear(); // menghapus LCD

(5)

lcd.print("Android"); // dicetak Karakter Android pada LCD

lcd.setCursor(0,1); // meletakkan posisi karakter pada LCD

lcd.print("Manual >>>"); // mencetak karakter Manual pada LCD

if (digitalRead(up)==0){state=0;} // jika tombol up tekan maka state sama

dengan 0

if (digitalRead(ok)==0){state=3;delay(200);} // jika tombol up tekan maka state

sama dengan 3 dengan delay sama dengan 200 ms

delay(300); // delay sama dengan 200 ms

}

while (state==3) // perulangan selama nilai state 3

{

digitalWrite(pompa,LOW); // pompa mati

if (digitalRead(righ)==0){volum+=0.1;} // jika tombol right ditekan maka

volume bertambah

if (digitalRead(left)==0){volum-=0.1;} // jika tombol left ditekan maka volume

berkurang

lcd.setCursor(0,0); // meletakkan posisi karakter pada LCD

lcd.print("Set Volume"); // mencetak karakter Set Volume pada LCD

lcd.setCursor(0,1); // meletakkan posisi karakter pada LCD

lcd.print(volum,1); // mencetak nilai volum pada LCD

if (digitalRead(ok)==0){state=4;delay(200);} // jika ok ditekan maka state sama

dengan 4 dengan delay sama dengan 200 ms

(6)

lcd.clear(); // menghapus LCD

}

while (state==4) // perulangan selama nilai state 4

{

if (totalMilliLitres>=volum) // jika volume yang masuk lebih besar atau sama

dengan

{

digitalWrite(pompa,LOW); // pompa mati

lcd.setCursor(0,0); // mencetak nilai flowrate pada LCD

lcd.print("Debit: "); // mencetak karakter Debit pada LCD

lcd.print(flowRate,3); // mencetak nilai flowrate pada LCD

lcd.print(" L/S"); // mencetak karakter L/S pada LCD

lcd.setCursor(0,1); // meletakkan posisi karakter pada LCD

lcd.print("Vol : "); // mencetak nilai volume pada LCD

lcd.print(totalMilliLitres); // mencetak nilai totalmillitres pada LCD

lcd.print(" L"); // mencetak karakter L pada LCD

if (digitalRead(ok)==0){state=3;delay(300);} // jika ok ditekan maka state 3

dengan delay sama dengan 300 ms

(7)

else{ // jika yang lain

digitalWrite(pompa,HIGH); // pompa menjadi high

if (digitalRead(ok)==0){state=3;delay(300);} // jika ok ditekan maka state 3

dengan delay sama dengan 300

if((millis() - oldTime) > 200){ // timer

detachInterrupt(sensorInterrupt); // menggambil data dari sensorinterrupt

oldTime = millis(); // timer

flowRate = pulseCount; // membaca pulsa

flowRate=flowRate*0.0263/480/2.5*100; // nilai kalibrasi

totalMilliLitres+=flowRate; // menjumlahkan flowrate dengan berulang

selama pompa aktif

unsigned int frac; // membuat variabel pada tipe data interger

lcd.setCursor(0,0); // meletakkan posisi karakter pada LCD

lcd.print("Debit: "); // mencetak karakter Debit pada LCD

lcd.print(flowRate,3); // mencetak nilai flowrate pada LCD

lcd.print(" L/S"); // mencetak karakter L/S pada LCD

lcd.setCursor(0,1); // meletakkan posisi karakter pada LCD

lcd.print("Vol : "); // mencetak nilai volume pada LCD

lcd.print(totalMilliLitres); // mencetak nilai totalmillitres pada LCD

(8)

pulseCount = 0; // memberikan 0 pada variabel pulseCount

attachInterrupt(sensorInterrupt, pulseCounter, FALLING); // membuat

attachInterrupt

}

}

}

while (state==2){ // perulangan selama nilai state 2

digitalWrite(pompa,LOW); // pompa mati

pulseCount = 0; // memberikan 0 pada variabel pulseCount

flowRate = 0.0; // memberikan 0 pada variabel flowRate

flowMilliLitres = 0; // memberikan 0 pada variabel flowMilliLitres

totalMilliLitres = 0; // memberikan 0 pada variabel totalMilliLitres

oldTime = 0; // memberikan 0 pada variabel oldTime

lcd.clear(); // menghapus LD

lcd.setCursor(0,0); // meletakkan posisi karakter pada LCD

lcd.print("Set Volume"); // mencetak karakter Set Volume pada LCD

lcd.setCursor(0,1); // meletakkan posisi karakter pada LCD

(9)

if (Serial.available()){recev= Serial.read(); // kalau serial aktif maka data

diambil dari android

if (recev=='A'){volum+=0.1;} // jika data yang dimasukkan A maka volum

bertambah 1

else if (recev=='B'){volum-=0.1;} // jika data yang dimasukkan B maka volum

berkurang 1

else if (recev=='Z'){state=5;} // jika data yang dimasukkan A maka state sama

dengan 5

}

Serial.print("*F"); // mengirim data ke android

Serial.print(volum); // mengirim data ke android

Serial.print("*"); // mengirim data ke android

Serial.print("*G"); // mengirim data ke android

Serial.print(totalMilliLitres); // mencetak nilai totalmillitres pada LCD

Serial.print("*"); // mengirim data ke android

Serial.print("*H"); // mengirim data ke android

Serial.print(flowRate,3); // mengirim data ke android

Serial.print("*"); // mengirim data ke android

delay(50); // delay 50 ms

(10)

while (state==5) // perulangan selama nilai state 5

{

if (totalMilliLitres>=volum) // jika volume yang masuk lebih besar atau sama

dengan

{

digitalWrite(pompa,LOW); // pompa mati

lcd.setCursor(0,0); // meletakkan posisi karakter pada LCD

lcd.print("Debit: "); // mencetak karakter Debit pada LCD

lcd.print(flowRate,3); // Print the integer part of the variable

lcd.print(" L/S"); // mencetak karakter L/S pada LCD

lcd.setCursor(0,1); // meletakkan posisi karakter pada LCD

lcd.print("Vol : "); // mencetak karakter Vol pada LCD

lcd.print(volum); // mencetak karakter volum pada LCD

lcd.print(" L"); // mencetak karakter L pada LCD

if (Serial.available()){if (Serial.read()=='Z'){state=2;delay(200);}} // jika

serial aktif dan jika data dimasukkan z maka state sama dengan 2 dengan delay

sama dengan 200 ms

}

(11)

digitalWrite(pompa,HIGH); // pompa hidup

if (Serial.available()){if (Serial.read()=='Z'){state=2;delay(200);}} // jika

serial aktif dan jika data dimasukkan z maka state sama dengan 2 dengan delay

sama dengan 200 ms

if((millis() - oldTime) > 200){ // timer

detachInterrupt(sensorInterrupt); // mengambil data dari sensorinterrupt

flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;

//

oldTime = millis(); // timer

flowRate = pulseCount; // membaca pulsa

flowRate=flowRate*0.0263/480/2.5*100; // nilai kalibrasi

totalMilliLitres+=flowRate; // menjumlahkan flowrate dengan berulang

selama pompa aktif

/* flowMilliLitres = ((flowRate / 60) * 1000)/8256;

totalMilliLitres += flowMilliLitres;*/

unsigned int frac; // membuat variabel pada tipe data interger

lcd.setCursor(0,0); // meletakkan posisi karakter pada LCD

lcd.print("Debit: "); // mencetak karakter Debit pada LCD

lcd.print(flowRate,3); // mencetak nilai flowrate pada LCD

(12)

lcd.setCursor(0,1); // meletakkan posisi karakter pada LCD

lcd.print("Vol : "); // mencetak karakter Vol pada LCD

lcd.print(totalMilliLitres); // mencetak nilai totalmillitres pada LCD

lcd.print(" L"); // mencetak karakter L pada LCD

pulseCount = 0; // memberikan 0 pada variabel pulseCount

attachInterrupt(sensorInterrupt, pulseCounter, FALLING); // membuat

attachInterrupt

}

}

Serial.print("*F"); // mengirim data ke android

Serial.print(volum); // mengirim data ke android

Serial.print("*"); // mengirim data ke android

Serial.print("*G"); // mengirim data ke android

Serial.print(totalMilliLitres); // mencetak nilai totalmillitres pada LCD

Serial.print("*"); // mengirim data ke android

Serial.print("*H"); // mengirim data ke android

Serial.print(flowRate,3); // mencetak nilai flowrate pada LCD

(13)

}

void pulseCounter(){pulseCount++;} // pulsa dari sensor

Lampiran 2.Data Sheet ATMega8

Features •

High-performance, Low-power Atmel ®

AVR ®

8-bit Microcontroller •

Advanced RISC Architecture – 130 Powerful Instructions – Most Single-clock Cycle Execution

– 32 × 8 General Purpose Working Registers – Fully Static Operation

– Up to 16MIPS Throughput at 16MHz – On-chip 2-cycle Multiplier

High Endurance Non-volatile Memory segments – 8Kbytes of In-System Self-pro

grammable Flash program memory – 512Bytes EEPROM

– 1Kbyte Internal SRAM – Write/Erase Cycles: 10,000 Flash/1

00,000 EEPROM

– Data retention: 20 years at 85°C/100 years at 25°C (1)

– Optional Boot Code Section with Independent Lock Bits In-System Programming by On-chip Boot Program

True Read-While-W rite Operation

– Programming Lock for Software Security •

Peripheral Features

– Two 8-bit Timer/Counters with Se parate Prescaler, one Compare Mode – One 16-bit Timer/Counter

with Separate Prescaler, Compare Mode, and Capture Mode

– Real Time Counter with Separate Oscillator – Three PWM Channels

(14)

– 6-channel ADC in PDIP package Six Channels 10-bit Accuracy – Byte-oriented Two-wi re Serial Interface

– Programmable Serial USART – Master/Slave SPI Serial Interface

– Programmable Watchdog Timer with Separate On-chip Oscillator – On-chip Analog Comparator

Special Microcontroller Features

– Power-on Reset and Programmable Brown-out Detection – Internal Calibrated RC Oscillator

– External and Internal Interrupt Sources – Five Sleep Modes: Idle, ADC Noise Re duction, Power-save, Power-down, and Standby

I/O and Packages

– 23 Programmable I/O Lines – 28-lead PDIP, 32-lead TQ FP, and 32-pad QFN/MLF •

Power Consumption at 4Mhz, 3V, 25 

Rev.2486AA–AVR–02/2013 2

2486AA–AVR–02/2013 ATmega8(L)

(15)
(16)
(17)
(18)

27

(19)

or glued to the PCB to ensure good mechanical stability. If the center pad is left unconneted, the package might loosen from the PCB.

3

ATmega8 is a low-power CMOS 8-bit microcontroller based on the AVR RISC architecture. By executing powerf

ul instructions in a single clock cycle, the ATmega8 achieves

throughputs approaching 1MIPS per MHz, allowing the system designer to optimize power con-

(20)

PROGRAMMING PORTC DIGITAL INTERFACE GENERAL PORTB DIGITAL INTERFACE PORTD DIGITAL INTERFACE PORTD DRIVERS/BUFFERS

core combines a rich instruction set with 32 general purpose working registers. All the 32 registers are directly connected to the Arithmetic Logic Unit (ALU), allowing two inde-

(21)

struction executed in one clock cycle. The resulting architecture is more code efficient wh ile achieving throughputs up to ten times faster than conventional CISC microcontrollers.

The ATmega8 provides the following features: 8 Kbytes of In-System Programmable Flash with

Read-While-Write capabilities, 512 bytes of EEPROM, 1 Kbyte of SRAM, 23 general purpose

I/O lines, 32 general purpose working registers, three flexible Timer/Counters with compare modes, internal and external interrupts, a seri al programmable USART, a byte oriented Two-

wire Serial Interface, a 6-channel ADC (eight channels in TQFP and QFN/MLF packages) with

10-bit accuracy, a programmable Watchdog Timer with Internal Os cillator, an SPI serial port,

and five software selectable power saving modes. The Idle mode stops the CPU while allowing

the SRAM, Timer/Counters, SPI port, and interr upt system to continue functioning. The Power- down mode saves the register contents but freezes the Oscillator, disabling all other chip func-

tions until the next Interrupt or Hardware Reset. In Power-save mode, the asynchronous timer

continues to run, allowing the user to maintain a timer base while the rest of the device is sleep-

ing. The ADC Noise Reduction mode stops the CPU and all I/O modules except asynchronous timer and ADC, to minimize switching noise during ADC conversions. In Standby mode, the crystal/resonator Oscillator is running while the re st of the device is sleeping. This allows very

fast start-up combined with low-power consumption. The device is manufactured using Atmel’s high density non-volatile memory technology. The

Flash Program memory can be reprogrammed In-System through an SPI serial interface, by a

conventional non-volatile memory programmer, or by an On-chip boot program running on the

AVR core. The boot program can use any interface to download the application program in the

Application Flash memory . Software in the Boot Flash Sect ion will continue to run while the

(22)

an 8-bit RISC CPU with In-System Self-Programmable Flash on a monolithic chip, the Atmel

ATmega8 is a powerful microcontroller that provides a highly-flexible and cost-effective solution

to many embedded control applications.

The ATmega8 is supported with a full suite of program and system development tools, including

C compilers, macro assemblers, program simulators, and evaluation kits. Disclaimer

Typical values contained in this datasheet ar e based on simulations and characterization of other AVR microcontrollers manufactured on t he same process technology. Minimum and Maxi- mum values will be available afte

r the device is characterized. 5

2486AA–AVR–02/2013 ATmega8(L)

Pin Descriptions VCC

Digital supply voltage. GND

Ground.

Port B (PB7..PB0) XTAL1/XTAL2/TOSC1/ TOSC2

Port B is an 8-bit bi-directional I/O port with internal pull-up resistors (selected for each bit). The

Port B output buffers have symmetrical drive characteristics with both high sink and source capability. As inputs, Port B pi

ns that are externally pulled low will source current if the pull-up

resistors are activated. The Port B pins are tri-stated when a reset condition becomes active,

even if the clock is not running.

Depending on the clock selection fuse settings, PB6 can be used as input to the inverting Oscil-

lator amplifier and input to the internal clock operating circuit.

Depending on the clock selection fuse settings, PB7 can be used as output from the inverting

Oscillator amplifier. If the Internal Calibrate d RC Oscillator is used

as chip clock source, PB7..6 is used as TOSC2..1 input for the Asynch

(23)

e AS2 bit in ASSR is set.

The various special features of Port B are elaborated in “Alternate Functions of Port B” on page

58 and

“System Clock and Clock Options” on page 25 .

Port C (PC5..PC0)

Port C is an 7-bit bi-directional I/O port with internal pull-up resistors (selected for each bit). The

Port C output buffers have symmetrical drive c haracteristics with bot

h high sink and source

capability. As inputs, Port C pi ns that are externally pulled lo w will source current if the pull-up

resistors are activated. The Port C pins are tri-stated when a reset condition becomes active,

even if the clock is not running. PC6/RESET

If the RSTDISBL Fuse is programmed, PC6 is used as an I/O pin. Note that the electrical char-

acteristics of PC6 differ from those of the other pins of Port C.

If the RSTDISBL Fuse is unprogrammed, PC6 is used as a Reset input. A low level on this pin

for longer than the minimum pulse a Reset, even if the clock is not running. The minimum pulse length is given in Table 15 on page 38

. Shorter pulses are not guaranteed to generate a Reset.

The various special features of Port C are elaborated on page 61

.

Port D (PD7..PD0)

Port D is an 8-bit bi-directional I/O port with internal pull-up resistors (selected for each bit). The

Port D output buffers have symmetrical drive c haracteristics with bot

h high sink and source

capability. As inputs, Port D pi ns that are externally pulled lo w will source current if the pull-up

resistors are activated. The Port D pins are tri-stated when a reset condition becomes active,

even if the clock is not running.

(24)

page 63 .

RESET

Reset input. A low level on this pin for longer than the minimum pulse length will generate a

reset, even if the clock is not running. The minimum pulse length is given in

Table 15 on page 38

Referensi

Dokumen terkait

Selain itu ada beberapa perbedaan dasar seperti ; Dalam bank syariah, bisnis dan usaha yang dibiayai tidak terlepas dari saringan syariah agama, yakni usaha yang di dalamm

Sehubungan dengan adanya kesalahan dalam penginputan data pada Pengumuman Lelang non e-proc yang telah ditayangkan khususnya untuk POKJA KONSTRUKSI, maka bersama

Menurut Pasal 1 angka 6 Perpres 38/ 2015, Kerjasama Pemerintah dengan Badan Usaha (KPBU) adalah kerjasama antara peme- rintah dan Badan Usaha dalam Penyediaan

Pada variabel CTPS diperoleh bahwa seluruh responden memiliki fasilitas CTPS di rumahnya sejumlah 28 orang (100%), se- luruh responden mendapatkan pernah

Kategori alasan: Kepercayaan dan kecocokan antar rekan kerja.. Emily Ford, Betty Izumi, JostLottes and Dawn

Dengan membaca teks, siswa dapat menuliskan ungkapan atau kalimat saran, masukan, dan penyelesaian masalah (sederhana) sebagai warga negara dengan tepat. Dengan membaca teks,

Dari hasil ini menunjukan bahwa penggunaan filter berpori 0,5 mikron, 0,3 mikron dan karbon aktif sangat baik untuk aliran air PDAM yang kurang bersih.. Kata Kunci : Filter

• Siswa memerhatikan penjelasan guru tentang kegiatan yang akan dilakukan hari ini yaitu kegiatan melempar dan menangkap bola dengan menggunakan bola yang terbuat dari