Selamat datang di ForSa! Forum diskusi seputar sains, teknologi dan pendidikan Indonesia.

Welcome to Forum Sains Indonesia. Please login or sign up.

Maret 28, 2024, 10:10:12 PM

Login with username, password and session length

Topik Baru

Artikel Sains

Anggota
Stats
  • Total Tulisan: 139,653
  • Total Topik: 10,405
  • Online today: 142
  • Online ever: 1,582
  • (Desember 22, 2022, 06:39:12 AM)
Pengguna Online
Users: 0
Guests: 119
Total: 119

Aku Cinta ForSa

ForSa on FB ForSa on Twitter

Mikrokontroller (ATmega8535) dengan Handphone (SMS) - please help

Dimulai oleh vallenangelict, Maret 07, 2010, 02:13:22 AM

« sebelumnya - berikutnya »

0 Anggota dan 1 Pengunjung sedang melihat topik ini.

vallenangelict

bos, gw butuh bantuan ni  ;D
gw lagi bikin project pake HP Siemens C45 & MK ATmega8535 + LCD 16*2, gw pingin nyoba program sederhana "mengirim SMS" ke nomer HP yg dituju & "menerima SMS" yg kemudian ditampilin di LCD, tp kok susah amad yaa???
ada yg bs bantu gw ngasi contoh listing program pake bahasa C ga?  ???
ntar gw bandingin ama pny gw jd mudah2an bisa tw ksalahan gw ada dmana. gw uda nyoba listing program dari banyak source yg gw dapet tp kagak bs smuaaaaa. & gw rasa interface pake RS232 yg gw colokin si mungkin uda bener. jadi masalahny cm di listing programny nih  :-\

jatihisivalley

Kutip dari: vallenangelict pada Maret 07, 2010, 02:13:22 AM
HP Siemens C45 & MK ATmega8535 + LCD 16*2
gw pingin nyoba program sederhana "mengirim SMS" ke nomer HP yg dituju & "menerima SMS" yg kemudian ditampilin di LCD

Tips:
- Pelajari AT Command - khususnya untuk C45 -
- Pelajari buffered (ring buffer) serial ISR (interrupt service routine)
- Pelajari command parsing (yang di akhiri 0x0D, 0x0A)
- sebelum terjun ke mikrokontroller,kenali dulu "kelakuan" C45 anda lewat hiperterminal, cari software hyperteminal dan serial spy
- dan jika ingin lebih serius... jangan pake C45, yang biasa si pake untuk M2M-based-design (gsm enabled device)... spesialisnya SIM300... banyak tuh yang udah pake... kami juga sudah bikin beberapa project yang interface di dalam nya untuk RTU (realtime unit),remote monitoring system,tracking system..
- "Penyederhanaan Algonya" :
   - AT+CMGS (kirim)
  - Tunggu AT+CMTI (baca)
  - AT+CMGR  (baca)

  -.... blah-blah :D .... jika M2M anda format sms-nya PDU, ya mesti bikin sendiri routine decode/encode PDU format


Too Payz

Kutipgw lagi bikin project pake HP Siemens C45 & MK ATmega8535 + LCD 16*2, gw pingin nyoba program sederhana "mengirim SMS" ke nomer HP yg dituju & "menerima SMS" yg kemudian ditampilin di LCD, tp kok susah amad yaa???
Gampaang...  ::)   ::)

Kutipada yg bs bantu gw ngasi contoh listing program pake bahasa C ga?  ???
ntar gw bandingin ama pny gw jd mudah2an bisa tw ksalahan gw ada dmana.
Coba share dlu codingnya biar bisa dikoreksi bersama...  ;D   ;D

Kutipgw rasa interface pake RS232 yg gw colokin si mungkin uda bener. jadi masalahny cm di listing programny nih  :-\
Jangan pakai perasaan... test dulu dengan komputer menggunakan Hyperterminal atau terminal bawaan CoViAVR.
Kalo komunikasi dengan komputer OK Mikro pasti OK..
;)  ;)

vallenangelict

wahaha,, uda lama g ke forum ni,,  ;D
buat bos2 semuanya yg ada d atas gw,, makasih bgt buat smua masukannyee  :-* :-* :-*
gw lupa mulai kpn,, gw uda bisa masalah sms ntu,, ternyata emang gampang bgt.
ternyata masalahnye cm di sirkuit,, gw baru tau kalo antara Siemens C45 dengan MK ATmega8535 tu ga pake interface apa2,, cm langsung dicolokin ajee :
- TX hp dengan RX mk
- RX hp dengan TX mk
- GND hp dengan GND mk

karena level tegangan HP & MK tu sama2 TTL (katanye temen gw),,
RS232 tu ga da gunanyeeeeee  :o :o :o (gw emang bego buanget)  :D

nah sekarang masalah gw ni,, gw pernah baca PDU via LCD,, diakhir PDU terima SMS tu ada gambar2 aneh :

07F6B06||
||
OK

nah gambar || tu artinyee apaan yaa ??  ??? ???

jd misalnye waktu PDU gw simpen di array & gw baca :
- array ke 73 membaca "0"
- array ke 74 membaca "6"
- array ke 75 membaca "||"
- array ke 76 membaca "  " (kosong)
- array ke 77 membaca "||"
- array ke 78 membaca "  " (kosong)
- array ke 79 membaca "O"
- array ke 80 membaca "K"
- array ke 81 membaca "||"
- array ke 82 membaca " " (kosong)

nah kalo pada saat inisialisasi seperti :

for (w=0;w<=83;w++)
{
     ambil_PDU[w]=getchar();
}

programnye tu berenti (kalo "w<=82" ntu masi ga apa2),, ntu kenapa ya???
perilakunye kok aneh2  ??? ??? ???

vallenangelict

NB : buat bos Too Payz
gw sempet masuk k blog anda,, isinye EMPAT JEMPOL DAH  ;D ;D ;D
gw jg blajar USART dari sanee,, makasi bgt ya boss,, uda bikin blog yg berguna  :-*

Too Payz

KutipNB : buat bos Too Payz
gw sempet masuk k blog anda,, isinye EMPAT JEMPOL DAH  ;D ;D ;D
gw jg blajar USART dari sanee,, makasi bgt ya boss,, uda bikin blog yg berguna  :-*
Sama-sama...
Ga da yang gratis termasuk blog-ku.. jadi....
JAngan lupa doanya buat aku ya...   ::)   ::)

Begini nih yg wa suka...
BUka blog.. Baca... Coba sendiri...trus Bisa sendiri....
Nambah semangat buat update blog nih...  ;D   ;D   ;D

Too Payz

Kutipgw baru tau kalo antara Siemens C45 dengan MK ATmega8535 tu ga pake interface apa2,, cm langsung dicolokin ajee :
- TX hp dengan RX mk
- RX hp dengan TX mk
- GND hp dengan GND mk
karena level tegangan HP & MK tu sama2 TTL (katanye temen gw),,
Tepat sekali...  ;D  ;D
Btw ada Siemens tipe yang level TTL 3,3 Volt, jadi menambahkan konverter 5Vdc ke 3Vdc.
Kutip
nah sekarang masalah gw ni,, gw pernah baca PDU via LCD,, diakhir PDU terima SMS tu ada gambar2 aneh :

07F6B06||
||
OK

nah gambar || tu artinyee apaan yaa ??&nbsp; ??? ???
Lihat daftar ASCII pada karakter LCD 16x2. Ingat ASCII pada LCD warna biru dengan ASCII pada lcd warna kuning/hijau sedikit berbeda.
Link :
[pranala luar disembunyikan, sila masuk atau daftar.]
[pranala luar disembunyikan, sila masuk atau daftar.]

Karakter "||" ditampilkan jika nilai Heksadesimal tidak terdaftar pada list ASCII tersebut.
PDU kan terdiri dari huruf, angka, dan simbol-simbol tertentu jadi pada Coding tambahkan misalnya seperti ini :
if (simbol, huruf atau angka) then simpan ke array
else do nothing.

Kutipnah kalo pada saat inisialisasi seperti :
for (w=0;w<=83;w++)
{
ambil_PDU[w]=getchar();
}

programnye tu berenti (kalo "w<=82" ntu masi ga apa2),, ntu kenapa ya???
perilakunye kok aneh2  ??? ??? ???
Coba ubah w<=255 tapi jangan lupa sesuaikan variabel array ambil_PDU[256];
Atau sesuaikan jumlah array dgn Maksimum karakter SMS yang akan diterima.

Tapi mending jangan gunakan for (w=0;w<=83;w++)
Saya lebih suka mendeteksi karakter "K" (OK) atau karakter "R" (ERROR) sebagai indikator akhir pembacaan PDU SMS...
kan kalo SMS berhasil dibaca akhirnya pasti ada OK.
dan kalo SMS gagal dibaca akhirnya pasti ada ERROR.

w=0;
while (huruf!='K' && huruf!='R')
{
huruf = getchar();
if (huruf, simbol, atau angka) ambil_PDU[w]=huruf; // malas ngetiknya  ::)   ::)
w++;
}

Met mencoba..  :D  ;)  ;D

vallenangelict

KutipLihat daftar ASCII pada karakter LCD 16x2. Ingat ASCII pada LCD warna biru dengan ASCII pada lcd warna kuning/hijau sedikit berbeda.
Link :
[pranala luar disembunyikan, sila masuk atau daftar.]
[pranala luar disembunyikan, sila masuk atau daftar.]
hehe,, sebelumnye gw uda liad kok boz,, itu juga ada di blog anda kalo ga salah  ;)

Kutipif (simbol, huruf atau angka) then simpan ke array
else do nothing.

w=0;
while (huruf!='K' && huruf!='R')
{
huruf = getchar();
if (huruf, simbol, atau angka) ambil_PDU[w]=huruf; // malas ngetiknya  ::)   ::)
w++;
}

hehehe,, maap bos,, gw blum sempet nyoba,, ni gw aja uda mw bubug  :P
besok gw cobain de  ;D ;D ;D
btw,, makasi bgt ya bozz  :-*

vallenangelict

btw,, ni contoh program gw yg gw buat untuk nyalain & matiin lampu  ;)
oiyaa,, ini USARTnya gw pake interrupt (sementara gw delete soalnye kagak cukup)

#include <mega8535.h>
#include <delay.h>

#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>

#define buzzer PORTA.0
#define lampu PORTA.1

// Standard Input/Output functions
#include <stdio.h>

// Declare your global variables here

char ambil_PDU[100];
int w,n;
char pesan_nyala[]={'0','5','E','E','7','C','9','8','1','D','0','6'};
char pesan_mati[]={'0','4','E','D','3','0','3','D','0','D'};

void read_SMS();
void delete_SMS();
void buzzer_kedip2();

void main(void)
{
DDRA=0b00000011;

UCSRA=0x00;
UCSRB=0xD8;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x26;

ACSR=0x80;
SFIOR=0x00;

// LCD module initialization
lcd_init(16);

// Global enable interrupts
#asm("sei")

lcd_gotoxy (0,0);
lcd_putsf("Cek Koneksi HP");
delay_ms(2000);

lcd_clear();
lcd_gotoxy (0,0);
lcd_putsf("SET ate0 :");
delay_ms(500);
printf("ate0");
putchar(13);
while (getchar()!='O');
while (getchar()!='K');
lcd_gotoxy (0,1);
lcd_putsf("ate0 SUKSES");
delay_ms(500);

lcd_clear();
lcd_gotoxy (0,0);
lcd_putsf("SET at :");
delay_ms(500);
printf("at");
putchar(13);
while (getchar()!='O');
while (getchar()!='K');
lcd_gotoxy (0,1);
lcd_putsf("at SUKSES");
delay_ms(500);

lcd_clear();
lcd_gotoxy (0,0);
lcd_putsf("Deleting SMS :");
delay_ms(500);
printf("AT+CMGD=1");
putchar(13);
while (getchar()!='O');
while (getchar()!='K');
delay_ms(1000);
printf("AT+CMGD=2");
putchar(13);
while (getchar()!='O');
while (getchar()!='K');
lcd_gotoxy (0,1);
lcd_putsf("SMS DELETED");
delay_ms(500);

lcd_clear();
lcd_gotoxy (0,0);
lcd_putsf("SIAP TERIMA SMS");
delay_ms(1000);

while (1)
{   
        read_SMS();       
}
}

void read_SMS()
{
        looping:
        lcd_clear();
        lcd_gotoxy (0,0);
        lcd_putsf("Menunggu SMS");       
        printf("AT+CMGL=0");
        putchar(13);

        if (getchar()=='O') { }
        if (getchar()=='O') { }
        if (getchar()=='O') { }
        if (getchar()=='O') { }
        if (getchar()=='O') { }
        else
        {
                {
                        buzzer_kedip2();
                        lcd_clear();
                        lcd_gotoxy (0,0);
                        lcd_putsf("ADA SMS MASUK");
                        delay_ms(1000);
                        printf("AT+CMGR=1");
                        putchar(13);
                        while (getchar()!='+');

                        for (w=0;w<=80;w++)
                        {       
                                ambil_PDU[w]=getchar();
                        }
                        delay_ms(1000);
                        if (ambil_PDU[80]=='K')
                        {
                                printf("AT+CMGR=1");
                                putchar(13);
                                while (getchar()!='+');
                                for (w=0;w<=74;w++)
                                {       
                                        ambil_PDU[w]=getchar();
                                }
                                if ((ambil_PDU[63]==pesan_nyala[0])&&
                                (ambil_PDU[64]==pesan_nyala[1])&&
                                (ambil_PDU[65]==pesan_nyala[2])&&
                                (ambil_PDU[66]==pesan_nyala[3])&&
                                (ambil_PDU[67]==pesan_nyala[4])&&
                                (ambil_PDU[68]==pesan_nyala[5])&&
                                (ambil_PDU[69]==pesan_nyala[6])&&
                                (ambil_PDU[70]==pesan_nyala[7])&&
                                (ambil_PDU[71]==pesan_nyala[8])&&
                                (ambil_PDU[72]==pesan_nyala[9])&&
                                (ambil_PDU[73]==pesan_nyala[10])&&
                                (ambil_PDU[74]==pesan_nyala[11]))
                                {
                                        buzzer_kedip2();
                                        lampu=1;
                                        lcd_clear();
                                        lcd_gotoxy (0,0);
                                        lcd_putsf("LAMPU MENYALA");
                                        delete_SMS();
                                }
                        }

                        if (ambil_PDU[78]=='K')
                        {
                                printf("AT+CMGR=1");
                                putchar(13);
                                while (getchar()!='+');
                                for (w=0;w<=72;w++)
                                {       
                                        ambil_PDU[w]=getchar();
                                }
                                if ((ambil_PDU[63]==pesan_mati[0])&&
                                (ambil_PDU[64]==pesan_mati[1])&&
                                (ambil_PDU[65]==pesan_mati[2])&&
                                (ambil_PDU[66]==pesan_mati[3])&&
                                (ambil_PDU[67]==pesan_mati[4])&&
                                (ambil_PDU[68]==pesan_mati[5])&&
                                (ambil_PDU[69]==pesan_mati[6])&&
                                (ambil_PDU[70]==pesan_mati[7])&&
                                (ambil_PDU[71]==pesan_mati[8])&&
                                (ambil_PDU[72]==pesan_mati[9]))   
                                {
                                        buzzer_kedip2();
                                        lampu=0;
                                        lcd_clear();
                                        lcd_gotoxy (0,0);
                                        lcd_putsf("LAMPU MATI");
                                        delete_SMS();
                                }
                        }
                        else
                        {
                                delete_SMS();       
                        }
                        lcd_clear();
                        lcd_gotoxy (0,0);
                        lcd_putsf("OK");
                        delay_ms(1000);
                        goto looping;
                }

        }
        if (getchar()=='K') { }
        for (n=0;n<=15;n++)
        {
                lcd_gotoxy (n,1);
                lcd_putsf("*");
                delay_ms(50);
        }
        goto looping;     
}

void buzzer_kedip2()
{
        buzzer=1;
        delay_ms(50);
        buzzer=0;
        delay_ms(50);
        buzzer=1;
        delay_ms(50);
        buzzer=0;
        delay_ms(50);

   
void delete_SMS()
{
        delay_ms(1000);
        printf("AT+CMGD=1");
        putchar(13);
        while (getchar()!='O');
        while (getchar()!='K');
}

ntu program uda jalan kok,, tp kok perilakunye kadang aneh2 yee??
misalnya : gw sms "nyala" ato sms "mati" untuk yg kesekian kalinya,, alatnye tu brenti pada saat tampilan LCD "LAMPU MENYALA" ato "LAMPU MATI"  :-\ :-\ :-\
ntu knape yaaa??  ??? ??? ???
& kok gw ngrasa ntu listing program kayaknya aneh bgt (terlalu boros menurut gw)  :D
maap ajee,, kemampuan bahasa C gw masi kelas teri boz,, ntu aje ga da atupun yg ngajarin jdinye rada2 ngawur deh  ;D

Too Payz

Wedew Panjang juga...  ;D   ;D
Kutipbtw,, ni contoh program gw yg gw buat untuk nyalain & matiin lampu  ;)
oiyaa,, ini USARTnya gw pake interrupt (sementara gw delete soalnye kagak cukup)
Seharusnya tidak perlu pakai interupsi karena mikro yang mengendalikan "kapan terjadinya komunikasi dgn HP", kan setelah dikasi AT-coomand HP pasti jawab terus-menerus hingga ada OK atau ERROR jadi sebaiknya mikro "jangan melakukan apapun" saat komunikasi terjadi..
Kutipchar pesan_nyala[]={'0','5','E','E','7','C','9','8','1','D','0','6'};
char pesan_mati[]={'0','4','E','D','3','0','3','D','0','D'};
Boleh juga caranya, aq g kepikiran begini...  :o   :o
Kutiplcd_clear();
lcd_gotoxy (0,0);
lcd_putsf("SET ate0 :");
delay_ms(500);
printf("ate0");
putchar(13);
while (getchar()!='O');
while (getchar()!='K');
Biasanya saya makenya putchar(0x0D); putchar(0x0A);
atau putchar(13); putchar(10);
oiya biar di gabung 1 line bisa ditulis printf("ate0\x0D\x0A");
Singkat to..  :D
Kutiplcd_clear();
lcd_gotoxy (0,0);
lcd_putsf("Deleting SMS :");
delay_ms(500);
printf("AT+CMGD=1");
putchar(13);
while (getchar()!='O');
while (getchar()!='K');
delay_ms(1000);
printf("AT+CMGD=2");
putchar(13);
while (getchar()!='O');
while (getchar()!='K');
lcd_gotoxy (0,1);
lcd_putsf("SMS DELETED");
delay_ms(500);
Mengapa mesti Delete 2 SMS misalkan sejak awal InBox-nya kosong gimana ??

Btw misalkan balasan bukannya OK tetapi ERROR yang berarti K "tidak akan pernah ditemui" berarti programnya g akan jalan ke bawah / nyangkut gara-gara perintah
while (getchar()!='K');
Bahaya ini.....  >:D   >:D
Kutip
void read_SMS()
{
        looping:
        lcd_clear();
        lcd_gotoxy (0,0);
        lcd_putsf("Menunggu SMS");       
        printf("AT+CMGL=0");
        putchar(13);
daripada looping sambil nunggu SMS mending ada tampilan LCD yang berganti-gantian atau LED kedap-kedip yang menunjukkan "programnya masih jalan" kalo g terjadi apa-apa kan bingung, ini program error atau berfungsi..
Kutip
        if (getchar()=='O') { }
        if (getchar()=='O') { }
        if (getchar()=='O') { }
        if (getchar()=='O') { }
        if (getchar()=='O') { }
Bahaya..bahaya...  >:D   >:D  Rawan nyangkut..
Bisa disingkat:
for (x=0; x<5; x++)  if (getchar()=='O'); // titik koma saja n g usa {} = do nothing
Kutip
...........
Coding cek pesan nyala n pesan mati
g di tulis panjang bgt..  ::)   ::)
...........
Pusing.... Wakakakakaaaa  ;D   ;D
Codingnya memang belum sederhana...
Kesamaan NYALA n MATI atau bahkan pesan apapun sepertinya dimulai dari data PDU ke-63 jadi langsung saja dibandingkan ketika data PDU ke-63. Misal :


                        buzzer_kedip2();
                        lcd_clear();
                        lcd_gotoxy (0,0);
                        lcd_putsf("ADA SMS MASUK");
                        delay_ms(1000);
                        printf("AT+CMGR=1");
                        putchar(13);
                        while (getchar()!='+');

                        x = 0;    // variabel tambahan
                        ke = 0;  // variabel tambahan
                        // ram_bebas juga variabel tambahan
                        while (ram_bebas!='K' && ram_bebas!='R')
                        {     
                                ram_bebas=getchar();  // di ram saja mayan hemat memori     
                                if (x>=63 && x<=74)  // cuma 12 karakter (NYALA)
                                {
                                    ambil_PDU[ke] = ram_bebas;
                                    ke++;
                                }
                                x++;
                        }
                        // bandingkan apakah NYALA atau MATI

variabel ambil_PDU[] juga g perlu sampai 100, maksimal untuk NYALA n MATI 12 saja.
Kutip
                        lcd_clear();
                        lcd_gotoxy (0,0);
                        lcd_putsf("OK");
                        delay_ms(1000);
                        goto looping;
                }
Hindari penggunaan goto Seharusnya dalam bahasa C sudah tidak ada goto karena bisa merusak alur program..

kuin

mendingan pakai sony ericson T610 yang udah ada mode text, kalo PDU text kan sulit......he he he

hevngate!

saya mau tanya soalnya udah stress bgt oprek hardware saya yang ga jalan sesuai yg saya inginkan.
saya bikin sistem penjawab SMS otomatis dengn mikrokontroler AVR ATMEGA8535. saya menggunakan HP Sony Ericsson T610 yang sudah dilengkapi teks mode untuk mempermudah pemrosesan data. dan berikut ini adalah koneksinya

GND dr hp --> gnd uC

ah untuk ngecek apakah HP ini konek ama mikronya saya coba DIAL dengan program berikut
$crystal=12000000
$baud=9600

Print "ATD0857297XXXXX";chr(13)
wait 2

nah pas dicoba di HP saya ternyata bisa dialing nomer diatas, TAPI itu cuma sesaat saja, sehingga sebelum T610nya menyambungkan dengan telpon yg dituju alias sedang CONNECTING eh malah tiba2 DIAL nya BERHENTI sehingga tidak bisa menyambung. nah disini saya mulai heran kenapa bs kek gini??

tapi saya berpikir, "ah ini kan cm buat testing koneksi mikro dengan HP, toh sudah konek, lagipula saya tidak butuh command DIAL"

akhirnya saya mulai membikin program testing kirim SMS seperti berikut:
$crystal=12000000
$baud=9600

Print "AT+CMGF=1"
waitms 500
Print "AT+CMGS="; chr(34);"+628572XXXXX";chr(34)
wait 1
Print "TESTING SMS";chr(26)
wait 1


ternyata malah tidak jalan sama sekali, padahal semua AT command yang sudah saya coba diatas itu sudah sesuai dengan AT command dari SE T610. adakah yang bisa tolong bantu saya  ???

herlambang

built-in double watchdog! ^^"   *Problem Solved*

haglan

sayangnya w pernahcoba pkenyayg pdu mode hehehe yg teks aku yum pernah tuh n di pdu w jadi kirimnya ...

hyman45

ntu program uda jalan kok,, tp kok perilakunye kadang aneh2 yee??
misalnya : gw sms "nyala" ato sms "mati" untuk yg kesekian kalinya,, alatnye tu brenti pada saat tampilan LCD "LAMPU MENYALA" ato "LAMPU MATI"  :-\ :-\ :-\
ntu knape yaaa??  ??? ??? ???

wah sama gan masalah kita,kadang suka eror trs klo kelamaan kyk g mau kerja