Помогите скомбинировать скетчи и разобраться с ошибкой

Lord-Urd
Offline
Зарегистрирован: 26.08.2015

Здравствуйте дорогие форумчане. Обращаюсь к вам с просьбой о помощи с вот такими вопросами:

1) Имеется два скетча, из этих источников:

http://smart-home.te.ua/arduino-herkonovyij-datchyk/?lang=ru

http://lesson.iarduino.ru/page/kontrol-dostupa-rfid-rc522-servo-arduino/

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

2) Скетч из первого примера лёгкий и там всё просто. А вот со вторым у меня что то не выходит. При компиляции скетча выдаёт ошибку и подсвечивает эту строку:

{

uidDecTemp = mfrc522.uid.uidByte[i];

uidDec = uidDec * 256 uidDecTemp;

}

Вот как я всё скоммутировал:

Помогите пожалуйста. Я только начинаю осваивать Arduino, а мигать светодиодиками уже надоело((

 

Заранее благодарен.



 

ya
Offline
Зарегистрирован: 09.12.2014

на том сайте почему то игнорятся все + в коде, а этот цикл for на который ошибка замените на

  for (byte i = 0; i < mfrc522.uid.size; i++) {
    uidDecTemp = mfrc522.uid.uidByte[i];
    uidDec = uidDec * 256 + uidDecTemp;
  }

 

ya
Offline
Зарегистрирован: 09.12.2014

а весь скетч такой:

#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;  // для хранения номера метки в десятичном формате
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);  // устанавливаем серву в закрытое состояние
}
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 == 3763966293) // Сравниваем Uid метки, если он равен заданному то серва открывает.
  {
    tone(5, 200, 500); // Делаем звуковой сигнал, Открытие
    servo.write(90); // Поворачивавшем серву на угол 90 градусов(Отпираем какой либо механизм: задвижку, поворачивавшем ключ и т.д.)
    delay(3000); // пауза 3 сек и механизм запирается.
    tone(5, 500, 500); // Делаем звуковой сигнал,  Закрытие
  }
  servo.write(0);  // устанавливаем серву в закрытое состояние
}

 

Lord-Urd
Offline
Зарегистрирован: 26.08.2015

Попробую залить ваш код. А как сделать чтобы геркон в коде учитывался?

ya
Offline
Зарегистрирован: 09.12.2014

Lord-Urd пишет:

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

не много не понял вы наверное хотите так:

КАРТА ПРАВИЛЬНАЯ И ДВЕРЬ ЗАКРЫТА:

ДА: ОТКРЫВАЕМ ДВЕРЬ

НЕТ: НИЧЕГО НЕ ДЕЛАЯЕМ (ну или пищим и светодиодом моргаем)

 

КАРТА ПРАВИЛЬНАЯ И ДВЕРЬ ОТКРЫТА:

ДА: ЗАКРЫВАЕМ ДВЕРЬ

НЕТ: НИЧЕГО НЕ ДЕЛАЕМ

ya
Offline
Зарегистрирован: 09.12.2014

или хотите когда карта праильна и дваерь закрыта то открываем дверь

геркон у магнита то закрываем дверь

Lord-Urd
Offline
Зарегистрирован: 26.08.2015

второе))

 

ya
Offline
Зарегистрирован: 09.12.2014

ц что уж давайте сами если что подскажу, если хотите чтобы за вас написали код то идите в http://arduino.ru/forumy/ishchu-ispolnitelya

Lord-Urd
Offline
Зарегистрирован: 26.08.2015

попробую.

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

Lord-Urd
Offline
Зарегистрирован: 26.08.2015

И то не всегда с первого раза. Ардуина подклченна к ПК по USB и плюс дополнительное питание от батарейки кроны. 

Lord-Urd
Offline
Зарегистрирован: 26.08.2015

Скорее всего причина в том, что не припаяны к считавателю штекеры.

ya
Offline
Зарегистрирован: 09.12.2014

да когда не были припаяны было и не такое...

Lord-Urd
Offline
Зарегистрирован: 26.08.2015

вроде получилось. Вот что вышло:

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

Servo servo;

int Door_Sensor_Pin = 6; // контакт для датчика

int Door_Sensor_State = 0;  // Состояние геркона

 

const int CardsID_Max=2;  //Максимальное количество доступных карт в массиве CardsID

unsigned long CardsID[CardsID_Max];  // Массив для IDшников карт

 

void setup() {

  Serial.begin(9600);

  Serial.println("\n-----------------------------------------------------------------------------------------\nSetup complete!");

  SPI.begin();  //  инициализация SPI / Init SPI bus.

  mfrc522.PCD_Init();     // инициализация MFRC522 / Init MFRC522 card.

  servo.attach(5);

  servo.write(0);  // устанавливаем серву в закрытое состояние

  pinMode(Door_Sensor_Pin, INPUT); // установить Door_Sensor_Pin как вход

 

  for(int i=0; i<CardsID_Max; i++)  CardsID[i]=0;

  CardsID[0]=3544330242;

  CardsID[1]=2770378028;

}

void loop()

{

    //delay(1000);

    //Проверка геркона

    //Serial.println("\nGerkon check.");

   Door_Sensor_State = digitalRead(Door_Sensor_Pin);

   if ( Door_Sensor_State == LOW) // читать Door_Sensor_Pin

    {

        //Serial.println("Gerkon closed");

        servo.write(0);  // устанавливаем серву в закрытое состояние

        //tone(3, 100, 100);

        Serial.println("SERVO: close");

   

     // Поиск новой метки

      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 метки в консоль.

    for(int i=0; i<CardsID_Max; i++)

    {

        if(CardsID[i] == uidDec)

        {

          tone(3, 100, 500); // Делаем звуковой сигнал, Открытие

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

          Serial.println("SERVO move 90");

          break;

        }

    }; 

   }

   else

   {

      Serial.println("Gerkon: open");

   }

   

   Serial.println("Waiting 3 sec...\n"); 

   delay(3000);    //Время на открытие двери после того как карта принята

 

}

Lord-Urd
Offline
Зарегистрирован: 26.08.2015

Только как то нестабильно это всё работает. То нормально считала карту открыл дверь, геркон в разрыве, замок не закрывается, то сам по себе закрывает замок когда дверь открыта. Может пару раз нормально отработать а третий раз глюкнет, или наоборот. Не могу понять в чём дело. Помогите разобраться.

ya
Offline
Зарегистрирован: 09.12.2014

наверное из за дребезга геркона напишите

pinMode(Door_Sensor_Pin, INPUT_PULLUP);

и проверьте

Lord-Urd
Offline
Зарегистрирован: 26.08.2015

  pinMode(Door_Sensor_Pin, INPUT); // установить Door_Sensor_Pin как вход

вместо этой строки?

ya
Offline
Зарегистрирован: 09.12.2014

да

Lord-Urd
Offline
Зарегистрирован: 26.08.2015

Попробую. Спасибо большое за помощь!!!

vvadim
Offline
Зарегистрирован: 23.05.2012

дребезг геркона - раз

серву не подключают к дуне по питанию. сделайте ей нормальное питание отдельное 5-6 вольт - два

 

Lord-Urd
Offline
Зарегистрирован: 26.08.2015

Спасибо большое за наставления. А если крону к серве как питающий элемент, временный для опытов, подключить, то нормально будет?

Arduino

Сервопривод

5V *(к плюсу кроны)

Красный (Центральный)

GND (к минусу кроны)

Черный или Коричневый (Левый)

pin 5

Белый или Оранжевый (Правый)

 

bwn
Offline
Зарегистрирован: 25.08.2014

Питание от отдельного БП на 5-6В (Крона - 9В), + только на серву, GND соединяем.

Lord-Urd
Offline
Зарегистрирован: 26.08.2015

Ага понятно. Спасибо за помощь!!!

Lord-Urd
Offline
Зарегистрирован: 26.08.2015

Lord-Urd
Offline
Зарегистрирован: 26.08.2015

Вот так надо серву подключить. Извиняюсь что на картинке аккумулятор, просто во фризинге не нашёл блок питания.