• 八方資訊網歡迎您!
    八方資訊網>科技>正文

    用個8位單片機+sim900a+gps模塊自制建議定位裝置!

    2021-01-20 08:36:56 來源: 閱讀:-

    gps定位器是一個被廣泛使用的小工具,說不定你老婆就在你的身上放了一個。這玩意很容易買的到。當然自己做一個也可以,畢竟看這內容的人一般都是單身狗。

    需要材料,一款diy界網紅arduino uno,采用8位AVR單片機,自帶bootloader和一大推的支持庫。配合arduino開發環境可以快速簡單的編寫arduino的程序。

    一個ICOMSAT擴展板,集成收發短信的sim900模塊

    一個GPS shield擴展板

    這些都是擴展版,直接堆疊插在一起就好了,第一層是arduino uno(這是廢話),第二層是ICOMSAT擴展板,第三層是GPS shield擴展板。這就是arduino的魅力,擁有大量的周邊擴展模塊,直接連接。讓沒有硬件開發知識人,只要會簡單的c語言就可以玩轉arduino。

    首先對ICOMSAT擴展板操作,開關撥到UART的一端,跳線帽按照RXD->D2,TXD->D3如圖,接上GSM天線和插上手機SIM卡。詳細跳帽和引腳請下載查閱產品手冊和原理圖

    用個8位單片機+sim900a+gps模塊自制建議定位裝置

    然后對GPS shield擴展板操作,開關撥到5V,跳線帽按照RXD->D1,TXD->D0如圖連接,接上GPS天線

    用個8位單片機+sim900a+gps模塊自制建議定位裝置

    最后按照順序把三個家伙給堆起來

    用個8位單片機+sim900a+gps模塊自制建議定位裝置

    在編譯程序之前我們需要下載arduino的gsm和gps的支持庫,解壓后放在Arduino\libraries的目錄下

    下面是程序代碼復制粘帖過去IDE中,編譯好后下載到arduino中就好了

    #include "SIM900.h"

    #include

    //#include "inetGSM.h"

    #include "sms.h"

    //#include "call.h"

    #include

    #include

    /* This sample code demonstrates the normal use of a TinyGPS object.

    It requires the use of SoftwareSerial, and assumes that you have a

    4800-baud serial GPS device hooked up on pins 3(rx) and 4(tx).

    */

    TinyGPS gps;

    #define ledpin 13

    #define pwrkey 27

    //**************************************************************************

    char sms_rx[122]; //Received text SMS

    byte type_sms=SMS_ALL; //Type of SMS

    byte del_sms=1; //0: No deleting sms - 1: Deleting SMS

    char number_incoming[20];

    //**************************************************************************

    SMSGSM sms;

    int error;

    boolean started=false;

    bool newData = false;

    char gps_year[8];

    char gps_mon[3];

    char gps_day[3];

    char gps_hour[3];

    char gps_min[3];

    char gps_sec[3];

    char gps_lon[20];

    char gps_lat[20];

    char gps_sms[100];

    void setup()

    {

    //software power sim900 up

    pinMode(pwrkey,OUTPUT);

    digitalWrite(pwrkey,HIGH);

    delay(600);

    digitalWrite(pwrkey,LOW);

    Serial.begin(115200);

    Serial2.begin(9600);

    if (gsm.begin(9600)) {

    Serial.println("\nstatus=READY");

    gsm.forceON(); //To ensure that SIM908 is not only in charge mode

    started=true;

    } else Serial.println("\nstatus=IDLE");

    if(started)

    {

    //delete all sms message

    Serial.println("Deleting SMS");

    char error = DeleteAllSMS();

    if (error==1)Serial.println("All SMS deleted");

    else Serial.println("SMS not deleted");

    }

    else

    {Serial.println("SIM900 NOT EXISTED"); while(1);}

    delay(10000);

    }

    void loop()

    {

    if(started)

    {

    check_gps();

    Check_SMS();

    }

    }

    void Check_SMS() //Check if there is an sms 'type_sms'

    {

    char pos_sms_rx; //Received SMS position

    pos_sms_rx=sms.IsSMSPresent(type_sms);

    if (pos_sms_rx!=0)

    {

    //Read text/number/position of sms

    sms.GetSMS(pos_sms_rx,number_incoming,sms_rx,120);

    Serial.print("Received SMS from ");

    Serial.print(number_incoming);

    Serial.print("(sim position: ");

    Serial.print(word(pos_sms_rx));

    Serial.println(")");

    Serial.println(sms_rx);

    if (del_sms==1) //If 'del_sms' is 1, i delete sms

    {

    error=sms.DeleteSMS(pos_sms_rx);

    if (error==1)Serial.println("SMS deleted");

    else Serial.println("SMS not deleted");

    }

    if((strstr(sms_rx,"gps")!=0)&&(strlen(sms_rx)==3))

    {

    Serial.println("\nsending SMS");

    if(newData)

    {

    if (sms.SendSMS(number_incoming, gps_sms))

    Serial.println("\nSMS sent OK");

    else

    Serial.println("\nSMS sent error");

    }

    else

    {

    if (sms.SendSMS(number_incoming, "gps not ready"))

    Serial.println("\nSMS sent OK");

    else

    Serial.println("\nSMS sent error");

    }

    }

    Serial2.flush();

    }

    newData=false;

    return;

    }

    char check_gps()

    {

    newData=false;

    unsigned long chars;

    unsigned short sentences, failed;

    // For one second we parse GPS data and report some key values

    for (unsigned long start = millis(); millis() - start < 1000;)

    {

    while (Serial2.available())

    {

    char c = Serial2.read();

    // Serial.write(c); // uncomment this line if you want to see the GPS data flowing

    if (gps.encode(c)) // Did a new valid sentence come in?

    newData = true;

    }

    }

    if (newData)

    {

    float flat, flon;

    unsigned long age;

    int _year;

    byte _month, _day,_hour,_minute,_second,_hundredths;

    gps.f_get_position(&flat, &flon, &age);

    gps.crack_datetime(&_year,&_month,&_day,&_hour,&_minute,&_second,&_hundredths,&age);

    flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6;

    flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6;

    dtostrf(flat, 11, 6, gps_lat);

    dtostrf(flon, 10, 6, gps_lon);

    strcpy(gps_sms,"lat:");

    strcat(gps_sms,gps_lat);

    strcat(gps_sms,"\n");

    strcat(gps_sms,"lon:");

    strcat(gps_sms,gps_lon);

    strcat(gps_sms,"\n");

    strcat(gps_sms,"time:");

    itoa(_year,gps_year,10);

    strcat(gps_sms,gps_year);

    itoa(_month,gps_mon,10);

    if(strlen(gps_mon)==1)

    strcat(gps_sms,"0");

    strcat(gps_sms,gps_mon);

    itoa(_day,gps_day,10);

    if(strlen(gps_day)==1)

    strcat(gps_sms,"0");

    strcat(gps_sms,gps_day);

    itoa(_hour,gps_hour,10);

    if(strlen(gps_hour)==1)

    strcat(gps_sms,"0");

    strcat(gps_sms,gps_hour);

    itoa(_minute,gps_min,10);

    if(strlen(gps_min)==1)

    strcat(gps_sms,"0");

    strcat(gps_sms,gps_min);

    itoa(_second,gps_sec,10);

    if(strlen(gps_sec)==1)

    strcat(gps_sms,"0");

    strcat(gps_sms,gps_sec);

    Serial.println(gps_sms);

    }

    }

    char DeleteAllSMS()

    {

    char ret_val = -1;

    if (CLS_FREE != gsm.GetCommLineStatus()) return (ret_val);

    gsm.SetCommLineStatus(CLS_ATCMD);

    ret_val = 0; // still not present

    gsm.SimpleWriteln(F("AT+CMGDA=\"DEL ALL\""));

    switch (gsm.WaitResp(8000, 50, "OK")) {

    case RX_TMOUT_ERR:

    // response was not received in specific time

    ret_val = -2;

    break;

    case RX_FINISHED_STR_RECV:

    // OK was received => SMS deleted

    ret_val = 1;

    break;

    case RX_FINISHED_STR_NOT_RECV:

    // other response: e.g. ERROR => SMS was not deleted

    ret_val = 0;

    break;

    }

    gsm.SetCommLineStatus(CLS_FREE);

    return (ret_val);

    }

    通過9v電池供電或者是充電寶usb供電,把做好的三層不明物體放在開闊的地方,想arduino的手機號碼發送“gps”短信,之后會收到一個回信,內容為

    lat:23.036960

    lon:114.418800

    time:20170919114516

    lat表示緯度,lon表示經度,time表示時間,不過是“格林尼治時間”(本初子午線)不是北京時間,和北京時間相差8小時。不會算的回去學地理。

    如果你收到“gps not ready”回信,那就是說明沒有搜到gps衛星,等一下或者是換個地方。

    本文為企業推廣,本網站不做任何建議,僅提供參考,作為信息展示!

    推薦閱讀:中華企業新聞網

    網友評論
    請登錄后進行評論| 0條評論

    請文明發言,還可以輸入140

    您的評論已經發表成功,請等候審核

    小提示:您要為您發表的言論后果負責,請各位遵守法紀注意語言文明

    回到首頁 回到頂部
    八方資訊網 關于我們| 聯系我們| 招聘信息| XML地圖| 網站地圖TXT
    免責聲明:八方資訊網所有文字、圖片、視頻、音頻等資料均來自互聯網,不代表本站贊同其觀點,本站亦不為其版權負責。相關作品的原創性、文中陳述文字以及內容數據龐雜本站無法一一核實,如果您發現本網站上有侵犯您的合法權益的內容,請聯系我們,本網站將立即予以刪除!
    Copyright © 2012-2019 http://www.quan28.cn, All rights reserved.
    主站蜘蛛池模板: 亚洲精品久久久www| 国产精品综合久成人| 日韩精品在线看| 亚洲精品视频久久久| 2022国产精品最新在线| 午夜精品久久久久久中宇| 国产成人久久精品麻豆一区| 精品一区二区三区自拍图片区| 精品一区二区三区高清免费观看 | 在线观看国产精品普通话对白精品| 久久国产精品成人免费| 亚洲AV无码成人精品区在线观看| 国语自产精品视频在线观看| 热re99久久精品国产99热| 国产精品视频二区不卡| 爽爽精品dvd蜜桃成熟时电影院| 欧美亚洲成人精品| 精品人妻伦一二三区久久| 99久re热视频这里只有精品6| 99精品视频3| 国产精品无码专区| 婷婷精品国产亚洲AV麻豆不片| 欧美在线精品一区二区三区 | 精品视频一区二区三三区四区| 无码精品蜜桃一区二区三区WW | 亚洲精品无码Av人在线观看国产 | 久久亚洲私人国产精品vA| 日本一区二区三区精品国产| 国产亚洲精品拍拍拍拍拍| 99久久精品这里只有精品| 久久精品无码一区二区三区| 国产亚洲精品观看91在线| 97久久精品无码一区二区天美| 国产精品免费一区二区三区四区 | 一级A毛片免费观看久久精品| 久久99精品久久久久久野外| 国产精品福利片免费看| 国产高清在线精品一区二区三区 | 九九线精品视频在线观看| 国产精品免费看久久久香蕉 | 日韩精品专区在线影院重磅|