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

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

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

В общем делаю замок реагирующий на rfid карты и отображающий состояние двери на экран LCM1602 IIC V1, так же замок открыватся должен через нажатие кнопки. Открывает всё серво, геркон для проверки открыта дверь или закрыта. Скетч следующий:

#include <Servo.h>

#include <SPI.h>

#include <MFRC522.h> // библиотека "RFID".



#include <Wire.h>

#include <LiquidCrystal_I2C.h>



#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 BUTTON=2; // контакт 2 для подключения кнопки

int buttonState = 0; // Переменная для хранения состояния кнопки



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

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





//задаем адрес LCD экрана 0x27, 16 символов, 2 строки

LiquidCrystal_I2C lcd(0x27,16,2);



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_PULLUP); // установить Door_Sensor_Pin как вход

  //pinMode (BUTTON, INPUT); // Сконфигурировать контакт кнопки как вход

  pinMode(BUTTON, INPUT_PULLUP);



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

  CardsID[0]=3544330242;

  CardsID[1]=2770378028;



  lcd.init(); // Инициализируем экран

  // Выводим сообщение //

  //включаем подсветку

  lcd.backlight();



  lcd.setCursor(0,0);

  lcd.print("Test start!"); 

}

void loop()

{

   delay(1000);

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

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



   Door_Sensor_State = digitalRead(Door_Sensor_Pin);

   //buttonState = digitalRead(BUTTON); //Считываем значение с входа кнопки



     //Проверяем нажата ли кнопка если нажата то buttonState будет HIGH

   //if (buttonState == HIGH)

   if (!digitalRead(BUTTON))

   {

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

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

          Serial.println("SERVO move 90");



          lcd.setCursor(0,0);

          lcd.print("DOOR: open");

          Serial.println("Button: click");

          delay(1000);          

          lcd.clear();

          //buttonState=LOW;

            

   }

   else  {

          lcd.setCursor(0,0);

          lcd.print("DOOR: close");

          //tone(3, 100, 500);

    }







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

    {

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

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

        //tone(3, 100, 100);

        Serial.println("DOOR: 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("DOOR: open");

   }





   

  

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

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



}

Почему то при нажатии на кнопку совсем ничего не происходит. Почему понять не могу. Помогите пожалуйста.

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

Ну помогите пожалуйста.

Araris
Offline
Зарегистрирован: 09.11.2012

Lord-Urd пишет:

Почему то при нажатии на кнопку совсем ничего не происходит. Почему понять не могу. Помогите пожалуйста.

То есть строка "Serial.println("SERVO move 90");" не отрабатывает и сообщение в окно терминала не выводится ?

Исправность кнопки тестером проверяли ? Кнопка точно подключена к пину 2 и земле ?

Ну и на будущее обязательно прочтите http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii , тяжело код читать в таком виде, как Вы выложили.

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

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

Araris
Offline
Зарегистрирован: 09.11.2012

Lord-Urd пишет:

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

Не понял, что именно пишет.

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

Пишет Servo close, и сразу Button: click. Ну Servo close сейчас заменено на Door close

Araris
Offline
Зарегистрирован: 09.11.2012

Кстати, конструкция

buttonState = !digitalRead(BUTTON); // Инвертируем, потому что пин прописан как pinMode(BUTTON, INPUT_PULLUP);

if (buttonState == HIGH)
{
.........
}

гораздо лучше, чем просто

if (!digitalRead(BUTTON))
{
.........
}

она дает возможность завести переменную int buttonStatePrev; (хотя я бы делал их boolean) и в скетче реагировать не на значение переменной, а только на ИЗМЕНЕНИЕ значения переменной.

buttonState = !digitalRead(BUTTON); // Инвертируем, потому что пин прописан как pinMode(BUTTON, INPUT_PULLUP);
if (buttonStatePrev != buttonState)
 {
 if (buttonState)
  { ......... } 
 else
  { ......... } 
 buttonStatePrev = buttonState;
 }

В данном скетче такой подход избавит от операции вывода на дисплей при каждом проходе loop().

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

Спасибо огромное Araris!!! Попробую сделать как вы написали. А вообще этот проект начало системы умный дом. Просто пока я не столь умудрён в Arduino и начинаю с более простого. Ещё раз спасибо за помощь и советы! Попробую и обязательно отпишусь.