ЖК-дисплей показывает выходной сигнал без нажатия датчика

#include<LiquidCrystal.h>
LiquidCrystal lcd(13,12,11,10,9,8);
#define vibrate_sense 7

char str[70];
char *test="$GPGGA";      
char logitude[10];
char latitude[10];

int i,j,k;
int temp;
//int Ctrl+z=26; //для отправки сообщения
int led=13;

void setup()
{
  lcd.begin(16,2);
  Serial.begin(4800);
  pinMode(vibrate_sense, INPUT);
  pinMode(led, OUTPUT);
  lcd.setCursor(0,0);
  lcd.print("..Initializing..");
  lcd.setCursor(0,1);
    lcd.print("....System...");
delay(1000);
lcd.clear();
lcd.setCursor(0,0);
  lcd.print("Searching for");
    lcd.setCursor(0,1);
      lcd.print("Gps Signals");
  delay(2300);
lcd.clear();
  lcd.setCursor(0,0);
    lcd.print("Setup Completed");
  delay(500);
  lcd.setCursor(0,0);
    lcd.print("Accident detect");
  lcd.setCursor(0,1);
    lcd.print("& Alert system");
  delay(1500);
  lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("No accident");
        lcd.setCursor(0,1);
        lcd.print("occured");


}

void loop()
{
  if (digitalRead(vibrate_sense)==0)
  {
    for(i=18;i<27;i++)          //извлекаем широту из строки
    {
      latitude[j]=str[i];
      j++;
    }

    for(i=30;i<40;i++)          //извлекаем долготу из строки
    {
      logitude[k]=str[i];
      k++;
    }

lcd.clear();
    lcd.setCursor(0,0);        //отображение широты и долготы на ЖК-дисплее 16X2
    lcd.print("Latitude(N)");
    lcd.print(latitude);
    lcd.setCursor(0,1);
    lcd.print("Longitude(E)");
    lcd.print(logitude);
    delay(500);
    lcd.clear();
        lcd.setCursor(0,0);
    lcd.print("Accident has");
            lcd.setCursor(0,1);
    lcd.print("been Detected");
delay(500);
lcd.clear();
    lcd.print("Sending SMS");
    delay(500);
    lcd.clear();
    Serial.begin(9600);

    Serial.println("AT+CMGF=1");    //выбираем текстовый режим
    delay(10);
    Serial.println("AT+CMGS=\"7066128969\"");  //вводим номер получателя
    Serial.println("Vehicle Accident occured:");
    Serial.print("Latitude(N): ");             //вводим широту в сообщение
    Serial.println(latitude);                  //вводим значение широты в сообщение
    Serial.print("Longitude(E): ");            //вводим долготу в сообщении
    Serial.println(logitude);                  //вводим значение долготы в сообщение
    Serial.print("http://maps.google.com/maps?&z=15&mrt=yp&t=k&q=");
    Serial.println(latitude);
    Serial.println("+");
    Serial.println(logitude);
    Serial.write(26);                      //отправляем сообщение Ctrl+z=26

      lcd.setCursor(0,0);
    lcd.print("SMS Sent");
delay(1000);
lcd.clear();
          lcd.setCursor(0,0);
    lcd.print("Help Please");

    temp=0;
    i=0;
    j=0;
    k=0;
    delay(20000);                        // следующее чтение через 20 секунд
    Serial.begin(4800);
  }
}

void serialEvent()
{
  while (Serial.available())            //Последовательные входящие данные от GPS
  {
    char inChar = (char)Serial.read();
     str[i]= inChar;                    //сохраняем входящие данные от GPS во временную строку str[]
     i++;
     if (i < 7)                      
     {
      if(str[i-1] != test[i-1])         //проверяем правильность строки
      {
        i=0;
      }
     }
    if(i >=60)
    {
     break;
    }
  }
}

Это мой код для моего проекта.
Это система обнаружения аварий, и она должна работать так: когда я нажимаю датчик или концевой выключатель, на ЖК-дисплее должно отображаться сообщение о том, что произошла авария. Но сообщение отображается на ЖК-дисплее БЕЗ нажатия сенсорной кнопки.

Что делать? Я думаю, что в моей программе ошибка. Кто-нибудь может сказать мне, где это?

, 👍0

Обсуждение

вы не изучили основы, прежде чем приступить к созданию программы... начните с написания короткой программы, которая включает светодиод при нажатии кнопки и выключает светодиод при отпускании кнопки, @jsotola

У вас есть подтягивающий резистор?, @gre_gor

Пожалуйста, не портите свои и чужие публикации. Публикуя в сети Stack Exchange, вы предоставляете SE безотзывное право на распространение этого контента (по [лицензии CC BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0). /)). Согласно политике SE, любой вандализм будет пресечен., @gre_gor


1 ответ


1

Во-первых, я отредактировал отступы в вашем коде, потому что неправильные отступы немного сбивают с толку.

#include <LiquidCrystal.h>
LiquidCrystal lcd(13,12,11,10,9,8);
#define vibrate_sense 7

char str[70];
char *test="$GPGGA";      
char logitude[10];
char latitude[10];

int i,j,k;
int temp;
//int Ctrl+z=26; //для отправки сообщения
int led = 13;


void setup(){
  lcd.begin(16,2);
  Serial.begin(4800);

  pinMode(vibrate_sense, INPUT);
  pinMode(led, OUTPUT);

  lcd.setCursor(0,0);
  lcd.print("..Initializing..");
  lcd.setCursor(0,1);
  lcd.print("....System...");
  delay(1000);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Searching for");
  lcd.setCursor(0,1);
  lcd.print("Gps Signals");
  delay(2300);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Setup Completed");
  delay(500);
  lcd.setCursor(0,0);
  lcd.print("Accident detect");
  lcd.setCursor(0,1);
  lcd.print("& Alert system");
  delay(1500);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("No accident");
  lcd.setCursor(0,1);
  lcd.print("occured");
}


void loop(){
  if (digitalRead(vibrate_sense) == 0){
    for(i = 18; i < 27; i ++){          //извлекаем широту из строки
      latitude[j]=str[i];
      j++;
    }

    for(i=30;i<40;i++){          //извлекаем долготу из строки
      logitude[k] = str[i];
      k++;
    }

    lcd.clear();
    lcd.setCursor(0,0);        //отображение широты и долготы на ЖК-дисплее 16X2
    lcd.print("Latitude(N)");
    lcd.print(latitude);
    lcd.setCursor(0,1);
    lcd.print("Longitude(E)");
    lcd.print(logitude);
    delay(500);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Accident has");
    lcd.setCursor(0,1);
    lcd.print("been Detected");
    delay(500);
    lcd.clear();
    lcd.print("Sending SMS");
    delay(500);
    lcd.clear();
    Serial.begin(9600);

    Serial.println("AT+CMGF=1");    //выбираем текстовый режим
    delay(10);
    Serial.println("AT+CMGS=\"7066128969\"");  //вводим номер получателя
    Serial.println("Vehicle Accident occured:");
    Serial.print("Latitude(N): ");             //вводим широту в сообщение
    Serial.println(latitude);                  //вводим значение широты в сообщение
    Serial.print("Longitude(E): ");            //вводим долготу в сообщении
    Serial.println(logitude);                  //вводим значение долготы в сообщение
    Serial.print("http://maps.google.com/maps?&z=15&mrt=yp&t=k&q=");
    Serial.println(latitude);
    Serial.println("+");
    Serial.println(logitude);
    Serial.write(26);                      //отправляем сообщение Ctrl+z=26

    lcd.setCursor(0,0);
    lcd.print("SMS Sent");
    delay(1000);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Help Please");

    temp = 0;
    i = 0;
    j = 0;
    k = 0;
    delay(20000);                        // следующее чтение через 20 секунд
    Serial.begin(4800);
  }
}

void serialEvent(){
  while (Serial.available()){            //Последовательные входящие данные от GPS
    char inChar = (char)Serial.read();
    str[i] = inChar;                    //сохраняем входящие данные от GPS во временную строку str[]
    i++;
    if (i < 7){
      if(str[i-1] != test[i-1]){         //проверяем правильность строки
        i = 0;
      }
    }
    if(i >= 60){
      break;
    }
  }
}

Во-вторых, в этой строке if (digitalRead(vibrate_sense) == 0){ вы проверяете значение vibrate_sense на значение 0. Вы уверены, что сработавшее значение равно 0, а не 1? Попробуйте этот код, чтобы проверить, какое значение соответствует состоянию срабатывания.

#define vibrate_sense 7


void setup() {
  Serial.begin(9600);
  Serial.println("Sensor testing");
  pinMode(vibrate_sense, INPUT);

}

void loop() {
  Serial.println(digitalRead(vibrate_sense));
  delay(300);
}

Последнее — подключение сенсора/кнопки. Для кнопки вам также необходимо использовать резистор PULL_UP/PULL_DOWN, чтобы иметь правильное логическое значение на цифровом выводе.

,