SIM808调试过程中遇到的一些问题
新人求教,我在调试SIM808时遇到了一些问题。我想实现的功能是:
1、当按钮(4)按下后,发送包含地理位置的短息到指定号码。
2、当SIM808收到查询短信后,反馈包含地理位置的短息到指定号码。
具体遇到的问题是:
1、进入SIM808后没有反馈地理位置信息(如图所示)
2、按下按钮后电脑会响应表示串口弹开,同时手机没有反。
可排除的干扰是:
1、卡是有话费的。
2、接线是正确的。
3、电源是9V 1A
4、单独测试SIM808(功能开关拨到2),各个命令(获取GPS数据,发送短信)均可正确响应。
在调试之前我参考了沧海笑前辈的帖子:https://mc.dfrobot.com.cn/forum.php?mod=viewthread&tid=23101&highlight=sim808
同时也看了官方库里给的示列(SIM808_SMSread)
附代码如下:
#include <DFRobot_sim808.h>
#include <sim808.h>
DFRobot_SIM808 sim808(&Serial);
#include <SoftwareSerial.h>
/*
短信
*/
//定义变量
float lat,lon; //经纬度
int smsnum=1;//发送次数
//读取短信缓存
#define MESSAGE_LENGTH 160
char message;
int messageIndex = 0;
char phone;
char datetime;
//缓存发送内容
String msg =""; //位置短信内容
void setup() {
Serial.begin(9600);
//按钮及其指示灯定义//
pinMode(4,INPUT); //d4--按键
pinMode(13, OUTPUT); //GPS指示灯定义
pinMode(12, OUTPUT); //发送指示灯定义
/*用于显示收到查询短信(快闪动3次,500ms)
并且发送位置短信*/
digitalWrite(12, LOW);
digitalWrite(13, LOW);
Serial.print("Sim808 begin\r\n");
while(!sim808.init()) {
delay(1000);
Serial.print("Sim808 init error\r\n");
}
delay(3000);
if( sim808.attachGPS())
Serial.println("Open the GPS power success");
else
Serial.println("Open the GPS power failure");
}
void loop() {
int key =digitalRead(4); //读取d4数字口状态
//************** 获取GPS数据 *******************
if (sim808.getGPS()) {
Serial.print("latitude :");
Serial.println(sim808.GPSdata.lat);
delay(10000);
Serial.print("longitude :");
Serial.println(sim808.GPSdata.lon);
getgpsdata();
/*关掉GPS电源*/
sim808.detachGPS();
/*指示灯*/
digitalWrite(13, HIGH); // LED13闪动2次,显示GPS数据收到
delay(200);
digitalWrite(13, LOW);
delay(200);
digitalWrite(13, HIGH);
delay(200);
digitalWrite(13, LOW);
delay(2000);
//*********** 如果按钮按下(主动发送) ***********
if (key==HIGH) {
delay(60); //消抖延时
if (key==HIGH)
{
digitalWrite(13, HIGH); // LED13闪动1次
delay(1000);
digitalWrite(13, LOW);
sendasms_s();//发送一次
}
}
}
messageIndex = sim808.isSMSunread();
Serial.print("messageIndex: ");
Serial.println(messageIndex);
//*********** 如果读取到短信 (被动查询)***********
if (messageIndex > 0) {
sim808.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime);
//***********读取完成后删除短信**********
sim808.deleteSMS(messageIndex);
Serial.print("From number: ");
Serial.println(phone);
Serial.print("Datetime: ");
Serial.println(datetime);
Serial.print("Recieved Message: ");
Serial.println(message);
digitalWrite(12, HIGH); // LED13闪动1次
delay(1500);
digitalWrite(12, LOW);
sendasms_u(); //发送一次
}
}
void getgpsdata() //获取gps数据函数
{
//第一步:************** Get GPS data *******************
delay(2000);
Serial.print("lat :");
Serial.println(sim808.GPSdata.lat);
delay(2000);
Serial.print("lon :");
Serial.println(sim808.GPSdata.lon);
delay(2000);
lat=sim808.GPSdata.lat;
delay(100);
lon=sim808.GPSdata.lon;
//第二步:生成经纬度短信内容
//计算纬度
msg ="";
char s_lat;
dtostrf(lat,2,2,s_lat);//把lat转换为两位整数,两位小数的字符串
msg=msg+s_lat;
//计算经度
char s_lon;
dtostrf(lon,2,2,s_lon);//把lon转换为两位整数,两位小数的字符串
msg=msg+","+s_lon;
Serial.println(msg);
}
void sendasms_s() //发送函数_1 主动发送
{
delay(3000);
Serial.println("send sms now...");
char PHONE_NUMBER= "147***********";//请替换为您的手机号
char smsmessage;
int msglen=msg.length()+1;
msg.toCharArray(smsmessage, msglen);
Serial.println(smsmessage); //串口(PC端)显示转换后的内容,以便确认
sim808.sendSMS(PHONE_NUMBER,smsmessage); //发送短信
//慢闪,表明已发送
digitalWrite(13, HIGH); // LED13闪动
delay(2000);
digitalWrite(13, LOW);
delay(1000);
digitalWrite(13, HIGH);
delay(2000);
digitalWrite(13, LOW);
smsnum=0;//发送一次
}
void sendasms_u() //发送函数_2,查询信息
{
delay(3000);
Serial.println("send sms now...");
char PHONE_NUMBER= "147***********";//请替换为您的手机号
char smsmessage;
int msglen=msg.length()+1;
char sos = "SOS" ;
msg.toCharArray(smsmessage, msglen);
Serial.println(smsmessage);//
//发送短信
sim808.sendSMS(PHONE_NUMBER,sos);
sim808.sendSMS(PHONE_NUMBER,smsmessage);
//慢闪,表明已发送
digitalWrite(13, HIGH); // LED13闪动
delay(2000);
digitalWrite(13, LOW);
delay(1000);
digitalWrite(13, HIGH);
delay(2000);
digitalWrite(13, LOW);
smsnum=0;//发送一次
}
额,在代码中我给了几个较长的延时,我之所以这样做,是因为我认为GPS获取数据是需要时间的,所以预留出来。
同时,第一次上传的代码较长,看起来有些麻烦,我用代码折叠改了一下,同时把引脚定义省掉(引脚定义请参考第一次上传的代码)希望方便阅读。
void loop() {
int key =digitalRead(4); //读取d4数字口状态
//************** 获取GPS数据 *******************
if (sim808.getGPS()) {
Serial.print("latitude :");
Serial.println(sim808.GPSdata.lat);
delay(10000);
Serial.print("longitude :");
Serial.println(sim808.GPSdata.lon);
getgpsdata();
/*关掉GPS电源*/
sim808.detachGPS();
/*指示灯*/
digitalWrite(13, HIGH); // LED13闪动2次,显示GPS数据收到
delay(200);
digitalWrite(13, LOW);
delay(200);
digitalWrite(13, HIGH);
delay(200);
digitalWrite(13, LOW);
delay(2000);
//*********** 如果按钮按下(主动发送) ***********
if (key==HIGH) {
delay(60); //消抖延时
if (key==HIGH)
{
digitalWrite(13, HIGH); // LED13闪动1次
delay(1000);
digitalWrite(13, LOW);
sendasms_s();//发送一次内容为S级信息
}
}
}
}
void getgpsdata() //获取gps数据函数
{
//第一步:************** Get GPS data *******************
delay(2000);
Serial.print("lat :");
Serial.println(sim808.GPSdata.lat);
delay(2000);
Serial.print("lon :");
Serial.println(sim808.GPSdata.lon);
delay(2000);
lat=sim808.GPSdata.lat;
delay(100);
lon=sim808.GPSdata.lon;
//第二步:生成经纬度短信内容
//计算纬度
msg ="";
char s_lat;
dtostrf(lat,2,4,s_lat);//把lat转换为两位整数,四位小数的字符串
msg=msg+s_lat;
//计算经度
char s_lon;
dtostrf(lon,2,4,s_lon);//把lon转换为两位整数,四位小数的字符串
msg=msg+","+s_lon;
Serial.println(msg);
}
void sendasms_s() //发送函数_1求救短信
{
delay(3000);
Serial.println("send sms now...");
char PHONE_NUMBER= "147*******";//请替换为您的手机号
char smsmessage;
int msglen=msg.length()+1;
msg.toCharArray(smsmessage, msglen);
Serial.println(smsmessage); //串口(PC端)显示转换后的内容,以便确认
sim808.sendSMS(PHONE_NUMBER,smsmessage); //发送短信
//慢闪,表明已发送
digitalWrite(13, HIGH); // LED13闪动
delay(2000);
digitalWrite(13, LOW);
delay(1000);
digitalWrite(13, HIGH);
delay(2000);
digitalWrite(13, LOW);
smsnum=0;//发送一次
}
void sendasms_u() //发送函数_2,查询信息
{
delay(3000);
Serial.println("send sms now...");
char PHONE_NUMBER= "14785835246";//请替换为您的手机号
char smsmessage;
int msglen=msg.length()+1;
char sos = "SOS" ;
msg.toCharArray(smsmessage, msglen);
Serial.println(smsmessage);//串口(PC端)显示转换后的内容,以便确认
//发送短信
sim808.sendSMS(PHONE_NUMBER,sos);
sim808.sendSMS(PHONE_NUMBER,smsmessage);
//慢闪,表明已发送
digitalWrite(13, HIGH); // LED13闪动
delay(2000);
digitalWrite(13, LOW);
delay(1000);
digitalWrite(13, HIGH);
delay(2000);
digitalWrite(13, LOW);
smsnum=0;//发送一次
}
void Read() //短信反馈函数
{
messageIndex = sim808.isSMSunread();
Serial.print("messageIndex: ");
Serial.println(messageIndex);
//*********** 如果读取到短信(被动查询) ***********
if (messageIndex > 0) {
sim808.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime);
//***********读取完成后删除短信**********
sim808.deleteSMS(messageIndex);
Serial.print("From number: ");
Serial.println(phone);
Serial.print("Datetime: ");
Serial.println(datetime);
Serial.print("Recieved Message: ");
Serial.println(message);
digitalWrite(12, HIGH); // LED13闪动1次
delay(1500);
digitalWrite(12, LOW);
sendasms_u();//发送一次,内容为U级信息
}
}
liuhu512 发表于 2017-6-23 12:25
额,在代码中我给了几个较长的延时,我之所以这样做,是因为我认为GPS获取数据是需要时间的,所以预留出来 ...
不好意思弄错了,代码是:
void loop() {
int key =digitalRead(4); //读取d4数字口状态
//************** 获取GPS数据 *******************
if (sim808.getGPS()) {
Serial.print("latitude :");
Serial.println(sim808.GPSdata.lat);
delay(10000);
Serial.print("longitude :");
Serial.println(sim808.GPSdata.lon);
getgpsdata();
/*关掉GPS电源*/
sim808.detachGPS();
/*指示灯*/
digitalWrite(13, HIGH); // LED13闪动2次,显示GPS数据收到
delay(200);
digitalWrite(13, LOW);
delay(200);
digitalWrite(13, HIGH);
delay(200);
digitalWrite(13, LOW);
delay(2000);
//*********** 如果按钮按下(主动发送) ***********
if (key==HIGH) {
delay(60); //消抖延时
if (key==HIGH)
{
digitalWrite(13, HIGH); // LED13闪动1次
delay(1000);
digitalWrite(13, LOW);
sendasms_s();//发送一次内容为S级信息
}
}
}
}
void getgpsdata() //获取gps数据函数
{
}
void sendasms_s() //发送函数_1求救短信
{
}
void sendasms_u() //发送函数_2,查询信息
{
}
void Read() //短信反馈函数
{
messageIndex = sim808.isSMSunread();
Serial.print("messageIndex: ");
Serial.println(messageIndex);
//*********** 如果读取到短信(被动查询) ***********
if (messageIndex > 0) {
sim808.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime);
//***********读取完成后删除短信**********
sim808.deleteSMS(messageIndex);
Serial.print("From number: ");
Serial.println(phone);
Serial.print("Datetime: ");
Serial.println(datetime);
Serial.print("Recieved Message: ");
Serial.println(message);
digitalWrite(12, HIGH); // LED13闪动1次
delay(1500);
digitalWrite(12, LOW);
sendasms_u();//发送一次,内容为U级信息
}
}
liuhu512 发表于 2017-6-23 12:29
不好意思弄错了,代码是:
void loop() {
int key =digitalRead(4); //读取d ...
Read()函数卸载loop的最后一行,对不起忘记加了 1、您运行我的例子是否顺利。
2、请把您的代码打包作为附件。如果有时间我看一下。当时查询---发送功能我也未能实现。 沧海笑 发表于 2017-7-4 19:05
1、您运行我的例子是否顺利。
2、请把您的代码打包作为附件。如果有时间我看一下。当时查询---发送功能我也 ...
感谢关注。运行您的列子十分顺利,我已经实现查询发送功能,但是程序不稳定(查询完毕之后需要复位),同时最近忙会考,不知能不能留下邮箱,我一定尽快回复。
页:
[1]