找回密码
 请使用中文注册

用个8位单片机+sim900a+gps模块自制建议定位装置

2023-5-6 08:32| 发布者: 开心| 查看: 68| 评论: 0

阅读字号:

摘要:   gps定位器是一个被广泛运用的小工具,说不定你老婆就在你的身上放了一个。这玩意很容易买的到。当然自己做一个也可以,毕竟看这内容的人一般都是单身狗。  需要材 ...
      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卡。详细跳帽和引脚请下载查阅产品手册和原理图。


  然后对GPS shield扩展板操作,开关拨到5V,跳线帽按照RXD->D1,TXD->D0如图连接,接上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卫星,等一下或者是换个地方。

路过

雷人

握手

鲜花

鸡蛋

最新评论

QQ|Archiver|手机版|家电维修论坛 ( 蜀ICP备19011473号-4 川公网安备51102502000164号 )

GMT+8, 2026-1-12 09:09 , Processed in 0.505912 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

返回顶部