Translate

Membuat Robot Remote Control Menggunakan Arduino dan Modul Wireless NRF24L01

Membuat Robot Remote Control Menggunakan Arduino dan Modul Wireless NRF24L01


         Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah robot yang fungsinya sama seperti mobil remote control mainan, yang jadi pembeda yaitu alat ini bisa dimodif sesuka hati dengan merubah program atau hardwarenya, sehingga sesuai dengan selera pengguna, robot ini menggunakan 2 buah arduino sebagai master dan slave atau transmitter dan receiver, untuk komunikasinya yaitu menggunakan modul wireless 2.4 GHz NRF24L01 sehingga jangkauannya bisa 100 meteran lebih. untuk lebih jelasnya berikut adalah skema dan programnya



a. Arduino Uno 





b. Modul Wireless NRF24L01


  • Connect the following pins to your Arduino:
  • Pin 9 - CE
  • Pin 10 - CS(N)
  • Pin 11 - MOSI
  • Pin 12 - MISO
  • Pin 13 - SCK
  • 3.3v - VCC
  • GND - GND




c. Driver Motor L298





d. Motor DC






e. Program Arduino Transmitter / Master

#include  <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

int msg[1];
int datain;

int maju;
int mundur;
int kanan;
int kiri;

RF24 radio(9,10);

const uint64_t pipe = 0xE8E8F0F0E1LL;

void setup(void){
 
 Serial.begin(9600);
 radio.begin();
 radio.openWritingPipe(pipe);

 pinMode(13,OUTPUT);

 pinMode(7,INPUT);
 pinMode(6,INPUT);
 pinMode(5,INPUT);
 pinMode(4,INPUT);

 digitalWrite(7,HIGH);
 digitalWrite(6,HIGH);
 digitalWrite(5,HIGH);
 digitalWrite(4,HIGH);

 }


void loop(void){

maju = digitalRead(6);
mundur = digitalRead(4);
kiri = digitalRead(5);
kanan = digitalRead(7);
  
if(maju == 0){ 
 msg[0] = 1;
 radio.write(msg, 1);
 //Serial.println(msg[0]);
}
else if(mundur == 0){ 
 msg[0] = 4;
 radio.write(msg, 1);
 //Serial.println(msg[0]);
}
else if(kiri == 0){ 
 msg[0] = 3;
 radio.write(msg, 1);
 //Serial.println(msg[0]);
}
else if(kanan == 0){ 
 msg[0] = 2;
 radio.write(msg, 1);
 //Serial.println(msg[0]);
}
else{ 
 msg[0] = 5;
 radio.write(msg, 1);
 //Serial.println(msg[0]);
}
 

}


 

 f. Program Arduino Receiver / Slave 

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

int msg[1];

RF24 radio(9,10);

const uint64_t pipe = 0xE8E8F0F0E1LL;

//kiri
int mtr1 = 2;
int mtr2 = 3;
//kanan
int mtr3 = 4;
int mtr4 = 5;

void setup(void){
 
 Serial.begin(9600);
 radio.begin();
 radio.openReadingPipe(1,pipe);
 radio.startListening();
 pinMode(mtr1, OUTPUT);
 pinMode(mtr2, OUTPUT);
 pinMode(mtr3, OUTPUT);
 pinMode(mtr4, OUTPUT);

 }


 void loop(void){
   
 if (radio.available()){
   bool done = false;   
   while (!done){
     done = radio.read(msg, 1);     
     Serial.println(msg[0]);
    
     if (msg[0] == 1){    
     delay(10);
     digitalWrite(mtr1, HIGH);
     digitalWrite(mtr2, LOW);
     digitalWrite(mtr3, HIGH);
     digitalWrite(mtr4, LOW);  
     //delay(200);
     }
     else if (msg[0] == 2){    
     delay(10);
     digitalWrite(mtr1, HIGH);
     digitalWrite(mtr2, LOW);
     digitalWrite(mtr3, LOW);
     digitalWrite(mtr4, LOW);  
     //delay(200);
     }
     else if (msg[0] == 3){    
     delay(10);
     digitalWrite(mtr1, LOW);
     digitalWrite(mtr2, LOW);
     digitalWrite(mtr3, HIGH);
     digitalWrite(mtr4, LOW);  
     //delay(200);
     }
     else if (msg[0] == 4){    
     delay(10);
     digitalWrite(mtr1, LOW);
     digitalWrite(mtr2, HIGH);
     digitalWrite(mtr3, LOW);
     digitalWrite(mtr4, HIGH);  
     //delay(200);
     }
     else {    
     delay(10);
     digitalWrite(mtr1, LOW);
     digitalWrite(mtr2, LOW);
     digitalWrite(mtr3, LOW);
     digitalWrite(mtr4, LOW);  
     //delay(200);
     }
       
     delay(10);
   }
  
  
 }
 else{
 Serial.println("No radio available");

 }
 }





g. VIDEO HASILNYA








 

Membuat Alat Kendali / Pemutar Suara ( WAV ) Menggunakan Tombol dan Modul WP3A

Membuat Alat Kendali / Pemutar Suara ( WAV ) Menggunakan Tombol dan Modul WP3A


        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memutar musik atau suara yang bervariasi saat tombol ditekan, jadi ada 8 buah tombol yang mana tiap-tiap tombol akan menghasilkan suara yang berbeda ketika ditekan, suara pada contoh alat ini sejenis klakson mobil "OM TELOLET OM" yang tenar awal tahun ini. alat ini menggunakan modul wav player sebagai pemutar suaranya dan mikrokontroller yang digunakan adalah ATMega8 sebagai eksekutornya. untuk lebih jelasnya berikut adalah skema dan programnya. 



a. Minimum System ATMega8





b. Modul Wav Player WP3A






c. Program Bascom AVR

$regfile = "m8def.dat"
$crystal = 16000000
$baud = 19200

Ddrd.2 = 0
Ddrd.3 = 0
Ddrd.4 = 0
Ddrd.5 = 0
Ddrb.0 = 0
Ddrb.1 = 0
Ddrb.2 = 0
Ddrb.3 = 0

Portd.2 = 1
Portd.3 = 1
Portd.4 = 1
Portd.5 = 1
Portb.0 = 1
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1

Print Chr(13) ; Chr(13) ; Chr(13);
Waitms 100

Print "t" ; Chr(13);
Waitms 100

Print "g" ; Chr(13);
Waitms 100

Do

  If Pind.2 = 0 Then
    Print "lsuara1.wav" ; Chr(13);

  Elseif Pind.3 = 0 Then
    Print "lsuara2.wav" ; Chr(13);

  Elseif Pind.4 = 0 Then
    Print "lsuara3.wav" ; Chr(13);

  Elseif Pind.5 = 0 Then
    Print "lsuara4.wav" ; Chr(13);

  Elseif Pinb.0 = 0 Then
    Print "lsuara5.wav" ; Chr(13);

  Elseif Pinb.1 = 0 Then
    Print "lsuara6.wav" ; Chr(13);

  Elseif Pinb.2 = 0 Then
    Print "lsuara7.wav" ; Chr(13);

  Elseif Pinb.3 = 0 Then
    Print "lsuara8.wav" ; Chr(13);

  Else
    Print "t" ; Chr(13);

  End If

  Waitms 100
Loop

End






d. VIDEO HASILNYA











Membuat Alat Pengukur Tegangan AC Single Phase Sensor ZMPT101B Menggunakan CV AVR dan ATMega128

Membuat Alat Pengukur Tegangan AC Single Phase Sensor ZMPT101B Menggunakan CV AVR dan ATMega128


       Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara menggunakan sensor ZMPT101B untuk mengukur tegangan sinus AC 220 volt 50Hz, jadi pada percobaan kali ini benar-benar harus sangat berhati-hati karena tegangan yang dideteksi adalah high voltage dan bisa juga berdaya besar, maka dari itu perlu sekali perhitungan yang cermat dalam tiap langkahnya, alat ini hanya mendeteksi tegangan AC dari input sensor kemudian outputnya adalah tegangan DC sinus, sehingga perlu mengunakan teknik sampling untuk membacanya, dan juga nanti tegangan yang akan dideteksi adalah tegangan puncak dari sinyal sinus tersebut menggunakan perbandingan, untuk lebih jelasnya berikut adalah skema dan programnya

LINK TUTORIAL KALIBRASI SENSOR

 

a. Minimum System ATMega128






b. Sensor ZMPT101B





c. Trafo Step Down





d. Konfigurasi Fuse AVR DUDE






e. Program Codevision AVR

/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 2/22/2017
Author  : anak singkong
Company :
Comments:
under license on feb 2017


Chip type               : ATmega128
Program type            : Application
AVR Core Clock frequency: 16.000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 1024
*****************************************************/

#include <mega128.h>
#include <stdio.h>
#include <delay.h>
#include <stdlib.h>

// Alphanumeric LCD Module functions
#include <alcd.h>

#define ADC_VREF_TYPE 0x40

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
//ADCSRA|=0x128;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
//ADCSRA|=0x128;
return ADCW;
}

// Declare your global variables here
int dataadc;
char temp[10];
char temp1[10];
char temp2[10];
char temp3[10];
char temp4[10];
int z,zm,zk,zs;
int i,k,m,s;
int values[300];

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTA=0x00;
DDRA=0xFF;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Port E initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTE=0x00;
DDRE=0x00;

// Port F initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTF=0x00;
DDRF=0x00;

// Port G initialization
// Func4=In Func3=In Func2=In Func1=In Func0=In
// State4=T State3=T State2=T State1=T State0=T
PORTG=0x00;
DDRG=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
ASSR=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// OC1C output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// Timer/Counter 3 initialization
// Clock source: System Clock
// Clock value: Timer3 Stopped
// Mode: Normal top=0xFFFF
// OC3A output: Discon.
// OC3B output: Discon.
// OC3C output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer3 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR3A=0x00;
TCCR3B=0x00;
TCNT3H=0x00;
TCNT3L=0x00;
ICR3H=0x00;
ICR3L=0x00;
OCR3AH=0x00;
OCR3AL=0x00;
OCR3BH=0x00;
OCR3BL=0x00;
OCR3CH=0x00;
OCR3CL=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
// INT3: Off
// INT4: Off
// INT5: Off
// INT6: Off
// INT7: Off
EICRA=0x00;
EICRB=0x00;
EIMSK=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

ETIMSK=0x00;

// USART0 initialization
// USART0 disabled
UCSR0B=0x00;

// USART1 initialization
// USART1 disabled
UCSR1B=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC Clock frequency: 1000.000 kHz
// ADC Voltage Reference: AVCC pin
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x84;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Alphanumeric LCD initialization
// Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTA Bit 0
// RD - PORTA Bit 1
// EN - PORTA Bit 2
// D4 - PORTA Bit 4
// D5 - PORTA Bit 5
// D6 - PORTA Bit 6
// D7 - PORTA Bit 7
// Characters/line: 16
lcd_init(16);

while (1)
      {     
       
      for(i=0;i<300;i++) {
        values[i] = read_adc(0);             

      if (values[i] >= z) {
        z = values[i]; 
      }         
     
      }  
     
      for(k=0;k<300;k++) {
        values[k] = read_adc(0);             

      if (values[k] >= zk) {
        zk = values[k]; 
      }         
     
      }
     
      for(m=0;m<300;m++) {
        values[m] = read_adc(0);             

      if (values[m] >= zm) {
        zm = values[m]; 
      }         
     
      }
     
      for(s=0;s<300;s++) {
        values[s] = read_adc(0);             

      if (values[s] >= zs) {
        zs = values[s]; 
      }         
     
      }


      if((z >= zk)&&(z >= zm)&&(z >= zs)){
         itoa(z,temp);
      }
      if((zk >= z)&&(zk >= zm)&&(zk >= zs)){
         itoa(zk,temp);
      }
      if((zm >= z)&&(zm >= zk)&&(zm >= zs)){
         itoa(zm,temp);
      }
      if((zs >= z)&&(zs >= zk)&&(zs >= zm)){
         itoa(zs,temp);
      }


       
        lcd_gotoxy(0,0);
        lcd_putsf("ADC= ");
        lcd_puts(temp);

      delay_ms(200);
     
      z = 0;
      zk = 0;
      zm = 0;
      zs = 0;
      }
}






f. VIDEO HASILNYA










  

Membuat Alat Monitor Tekanan Paru-Paru Menggunakan Sensor MPX5700 dan Mikrokontroller - Bascom AVR

Membuat Alat Monitor Tekanan Paru-Paru Menggunakan Sensor MPX5700 dan Mikrokontroller - Bascom AVR


        Pada malam menjelang pagi kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang berfungsi untuk mengetahui tekanan paru-paru seseorang dengan menggunakan sensor tekanan MPX dan mikrokontroller, alat ini sebenarnya sangatlah sederhana namun yang harus diperhatikan adalah kalibrasi sensor agar sesuai dengan satuan tekanan paru-paru, pada contoh kali ini saya akan mencontohkan alat yang dibuat dengan menggunakan mikrokontroller dengan interface delphi 7. untuk lebih jelasnya berikut adalah program dan skemanya. untuk mengetahui parameter tekanan paru-paru lebih jelas silahkan download artikel berikut





a. Minimum System ATMega16





b. Sensor MPX5700AP





c. Modul RS232






d. Program Bascom AVR

$regfile = "m16def.dat"
$crystal = 11059200
$baud = 9600


Config Adc = Single , Prescaler = Auto , Reference = Avcc

Dim Dataadc As Word


Start Adc


Do

Dataadc = Getadc(0)

Print Dataadc ;

Waitms 1000

Loop






e. Program Interface Delphi 7



unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, TeEngine, Series, TeeProcs, Chart, CPort,StrUtils;

type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    ComPort1: TComPort;
    Chart1: TChart;
    Series1: TFastLineSeries;
    Edit1: TEdit;
    Label1: TLabel;
    Button5: TButton;
    Edit2: TEdit;
    Edit3: TEdit;
    ComboBox1: TComboBox;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Edit8: TEdit;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Series2: TFastLineSeries;
    Series3: TFastLineSeries;
    Edit9: TEdit;
    Edit10: TEdit;
    Edit11: TEdit;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Timer1: TTimer;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Timer2: TTimer;
    Timer3: TTimer;
    Timer4: TTimer;
    Button9: TButton;
    Button10: TButton;
    Button11: TButton;
    procedure Button4Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure Timer3Timer(Sender: TObject);
    procedure Timer4Timer(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure Button10Click(Sender: TObject);
    procedure Button11Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

 serin:string;
 pefl:double;
 pefp:double;

implementation

{$R *.dfm}


procedure TForm1.Button4Click(Sender: TObject);
begin
  application.Terminate;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 comport1.ShowSetupDialog;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 comport1.Connected:=True;
 button2.Enabled:=False;
 button3.Enabled:=true;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 comport1.Connected:=false;
 button3.Enabled:=False;
 button2.Enabled:=true;
end;

procedure TForm1.Button5Click(Sender: TObject);
var
  F: TextFile;
begin
  AssignFile(F, 'D:\hasil.txt');
  Append(F);
  WriteLn(F, '========================');
  WriteLn(F, '=========Record=========');
  WriteLn(F, '========================');
  WriteLn(F, 'Nama: ',Edit2.Text);
  WriteLn(F, 'No.ID: ',Edit3.Text);
  WriteLn(F, 'Jeni Kelamin: ',ComboBox1.Text);
  WriteLn(F, 'Umur: ',Edit4.Text);
  WriteLn(F, 'Tinggi Badan: ',Edit5.Text);
  WriteLn(F, 'Nilai PEF Normal: ',Edit6.Text);
  WriteLn(F, 'Nilai PEF Rata2: ',Edit7.Text);
  WriteLn(F, 'Kategori: ',Edit8.Text);
  WriteLn(F, '');
  WriteLn(F, '');
  CloseFile(F);
end;




procedure TForm1.Timer1Timer(Sender: TObject);
var umur:integer;
    tb:integer;
    rata:double;
    nmaxval1:integer;
    nmaxval2:integer;
    nmaxval3:integer;
    btatasPEFL:double;
    btbawahPEFL:double;
    btatasPEFP:double;
    btbawahPEFP:double;

begin

if (Edit9.Text <> '') and (Edit10.Text <> '') and (Edit11.Text <> '') then
begin
nmaxval1 := strtoint(Edit9.Text);
nmaxval2 := strtoint(Edit10.Text);
nmaxval3 := strtoint(Edit11.Text);
rata:= (nmaxval1 + nmaxval2 + nmaxval3 ) / 3;
Edit7.Text:= floattostr(rata);
end;


if (ComboBox1.Text <> '') and (Edit4.Text <> '') and (Edit5.Text <> '') then
begin

umur:=strtoint(Edit4.text);
tb:=strtoint(Edit5.text);


pefl := (-10.86040 + 0.12766 * umur + 0.11169 * tb - 0.0000319344 * umur * umur * umur) * 60;
pefp := (-5.12502 + 0.09006 * umur + 0.06980 * tb - 0.00145669 * umur * umur) * 60;

btatasPEFL := pefl + 1.70935;
btbawahPEFL := pefl - 1.70935;
btatasPEFP := pefp + 1.77692;
btbawahPEFP := pefp - 1.77692;

if ComboBox1.Text = 'L' then
begin
Edit6.Text:=floattostr(pefl);
end;

if ComboBox1.Text = 'P' then
begin
Edit6.Text:=floattostr(pefp);
end;

end;


if (Edit7.Text <> '') and (Edit6.Text <> '') then
begin
if (ComboBox1.Text = 'L') and (rata > btatasPEFL) then
begin
Edit8.Text:='diatas PEF';
end;

if (ComboBox1.Text = 'L') and (rata < btbawahPEFL) then
begin
Edit8.Text:='dibawah PEF';
end;

if (ComboBox1.Text = 'L') and (rata >= btbawahPEFL) and (rata <= btatasPEFL) then
begin
Edit8.Text:='NORMAL';
end;



if (ComboBox1.Text = 'P') and (rata > btatasPEFP) then
begin
Edit8.Text:='diatas PEF';
end;

if (ComboBox1.Text = 'P') and (rata < btbawahPEFP) then
begin
Edit8.Text:='dibawah PEF';
end;

if (ComboBox1.Text = 'P') and (rata >= btbawahPEFP) and (rata <= btatasPEFP) then
begin
Edit8.Text:='NORMAL';
end;


end;

end;





procedure TForm1.Timer2Timer(Sender: TObject);
var
  Str: String;
  suhu:integer;
  Count:integer;
  nmax1:double;

begin
  ComPort1.ReadStr(Str,Count);
  Edit1.Text:=Str;
  suhu:=strToint(str);
  chart1.Series[0].Add(suhu,'',clgreen);

  nmax1:=chart1.Series[0].MaxYValue;

  Edit9.Text := floattostr(nmax1);

end;



procedure TForm1.Timer3Timer(Sender: TObject);
var
  Str: String;
  suhu:integer;
  Count:integer;
  nmax2:double;

begin
  ComPort1.ReadStr(Str,Count);
  Edit1.Text:=Str;
  suhu:=strToint(str);
  chart1.Series[1].Add(suhu,'',clgreen);

  nmax2:=chart1.Series[1].MaxYValue;

  Edit10.Text := floattostr(nmax2);

end;

procedure TForm1.Timer4Timer(Sender: TObject);
var
  Str: String;
  suhu:integer;
  Count:integer;
  nmax3:double;

begin
  ComPort1.ReadStr(Str,Count);
  Edit1.Text:=Str;
  suhu:=strToint(str);
  chart1.Series[2].Add(suhu,'',clgreen);

  nmax3:=chart1.Series[2].MaxYValue;

  Edit11.Text := floattostr(nmax3);

end;




procedure TForm1.Button6Click(Sender: TObject);
begin
Timer2.Enabled := True;
Timer3.Enabled := False;
Timer4.Enabled := False;
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
Timer2.Enabled := False;
Timer3.Enabled := True;
Timer4.Enabled := False;
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
Timer2.Enabled := False;
Timer3.Enabled := False;
Timer4.Enabled := True;
end;

procedure TForm1.Button9Click(Sender: TObject);
begin
  chart1.Series[0].Clear;
  Edit9.Text := '';

end;

procedure TForm1.Button10Click(Sender: TObject);
begin
  chart1.Series[1].Clear;
  Edit10.Text := '';

end;

procedure TForm1.Button11Click(Sender: TObject);
begin
  chart1.Series[2].Clear;
  Edit11.Text := '';

end;

end.







f. Cara Menggunakan Alat

       Cara menggunakan alat ini yang pertama adalah harus tau bagaimana cara mendapatkan nilai tekanan paru sesuai standart dari input nilai umur dan tinggi badan baik itu laki-laki maupun perempuan karena pada interface didapat sebuah rumus yang datanya diambil dari lampiran

untuk pria
pefl := (-10.86040 + 0.12766 * umur + 0.11169 * tb - 0.0000319344 * umur * umur * umur) * 60;

untuk wanita
pefp := (-5.12502 + 0.09006 * umur + 0.06980 * tb - 0.00145669 * umur * umur) * 60;


       Jadi pada interface delphi 7 akan dilakukan 3 kali pengambilan data secara berurutan, kemudian pasien disuruh untuk meniup pada sensor, jika tekanan diantara ambang normal dari PEF tersebut maka dapat dikatakan paru-paru dalam kondisi normal, jika tidak maka akan dikategorikan menjadi sebuah penyakit, jadi ke 3 pengambilan data tertinggi dari tiap-tiap grafik yang ditampilkan kemudian dibagi 3 atau dilakukan rata2, jadi prinsip kerja interface grafik adalah menampilkan secara realtime nilai sensor, saat ditiup, sensor akan otomatis mengeluarkan tegangan sehingga grafik akan naik dan ketika naik mendapatkan nilai puncak atau nilai tertinggi kemudian akan disimpan ke sebuah variabel yang setelahnya akan dilakukan hal yang sama sebanyak 2 kali pengambilan, jika sudah mendapatkan 3 grafik sample maka akan dirata-rata dan di bandingkan dengan nilai PEF berdasarkan perhitngan. lalu data yang didapat bisa disimpan menggunakan tombol save.  












Membuat Alat Monitoring Jarak Menggunakan HC-SRF04 dan OUTPUT SMS GATEWAY - ALARM INDIKATOR

Membuat Alat Monitoring Jarak Menggunakan HC-SRF04 dan OUTPUT SMS GATEWAY - ALARM INDIKATOR


       Pada tengah malam ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang fungsinya yaitu untuk memonitor jarak benda atau jarak air / ketinggian level air menggunakan sensor ultrasonik HC-SRF04 dengan output sms, alarm buzzer dan indikator led, selain itu ada sebuah motor yang digunakan untuk membuka palang pintu air saat air telah mencapai level tertentu, kemudian akan menutup kembali saat mencapai level yang telah di setting sebelumnya. untuk lebih jelasnya berikut adalah skema dan programnya.





a. Arduino Mega






b. Modul SMS SIM800L





c. Buck Converter Modul





d. Sensor HC-SRF04





e. Motor Driver L298






f. Program Arduino IDE

//vcc sim800l adalah 4.0 volt
// hubungkan RX-TX di pin 50 dan 51

#include "SIM900.h"
#include <SoftwareSerial.h>
#include <LiquidCrystal.h>

#define trigPin 8
#define echoPin 9

#include "sms.h"
SMSGSM sms;

LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

long duration, distance;

const int btset = A7;
const int btup = A6;
const int btdown = A5;
const int btsimpan = A4 ;

int mtr1 = 10;
int mtr2 = 11;
int kecepatan = 12;

int level1;
int level2;
int level3;

int btsetx;
int btupx;
int btdownx;
int btsimpanx;

int ledmerah = A2;
int ledkuning = A1;
int ledhijau = A0;
int buzzer = A3;

int simpanlevel1;
int simpanlevel2;
int simpanlevel3;

int mark = 0;
int markx = 0;

int numdata;
boolean started=false;
char smsbuffer[160];
char n[20];


void setup() {
     //Serial connection.
     Serial.begin(9600);
     Serial.println("GSM Shield testing.");
     //Start configuration of shield with baudrate.
     //For http uses is raccomanded to use 4800 or slower.
     if (gsm.begin(2400)) {
          Serial.println("\nstatus=READY");
          started=true;
     } else Serial.println("\nstatus=IDLE");

     if(started) {
          //Enable this two lines if you want to send an SMS.
          if (sms.SendSMS("085348017819", "ALAT READY"))
          Serial.println("\nSMS sent OK");
          if (sms.SendSMS("082157306006", "ALAT READY"))
          Serial.println("\nSMS sent OK");
     }

  digitalWrite(A3,HIGH);
 
  lcd.begin(16, 2);
  lcd.clear();
  lcd.noCursor();
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(btset, INPUT);
  pinMode(btup, INPUT);
  pinMode(btdown, INPUT);
  pinMode(btsimpan, INPUT);
  digitalWrite(btset,HIGH);
  digitalWrite(btup,HIGH);
  digitalWrite(btdown,HIGH);
  digitalWrite(btsimpan,HIGH);
  pinMode(ledmerah, OUTPUT);
  pinMode(ledkuning, OUTPUT);
  pinMode(ledhijau, OUTPUT);
  pinMode(buzzer, OUTPUT);
 
 
}

void loop() {

mark = 0;

btsetx = digitalRead(btset);
btsimpanx = digitalRead(btsimpan);

if(btsetx == 0){
  delay(200);
  lcd.clear(); 
  setting2();
  delay(1000);
  setting3();
  delay(1000);

  }

if(btsimpanx == 0){
  delay(200);
  lcd.clear(); 
  showlevel(); 
  }

  digitalWrite(trigPin, LOW);  // Added this line
  delayMicroseconds(2); // Added this line
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10); // Added this line
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
 
  lcd.setCursor(0, 0);
  lcd.print("Level= ");
  lcd.print(distance);
  lcd.setCursor(0, 1);
  lcd.print("SET       SIMPAN");


if((simpanlevel1 == 0)&&(simpanlevel2 == 0)&&(simpanlevel3 == 0)&&(mark == 0)){
  digitalWrite(ledmerah,LOW);
  digitalWrite(ledkuning,LOW);
  digitalWrite(ledhijau,LOW);
  digitalWrite(buzzer,HIGH);
  mark = 1;
}


if((distance <= simpanlevel3)&&(mark == 0)){
  digitalWrite(ledmerah,HIGH); 
  digitalWrite(ledkuning,LOW);
  digitalWrite(ledhijau,LOW);
  digitalWrite(buzzer,LOW);

if(markx == 0){

  if (sms.SendSMS("085348017819", "KONDISI BAHAYA"));
  if (sms.SendSMS("082157306006", "KONDISI BAHAYA"));
  delay(3000);
 
  digitalWrite(mtr1,HIGH);
  digitalWrite(mtr2,LOW);
  analogWrite(kecepatan,250);

  delay(3000);

  digitalWrite(mtr1,LOW);
  digitalWrite(mtr2,LOW);
  analogWrite(kecepatan,0);
  markx =1;
}

}


if((distance > simpanlevel3)&&(distance <= simpanlevel2)&&(mark == 0)){
  digitalWrite(ledmerah,LOW); 
  digitalWrite(ledkuning,HIGH);
  digitalWrite(ledhijau,LOW);
  digitalWrite(buzzer,HIGH);
//  mark = 1; 
}



if((distance > simpanlevel2)&&(mark == 0)){
  digitalWrite(ledmerah,LOW); 
  digitalWrite(ledkuning,LOW);
  digitalWrite(ledhijau,HIGH);
  digitalWrite(buzzer,HIGH);

if(markx == 1){

  if (sms.SendSMS("085348017819", "KONDISI AMAN"));
  if (sms.SendSMS("082157306006", "KONDISI AMAN"));
  delay(3000);
  digitalWrite(mtr1,LOW);
  digitalWrite(mtr2,HIGH);
  analogWrite(kecepatan,250);

  delay(3000);

  digitalWrite(mtr1,LOW);
  digitalWrite(mtr2,LOW);
  analogWrite(kecepatan,0);
  markx = 0;
}


}


delay(1000);
lcd.clear(); 

 
}





void setting2(){
 
  lcd.setCursor(0, 0);
  lcd.print("batas level 2 ");
  lcd.setCursor(0, 1);
  lcd.print("nilai= "); 
  lcd.print(level2);

  btupx = digitalRead(btup);
  btdownx = digitalRead(btdown);
  btsimpanx = digitalRead(btsimpan);
 
  if(btupx == 0){
  delay(200);
  level2++;
  }
 
  if(btdownx == 0){
  delay(200);
  level2--;
  }

  if(btsimpanx == 0){
  delay(200);
  simpanlevel2 = level2;
  lcd.clear();
  return;
  }

setting2();
 
}




void setting3(){
 
  lcd.setCursor(0, 0);
  lcd.print("batas level 3 ");
  lcd.setCursor(0, 1);
  lcd.print("nilai= "); 
  lcd.print(level3);

  btupx = digitalRead(btup);
  btdownx = digitalRead(btdown);
  btsimpanx = digitalRead(btsimpan);
 
  if(btupx == 0){
  delay(200);
  level3++;
  }
 
  if(btdownx == 0){
  delay(200);
  level3--;
  }

  if(btsimpanx == 0){
  delay(200);
  simpanlevel3 = level3;
  lcd.clear();
  return;
  }

setting3();
 
}




void showlevel(){
  lcd.setCursor(0, 0);
  lcd.print("LV3=");
  lcd.print(simpanlevel3);
 
  lcd.setCursor(0, 1);
  lcd.print("LV2=");
  lcd.print(simpanlevel2);

btsetx = digitalRead(btset);

if(btsetx == 0){
  delay(200);
  lcd.clear();
  return;
  }


showlevel();
}






g. VIDEO HASILNYA












Mengakses WIZ110SR Serial to TCP-IP Converter ARDUINO WIFI

Mengakses WIZ110SR Serial to TCP-IP Converter ARDUINO WIFI


        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara mengakses WIZ110SR menggunakan arduino, seperti yang telah diketahui bahwa WIZ110SR adalah modul yang fungsinya untuk konversi dari serial data TTL menjadi TCP-IP sehingga modenya diubah menjadi protokol, keuntungan mode ini yaitu pengiriman data bisa jauh dan menggunakan RJ45 sehingga bisa dikoneksikan ke router jika menginginkan broadcast data menggunakan wifi. yang perlu diperhatikan yaitu pertama setting dulu modul WIZ110SR menggunakan tools yang disediakan atau menggunakan aplikasi bawaannya, kemudian set IP dan PORT-nya, pada contoh ini dijelaskan mengenai bagaimana cara mengirimkan data sensor menggunakan serial arduino melalui media wifi / tcp-ip. untuk lebih jelasnya berikut adalah skema dan programnya.




a. Arduino Uno





b. Modul WIZ110SR 





c. Router





d. Modul RS232






e. Program Arduino IDE

void setup() {

  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);

}

// the loop routine runs over and over again forever:
void loop() {

  // read the input on analog pin 0:
  int sensorValue = analogRead(A0);
  // print out the value you read:
  Serial.println(sensorValue);
  delay(1000);        // delay in between reads for stability

}






f. VIDEO HASILNYA











Membuat Alat Monitor PH Cairan Menggunakan ARDUINO dan Interface Grafik Delphi 7

Membuat Alat Monitor PH Cairan Menggunakan ARDUINO dan Interface Grafik Delphi 7


       Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang digunakan untuk mengetahui PH suatu cairan, alat ini menggunakan mikrokontroller ARDUINO dan sensor yang dipakai adalah sensor PH module yang sudah include sensor suhu DS18b20. pada alat ini terdapat dua buah tombol untuk kalibrasi. alat ini menggunakan ADC ekseternal 12 bit sehingga range sensor akan lebih besar. untuk kalibrator digunakan buffer PH 4, PH 7 dan PH 10. untuk lebih jelasnya berikut adalah skema dan programnya. untuk cara kalibrasi sensor PH berikut link-nya.
 




a. Arduino UNO





b. Sensor PH + Sensor Suhu DS18B20






c. Modul ADc 12 bit ADS1015







d. Program Arduino IDE

#include <Wire.h>
#include <Adafruit_ADS1015.h>
#include <LiquidCrystal.h>
#include <OneWire.h>

OneWire  ds(10);  // on pin 10 (a 4.7K resistor is necessary)

LiquidCrystal lcd(12, 11, 7, 6, 5, 4);
Adafruit_ADS1115 ads1115;

int kal7x;
int kal10x;
float volt0, sensorph, offsetph, ph1, ph2, selisih7, selisih10;


void setup(void)
{
 
  pinMode(2,INPUT);
  digitalWrite(2,HIGH);
  pinMode(3,INPUT);
  digitalWrite(3,HIGH);
 
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.clear();
  lcd.noCursor();
 
  ads1115.begin();
  ads1115.setGain(GAIN_ONE); 
 
}

void loop(void)
{

  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
 
  if ( !ds.search(addr)) {
    ds.reset_search();
    delay(250);
    return;
  }
 

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
 
  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
 
  present = ds.reset();
  ds.select(addr);   
  ds.write(0xBE);         // Read Scratchpad

  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
  }

  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
 
  celsius = (float)raw / 16.0;
 // fahrenheit = celsius * 1.8 + 32.0;
  
  int16_t adc0, adc1, adc2; // input ADC

  adc0 = ads1115.readADC_SingleEnded(0);
  volt0 = (adc0 * 0.125);

  ph1 = (((volt0/1000.0) - 4.4645) / -0.2063);
 
  if((ph1 >= 6.0)&&(ph1 <= 8.0)){
  ph1 = selisih7 + ph1;
  lcd.setCursor(11, 0);
  lcd.print(selisih7);
  }
 
  if((ph1 >= 9.0)&&(ph1 <= 11.0)){
  ph1 = selisih10 + ph1; 
  lcd.setCursor(11, 1);
  lcd.print(selisih10); 
  }
 
  lcd.setCursor(0, 0);
  lcd.print("PH= ");
  lcd.print(ph1); 
   
  lcd.setCursor(0, 1);
  lcd.print("T= ");
  lcd.print(celsius);

  kal7x = digitalRead(2);
  kal10x = digitalRead(3);

  if(kal7x == 0){
  delay(200); 
  selisih7 = 7 - ph1;     
  }
 
  if(kal10x == 0){
  delay(200);
  selisih10 = 10 - ph1; 
  } 
 
  Serial.print(ph1),Serial.println ('a');
  Serial.print(celsius),Serial.println ('b');

  delay(1000);
 
}





e. Program Delphi 7 Interface



unit TA;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls,strutils, TeeProcs, TeEngine, Chart, CPort, mmsystem,
  Series, Buttons;

type
  TForm1 = class(TForm)
    ComPort1: TComPort;
    GroupBox1: TGroupBox;
    Edit1: TEdit;
    Edit2: TEdit;
    Chart1: TChart;
    Shape1: TShape;
    Shape2: TShape;
    GroupBox2: TGroupBox;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Memo1: TMemo;
    Label1: TLabel;
    Label2: TLabel;
    Timer1: TTimer;
    Label7: TLabel;
    Label8: TLabel;
    BitBtn1: TBitBtn;
    Series1: TFastLineSeries;
    Series2: TFastLineSeries;
    Chart2: TChart;
    Series3: TFastLineSeries;
    Chart3: TChart;
    Series4: TFastLineSeries;
    Timer2: TTimer;
    Timer3: TTimer;
    procedure ComPort1RxChar(Sender: TObject; Count: Integer);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure Timer3Timer(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var buff:string;
begin
comport1.ReadStr(buff,count);
memo1.Text:=memo1.Text+buff;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
comport1.ShowSetupDialog;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Timer2.Enabled := True;
Timer3.Enabled := True;
if button2.Caption='Connect' then
   begin
   button2.Caption:='Disconnect';
   comport1.Open;
   end
else if button2.Caption='Disconnect' then
   begin
   button2.Caption:='Connect';
   comport1.Close;
   end;

end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Edit1.Color:=clwhite;
Edit2.Color:=clwhite;
edit1.text:='';
edit2.text:='';
memo1.Text:='';
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
close;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ThousandSeparator:=',';
DecimalSeparator:='.';
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
label7.Caption:='Date  '+ FormatdateTime('d/mm/yyyy',Date);
label8.Caption:='Time  '+ FormatDateTime('hh:nn:ss',Time);
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
close;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
var
  F: TextFile;
begin
  AssignFile(F, 'D:\record.txt');
  Append(F);
  WriteLn(F, '======================================');
  WriteLn(F, 'Tanggal = ',label7.Caption);
  WriteLn(F, 'Jam     = ',label8.Caption);
  WriteLn(F, '======================================');

  WriteLn(F, 'PH  : ',Edit1.Text);
  WriteLn(F, 'Suhu: ',Edit2.Text);
  CloseFile(F);
end;

procedure TForm1.Timer3Timer(Sender: TObject);
var ruang,kulit:double;
    rin,kin:string;
    jumlahdata:integer;

begin
  shape1.Brush.Color:=clgreen;
  shape2.Brush.Color:=clgreen;
  jumlahdata:=chart1.GetMaxValuesCount;
  form1.Caption:=inttostr(jumlahdata);
  if jumlahdata > 60 then
     begin
     chart1.Series[0].Clear;
     chart1.Series[1].Clear;
     Series3.Clear;
     Series4.Clear;
     end;

  rin:=memo1.Lines[memo1.Lines.count-2];
  kin:=memo1.Lines[memo1.Lines.count-1];

  if rightstr(rin,1)= 'a' then
     begin
     edit1.Text:=leftstr(rin,length(rin)-1);
     ruang:=strtofloat(edit1.text);
     chart1.Series[0].Add(ruang,'',clred) ;
     Series3.Add(ruang,'',clred) ;
     shape1.Brush.Color:=clred;
     end;
  if rightstr(kin,1)='b' then
     begin
     edit2.Text:=leftstr(kin,length(kin)-1);
     kulit:=strtofloat(edit2.text);
     chart1.Series[1].Add(kulit,'',clgreen) ;
     Series4.Add(kulit,'',clgreen) ;
     shape2.Brush.Color:=clgreen;
     end;


end;

end.






f. VIDEO HASILNYA












Membuat Alat Monitoring Suhu dan kelembaban (Sensor DHT11) Menggunakan Android dan ARDUINO

Membuat Alat Monitoring Suhu dan kelembaban (Sensor DHT11) Menggunakan Android dan ARDUINO


        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat monitoring suhu dan kelembaban menggunakan sensor DHT11, dan media interfacenya adalah handphone android, jadi nanti nilai akan tampil pada aplikasi yang telah dibuat menggunakan Android, mikrokontroller yang digunakan adalah arduino dengan media transfer data yang dipakai adalah bluetooth HC-05. untuk lebih jelasnya berikut adalah program dan skemanya.




a. Arduino UNO





b. Sensor Suhu dan Kelembaban DHT11





c. Bluetooth HC-05






d. Program Android







e. Program Arduino IDE

#include "Wire.h"
#include "DHT.h"
#include <stdio.h>
#define DHTPIN 4     // what digital pin we're connected to
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

void setup(){
  Serial.begin(9600);
  dht.begin();
}


void loop(){

  delay(900);

  int h = dht.readHumidity();
  int t = dht.readTemperature();
  int hic = dht.computeHeatIndex(t, h, false);

Serial.print("Temp= ");
Serial.print(t);
Serial.println(" C");

Serial.print("Hum= ");
Serial.print(h);
Serial.println(" %");

}






f. VIDEO HASILNYA