ЖК-дисплей не работает с условием
#include <LiquidCrystal.h>
#include <Wire.h>
LiquidCrystal lcd(2, 3, 4, 5, 11, 12);// инициализируем библиотеку номерами пинов интерфейса
int pirPin = 7; //Переменная, которая будет получать цифровой сигнал от датчика
int LEDgreen = 6; //светодиод адресован цифровому выводу 6
int speaker = 8; //динамик адресован цифровому выводу 7
int buttonPin = 9; // контакт, к которому прикреплена кнопка
void setup(){
pinMode(buttonPin, INPUT);// Инициализируем вывод кнопки как вход:
pinMode(pirPin, INPUT); // объявляет переменную pirPin как вход
pinMode(LEDgreen, OUTPUT); // объявляет переменную LEDgreen как выход
pinMode(speaker, OUTPUT); // объявляет переменную Speaker как выход
lcd.begin(16, 2);
// включаем курсор:
lcd.cursor();
Serial.begin(9600);
}
void loop(){
int buttonState = digitalRead(buttonPin);// Чтение входного вывода кнопки:
int pirVal = digitalRead(pirPin); //читаем цифровое значение из pirPin и сохраняем значение в локальной переменной pirVal
if(buttonState == LOW){
if(digitalRead(pirPin) == LOW){
/*The LED Blinks once with the command digitalWrite
the LED keeps turned on after blink during the motion cycle*/
digitalWrite(LEDgreen, HIGH);
delay(1000);
digitalWrite(LEDgreen, LOW);
delay(500);
digitalWrite(LEDgreen, HIGH);
/*speaker plays frequency, the number 7 is the digital pin,
the second number is the frequency played and the third number is the sound duration
we repeated this command with different frequency and varying the time in order to create a
pleasant sound */
tone(4,261,300);
delay(200);
tone(4,329,300);
delay(200);
tone(4,392,600);
delay(200);
tone(4,329,300);
delay(200);
tone(4,392,300);
delay(200);
tone(4,493,600);
delay(200);
tone(4,392,300);
delay(200);
tone(4,493,300);
delay(200);
tone(4,294,600);
delay(200);
lcd.setCursor(0,0);
lcd.print(" Motion "); // Вывести сообщение на ЖК-дисплей.
lcd.setCursor(0,1);
lcd.print(" Detected ");
} else if(digitalRead(pirPin) == HIGH) {
digitalWrite(LEDgreen, LOW); // Выключаем светодиод в случае отсутствия движения
lcd.setCursor(0,0);
lcd.print("No Motion ");
lcd.setCursor(0,1);
lcd.print(" Detected ");
}
} else if(buttonState == HIGH) {
if(digitalRead(pirPin) == LOW) {
digitalWrite(LEDgreen, HIGH);
delay(1000);
digitalWrite(LEDgreen, LOW);
delay(500);
digitalWrite(LEDgreen, HIGH);
tone(4,261,300);
delay(200);
tone(4,329,300);
delay(200);
tone(4,392,600);
delay(200);
tone(4,329,300);
delay(200);
tone(4,392,300);
delay(200);
tone(4,493,600);
delay(200);
tone(4,392,300);
lcd.setCursor(0,0);
lcd.print(" Motion ");
lcd.setCursor(0,1);
lcd.print(" Detected & door ");
} else if(digitalRead(pirPin) == HIGH) {
digitalWrite(LEDgreen, LOW);
// Выключаем светодиод в случае отсутствия движения
tone(4,329,300);
delay(200);
tone(4,392,300);
delay(200);
tone(4,493,600);
delay(200);
tone(4,392,300);
lcd.setCursor(0,0);
lcd.print("No Motion ");
lcd.setCursor(0,1);
lcd.print(" Detected but door ");
}
}
delay(2000); // ждем 1 секунду перед повторным сравнением
}
@lobna amin, 👍-2
Обсуждение1 ответ
Лучший ответ:
Это краткое изложение вашей базовой логики цикла:
void loop() {
int buttonState = digitalRead(buttonPin);// Чтение входного вывода кнопки:
int pirVal = digitalRead(pirPin); //читаем цифровое значение из pirPin и сохраняем значение в локальной переменной pirVal
if (buttonState == LOW) {
if (digitalRead(pirPin) == LOW) {
// Состояние кнопки НИЗКОЕ
// pirPin недавно читался как НИЗКИЙ
// ... Обнаружено движение ...
}
else if (digitalRead(pirPin) == HIGH) {
// Состояние кнопки НИЗКОЕ
// pirPin недавно считывался как ВЫСОКИЙ
// ... Движение не обнаружено ...
}
}
else if (buttonState == HIGH) {
if (digitalRead(pirPin) == LOW) {
// Состояние кнопки ВЫСОКОЕ
// pirPin недавно читался как НИЗКИЙ
// ... Обнаружено движение & Дверь ...
}
else if (digitalRead(pirPin) == HIGH) {
// Состояние кнопки ВЫСОКОЕ
// pirPin недавно считывался как ВЫСОКИЙ
// ... Движение не обнаружено, но дверь ...
}
}
delay(2000); // ждем 1 секунду перед повторным сравнением
}
Однако это плохой код:
if (digitalRead(pirPin) == LOW) {
// ... Обнаружено движение ...
}
else if (digitalRead(pirPin) == HIGH) {
// ... Движение не обнаружено ...
}
потому что при каждом вызове функции digitalRead(..) она может возвращать разные значения. Таким образом, даже если ваше намерение ясно, этот код не будет работать так, как вы ожидаете. Рассмотрим, что произойдет, если первое значение digitalRead(pirPin) будет высоким, поэтому digitalRead(pirPin)==LOW будет ложным, а второе значение digitalRead(pirPin) будет низким, поэтому digitalRead(pirPin)==HIGH также будет ложным. Тогда ни один блок кода не запускается. Вместо этого используйте:
if (digitalRead(pirPin) == LOW) {
// ... Обнаружено движение ...
}
else {
// ... Движение не обнаружено ...
}
Или, поскольку вы уже выбрали его в начале цикла с помощью int pirVal = digitalRead(pirPin);
, упростите логику следующим образом:
void loop() {
int buttonState = digitalRead(buttonPin);// Чтение входного вывода кнопки:
int pirVal = digitalRead(pirPin); //читаем цифровое значение из pirPin и сохраняем значение в локальной переменной pirVal
if (buttonState == LOW) {
if (pirVal == LOW) {
// Состояние кнопки НИЗКОЕ
// pirPin НИЗКИЙ
// ... Обнаружено движение ...
}
else {
// Состояние кнопки НИЗКОЕ
// pirPin ВЫСОКИЙ
// ... Движение не обнаружено ...
}
}
else {
// Состояние кнопки ВЫСОКОЕ
if (pirVal == LOW) {
// Состояние кнопки ВЫСОКОЕ
// pirPin НИЗКИЙ
// ... Обнаружено движение & Дверь ...
}
else {
// Состояние кнопки ВЫСОКОЕ
// pirPin ВЫСОКИЙ
// ... Движение не обнаружено, но дверь ...
}
}
delay(2000); // ждем 1 секунду перед повторным сравнением
}
Кстати, если вы используете Arduino IDE, вы можете легко убрать отступы, чтобы эти управляющие структуры было легче увидеть, выбрав Tools | Автоматический формат.
привет, спасибо, MarkU, проблема в том, что мой ЖК-дисплей не работает, возможно, это настройка или цикл, я не знаю, @lobna amin
В будущем было бы полезно написать простую программу, чтобы убедиться, что ваше оборудование работает, прежде чем переходить к использованию нового программного обеспечения, которое само по себе может не работать. Простое «Привет, Мир!» Программа для вывода на дисплей очень быстро сообщит вам, есть ли у вас аппаратная или программная ошибка., @JRobert
Стандартный пример «Hello World» для ЖК-дисплея находится в Arduino IDE в разделе «Файл | Примеры | Жидкий Кристалл | Привет, мир. Обратите внимание, что в вашем примере кода используется другая распиновка: «LiquidCrystal lcd(2, 3, 4, 5, 11, 12)» вместо обычной конфигурации «LiquidCrystal lcd(12, 11, 5, 4, 3, 2)». Возможно ли, что ваши подключения ЖК-дисплея не такие, как вы предполагали?, @MarkU
привет, большое спасибо, MarkU, это программная ошибка, это была конфигурация LiquidCrystal lcd, сейчас все работает :), @lobna amin
Код LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
определяет, какие контакты Arduino подключены к оборудованию ЖК-дисплея — RS=12, Enable=11, D4=5, D5=4, D6= 3, Д7=2; с заземленным R/W. **Подключите ЖК-дисплей именно таким образом и запустите пример HelloWorld, чтобы убедиться, что оборудование вашего ЖК-дисплея работает.** Как только все заработает, исправьте свой код, чтобы он использовал ту же конфигурацию lcd(12, 11, 5, 4). , 3, 2)
вместо того, что было раньше, lcd(2, 3, 4, 5, 11, 12)
. У вас те же контакты, но в другом порядке, и я предполагаю, что ваш ЖК-дисплей подключен обычными разъемами., @MarkU
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Кажется, вы забыли задать вопрос..., @Majenko