如何在arduino uno上使用超声波传感器HC sr04和gps neogps 6m和gsm sim900

时间:2019-09-05 10:25:48

标签: arduino-uno

当超声波传感器测量到一定距离时,我尝试发送带有该位置的短信,但是当我在空白设置中添加gpsSerial(9600)行时,超声波传感器的读数会变得不一致,例如读数为24 cm,然后跳到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();

    }
  }

1 个答案:

答案 0 :(得分:0)

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