Перейти к публикации
iT4iT.CLUB

valdemar

Пользователи
  • Публикации

    8
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные пользователем valdemar


  1. @Kitsum Не у каждого на калитке будет замок, у нас общество огорожено, есть 2 официальных входа: 1ый просто калитка, 2ой калитка и автоматический шлагбаум. Сами замки будут установлены непосредственно на КПП. Задача 1 избежать проход посторонних, задача 2 создать неудобства неплательщикам взносов. Шлагбаум уже управляется телефонами, но в дальнейшем хочу тоже к нему прикрутить нрф, т.к. связь в нашем регионе бывает лагает.
    Сеть покрыта плотно т.к. год назад растянул оптику и на ключевых местах висят айпикамеры, потиху докупаемся.

    НУ КАК-ТО ТАК :)

     


  2. @Kitsum у меня в Садоводческом Обществе 1046 участков, у каждого участка минимум 2 ключа, причем дополнительно проводится проверка на факт задолженности при поднесении ключа. Епром не потянет такое количество ключей это факт, поэтому есть большое желание решить поставленную задачу..

     


  3. Я описывал, но повторюсь :), появляется тоже самое что и при старте контроллера.

    Проблему нашел( порт 3306 на сервере в брандмауэре был закрыт). Незнаю почему, но для апатча и скюэля были все порты открыты по умолчанию, но как только прописал открытие порта 3306 вручную, все заработало. 

    Проблема теперь в другом, отклик от момента подноса ключа к считывателю и открытием около 8ми секунд, это многовато для меня. Пробовал на другом компе с процем i7 и т.д. тоже самое. С чем может это быть связано? 


  4. Ребята, всем привет. Всем спасибо за развитие темы, полезная штука. Очень давно собирался собрать и вот дошли руки....Я не гений, но и не бот, в кое чем разбираюсь кое в чем нет, поэтому не судите строго. Проблемы с которыми столкнулся:

    Код использовал исходный из основного поста, единственное что поменял (это статический айпи прикрутил на ардуину и добавил приветствие для отслеживания монитора как предлагал  Kitsum. )

    Из схемы что изменено:

    - нет спикера, не поставил; (временно)

    -  вместо кнопки  открытия подтянул к 2 пину через 10кОм +5в; (временно)

    -  вместо переключателя режима, подтянул к 6 пину землю. (временно)

    В базе данных при создании таблицы поменял тип переменной uid с bigint на var  (т.к. ключи все подобные 16B7FB08, а по другому не могу вставить в базу)

    Проблема следующая на данный момент, в мониторе появляется: 

    Start
    IP: 192.168.1.113

    iT4iT CLUB (C) 2015
    https://it4it.club

     

     

    На всякий случай запустил пинг ардуины на компе, подношу ключ (любой), гаснет диод (который на 13ой ноге), потом очень тускло светится секунд 8,  потом вообще тухнет опять секунд 8, и загорается вновь.

    в мониторе появляется опять тоже самое. Пинг не пропадает.

    ЧТО ЭТО МОЖЕТ БЫТЬ? Всем спасибо за помощь. С Праздником!!!

     

     

    Код который заливаю в ардуину
     

    Скрытый текст

     

    
    // Необходимые библиотеки 16 B7 FB 08
    #include <avr/wdt.h>          
    #include <SPI.h>
    #include <MFRC522.h>
    #include <Bounce2.h>
    #include <Ethernet.h>
    #include <MySQL_Connection.h>
    #include <MySQL_Cursor.h>
    
    // Необходимые пины
    #define PIN_SS         9  // RFID
    #define PIN_RST        8  // RFID
    
    #define PIN_RELAY      7  // RELAY7
    #define PIN_MODE       6  // MODE
    #define PIN_TONE       3  // TONE
    #define PIN_OPEN       2  // OPEN
    
    MFRC522 mfrc522(PIN_SS, PIN_RST);
    
    byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
    IPAddress server(192, 168, 1, 111);  // IP адрес MySQL сервера
    char user[] = "root";               // MySQL username
    char password[] = "";        // MySQL password
    
    const char QUERY_S[] = "SELECT type FROM test.rc522 WHERE uid = %s;";
    const char QUERY_I[] = "INSERT INTO test.rc522 (uid) VALUES ('%s');";
    char query[128];
    
    EthernetClient client;
    MySQL_Connection conn((Client *)&client);
    MySQL_Cursor cur = MySQL_Cursor(&conn);
    
    //
    String key, lastKey;
    String typeKey;
    char toQuery[12];
    unsigned long lastKeyTimer  = 0;
    
    // Переменные необходимые для режима программирования
    byte modeProgTime           = 5;     // Количество секунд удержания мастер ключа для входа\выхода в\из режим\а программирования
    bool mode                   = false; // НЕ МЕНЯТЬ!
    bool modeLock               = false; // НЕ МЕНЯТЬ!
    byte modeClean              = 0;     // НЕ МЕНЯТЬ!
    unsigned long modeTimer     = 0;     // НЕ МЕНЯТЬ!
    
    // Управление замком
    unsigned long openTimer = 0;
    
    // Защита кнопок от дребезга
    Bounce key_open  = Bounce();
    /*
      Функция звукового оповещения.
      Принимает параметры: количество звуковых сигналов, частота в герцах, продолжительность звука, пауза в миллисекундах (не обязательно)
    */
    void squeaker(byte count, unsigned int Hz, unsigned int duration, unsigned int sleep = 0) 
    {
      for(int i=0; i<count; i++) {
        tone(PIN_TONE, Hz, duration);
        if(sleep > 0) delay(sleep);
      }
    }
    /*
      Функция читает EEPROM и составляет список активных ключей
      Первый байт в памяти содержит количество ключей
      UID ключа содержит 4 байта
      Общая память 1 + количество ключей * 4
      Максимум можно записать 255 ключей
    */
    void setup() {
      // Настраиваем сторожевой таймер
      wdt_disable();
      delay(8000);
      wdt_enable(WDTO_8S);
    
      // Инициализация используемых пинов
      // Реле
      pinMode(PIN_RELAY, OUTPUT);
      digitalWrite(PIN_RELAY, HIGH);
       
      // Кнопка открытия двери
      pinMode(PIN_OPEN,INPUT_PULLUP);
      key_open.attach(PIN_OPEN);
      key_open.interval(5);   
    
      // Перемычка выбора режима работы (0 - автоматическое закрытие двери, 1 - закрытие двери по ключу)
      pinMode(PIN_MODE, INPUT);
      digitalWrite(PIN_MODE, HIGH);
    
      // Инициализация консоли
      Serial.begin(115200);
      while (!Serial);
      Serial.println(F("Start"));
    
      // Инициализация ридера
      SPI.begin();
      mfrc522.PCD_Init();
    
     // Ethernet.begin(mac);
      IPAddress ip(192, 168, 1, 113);
      IPAddress subnet(255, 255, 255, 0);  
      IPAddress gateway(192, 168, 1, 1);
      IPAddress dns(192, 168, 1, 1);
    
      Ethernet.begin(mac, ip, dns, gateway, subnet);
     
      Serial.print(F("IP: "));
      Serial.println(Ethernet.localIP());
      Serial.println();
      
      // Приглашаем в гости
      Serial.println(F("iT4iT CLUB (C) 2015\nhttps://it4it.club\n"));      
    }
    
    void loop() {
      // Сбрасываем сторожевой таймер микроконтроллера
      wdt_reset();
    
      if(openTimer > millis()+10000) openTimer = 0;
      if(lastKeyTimer > millis()+10000) lastKeyTimer = 0;
    
      // Изменение режима работы закрытия
      modeLock = !digitalRead(PIN_MODE);
    
      // Открытие двери с кнопки
      key_open.update();
      if(!key_open.read() and openTimer == 0 and !mode) {
        if(modeLock or (!modeLock and digitalRead(PIN_RELAY))) {
          openTimer = millis()/1000;
          digitalWrite(PIN_RELAY, LOW);
          Serial.println(F("The door opened from the inside\n"));
          squeaker(5, 3200, 100, 300);
        }
        delay(2000);
      }
      
      // Автоматическое закрытие двери
      if(openTimer != 0) {
        if(millis()/1000 - openTimer > 5) {
          openTimer = 0;
          if(modeLock) {
            digitalWrite(PIN_RELAY, HIGH);
            Serial.println(F("* closed lock"));
          }
          else {
            if(!digitalRead(PIN_RELAY)) digitalWrite(PIN_RELAY, HIGH);
          }
        }
      }
      
      // Если ключ отсутствует или не читается, не выполняем дальнейший код
      if(!mfrc522.PICC_IsNewCardPresent()) {
        // Очистка таймера входа в режим программирования, в случае если ридер свободен
        if(modeTimer != 0) {
          if(++modeClean > 5) modeTimer = modeClean = 0;
        }
        // Таймер для контроля времени хранения последнего ключа в памяти
        if(lastKeyTimer != 0) {
          if((millis()-lastKeyTimer) > 100) {
            lastKey = "";
            lastKeyTimer = 0;
          }
        }
        return;
      }
      if(!mfrc522.PICC_ReadCardSerial()) return;
      // Останавливаем режим очистки
      modeClean = 0;
    
      // Читаем ключ
      for(byte i=0; i<4; i++) key += mfrc522.uid.uidByte[i];
      // Один ключ = Один запрос к MySQL серверу. Не флудим.
      if(key != lastKey) {
        if(!conn.connected()) {
          if(!conn.connect(server, 3306, user, password)) {
            squeaker(5, 1000, 200, 200);
            return;
          }
        }
        
        key.toCharArray(toQuery, key.length()+1);
        sprintf(query, QUERY_S, toQuery);
        cur.execute(query);
    
        column_names *cols = cur.get_columns();
        row_values *row = NULL;
        Serial.println("KEY: " + key);
        if((row = cur.get_next_row()) != NULL) typeKey = String(row->values[0]); else typeKey = "0";
        if(typeKey == F("1") or typeKey == F("2")) {
          if(!mode) {
            Serial.println(F("access allow"));
            // Доступ разрешен
            if(modeLock) {
              openTimer = millis()/1000;
              digitalWrite(PIN_RELAY, LOW); 
            }
            else digitalWrite(PIN_RELAY, !digitalRead(PIN_RELAY));
            squeaker(2, 2200, 200, 200);
          }
          else {
            if(typeKey != F("1")) {
              Serial.println(F("error: key elrady exists in eeprom"));
              squeaker(2, 500, 300);
            }
          }
        }
        else {
          if(!mode) {
            Serial.println(F("access dany"));
            squeaker(1, 500, 1000);
          }
          else {
            Serial.println(F("add key in MySQL"));
            sprintf(query, QUERY_I, toQuery);
            cur.execute(query);
            squeaker(2, 2200, 200, 200);
          }
        }
    
        lastKey = key;
        cur.close();
        conn.close();
      }
      else {
        if(typeKey == F("1")) {
          if(modeTimer == 0) modeTimer = millis()/1000;
          else {
            if(millis()/1000 - modeTimer > modeProgTime and modeTimer != 0) {
              modeTimer = openTimer = 0;
              if((mode = !mode) == true) {
                // Вход в режим программирования
                digitalWrite(PIN_RELAY, LOW);
                Serial.println(F("MASTER PROGRAMMING MODE ON"));
                squeaker(4, 1200, 200, 200);
              }
              else {
                // Выход из режима программирования
                digitalWrite(PIN_RELAY, HIGH);
                Serial.println(F("MASTER PROGRAMMING MODE OFF"));
                squeaker(4, 2200, 200, 200);
              }
              delay(2000);
            }
          }
        }
      }
      
      lastKeyTimer = millis();
      key = "";
    }

     

×
×
  • Создать...