رباتیک و هوافضا

پروژه ی ارسال پیامک و امکان تماس با رزبری پای و ماژول GSM

ارسال پیامک و امکان تماس با رزبری پای و ماژول GSM

به نام خدا

پروژه ی ارسال پیامک و امکان تماس با رزبری پای و ماژول GSM

 

ارسال پیامک و امکان تماس با رزبری پای و ماژول GSM

در این پروژه قصد داریم یک تلفن همراه ساده با استفاده از Raspberry Pi بسازیم. برای برقراری یا پاسخ دادن به تماس و ارسال  یا خواندن پیامک از ماژول GSM استفاده می کنیم . همچنین این پروژه دارای میکروفن و اسپیکر برای تماس های صوتی  است.

قطعات مورد نیاز ارسال پیامک و امکان تماس با رزبری پای و ماژول GSM:

  • رزبری پای ۳ (هر مدلی)
  • ماژول GSM
  • ال سی دی  ۲ ۱۶X
  • کی پد ۴X4
  • پتانسومتر ۱۰ کیلو اهمی
  • برد بورد
  • سیم برد بورد
  • منبع تغذیه
  • اسپیکر
  • میکروفون
  • سیم کارت
  • مدار تقویت کننده صدا( الزامی نیست )

ارسال پیامک و امکان تماس با رزبری پای و ماژول GSM

طرز کار:

در این پروژه از رزبری پای و ماژول GPS برای کنترل تمام امکانات و دسترسی به تمام قطعات ؛ از کی پد ۴×۴  برای وارد کردن شماره ، نوشتن پیام ، تماس گرفتن ، جواب دادن به تماس ، فرستادن پیام و خواندن پیام  ؛  از ماژول GPS SIM900A برای برقراری ارتباط با شبکه های تلفن همراه (ایرانسل،همراه اول یا هر شبکه دیگری) ؛ از میکرفون و اسپیکر برای تماس های صوتی  و از ال سی دی ۱۶X2 برای نمایش پیام ها و هشدارها  استفاده می کنیم.

برای نوشتن حروف و عدد ، از کی پد الفبایی-عددی (Alphanumeric) استفاده می کنیم. کی پد الفانامریک قابلیت نوشتن حروف و عدد را از روی یک کی پد به ما می دهد. طریقه برنامه نویسی کی پد الفانامریک را در آخر پست مشاهده می کنید.

ارسال پیامک و امکان تماس با رزبری پای و ماژول GSM

امکانات گوشی رزبری پای:

۱ – تماس گرفتن:

برای برقراری تماس باید دکمه “C” رااز روی کی پد فشار دهیم و سپس به وسیله کی پد شماره ای که می خواهیم با آن تماس بگیریم را وارد کنیم. پس از وارد کردن شماره باید دوباره دکمه “C” را فشار دهیم. با انجام این کار رزبری پای به وسیله دستور زیر تماس را برقرار می کند.(در کد زیر xxxxxxxxxx شماره گیرنده است)

ATDxxxxxxxxxx; <Enter>     where xxxxxxxxx is entered Mobile Number.

۲ – پاسخگویی به تماس:

هنگامی که شخصی تماس می گیرد ، روی ال سی دی پیغام ‘Incoming…’ بهمراه شماره فرد تماس گیرنده ظاهر می شود. تنها کاری که ما برای برقراری تماس باید انجام دهیم فشردن دکمه ‘A’ است. با فشردن این دکمه دستور زیر به ماژول GSM فرستاده می شود.

ATA <enter>

۳ – ارسال پیام:

برای ارسال پیام ابتدا دکمه ‘D’ را فشار می دهیم، بعد باید شماره گیرنده را وارد کنیم و برای تایید دکمه ی ‘D’ را فشار دهیم. سپس پیامی که می خواهیم را وارد کرده (مانند همه گوشی های دیگر) و دوباره ‘D’ را فشار  می دهیم. با انجام کار های گفته شده دستورات زیر به ماژول GSM فرستاده می شود.(در کد زیر xxxxxxxxxx شماره گیرنده پیام است)

AT+CMGF=1 <enter>
AT+CMGS=”xxxxxxxxxx” <enter>     where: xxxxxxxxxx is entered mobile number

 بعد از دستورات فوق با فرستادن دستور “۲۶” توسط رزبری پای به ماژول GSM ، پیام فرستاده می شود.

۴ – دریافت و خواندن پیام:

پیام هایی که دریافت می کنید در سیم کارت ذخیره می شود. رزبری پای به وسیله رابط UART هر لحظه پیام های دریافت شده را چک می کند. هر وقت پیام تازه ای دریافت شود روی ال سی دی پیغام “New message” ظاهر می شود. برای دیدن پیام دریافت شده کافی است دکمه ‘B’ را فشار دهیم. وقتی پیامی توسط ماژول GSM گرفته می شود دستور زیر را از طریق UART برای رزبری پای می فرستد.(در کد زیر ‘۶’ آدرس حافظه ای است که پیام در آن ذخیره شده. )

+CMTI: “SM”,۶  Where 6 is message location where it stored in SIM card.

 وقتی دستور بالا توسط رزبری پای گرفته می شود، با فرستادن دستور زیر پیام را می خواند. در کد زیر “SMS stored location” مکانی است که پیام در آن ذخیره شده.

AT+CMGR=<SMS stored location><enter>

پیام خوانده شده از ماژول GSM توسط رزبری پای روی ال سی دی نمایش داده می شود.

بیشتر بخوانید...  راه اندازی دات ماتریس 8*8 با استفاده از آردوینو

ارسال پیامک و امکان تماس با رزبری پای و ماژول GSM

توجه داشته باشید که برای اسپیکر و میکروفون به برنامه نویسی نیاز نداریم.

شماتیک مدار:

ارسال پیامک و امکان تماس با رزبری پای و ماژول GSM

 

پایه های  RS, EN, D4, D5, D6, D7 از ال سی دی ۱۶X2 به ترتیب به پین های ۱۸, ۲۳, ۲۴, ۲۵, ۸ , ۷ رزبری پای متصل شده اند.پایه Rx ماژول GSM به Tx رزبری پای و پایه Tx ماژول GSM به Rx رزبری پای متصل شده (زمین ماژول و رزبری پای باید به یکدیگر متصل شوند). پایه های ستون های کی پد R1, R2, R3, R4 به ترتیب به پین های۱۲,۱۶, ۲۰, ۲۱ رزبری پای و پایه های سطر های کی پد C1, C2, C3, C4 به ۲۶, ۱۹, ۱۳ , ۶ رزبری پای متصل شده اند. پایه های میکروفون مستقیما به پین های mic+ و mic- متصل شده و تقویت کننده صدا به پین های sp+ و sp- و سپس به اسپیکر متصل شده است. امپلی فایر(تقویت کننده صدا) الزامی نیست و می توانید بجای استفاده از آن، مستقیما اسپیکر را به پین های sp+ و sp- وصل کنید.

دانلود کد :

دانلود فایل
import RPi.GPIO as gpio
import serial
import time
msg=""
#     ۰      ۷   ۱۱  ۱۵  ۱۹  ۲۳  ۲۷   ۳۲  ۳۶   ۴۱۴۲۴۴   ROLL45
alpha="1!@.,:?ABC2DEF3GHI4JKL5MNO6PQRS7TUV8WXYZ90 *#"
x=0
y=0
MATRIX = [
            ['۱','۲','۳','A'],
            ['۴','۵','۶','B'],
            ['۷','۸','۹','C'],
            ['*','۰','#','D']
         ]
ROW = [21,20,16,12]
COL = [26,19,13,6]
moNum=['0','0','0','0','0','0','0','0','0','0']
m11=17
m12=27
led=5
buz=26
button=19
RS =18
EN =23
D4 =24
D5 =25
D6 =8
D7 =7
HIGH=1
LOW=0
gpio.setwarnings(False)
gpio.setmode(gpio.BCM)
gpio.setup(RS, gpio.OUT)
gpio.setup(EN, gpio.OUT)
gpio.setup(D4, gpio.OUT)
gpio.setup(D5, gpio.OUT)
gpio.setup(D6, gpio.OUT)
gpio.setup(D7, gpio.OUT)
gpio.setup(led, gpio.OUT)
gpio.setup(buz, gpio.OUT)
gpio.setup(m11, gpio.OUT)
gpio.setup(m12, gpio.OUT)
gpio.setup(button, gpio.IN)
gpio.output(led , 0)
gpio.output(buz , 0)
gpio.output(m11 , 0)
gpio.output(m12 , 0)
for j in range(4):
    gpio.setup(COL[j], gpio.OUT)
    gpio.setup(COL[j],1)
  
for i in range (4):
    gpio.setup(ROW[i],gpio.IN,pull_up_down=gpio.PUD_UP)
Serial = serial.Serial("/dev/ttyS0", baudrate=9600, timeout=2)
data=""
def begin():
  lcdcmd(0x33) 
  lcdcmd(0x32) 
  lcdcmd(0x06)
  lcdcmd(0x0C) 
  lcdcmd(0x28) 
  lcdcmd(0x01) 
  time.sleep(0.0005)
 
def lcdcmd(ch): 
  gpio.output(RS, 0)
  gpio.output(D4, 0)
  gpio.output(D5, 0)
  gpio.output(D6, 0)
  gpio.output(D7, 0)
  if ch&0x10==0x10:
    gpio.output(D4, 1)
  if ch&0x20==0x20:
    gpio.output(D5, 1)
  if ch&0x40==0x40:
    gpio.output(D6, 1)
  if ch&0x80==0x80:
    gpio.output(D7, 1)
  gpio.output(EN, 1)
  time.sleep(0.005)
  gpio.output(EN, 0)
  # Low bits
  gpio.output(D4, 0)
  gpio.output(D5, 0)
  gpio.output(D6, 0)
  gpio.output(D7, 0)
  if ch&0x01==0x01:
    gpio.output(D4, 1)
  if ch&0x02==0x02:
    gpio.output(D5, 1)
  if ch&0x04==0x04:
    gpio.output(D6, 1)
  if ch&0x08==0x08:
    gpio.output(D7, 1)
  gpio.output(EN, 1)
  time.sleep(0.005)
  gpio.output(EN, 0)
  
def lcdwrite(ch): 
  gpio.output(RS, 1)
  gpio.output(D4, 0)
  gpio.output(D5, 0)
  gpio.output(D6, 0)
  gpio.output(D7, 0)
  if ch&0x10==0x10:
    gpio.output(D4, 1)
  if ch&0x20==0x20:
    gpio.output(D5, 1)
  if ch&0x40==0x40:
    gpio.output(D6, 1)
  if ch&0x80==0x80:
    gpio.output(D7, 1)
  gpio.output(EN, 1)
  time.sleep(0.005)
  gpio.output(EN, 0)
  # Low bits
  gpio.output(D4, 0)
  gpio.output(D5, 0)
  gpio.output(D6, 0)
  gpio.output(D7, 0)
  if ch&0x01==0x01:
    gpio.output(D4, 1)
  if ch&0x02==0x02:
    gpio.output(D5, 1)
  if ch&0x04==0x04:
    gpio.output(D6, 1)
  if ch&0x08==0x08:
    gpio.output(D7, 1)
  gpio.output(EN, 1)
  time.sleep(0.005)
  gpio.output(EN, 0)
def lcdclear():
  lcdcmd(0x01)
 
def lcdprint(Str):
  l=0;
  l=len(Str)
  for i in range(l):
    lcdwrite(ord(Str[i]))
def setCursor(x,y):
    if y == 0:
        n=128+x
    elif y == 1:
        n=192+x
    lcdcmd(n)
def keypad():
   for j in range(4):
     gpio.setup(COL[j], gpio.OUT)
     gpio.output(COL[j], 0)
     ch=0
     for i in range(4):
       if gpio.input(ROW[i])==0:
         ch=MATRIX[i][j]
         #lcdwrite(ord(ch))
        # print "Key Pressed:",ch
        # time.sleep(2)
         return ch
         while (gpio.input(ROW[i]) == 0):
           pass
     gpio.output(COL[j],1)
    # callNum[n]=ch
   
def serialEvent():
    data = Serial.read(20)
    #if data != '\0':
    print data
    data=""
    
def gsmInit():
    lcdclear()
    lcdprint("Finding Module");
    time.sleep(1)
    while 1:
        data=""
        Serial.write("AT\r");
        data=Serial.read(10)
        print data
        r=data.find("OK")
        if r>=0:
            break
        time.sleep(0.5)
        
    while 1:
        data=""
        Serial.write("AT+CLIP=1\r");
        data=Serial.read(10)
        print data
        r=data.find("OK")
        if r>=0:
            break
        time.sleep(0.5)
        
    lcdclear()
    lcdprint("Finding Network")
    time.sleep(1)
    while 1:
        data=""
        Serial.flush()
        Serial.write("AT+CPIN?\r");
        data=Serial.read(30)
        print data
        r=data.find("READY")
        if r>=0:
            break
        time.sleep(0.5)
    
    lcdclear()
    lcdprint("Finding Operator")
    time.sleep(1)
    while 1:
        data=""
        Serial.flush()
        Serial.read(20)
        Serial.write("AT+COPS?\r");
        data=Serial.read(40)
        #print data
        r=data.find("+COPS:")
        if r>=0:
            l1=data.find(",\"")+2
            l2=data.find("\"\r")
            operator=data[l1:l2]
            lcdclear()
            lcdprint(operator)
            time.sleep(3)
            print operator
            break;
        time.sleep(0.5)
    Serial.write("AT+CMGF=1\r");
    time.sleep(0.5)
   # Serial.write("AT+CNMI=2,2,0,0,0\r");
   # time.sleep(0.5)
    Serial.write("AT+CSMP=17,167,0,0\r");
    time.sleep(0.5)
def receiveCall(data):
        inNumber=""
        r=data.find("+CLIP:")
        if r>0:
            inNumber=""
            inNumber=data[r+8:r+21]
            lcdclear()
            lcdprint("incoming")
            setCursor(0,1)
            lcdprint(inNumber)
            time.sleep(1)
            return 1
def receiveSMS(data):
    print data
    r=data.find("\",")
    print r
    
    if r>0:
        if data[r+4] == "\r":
            smsNum=data[r+2:r+4]
        elif data[r+3] == "\r":
            smsNum=data[r+2]
        elif data[r+5] == "\r":
            smsNum=data[r+2:r+5]
        else:
            print "else"
        print smsNum
        if r>0:
            
            lcdclear()
            lcdprint("SMS Received")
            setCursor(0,1)
            lcdprint("Press Button B")
            print "AT+CMGR="+smsNum+"\r"
            time.sleep(2)
            return str(smsNum)
    else:
        return 0
def attendCall():
    print "Attend call"
    Serial.write("ATA\r")
    data=""
    data=Serial.read(10)
    l=data.find("OK")
    if l>=0:
        lcdclear()
        lcdprint("Call attended")
        time.sleep(2)
        flag=-1;
        while flag<0:
            data=Serial.read(12);
            print data
            flag=data.find("NO CARRIER")
            #flag=data.find("BUSY")
            print flag
        lcdclear()
        lcdprint("Call Ended")
        time.sleep(1)
        lcdclear()
def readSMS(index):
                print index
                Serial.write("AT+CMGR="+index+"\r")
                data=""
                data=Serial.read(200)
                print data
                r=data.find("OK")
                if r>=0:
                    r1=data.find("\"\r\n")
                    msg=""
                    msg=data[r1+3:r-4]
                    lcdclear()
                    lcdprint(msg)
                    print msg
                    time.sleep(5)
                    lcdclear();
                    smsFlag=0
                    print "Receive SMS"
def getChar(Key, ind, maxInd):
            ch=0
            ch=ind
            lcdcmd(0x0e)
            Char=''
            count=0
            global msg
            global x
            global y
            while count<20:
                key=keypad()
                print key
                if key== Key:
                    setCursor(x,y)
                    Char=alpha[ch]
                    lcdwrite(ord(Char))
                    ch=ch+1
                    if ch>maxInd:
                        ch=ind
                    count=0
                count=count+1
                time.sleep(0.1)
            msg+=Char
            x=x+1
            if x>15:
                x=0
                y=1
            lcdcmd(0x0f)
      
def alphaKeypad():
    lcdclear()
    setCursor(x,y)
    lcdcmd(0x0f)
    msg=""
    while 1:
        key=0
        count=0
        key=keypad()
        if key == '1':
            ind=0
            maxInd=6
            Key='1'
            getChar(Key, ind, maxInd)
            
        elif key == '2':
            ind=7
            maxInd=10
            Key='2'
            getChar(Key, ind, maxInd)
            
        elif key == '3':
            ind=11
            maxInd=14
            Key='3'
            getChar(Key, ind, maxInd)
            
        elif key == '4':
            ind=15
            maxInd=18
            Key='4'
            getChar(Key, ind, maxInd)
        elif key == '5':
            ind=19
            maxInd=22
            Key='5'
            getChar(Key, ind, maxInd)
        elif key == '6':
            ind=23
            maxInd=26
            Key='6'
            getChar(Key, ind, maxInd)
        elif key == '7':
            ind=27
            maxInd=31
            Key='7'
            getChar(Key, ind, maxInd)
        elif key == '8':
            ind=32
            maxInd=35
            Key='8'
            getChar(Key, ind, maxInd)
        elif key == '9':
            ind=36
            maxInd=40
            Key='9'
            getChar(Key, ind, maxInd)
        elif key == '0':
            ind=41
            maxInd=42
            Key='0'
            getChar(Key, ind, maxInd)
        elif key == '*':
            ind=43
            maxInd=43
            Key='*'
            getChar(Key, ind, maxInd)
        elif key == '#':
            ind=44
            maxInd=44
            Key='#'
            getChar(Key, ind, maxInd)
        elif key== 'D':
            return
def sendSMS():
    print"Sending sms"
    lcdclear()
    lcdprint("Enter Number:")
    setCursor(0,1)
    time.sleep(2)
    moNum=""
    while 1:
        key=0;
        key=keypad()
        #print key
        if key>0:
            if key == 'A'  or key== 'B' or key== 'C':
                print key
                return
            elif key == 'D':
                print key
                print moNum
                Serial.write("AT+CMGF=1\r")
                time.sleep(1)
                Serial.write("AT+CMGS=\"+91"+moNum+"\"\r")
                time.sleep(2)
                data=""
                data=Serial.read(60)
                print data
                alphaKeypad()
                print msg
                lcdclear()
                lcdprint("Sending.....")
                Serial.write(msg)
                time.sleep(1)
                Serial.write("\x1A")
                while 1:
                    data=""
                    data=Serial.read(40)
                    print data
                    l=data.find("+CMGS:")
                    if l>=0:
                        lcdclear()
                        lcdprint("SMS Sent.")
                        time.sleep(2)
                        return;
  
                    l=data.find("Error")
                    if l>=0:
                        lcdclear()
                        lcdprint("Error")
                        time.sleep(1)
                        return
            else:
                print key
                moNum+=key
                lcdwrite(ord(key))
                time.sleep(0.5)
def call():
    print "Call"
    n=0
    moNum=""
    lcdclear()
    lcdprint("Enter Number:")
    setCursor(0,1)
    time.sleep(2)
    while 1:
        key=0;
        key=keypad()
        #print key
        if key>0:
            if key == 'A'  or key== 'B' or key== 'D':
                print key
                return
            elif key == 'C':
                print key
                print moNum
                Serial.write("ATD+91"+moNum+";\r")
                data=""
                time.sleep(2)
                data=Serial.read(30)
                l=data.find("OK")
                if l>=0:
                    lcdclear()
                    lcdprint("Calling.....")
                    setCursor(0,1)
                    lcdprint("+91"+moNum)
                    time.sleep(30)
                    lcdclear()
                    return
                #l=data.find("Error")
                #if l>=0:
                else:
                    lcdclear()
                    lcdprint("Error")
                    time.sleep(1)
                    return
            else:
                print key
                moNum+=key
                lcdwrite(ord(key))
                n=n+1
                time.sleep(0.5)
begin()
lcdcmd(0x01)
lcdprint("  Mobile Phone  ")
lcdcmd(0xc0)
lcdprint("    Using RPI     ")
time.sleep(3)
lcdcmd(0x01)
lcdprint("Circuit Digest")
lcdcmd(0xc0)
lcdprint("Welcomes you")
time.sleep(3)
gsmInit()
smsFlag=0
index=""
while 1:
    key=0
    key=keypad()
    print key
    if key == 'A':
      attendCall()
    elif key == 'B':
      readSMS(index)
      smsFlag=0
    elif key == 'C':
      call()
    elif key == 'D':
      sendSMS()
      
    data=""
    Serial.flush()
    data=Serial.read(150)
    print data
    l=data.find("RING")
    if l>=0:
      callstr=data
      receiveCall(data)
    l=data.find("\"SM\"")
    if l>=0:
      smsstr=data
      smsIndex=""
      (smsIndex)=receiveSMS(smsstr)
      print smsIndex
      if smsIndex>0:
          smsFlag=1
          index=smsIndex
    if smsFlag == 1:
        lcdclear()
        lcdprint("New Message")
        time.sleep(1)
    setCursor(0,0)
    lcdprint("C--> Call <--A");
    setCursor(0,1);
    lcdprint("D--> SMS  <--B")

 

بیشتر بخوانید...  کنترل دور موتور توسط سنسور دما

دیدگاه‌ها (2)

*
*

    محمد مهمان فروردین 23, 1399 پاسخ

    ببخشید میتوانید این پروژه را با اردینو بزارید

      Admin مدیر کل آبان 16, 1399 پاسخ

      سلام
      به واحد تولید محتوا ارجاع داده میشه