راه اندازی HT9032D

راه اندازی HT9032D آی سی Caller ID با ESP8266 در آردوینو

محتوا

مقدمه ایی بر تکنولوژی Caller ID یا شماره تماس گیرنده

راه اندازی HT9032D جزء پروژه های تحقیق و توسعه ایی است که خیلی درگیرم کرد و آموزش های فارسی هم در موردش کم پیدا میشه پس سعی کردم نتایج رو تو سایت بزارم تا دیگران هم مثل من وقت شون گرفته نشه و عصابشون خورد نشه (می دونم چه حسی داره). قبل از شروع این آموزش اینو یادآوری کنم که دوستان انجمن ECA و ایران میکرو نقش مهمی در رفع مشکلات اولیه راه اندازی این آی سی داشتن که بدون منت تجربیات ارزش مند خود را دراختیار دیگران قرار دادن.

کالرآیدی چیست و سیگنال Caller ID چگونه ارسال می شود

یکی از موارد مهمی که در مکالمه تلفنی بر بستر مخابرات مهم است شماره تماس گیرنده می باشد که به دو روش این اطلاعات به تماس گیرنده ارسال می شود به طور خلاصه Frequency Shift Keying یا FSK روشی است کلی برای ارسال اطلاعات بر روی خطوط یا بستر (Carrier) آنالوگ و  Dual Tone Multy Frequency یا DTMF همان مکانیزی است که در هنگام شماره گیری از روی شماره گیر تلفن خود از آن استفاده می کنید. برای تشخیص اینکه خط شما FSK یا DTMF هست هم طبق تجربه دوستان و اطلاعات بدست آمده اگر شماره تماس گیرنده قبل از زنگ اول نمایش داده شود خط شما DTMF است و اگر بین زنگ اول و دوم نمایش داده شود خط شما FSK می باشد.

نحوه تشخیص شماره تماس گیرنده Caller ID بر روی خط FSK

اگر خط شما FSK بود می توانید با آی سی HT9032D یا HT9032C شماره تماس گیرنده و زمان آن را تشخیص بدهید که من در این پرژوه از HT9032D استفاده کردم و لازم به ذکر است که بگم تقریبا حدود 36 وقت منو گرفت تا راه اندازی شود و مرجع فارسی هم در مورد تجربه استفاده از این آی سی کم بود و به همین خاطر تصمیم گرفتم اطلاعات و نکات مهم رو در این آموزش گردآوری کنم تا دیگر دوستان مثل من درگیر موارد سطحی نباشند و سریع تر به هدف نهایی خود برسند. برای نتیجه بهتر به نکاتی که در هنگام آموزش ارائه می شود دقت کنید.

نحوه راه اندازی آی سی HT9032D و قطعات مورد نیاز

بهترین مداری که تست زدم: خازن های C6 و C5 حتما باید سرامیکی باشد تحمل ولتاژ بالای 50 ولت و اگر از خازن عدسی استفاده کنید اطلاعات ناقص دریافت می کنید در مورد کریستال هم 3.58  یا 3.579 مگاهرتز می تونید استفاده کنید ، فقط 3.579 رو راحتر می تونید پیدا کنید و ضمنا دو تا خازن عدسی 30 یا 22 پیکو فاراد به پایه های کریستال وصل کنید چوک آبی یا زرد استفاده کنید هر مورد جواب داد در صورتی که منبع تغذیه آی سی مستقل باشه ، به جای مقاومت های R8 و R9 از مقاومت 200 کیلواهم هم می تونید استفاده کنید طبق مواردی که گفته شد مدار بخوبی کار کرد و شماره تماس گیرنده رو دریافت کردم.

راه اندازی HT9032D

نحوه دریافت و جداسازی اطلاعات تماس گیرنده از خروجی آی سی HT9032D

برای نمایش خروجی این آی سی باید باود ریت رو بر روی 1200 تنظیم کنید و به محض اتصال ورودی آی سی به خط تلفن دائما مقادیری نامشخص به شما نمایش داده می شود که این کاملا طبیعی است هنگام تماس در بین این مقادیر اطلاعات تماس گیرنده برای شما ارسال می شود که شماره تماس گیرنده رو می تونید به راحتی مشاهده کنی و فقط نیاز به مقدار کد نویسی هست تا شماره و زمان دریافت رو استخراج کنید که اونم از اینجا می تویند برای آردوینو دانلود کنید و همچنین ویدئویی از نحوه دریافت این اطلاعات رو در سریال مانیتورینگ برای شما قرار دادم تا اگر هم مشکلی وجود دارد راحتر بتونیم حلش کنید و همچنین قطعات استفاده شده و نحوه سیم کشی بر روی برد برد رو هم به صورت عکس برای شما در این آموزش قرار دادم امیدوارم مفید واقع شده باشد.

نمونه کد آردینو و تجربه های عملی من در این پروژه

مدارات متفاوتی تست زدم از ابین همه ی مدارهایی که بود مدار فوق از همه بهتر عمل کرد و حتی یکبار هم اطلاعات دریافتی اشتباه نبود ولی مثلا مداری که در دیتاشیت آی سی هست یکی در میان اطلاعات ناقص دریافت میشد گاهی یک یا دو عدد نمایش داده نمی شد در مورد نمونه کد هنوز آنالیز نکردم ولی درکل بدون مشکل جواب میده و اینکه دقت کنید پایه RX به آی سی متصل میشود در چند روز آینده PCB این مدار رو در فروشگاه قرار می دهم.

#include SoftwareSerial.h;
SoftwareSerial mySerial(10, 11); // RX, TX

static int state=0;
static int o=0;
static int i=0;
static char nam[128];
static char num[25];
static char dat[25];
static int plen=0;
static int nlen=0;
static int dlen=0;
static int mlen=0;
static int len=0;
int SER = 0;
String str = "";

void setup(){
Serial.begin(9600);
mySerial.begin(1200);
Serial.println("Start");
delay(100);
}

void loop(){
Ht9032_get();
if( state == 10 ) {
o=0;
Serial.println("State: 10 ");
Serial.print("DATE: ");
Serial.print(char(dat[0]));
Serial.print(char(dat[1]));
Serial.print('/');
Serial.print(char(dat[2]));
Serial.println(char(dat[3]));
Serial.print("TIME: ");
Serial.print(char(dat[4]));
Serial.print(char(dat[5]));
Serial.print(':');
Serial.print(char(dat[6]));
Serial.println(char(dat[7]));
Serial.print("NAME: ");
for(int i=0;i<nlen;i++){
Serial.print(char(nam[i]));
}

Serial.println("");
Serial.print("NUMBER: ");
for(int i=0;i<mlen;i++){
Serial.print(char(num[i]));
}

Serial.println("");
state=0;
Serial.print("Last Call Received :");
Serial.print("Date:");
Serial.print(char(dat[0]));
Serial.print(char(dat[1]));
Serial.print('/');
Serial.print(char(dat[2]));
Serial.print(char(dat[3]));
Serial.print(" ");
Serial.print(char(dat[4]));
Serial.print(char(dat[5]));
Serial.print(':');
Serial.print(char(dat[6]));
Serial.print(char(dat[7]));
Serial.println("Name: ");

for(int i=0;i<nlen;i++){
Serial.print(char(nam[i]));
}

Serial.println("Num :");
str = "";

for(int i=0;i<mlen;i++){
Serial.print(char(num[i]));
str += char(num[i]);
}
}
}

void Ht9032_get(){
if ( mySerial.available() > 0 ){

SER = mySerial.read();

/*
* states
* 0 - waiting for U's
* 1 - waiting for 25 U's and then an 0x80
* 2 - waiting for packet len
* 3 - waiting for message id
* 4 - get name len
* 5 - receiving name
* 6 - get number len
* 7 - receiving number
* 8 - get date len
* 9 - receiving date
* 10 - packet complete
*
* message ids
* 1 - date
* 2 - number
* 4 - number not found reason
* 7 - name
* 8 - name not found reason
*
* reasons
* O - Out of area (no caller ID available)
* P - Private party (Blocked)
*
*/
switch(state){
case 0:if (SER==0x55) {
state=1;
i=1;
Serial.println("State: 0 ");
}
break;

case 1:if (SER==0x55) {
i++;
}

if(SER==0x80){
if(i > 25){
state=2;
}
}
Serial.println("State: 1 ");
break;

case 2:plen = SER;
i=0;
state=3;
Serial.println("State: 2 ");
Serial.print("Packet Length: ");
Serial.println(plen);
break;

case 3: o++;
Serial.println("State: 3 ");
Serial.print("MID: ");
Serial.println(SER);
if(SER==1) {
state=8;
}
else if(SER==2){
state=6;
}
else if(SER==4){
state=6;
}
else if(SER==7){
state=4;
}
else if(SER==8){
state=4;
}
break;

case 4:len = SER;
nlen = len ;
o++;
i=0;
state=5;
Serial.println("State: 4 ");
Serial.print("Data Length: ");
Serial.println(nlen);
break;

case 6:len = SER;
mlen = len ;
o++;
i=0;
state=7;
Serial.println("State: 6 ");
Serial.print("Data Length: ");
Serial.println(mlen);
break;

case 8:len = SER;
dlen = len ;
o++;
i=0;
state=9;
Serial.println("State: 8 ");
Serial.print("Data Length: ");
Serial.println(dlen);
break;

case 5:nam[i]=SER;
i++;
o++;
if( i > nlen - 1 ) {
state=3;
i=0;
}
if( o > plen - 1 ) {
state=10;
}
Serial.println("State: 5 ");
break;

case 7:num[i]=SER;
i++;
o++;
if( i > mlen - 1 ) {
state=3;
i=0;
}
if( o > plen - 1 ) {
state=10;
}
Serial.println("State: 7 ");
break;

case 9:dat[i]=SER;
i++;
o++;
if( i > dlen - 1 ) {
state=3;
i=0;
}
if( o > plen - 1 ) {
state=10;
}
Serial.println("State: 9 ");
break;

default:break;
}
}
}

 

3.3 4 votes
امتیازدهی به مقاله
بخش نظرات
مشترک شوید
Notify of
guest
5 نظرات
قدیمی ترین
جدیدترین بیشترین آرای
Inline Feedbacks
View all comments
abbas
abbas
1 year ago

سلام
فایل شماتیک یا pcb این برد رو دارین؟

Ali
Ali
10 months ago

سلام بسیار عالی . اگر pcb یا مونتاژ‌شده این بورد رو برای فروش دارید لطفا از طریق ایمیل زیربه بنده اطلاع دهید.
alinet.ir@gmail.com

کوووو
کوووو
1 month ago

#include SoftwareSerial.h;
این باید بشه این
#include <SoftwareSerial.h>;

5
0
Would love your thoughts, please comment.x
×
×

سبد خرید