首页 > 解决方案 > 如何在 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();

    }
  }

标签: arduino-uno

解决方案


我尝试使用 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 的电源不够强大......


推荐阅读