Помогите решить проблему

85vehiza
Offline
Зарегистрирован: 26.12.2016
Нашол скейч скачал библиотеки все и при проверки выдает ощибку . могли бы вы под сказать что у меня неправельно.


#include <Metro.h> // Библиотека таймера (во всех паузах используется таймер, а не delay, чтобы избежать зависаний процесса во время задержки)
// Ее можно скачать здесь: https://github.com/thomasfredericks/Metro-Arduino-Wiring
// Затем ее необходимо подключить через Скетч->Импортировать библиотеку->Add Library...

// Эти библиотеки стандартные, должны работать без дополнительного подключения
#include <Servo.h> // Библиотека для управления сервоприводом
#include <SoftwareSerial.h> // Библиотека нужна для считывания данных с RFID сканера

#define ledPin1 2 // Pin для светодиода индикации состояния двери (внутри комнаты)
#define ledPin2 3 // Pin для светодиода индикации состояния двери (снуражи комнаты)
#define servoPowerPin 4 // Pin для питания сервопривода
#define insideOpen 6 // Pin для кнопки открытия двери внутри комнаты 
#define doorPin 7 // Pin для контактов, которые замыкаются при закрытии двери (работает аналогично кнопке)
#define reserveOpen 5 // Pin для контактов резервного открытия двери, в случае, если забыл RFID карту или в случае отказа RFID сканера (да, да, такое тоже случается :D)
#define pirPin 8 // Pin для инфракрасного датчика движения
#define rfPin 9 // Pin для RFID сканера (получает данные приложенной карты)
#define servoPin 10 // Pin для усправления сервоприводом щеколды замка
#define fadePin 11 // Pin для управления светодиодной лентой
#define angle 35 // Здесь задается угол поворота сервопривода, в зависимости от того, насколько длинный ход щеколды у замка
#define calibrationTime 60 // Это время калибровки инфракрасного датчика движения (чем выше, тем более точно будет реагировать на движение, 60 с. в самый раз)
// В течение этого времени после запуска Arduino не должно быть никого в поле его видимости. На время калибровки Arduino не будет ни на что реагировать.

Metro servoMetro = Metro(3000); // Задаем время, в течение которого после открытия замка должна быть открыта непосредственно сама дверь. Иначе через это время замок закроется обратно
int pos; // Переменная для считывания текущего положения сервопривода
boolean lockLow = true; // Переменная для проверки, было ли обнаружено движение, если true, то еще нет.
// Она нужна для корректной работы задержки перед выключением света, а также корректной работы включения света, в период, когда свет уже начал гаснуть, но движение появилось вновь, чтобы не дожидался, пока он полностью погаснет, а сразу начал его снова включать.
boolean takeLowTime; // Тоже для инфракрасного датчика, но нужна для того, чтобы после того, как узнали время окончания движения, больше его не считывать
boolean motionDetLed = false; // Показывает, должна ли светодиодная лента быть включенной
long unsigned int lowIn; // Получает время окончания движения
long unsigned int pause = 8000; // Время, в течении которого мы не проверяем, было ли новое движение. Т. е. по сути это время, в течении которого должна гореть светодиодная лента после обнаружения движения.
String msg; // Переменная, в которую считываем данные RFID карты
char c; // Переменная для посимвольного считывания
int ledState = LOW; // В этой переменной устанавливаем состояние светодиодов (оба светодиода работают синхронно и имеют одинаковую индикацию)
long previousMillis = 0; // Храним время последнего переключения светодиода. Это нужно для реализации быстрого мигания светодиода, когда дверь открыта
long interval = 400; // Интервал между включение/выключением светодиода

int ledI = 0; // Аналоговое значение яркости светодиодной ленты (для плавного включения и выключения света)
boolean ledBon = false; // Если true, то это значит, что свет в процессе включения (т. е. яркость поднимается, но еще не достигла конечной точки)
boolean ledBoff = false; // Если true, то это значит, что свет в процессе выключения (т. е. яркость опускается, но еще не достигла конечной точки)
Servo myservo; // Определяем переменную для работы с сервоприводом
SoftwareSerial rfid = SoftwareSerial(rfPin,12); // Определяем переменную для работы с RFID сканером

void setup(){
  // Задаем типы (ввод или вывод) для соответствующих Pin
  pinMode(fadePin, OUTPUT); 
  pinMode(servoPin, OUTPUT);
  pinMode(servoPowerPin,OUTPUT);  
  pinMode(fadePin,INPUT);
  
  myservo.attach(servoPin); // Связываем Pin сервопривода с соответствующим классом
  servoOpen(); // Функция открытия двери. Запускаем ее при запуске Ардуино для того, чтобы дверь открылась, если до этого она была закрыта
  rfid.begin(9600); // Подлкючаем RFID
  calibrationSensors(); // Запускаем калибровку инфракрасного датчика движения
}

void loop(){
  pos = myservo.read(); // Считываем положение сервопривода

  // В цикле loop выполняем следующие, отдельно написанные, функции
  diodBlink(); // Функция индикации светодиодов
  rfidRead(); // Функция чтения данных с RFID
  buttons(); // Функция обработки кнопок
  moveSensor(); // Функция обнаружения движения
  
  // Слудующий кусок кода плавно включает и выключает светодиодную ленту. Также идет обработка того случая, если светодиодная лента уже начала выключаться, но датчик движения снова обнаружил движение.
  // В этом случае нужно не дожидаться, пока она полностью погаснет, а сразу с той же точки якрости начать увеличивать ее до максимума
  if (ledBon && motionDetLed) {
     if (ledI>=255) {
       ledBon = false; 
     } else {       
       ledI=ledI+1; 
       analogWrite(fadePin,ledI);
       delay(15);
     }
  }
  else {
    motionDetLed = false;
    ledBon = false; 
  }
  
  if ((ledBoff) && (motionDetLed == false)) {
     if (ledI<=0) {
       ledBoff = false; 
     } else {
       ledI=ledI-1; 
       analogWrite(fadePin,ledI);
       delay(15);
     }
  }
  else {
    ledBoff = false; 
  }
 
}

// Функция обработки кнопок
void buttons() { 
 
  // Здесь идет проверка, на закрытие непсоредственно самой двери (т. е. замыкания контактов на ее торце).
  // Для этого были использованы обычные канцелярские кнопки: http://yadi.sk/d/BY2PPszsEkQ5M
  // Также, здесь проверяется, если замок был открыт, но в течение 3 сек. дверь не была открыта, то замок автоматически закрывается
  if ((digitalRead(doorPin) == HIGH)&&(servoMetro.check()==1))
  {
     servoClose(); // Функция закрытия сервоприводом замка
  }  
  
  // Здесь идет проверка как на нажатие кнопки открытия внутри комнаты, так и на замыкание резервной кнопки
  if ((digitalRead(insideOpen)==HIGH) || (digitalRead(reserveOpen)==HIGH)) {
      servoOpen(); // Функция открытия сервоприводом замка
  } 
  
}


// Функция индикации светодиодов
void diodBlink() {
  
  unsigned long currentMillis = millis();
 
  // Если замок открыт, т. е. угол поворота сервопривода равен нашему значению его октрытия, то светодиод должен быстро мигать
  if (pos==angle) {
  // Проверяем, не прошел ли нужный интервал, если прошел, то
  if(currentMillis - previousMillis > interval) {
    // Сохраняем время последнего переключения
    previousMillis = currentMillis;  

    // Если светодиод не горит, то зажигаем, иначе выключаем
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // Устанавливаем состояния выходов, чтобы включить или выключить светодиод для обоих светодиодов
    digitalWrite(ledPin1, ledState);
    digitalWrite(ledPin2, ledState);
  }
  } else {
    digitalWrite(ledPin1, HIGH);
    digitalWrite(ledPin2, HIGH);
  }
  
}


// Функция чтения данных с RFID
void rfidRead() {
  
 if(rfid.available()>0) {
   while(rfid.available()>0){ // считываем данные посимвольно
    c=rfid.read(); 
    msg += c;
  }
  delay(20);
 }
 
  msg=msg.substring(1,13); //вырезаем код, т. е. только те символы, которые нам нужны для идентификации карты
  
  // Если эта карта разрешенная, то открываем дверь
  // Здесь через знак || можно добавлять дополнительные карты для проверки
  // Также, можно сравнивать по большему количеству символов для большей защищенности
  if ((msg.indexOf('FCE')>=0)||(msg.indexOf('28C')>=0)) { 
      servoOpen(); // Открываем замок    
  } 
   msg = ""; // Очищаем переменную для возможности считывания новой карты
}

// Функция обнаружения движения
void moveSensor() {
  
  // Если обнаружено движение, то
  if (digitalRead(pirPin) == HIGH) {
     //Если еще не вывели информацию об обнаружении
     if(lockLow) {
       lockLow = false;     
       ledBon = true;
       motionDetLed = true;
       delay(50);
     }        
     takeLowTime = true;
   }
  //Ели движения нет, то
   if (digitalRead(pirPin) == LOW)
   {      
     // Если время окончания движения еще не записано
     if(takeLowTime)
     {
       lowIn = millis();          // Сохраним время окончания последнего движения
       takeLowTime = false;       // Изменим значения флага, чтобы больше не брать время, пока не будет нового движения
     }
     
     //Если время без движение превышает паузу => движение окончено
     if(!lockLow && millis() - lowIn > pause)
     { 
       //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения
       lockLow = true;               
       ledBoff = true;
       motionDetLed = false;
       delay(50);
     }
   } 
}

// Калибровка сенсора
void calibrationSensors() {
   for(int i = 0; i < calibrationTime; i++)
   {
     delay(1000);
   }
}


// Открытие замка
void servoOpen() {
    digitalWrite(servoPowerPin,HIGH); // Включаем питание сервопривода подачей напряжения на запирающий транзистор
    delay(100); // Задержка, чтобы сервопривод успел начать принимать данные после подключения к нему питания
    myservo.write(angle); // Поворачиваем сервопривод на угол angle
    delay(500); // Эта задержка нужна, чтобы сервопривод успел передвинуть щеколду до момента отключения от него питания
    digitalWrite(servoPowerPin,LOW); // Отключаем питание сервопривода
    servoMetro.reset(); // Сбрасываем таймер для нвоого отсчета, чтобы если дверь не была открыта в течении 3-х секунд, закрыть замок обратно
}


// Закрытие замка
void servoClose() {
    digitalWrite(servoPowerPin,HIGH); // Включаем питание сервопривода подачей напряжения на запирающий транзистор
    delay(100);
    myservo.write(0);
    delay(500);  
    digitalWrite(servoPowerPin,LOW); // Отключаем питание сервопривода
}

 

valera678
Offline
Зарегистрирован: 04.11.2016

Если хотите чтобы вам помогли то копируйте и выложите сюда код ошибки. 

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

85vehiza пишет:

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

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Чтобы подсказать, что у Вас неправильно, нужны, минимум, результаты Ваших анализов.

valera678
Offline
Зарегистрирован: 04.11.2016

Видно "пошел" анализы сдавать)

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

valera678 пишет:
Видно "пошел" анализы сдавать)
Думаю, что не "пошёл", а "пошол".

85vehiza
Offline
Зарегистрирован: 26.12.2016

Извините с русс яз плохо все 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

85vehiza пишет:

Извините с русс яз плохо все 

Ну, существо проблемы Вам по русски либо по английски все равно придется сформулировать.

85vehiza
Offline
Зарегистрирован: 26.12.2016

я все нашол в чем причина была