#1 2019-08-12 21:43:39

STALKER7538
Участник
Зарегистрирован: 2019-08-12
Сообщений: 9

Проблема с работоспособностью

Скетч работает некоректно. Помогите разобратся

При поднисении правильной РФИД метки должен проворачиватся сервомотор и влючатся два реле, а при нажатии на кнопку сервомотор должен возвращатся в ноль а реле выключатся.

А у меня кнопка и реле не работает.

#include <Servo.h>
#include <SPI.h>
#include <MFRC522.h> // библиотека "RFID".
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);
unsigned long uidDec, uidDecTemp;  // для храниения номера метки в десятичном формате
boolean flag;    
int relay_lights = 5; // Определение пина для реле включения зажигания
int relay_lights2 = 4; // Определение пина для реле включения насоса
 
 
Servo servo;
void setup() {
  Serial.begin(9600);
  Serial.println("Waiting for card...");
  SPI.begin();  //  инициализация SPI / Init SPI bus.
  mfrc522.PCD_Init();     // инициализация MFRC522 / Init MFRC522 card.
  servo.attach(6);
  servo.write(0);  // устанавливаем серву в закрытое сосотояние
  digitalWrite(relay_lights, HIGH);
  digitalWrite(relay_lights2, HIGH);
}
void loop() {
  // Поиск новой метки
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }
  // Выбор метки
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }
  uidDec = 0;
  // Выдача серийного номера метки.
  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    uidDecTemp = mfrc522.uid.uidByte[i];
    uidDec = uidDec * 256 + uidDecTemp;
  }
  Serial.println("Card UID: ");
  Serial.println(uidDec); // Выводим UID метки в консоль.
  if (uidDec == 1475896523 or 4786935279) // Сравниваем Uid метки, если он равен заданому то серва открывает.
  {
    tone(5, 200, 500); // Делаем звуковой сигнал, Открытие
    servo.write(90); // Поворациваем серву на угол 90 градусов(Отпираем какой либо механизм: задвижку, поворачиваем ключ и т.д.)
    digitalWrite(relay_lights, LOW);
    digitalWrite(relay_lights2, LOW);
 
    delay(1000); // пауза 1 сек.
 
    flag==0;
  }
  if(digitalRead(3)==LOW&&flag==1)//если кнопка нажата
 
if(digitalRead(3)==HIGH&&flag==0)
{
servo.write(0);
digitalWrite(relay_lights, HIGH);
digitalWrite(relay_lights2, HIGH);
 
tone(5, 500, 500); // Делаем звуковой сигнал,  Закрытие
 
flag=1;
}
}

#2 2019-08-12 22:01:55

г0сть
Гость

Re: Проблема с работоспособностью

вы бы определились когда у вас кнопка нажата
if(digitalRead(3)==LOW&&flag==1)//если кнопка нажата
или
if(digitalRead(3)==HIGH&&flag==0)

#3 2019-08-12 22:19:34

г0сть
Гость

Re: Проблема с работоспособностью

и вы бы указали в сетапе где у вас вход, а где выход
да и это выражение
if (uidDec == 1475896523 or 4786935279)
вызывает сомнение

#4 2019-08-12 22:24:09

STALKER7538
Участник
Зарегистрирован: 2019-08-12
Сообщений: 9

Re: Проблема с работоспособностью

if(digitalRead(3)==LOW&&flag==0)//если кнопка нажата

#5 2019-08-12 22:25:21

STALKER7538
Участник
Зарегистрирован: 2019-08-12
Сообщений: 9

Re: Проблема с работоспособностью

г0сть пишет:

и вы бы указали в сетапе где у вас вход, а где выход
да и это выражение
if (uidDec == 1475896523 or 4786935279)
вызывает сомнение

Как это указать?

#6 2019-08-12 22:32:20

г0сть
Гость

Re: Проблема с работоспособностью

pinMode(xxx,INPUT) или pinMode(xxx,OUTPUT)
где xxx - сответствующий пин

#7 2019-08-12 22:34:44

г0сть
Гость

Re: Проблема с работоспособностью

и это if(digitalRead(3)==LOW&&flag==1) тогда уберите

#8 2019-08-12 22:40:29

STALKER7538
Участник
Зарегистрирован: 2019-08-12
Сообщений: 9

Re: Проблема с работоспособностью

г0сть пишет:

pinMode(xxx,INPUT) или pinMode(xxx,OUTPUT)
где xxx - сответствующий пин

не работает Arduino: 1.8.9 (Windows 7), Плата:"Arduino Nano, ATmega328P (Old Bootloader)"

sketch_aug05a:11:8: error: expected constructor, destructor, or type conversion before '(' token

pinMode(3,INPUT)

        ^

C:\Users\Lex\Desktop\RFID LESSON\sketch_aug05a\sketch_aug05a.ino: In function 'void setup()':

sketch_aug05a:19:3: error: 'servo' was not declared in this scope

   servo.attach(6);

   ^

C:\Users\Lex\Desktop\RFID LESSON\sketch_aug05a\sketch_aug05a.ino: In function 'void loop()':

sketch_aug05a:45:5: error: 'servo' was not declared in this scope

     servo.write(90); // Поворациваем серву на угол 90 градусов(Отпираем какой либо механизм: задвижку, поворациваем ключ и т.д.)

     ^

sketch_aug05a:55:1: error: 'servo' was not declared in this scope

servo.write(0);

^

exit status 1
expected constructor, destructor, or type conversion before '(' token

#9 2019-08-12 22:42:49

г0сть
Гость

Re: Проблема с работоспособностью

ну а ; после ) кто ставить будет?

#10 2019-08-12 22:54:39

STALKER7538
Участник
Зарегистрирован: 2019-08-12
Сообщений: 9

Re: Проблема с работоспособностью

Где после?
pinMode(buttonPin, INPUT);

#11 2019-08-12 22:55:40

г0сть
Гость

Re: Проблема с работоспособностью

да

#12 2019-08-12 23:01:17

STALKER7538
Участник
Зарегистрирован: 2019-08-12
Сообщений: 9

Re: Проблема с работоспособностью

Оно так сначала было написано но все равно не компилируется

#13 2019-08-12 23:07:30

г0сть
Гость

Re: Проблема с работоспособностью

проверяйте внимательно что вы накуролесили. Скопировал и ничего более не меняя добавил в ваш код три строки
  pinMode(3,INPUT);
  pinMode(relay_lights,OUTPUT);
  pinMode(relay_lights2,OUTPUT);
у меня нормально все скомпилировалось

#14 2019-08-13 10:14:46

UU
Гость

Re: Проблема с работоспособностью

Автор, с этим

if (uidDec == 1475896523 or 4786935279)

Ваша сигналка будет срабатывать от абсолютно любой карты.

Можете легко это проверить - вставьте в условие вместо своих номеров любые другие, например

if (uidDec == 1111111111 or 4444444444)

и убедитесь, что сервы продолжают поворачиваться

#15 2019-08-13 12:22:04

Kaka
Участник
Зарегистрирован: 2018-03-21
Сообщений: 140

Re: Проблема с работоспособностью

UU, ему это уже говорили на другом форуме, но он не верит smile

#16 2019-08-13 21:57:00

STALKER7538
Участник
Зарегистрирован: 2019-08-12
Сообщений: 9

Re: Проблема с работоспособностью

Подправил код. Реле тепер вкючаэтся. А с кнопкой по прежнему не могу разобратся. Может кто то помочь?

Когда подношу карточку. Серво поворачивается и реле включается. А кнопка не реагируэт.

При нажатой кнопке подношу карточку Серво поворачивается и реле включается и через секунду возвращается обратно.

Как сделать чтобы Возвращалось назад сервомотор и выключалось реле после отпускания кнопки без карточки?

Включить карточкой а выключить по отпускании кнопки.

#include <Servo.h>
#include <SPI.h>
#include <MFRC522.h> // библиотека "RFID".
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);
unsigned long uidDec, uidDecTemp;  // для храниения номера метки в десятичном формате
boolean flag;
    void closeflag ();


// constants won't change. They're used here to set pin numbers:
const int buttonPin = 3;     // the number of the pushbutton pin
const int ledPin =  4;      // the number of the LED pin
const int relayPin =  2;      // the number of the RELAY pin

int buttonState = 0;         // variable for reading the pushbutton status



Servo servo;
void setup() {
    // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);

  Serial.begin(9600);
  Serial.println("Waiting for card...");
  SPI.begin();  //  инициализация SPI / Init SPI bus.
  mfrc522.PCD_Init();     // инициализация MFRC522 / Init MFRC522 card.
  servo.attach(6);
  servo.write(0);  // устанавливаем серву в закрытое сосотояние

}
void loop() {
  
   // Поиск новой метки
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }
  // Выбор метки
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }
  uidDec = 0;
  // Выдача серийного номера метки.
  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    uidDecTemp = mfrc522.uid.uidByte[i];
    uidDec = uidDec * 256 + uidDecTemp;
  }
  Serial.println("Card UID: ");
  Serial.println(uidDec); // Выводим UID метки в консоль.
  if ((uidDec == 1475896523) || (uidDec == 4786935279)) // Сравниваем Uid метки, если он равен заданому то серва открывает.
  { 
   digitalWrite(ledPin, HIGH);
   digitalWrite(relayPin, HIGH);
   servo.write(90); // Поворациваем серву на угол 90 градусов(Отпираем какой либо механизм: задвижку, поворациваем ключ и т.д.)
      delay(1000); // пауза 0,5 сек.
  
   buttonState = digitalRead(buttonPin); 
    // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
  if (buttonState == HIGH)
      {
   servo.write(0); // Поворациваем серву на угол 90 градусов(Отпираем какой либо механизм: задвижку, поворациваем ключ и т.д.)
   digitalWrite(ledPin, LOW);
   digitalWrite(relayPin, LOW);}
    
  }
  }
  

#17 2019-08-13 22:00:14

г0сть
Гость

Re: Проблема с работоспособностью

что значит "при отпускании кнопки"? Нажать на кнопку и удерживать нажатой - ничего не меняется, отпустить - реле выключилось. Или под отпусканием имеется ввиду разорвать цепь?

#18 2019-08-13 23:03:39

г0сть
Гость

Re: Проблема с работоспособностью

STALKER7538 пишет:

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

Я правильно понял: в данном случае кнопка - это имитация сигнала с какой-то хрени? Поднесли карточку, сработало реле, подало питание на эту хрень, с выхода этой хрени пришел сигнал на ардуину. Выключили хрень, сигнал пропал, ардуина отключила реле?
Cигнал - низкий уровень LOW?

#19 2019-08-14 05:12:02

STALKER7538
Участник
Зарегистрирован: 2019-08-12
Сообщений: 9

Re: Проблема с работоспособностью

Да

#20 2019-08-14 06:24:20

STALKER7538
Участник
Зарегистрирован: 2019-08-12
Сообщений: 9

Re: Проблема с работоспособностью

Почему если удалить строки с RFID то кнопка работает как положено?

#21 2019-08-14 06:53:31

vvr
Участник
Зарегистрирован: 2015-04-12
Сообщений: 575

Re: Проблема с работоспособностью

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

#22 2019-08-14 09:07:10

г0сть
Гость

Re: Проблема с работоспособностью

if(!digitalRead(buttonPin)) {
delay(10);               
while(!digitalRead(buttonPin)) {}                 
servo.write(0);
digitalWrite(ledPin, LOW);
digitalWrite(relayPin, LOW);
  }

Быстрое сообщение

Введите сообщение и нажмите Отправить

Подвал раздела