arduino-uno - 如何在 arduino uno 上使用超声波传感器 hc sr04 和 gps neogps 6m 和 gsm sim900
问题描述
我正在尝试在超声波传感器测量到一定距离时发送带有位置的短信,但是当我在 void 设置中添加 gpsSerial(9600) 线时,超声波传感器读数变得不一致,例如它读取 24 厘米然后跳到 18厘米然后回到 24 厘米。如果任何熟悉 arduino 或曾经遇到过这个问题的人能帮助我,我将不胜感激。这是我的代码:
#include <TinyGPS.h>
#include <SoftwareSerial.h>
#include "NewPing.h"
#define TRIGGER_PIN 7
#define ECHO_PIN 8
#define MAX_DISTANCE 100
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
float duration, distance;
SoftwareSerial gsmSerial(2, 3);
SoftwareSerial gpsSerial(5, 4);
TinyGPS gps; //Creates a new instance of the TinyGPS object
bool newData = false;
void setup()
{
Serial.begin(9600);
gsmSerial.begin(9600);
gpsSerial.begin(9600);
}
void loop()
{
// Send ping, get distance in cm
distance = sonar.ping_cm();
if (distance < 4 )
{
//sendSMS();
Serial.println("Bin is full!!, SMS SENT!!");
Serial.println(distance);
delay(1200);
}
else
{
Serial.println(distance);
delay(2000);
}
delay(2000);
}
void sendSMS(){
// For one second we parse GPS data and report some key values
for (unsigned long start = millis(); millis() - start < 1000;)
{
while (gpsSerial.available())
{
char c = gpsSerial.read();
//Serial.print(c);
if (gps.encode(c))
newData = true;
}
}
if (newData) //If newData is true
{
float flat, flon;
unsigned long age;
gps.f_get_position(&flat, &flon, &age);
gsmSerial.print("AT+CMGF=1\r");
delay(400);
gsmSerial.println("AT + CMGS = \"+26xxxxxxxx\"");// recipient's mobile
number
delay(300);
gsmSerial.print("BIN IS FULL!, PLEASE COLLECT @ https://www.google.com
/maps/?q=");
gsmSerial.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6);
gsmSerial.print(",");
gsmSerial.print(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6);
delay(200);
gsmSerial.println((char)26); // End AT command with a ^Z, ASCII code
26
delay(2000);
gsmSerial.println();
}
}
解决方案
我尝试使用 HC SR04 在 Arduino Uno 上重现您的问题,但没有成功——我的测量结果很稳定(连续 100 多个相同的测量结果)。我什至将传感器设置为距被测障碍物 24 厘米的距离。我使用了源自您提供的代码:
#include <SoftwareSerial.h>
#include "NewPing.h"
#define TRIGGER_PIN 7
#define ECHO_PIN 8
#define MAX_DISTANCE 100
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
float duration, distance;
SoftwareSerial gsmSerial(2, 3);
SoftwareSerial gpsSerial(5, 4);
void setup() {
Serial.begin(9600);
gsmSerial.begin(9600);
gpsSerial.begin(9600);
}
void loop() {
// Send ping, get distance in cm
distance = sonar.ping_cm();
if (distance < 4 ) {
Serial.println("Bin is full!!, SMS SENT!!");
Serial.println(distance);
}
else {
Serial.println(distance);
}
delay(2000);
}
我的结论是您的代码很好,问题与硬件有关。检查接线,如果可能,尝试使用另一个 HC-SR04 传感器。
BTW1:在测试期间,我正在向gpsSerial(rx)发送数据,以确保这不是由GPS模块发送一些周期性数据引起的。
BTW2:你如何为 GPS 和 GSM 模块供电?您是否使用 Arduino 为这些供电?如果是的话,这也可能是您的问题的根源,因为这些模块可能会消耗大的峰值电流,而 Arduino 的电源不够强大......
推荐阅读
- c# - 在 Regex C# 中允许撇号、点、& 符号、数字和字符
- c# - ILogger:如果信息没有真正记录,如何避免做繁重的工作
- angular - 嵌套 *ngFor 中的 Angular 4 ngModel 绑定
- sip - Kamailio,使用扩展向用户发送请求(类似于 Asterisk 扩展)
- javascript - 加载 iframe DOM 时的事件处理程序
- c# - 在 MVP 中,演示者和视图应该在同一个程序集中,还是应该在 Visual Studio 解决方案中自己的项目中
- apache-camel - Apache Camel sjms 批处理失败
- ios - 调用时AnimationView不出现
- java - 如何在Java中输出格式化的excel文档
- f# - 为什么 FParsec 不使用解析列表分隔符的字符?