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

STALKER7538
Offline
Зарегистрирован: 12.08.2019

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

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

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

........................
b707
Offline
Зарегистрирован: 26.05.2017

вставьте код по правилам форума

 

STALKER7538
Offline
Зарегистрирован: 12.08.2019

Это как?

STALKER7538
Offline
Зарегистрирован: 12.08.2019
#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 == 0000000000 or 0000000000) // Сравниваем 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;
}
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Условие в строке №42 ВСЕГДА ложно, потому строки  №№44-51 не работают никогда.

STALKER7538
Offline
Зарегистрирован: 12.08.2019

В строке 42 я использую 2 номера моих РФИД карт вместо нолей. Система считивает и поворачивает сервомотор на 90 градусов.

А дальше не работает реле не работают и кнопка на закритие тоже не реагирует

STALKER7538
Offline
Зарегистрирован: 12.08.2019

Не работает со строки 46

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Виноват, невнимательно посмотрел. На самом деле, вторая часть условия ложна. - "or 000". Т.е. условие в строке №42 истинно только огда, когда "uidDec == 0000000000", or и всё, что дальше - в пользу бедных.

kalapanga
Offline
Зарегистрирован: 23.10.2016

STALKER7538 пишет:

В строке 42 я использую 2 номера моих РФИД карт вместо нолей. Система считивает и поворачивает сервомотор на 90 градусов.

А дальше не работает реле не работают и кнопка на закритие тоже не реагирует

Ну Вам же написали, что ерунда в этой строке написана. Откуда только все такую запись берут?

Надо if (uidDec == xxxx or uidDec == yyyy) ...

STALKER7538
Offline
Зарегистрирован: 12.08.2019

Не знаю где вы нашли ерунду но обе карты считываются и поворачивают сервомотор

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

kalapanga пишет:

STALKER7538 пишет:

В строке 42 я использую 2 номера моих РФИД карт вместо нолей. Система считивает и поворачивает сервомотор на 90 градусов.

А дальше не работает реле не работают и кнопка на закритие тоже не реагирует

Ну Вам же написали, что ерунда в этой строке написана. Откуда только все такую запись берут?

Надо if (uidDec == xxxx or uidDec == yyyy) ...

вроде у него короткая запись того же самого. Только не знаю «or» в Си вообще применяется? (Вроде так - ||)

b707
Offline
Зарегистрирован: 26.05.2017

STALKER7538 пишет:

Не знаю где вы нашли ерунду но обе карты считываются и поворачивают сервомотор

не надо спорить, в строке 42 написана ерунда, не соответвующая правилам синтаксиса.

Вы же сюда пришли спрашивать? - так слушайте, что вам отвечают. А если уверены, что знаете лучше - решайте свои проблемы сами.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

BOOM пишет:

вроде у него короткая запись того же самого. 

А она допустима?

BOOM пишет:

Только не знаю «or» в Си вообще применяется? (Вроде так - ||)

Применяется.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

STALKER7538 пишет:

Не знаю где вы нашли ерунду 

В строке №42

Я правильно понимаю, что в реальности там не нули? Нули это Вы нам подсунули, чтобы мозги запудрить? Тем более, что на соседнем форуме у Вас

if (uidDec == 1475896523 or 4786935279)

И нафига Вы нам другое суёте? Реально, чтобы потроллить или Вы разницы между нулём и не нулём не понимаете?

В таком случае, моё замечание становится "наоборот" - условие в строке №42 истинно всегда - для любой карты. Если так, то у Вас действительно

STALKER7538 пишет:

обе карты считываются 

и не только обе, а ещё 100500 других, и вообще - любая. Поскольку выражение "or 4786935279" означает "всегда истинно"

Morroc
Offline
Зарегистрирован: 24.10.2016

STALKER7538 пишет:

Не знаю где вы нашли ерунду но обе карты считываются и поворачивают сервомотор

Напишите там if ((uidDec == 1475896523) || (uidDec == 4786935279)) ... чтобы никто не докопался :)

Далее у вас

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;
}
}

Первое же условие выполняется только если flag == 1, но во всем остальном коде программы вы flag = 1 не делаете - получается этот кусок кода не выполняется. Вангую, что вы хотели тут изобразить контроль нажатия и последующего отпускания кнопки (и только по отпусканию должно что то произойти) - так ?

b707
Offline
Зарегистрирован: 26.05.2017

Morroc - да там еще куча ошибок, например посмотрите на строку 51...

по коду и общению в форуме видно. что автор в теме Ардуино абсолютно деревянный. И слушать никого не хочет, уверен. что у него все и так правильно, только кнопка "почему-то" не срабатывает :)

Он на этот форум уже обиделся и ушел на другой, но и там тупит безмерно...

STALKER7538
Offline
Зарегистрирован: 12.08.2019

Morroc пишет:

STALKER7538 пишет:

Не знаю где вы нашли ерунду но обе карты считываются и поворачивают сервомотор

Напишите там if ((uidDec == 1475896523) || (uidDec == 4786935279)) ... чтобы никто не докопался :)

Далее у вас

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;
}
}

Первое же условие выполняется только если flag == 1, но во всем остальном коде программы вы flag = 1 не делаете - получается этот кусок кода не выполняется. Вангую, что вы хотели тут изобразить контроль нажатия и последующего отпускания кнопки (и только по отпусканию должно что то произойти) - так ?

Да по отпусканию должен повернутся серво в ноль. И викльчится реле

Morroc
Offline
Зарегистрирован: 24.10.2016

Значит проверяейте логику работы с этим flag, ну и со строкой 51 разберитесь действительно :)

STALKER7538
Offline
Зарегистрирован: 12.08.2019
#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;  // для храниения номера метки в десятичном формате


// 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);}
  
  }
  }


   

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

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

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

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

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

b707
Offline
Зарегистрирован: 26.05.2017

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

STALKER7538
Offline
Зарегистрирован: 12.08.2019

RFID ключ должен повернуть серву и включить реле.  После включения реле подается питание на плату управления. После начала работы платы управления поступает отрицательний сигнал на кнопку. И когда сигнал прекратится серва и реле должны вернутся в исходное состояние. 

 

b707
Offline
Зарегистрирован: 26.05.2017

по РФИД включаем зажигание и бензонасос, нажимаем кнопку "Старт", заводимся - правильно понимаю?  зачем же при отпускании кнопки бензонасос выключать, все заглохнет...

STALKER7538
Offline
Зарегистрирован: 12.08.2019

В принципе правильно что бы при виключении зажигания сново становилась на охрану.

Вооще мне это на катер нужно. Но принцип такой же.

b707
Offline
Зарегистрирован: 26.05.2017

STALKER7538 пишет:

В принципе правильно что бы при виключении зажигания сново становилась на охрану.

Вооще мне это на катер нужно. Но принцип такой же.

То есть все время, пока катер работает - надо кнопку держать? Или кнопка это не запуск, а зажигание?

Ну. честно говоря. я все равно не понял, как оно должно работать. Может другие окажутся понятливее.

STALKER7538
Offline
Зарегистрирован: 12.08.2019

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

STALKER7538
Offline
Зарегистрирован: 12.08.2019

Вы знаете в чем проблема с работоспособностю?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

памойму, тут проблема с алгоритмической логикой, а не с работоспособностью. 

STALKER7538
Offline
Зарегистрирован: 12.08.2019

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

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

STALKER7538 пишет:

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

 

ПОТОМУ ЧТО СТРОКИ 38-39 не дают добраться до чтения кнопок если карточки нет

Morroc
Offline
Зарегистрирован: 24.10.2016

STALKER7538 пишет:

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

А вы через полсекунды после поворота сервы нажмите и держите.

STALKER7538 пишет:

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

Именно так у вас программа и написана (и если кнопка при нажатии подает HIGH на ногу, чаще подключают к земле - тогда по идее должно быть LOW при нажатии, но вам виднее).

STALKER7538 пишет:

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

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

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