ЖК-дисплей показывает выходной сигнал без нажатия датчика
#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;
}
}
}
Это мой код для моего проекта.
Это система обнаружения аварий, и она должна работать так: когда я нажимаю датчик или концевой выключатель, на ЖК-дисплее должно отображаться сообщение о том, что произошла авария. Но сообщение отображается на ЖК-дисплее БЕЗ нажатия сенсорной кнопки.
Что делать? Я думаю, что в моей программе ошибка. Кто-нибудь может сказать мне, где это?
@Sarfraz Bagwan, 👍0
Обсуждение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, чтобы иметь правильное логическое значение на цифровом выводе.
- Есть ли какой-нибудь способ загрузить скетч с ардуино?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Печать string and integer LCD
- Асинхронные вызовы функций в скетче ардуино
- Как отобразить символ º на ЖК-дисплее?
- Отправка значения с одного Arduino на другой
- Черные квадраты дисплея Arduino 16x2
- NodeMCU с RFID RC522 и LCD-модулем интерфейса I2C вместе
вы не изучили основы, прежде чем приступить к созданию программы... начните с написания короткой программы, которая включает светодиод при нажатии кнопки и выключает светодиод при отпускании кнопки, @jsotola
У вас есть подтягивающий резистор?, @gre_gor
Пожалуйста, не портите свои и чужие публикации. Публикуя в сети Stack Exchange, вы предоставляете SE безотзывное право на распространение этого контента (по [лицензии CC BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0). /)). Согласно политике SE, любой вандализм будет пресечен., @gre_gor